Подклассификация или всеобъемлющий класс

#c# #coding-style

#c# #стиль кодирования

Вопрос:

Я разрабатываю распределенное приложение (сервер и клиенты). Сервер отправляет некоторые инструкции (например, InitCommand , StartCommand , StopCommand ). У каждой команды есть свои собственные аргументы. Теперь, если дело доходит до сериализации и сетевого взаимодействия, я спрашиваю себя, должен ли я создать подкласс для каждого типа команды (который наследуется от Command ) или просто поместить все возможные аргументы в Command класс.

При обработке команды это if (command is InitCommand) vs if (command.Type == CommandType.Init) .

Моя первая реализация использует первый вариант. Я сериализую вручную и помещаю информацию о типе в начало. Теперь, если я получаю данные ( byte[] ) из сети, я сначала проверяю фактический тип (десериализую только первые k байтов) и, во-вторых, использую некоторые методы десериализации (например, Serializer.Deserialize<InitCommand> ).

Второй вариант кажется намного проще в использовании, потому что я могу использовать автоматическую сериализацию и мне не нужно проверять тип перед десериализацией. Но меня раздражает, что я должен помещать все аргументы в один класс.

Как вы думаете, что лучше, или вы знаете о других подходах?

Ответ №1:

Похоже, у вас должен быть один класс с несколькими методами; Start , Init , Stop . Это поддерживало бы все в одном классе. SqlCommand имеет CommandType Text StoredProcedure , и TableDirect и это звучит так, как будто вы пытаетесь перестроить для другого типа команды. Я бы выбрал # 2 и посмотрел, как Microsoft реализовала SqlCommand с CommandType помощью.