如何减少代码中的分支语句
代码中往往存在很多的分支语句:判断+执行;大量的分支语句让代码看上去很丑陋,而且容易增加代码复杂度。
所以我觉得减少代码的分支语句或者隐藏分支语句是一件很有必要的事情,能够让代码变得更加清晰易读。
减少分支语句,在实际的编程中遇到了一种比较好的方式——Command模式减少分支语句。
Command模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化。
所以可以将一系列请求都封装成对象,形成一个请求集合。
当需要执行一个请求的时候直接去这个集合中查找到对应的请求对象,然后执行对象的Command。
下面以一个具体的例子看一下这个过程:
结构如下:
1 命令原型
interface ScenceCommand {
void doExecute();
}
//CallHang命令
class CallHangScenceCommand implements ScenceCommand {
private TelEventTreater mTreater;
public CallHangScenceCommand(TelEventTreater treater) {
mTreater = treater;
}
@Override
public void doExecute() {
mTreater.doHangCall();
}
}
//CallAnswer命令
class CallAnswerScenceCommand implements ScenceCommand {
private TelEventTreater mTreater;
public CallAnswerScenceCommand(TelEventTreater treater) {
mTreater = treater;
}
@Override
public void doExecute() {
mTreater.doAnswerCall();
}
}
……不一一列出
2 命令注册
abstract class ScenceCommandRegister {
//存储所有的命令请求集合
private HashMap<String, ScenceCommand> mScenceCmdSet;
public ScenceCommandRegister() {
mScenceCmdSet = new HashMap<String, ScenceCommand>();
}
//命令请求注册
public void registerCommand(String name, ScenceCommand command) {
mScenceCmdSet.put(name, command);
}
//命令请求查询
public ScenceCommand getCommand(String name) {
return mScenceCmdSet.get(name);
}
}
class CallScenceCommandRegiser extends ScenceCommandRegister {
public CallScenceCommandRegiser(TelEventTreater treater) {
super();
//注册所有命令
registerCommand(CallInputCommandMatch.CALL_DEFAULT,
new CallDefaultScenceCommand(treater));
registerCommand(CallInputCommandMatch.CALL_HANG,
new CallHangScenceCommand(treater));
registerCommand(CallInputCommandMatch.CALL_ANSWER,
new CallAnswerScenceCommand(treater));
registerCommand(CallInputCommandMatch.CALL_REPLY,
new CallReplyScenceCommand(treater));
registerCommand(CallInputCommandMatch.CALL_MUTE,
new CallMuteScenceCommand(treater));
registerCommand(CallInputCommandMatch.CALL_COMPLETE,
new CallCompleteScenceCommand(treater));
registerCommand(CallInputCommandMatch.CALL_NORSP,
new CallNoRspScenceCommand(treater));
}
}
3 命令执行
private static ScenceCommandRegister mScenceRegister;
@Override
public void onResult(Result res) {
String resultStr = res.Get_RawText();
do {
//操作请求
String cmdStr = mCommandMatch.matchInputCommand(resultStr);
if (cmdStr == null) {
break;
}
//命令请求
ScenceCommand scenceCmd = mScenceRegister.getCommand(cmdStr);
if (scenceCmd == null) {
break;
}
//命令执行
scenceCmd.doExecute();
} while (false);
}
4 总结
这是存在比较多的条件判断情况下,以此方式进行存在一个问题是:增加类的数量以及其他额外的开销。
但其实判断仍然是存在的,只是我们将其隐藏起来而已,很多时候复杂的逻辑流程必然存在无法避免,
但是却可以将复杂的事情简单化。软件中的复杂度是必然存在的,如何化复杂为简单,真是学问很大啊!