2013-04-07 3 views
0

У меня есть класс, который обрабатывает связь с каким-либо устройством. Я назвал этот класс Protocol. Класс не содержит информации о состоянии, и поэтому я создал класс модели, который должен раскрывать методы в классе протокола и содержать состояние устройства.Какую опцию следует выбирать для раскрытия функциональности?

Как я вижу, есть три способа реализации этого

  1. Пусть модель класса унаследованы из протокола
  2. Пусть класс модели реализуют протокол
  3. Пусть модель выставить протокол через a свойство

Может быть, протокол содержит методы, которые лучше не подвергаются реализации разработчику класса модели, который говорит против вариантов 1 и 3.

Вариант 2 позволяет мне выбрать, какие вещи, которые я хотел бы выставить из протокола, но большая часть функциональности будет только вызовы к протоколу, как:

DoSomething() 
{ 
    protocol.DoSomething(); 
} 

Что вы думаете, что будет «лучше "вариант?

N.B .: Причина развязки состояния и протокола заключается в том, что протокол не является фиксированным и может меняться в зависимости от внешних факторов.

+0

так почему модель разговаривает с протоколом в первую очередь? – Filip

+0

Он содержит состояние устройства и должен иметь способ получить это состояние. – kasperhj

+0

Почему опция 3 предоставляет уязвимые методы протокола агрегирующему классу? Даже вариант 1, который обычно плохо использует наследование, не может в конечном итоге разоблачить что-либо. – Jon

ответ

1

Вам действительно нужно отношение наследования между ними?

interface IDevice 
{ 
    // Some implementation 
} 

interface IProtocol : IDisposable 
{ 
    void Open(IDevice device, string connection); 
    void Close(); 
    void Send(object data); 
    object Receive(); 
} 
+0

Нет, не между устройством и протоколом. Протокол просто реализует все, что понимает устройство. Протокол «живет» поверх TCP-соединения или соединения RS-232, в зависимости от того, как подключено устройство. – kasperhj

0

Я использовал то, что мы назвали проект Command Handler в прошлом что-то подобное, и это, как он работал:

Был класс CommandHandler (ну, на самом деле компонент - это было несколько взаимодействующих классов), которые выполнили всю работу (что вы назвали «.DoSomething()». Таким образом, это то же самое, что и ваш класс протокола выше. Однако этот класс/компонент CommandHandler ничего не знал о протоколе. Он просто использовал конструкторы родных языков (в вашем случае классы или интерфейсы C#), чтобы выполнить эту работу. Тогда будет один или несколько классов протокола, которые сделали работу по преобразованию протокола в конструкции языков (например, преобразование XML в м классы эссейсов, двоичные байты из потока в классы и т. д.) и выполнять функции компонента обработчика команд путем создания экземпляров его классов из декодированного протокола и передачи аргументов этим экземплярам методов из параметров, полученных из протокола.

Чтобы реализовать новый протокол для вашего обработчика команд, напишите класс протокола и обработайте его любым протоколом, создав экземпляры и вызовите методы компонента Command Handler, которые другие протоколы сделали так, чтобы ядро функциональность не изменяется.

Надеюсь, это то, что вы искали.

+0

Ну, не совсем. Я пытаюсь отделить существующий класс протокола от класса, который содержит состояние устройства, поддерживающего протокол. – kasperhj

Смежные вопросы