如何減少代碼中的分支語句
代碼中往往存在很多的分支語句:判斷+執行;大量的分支語句讓代碼看上去很醜陋,而且容易增加代碼複雜度。
所以我覺得減少代碼的分支語句或者隱藏分支語句是一件很有必要的事情,能夠讓代碼變得更加清晰易讀。
減少分支語句,在實際的編程中遇到了一種比較好的方式——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;@Overridepublic 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 總結
這是存在比較多的條件判斷情況下,以此方式進行存在一個問題是:增加類的數量以及其他額外的開銷。
但其實判斷仍然是存在的,只是我們將其隱藏起來而已,很多時候覆雜的邏輯流程必然存在無法避免,
但是卻可以將複雜的事情簡單化。軟體中的複雜度是必然存在的,如何化複雜為簡單,真是學問很大啊!