Чтобы реализовать свойство или реализовать подкласс

У меня есть класс под названием List_Field, который, как следует из названия, создает поля ввода списка. Эти поля ввода списка позволяют пользователям выбирать один элемент в списке.

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

Должен ли я сделать это путем реализации свойства multiple_choice_allowed в существующее свойство List_Field, или я должен реализовать подкласс Multiple_Choice_List_Field класса List_Field?

Какому инженерному принципу я должен следовать, когда сталкиваюсь с подобными дилеммами?

16
задан Emanuil Rusev 26 May 2011 в 17:52
поделиться

3 ответа

Взгляните на ТВЕРДЫЕ принципы . Они помогут вам в ваших проектах. В частности, принцип единой ответственности скажет вам не смешивать две проблемы в одном классе, а принцип подстановки Лискова скажет вам не создавать подклассы, которые нарушают контракт суперклассов, как то, что вы также предлагаете.

Так, каково было бы решение в вашем случае? Вы можете создать абстрактный базовый класс, который будет независим от типа выбора, а затем создать 2 подкласса, один для одиночного выбора, а другой для множественного выбора.

19
ответ дан Jordão 26 May 2011 в 17:52
поделиться

Зависит от наличия / отсутствия эволюции объекта - если вы хотите, чтобы особый случай, подклассификация или инъекция (DI) «выберите» поведение (стратегию) хорошо.

Но если вы также хотите, чтобы Field_List динамически изменял свое поведение, тогда свойство или метод мутации - единственный путь.

Пример: экран регистрации с различными «планами» - базовый, где вы можете выбрать только одну вещь и премиум, где вы можете выбрать столько, сколько хотите. Смена плана будет переключаться между выпадающим и несколькими флажками, при этом все еще имея тот же объект, включая его содержимое.

Я бы проголосовал за свойство / мутировать метод.

3
ответ дан Kamil Tomšík 26 May 2011 в 17:52
поделиться

Должен ли я сделать это путем реализации свойства multip_choice_allowed в существующем свойстве List_Field

Если вы можете сделать это, я думаю, что это лучшее решение, потому что таким образом вы избегаете распространения классов. Если при этом вы слишком усложняете свой класс List_Field, возможно, создание производного класса может иметь некоторые преимущества в отношении удобства сопровождения вашего кода.

1
ответ дан Heisenbug 26 May 2011 в 17:52
поделиться