2015-05-07 141 views
0

我有一個TcpListener聽執行一個命令示例。 「複製,移動,刪除,...」對不使用IF語句的命令列表執行命令C#

switch(command) 
{ 
    case "copy": 
    // do copy 
    break; 
    case "delete": 
    // do delete 
    break; 
    case "move": 
    // do move 
    break; 
    ....................................... 
} 

我一直在使用switch - caseif聲明中實現它,但是當涉及到維護或增加新的命令,特別是當命令列表超出100指令它變得非常困難和繁瑣,所以有沒有辦法有效地做到這一點,我曾嘗試谷歌搜索上,但我似乎不能正確地得到它的行話
任何幫助:) 亞瑟

+2

你有沒有考慮過使用字典? –

+0

@ZoharPeled可以請詳細說明或給我一個例子 –

+0

@GrantWinney我已經創建了分離的方法,但我想要一個更有效的方式,比'如果其他'更專業的方式 –

回答

1

You'r e尋找Command Pattern。您將不得不創建一個接口ICommand,並且每個命令都執行該接口。

例如:CopyCommandDeleteCommandMoveCommand

然後,你需要一個factory method根據所提供的字符串,創建相應的ICommand的實例。

最後,您會撥打ICommand.Execute。這使得它可讀,可維護,清潔等..

您的代碼將成爲

ICommand command = commandFactory.Create(commandString); 
command.Execute(); 

哪裏commandFactory是「工廠」,這將創造適當的ICommand實例的實例。

如果您願意,可以使用巨大的開關盒或Dictionary<string, Func<ICommand>>來實現您的工廠類。

1

正如@Zohar Peled已經提到的字典是這個問題的一個非常便宜的解決方案,沒有那麼優雅,但真的很便宜:

 //Initialize command lists 
     Dictionary<string, Action> commands = new Dictionary<string, Action>(); 

     commands.Add("move", DoMyMove); 
     commands.Add("add",()=> Console.WriteLine("")); 
     commands.Add("remove", DoMyRemove); 
     commands.Add("close", DoMyClose); 

代表

 private void DoMyMove() 
     { 
      // TODO 
     } 

用法:

 commands[command].Invoke(); 

它可以擴展並易於清除基本開發人員...

+0

我給你-1偷我的想法:-),但用於編寫代碼示例的+1和用於在信用到期時提供信用的另一個+1。 :-) –

+0

你r溫柔和sry ...... :( – sac1

1

一種選擇是在類級別上定義一個Dictionary<string,action>,該級別將保存命令的名稱和操作委託給需要執行的實際方法。然後在主要方法中,您不需要使用開關,只需使用字典的TryGetValue Method從字典中獲取action委託,並且如果它返回true,則只需調用操作委託。