Хранение методов в словаре для пользовательских Tcp или Udp серверов. Это хорошая идея? C # - PullRequest
3 голосов
/ 06 июля 2011

Я рассматриваю возможность хранения методов внутри словаря (используя в качестве ключа понятную для пользователя строку), чтобы на сервер можно было отправить сообщение типа «echo, hello world» и сервер знал, что нужно вызвать: echo (строковое сообщение) и передать в "привет мир".

Псевдокод:

public delegate void NetCommand(object param);

void MyNetCommand(object param)
{
  string s = param as string;

  Console.WriteLine(s);
}

Dictionary<string, NetCommand> commands = new Dictionary<string, NetCommand>();

static void Main(string[] args)
{
  commands.Add("echo", MyNetCommand);
} 

void OnReceiveSomeImaginaryMessageAfterItsBeenProcessed(string friendly, object param)
{
  commands[friendly]();
}

Мой вопрос: это хорошая идея? Есть ли какие-либо недостатки в этом? Или это просто «неправильный» способ сделать то, что уже имеет желаемое решение?

Ответы [ 4 ]

2 голосов
/ 06 июля 2011

Выглядит круто, просто используйте

if (commands.HasKey(friendly)) 

... прежде чем делать это ...

вам также не хватает param как в:

commands[friendly](param);
2 голосов
/ 06 июля 2011

Я не понимаю, почему это не очень хорошая идея, и тот факт, что вы храните их в памяти, будет означать, что вы также получите повышение производительности.

1 голос
/ 06 июля 2011

Ваша производительность будет O (log (n)), однако строка switch / case over будет иметь такую ​​же производительность O (log (N)), так что вы не сделаете ничего плохого.В любом случае маршрутизация команд не должна быть узким местом.

1 голос
/ 06 июля 2011

Лично я считаю, что это достаточно элегантное решение. Единственное, что я лично изменю, так это то, что вместо того, чтобы поместить в Значение словаря deletefate, поместите объект класса. В этом случае yuo может легко поддерживать в будущем усложнение вашего кода.

public abstract class MyAbstractNetCommand {   

     public abstract void ExecuteCommand();
} 

public class ConcreteCommand : MyAbstractNetCommand {

    /*Here additional ConcreteCommand specific methods and state members*/

    public override ExecuteCommand() {
       // concrete iplementation
    }
}
...