Расширение дизайна объекта путем добавления множества тривиальных полей? - PullRequest
0 голосов
/ 11 января 2012

Мне нужно добавить набор тривиальных или редко используемых атрибутов к объекту в моей бизнес-модели.

Итак, представьте себе класс Foo, в котором есть куча стандартной информации, такой как цена, цвет, вес, длина. Теперь мне нужно добавить в Foo набор атрибутов, которые редко отклоняются от нормы и редко используются (в рамках всего домена). Итак, Foo.DisplayWhenConditionIsX верно для 95% случаев; аналогично, Foo.ShowPriceWhenConditionIsY почти всегда имеет значение true, и Foo.PriceWhenViewedByZ имеет то же значение, что и Foo.Price большую часть времени.

Мне просто неприятно добавлять дюжину таких полей как в мой класс, так и в таблицу базы данных. Однако я не знаю, имеет ли смысл оборачивать эти новые поля в их собственный класс FooDisplayAttributes. Это похоже на сложность моих DAL и BLL для небольшого усиления, кроме меньшего объекта. Любые рекомендации?

Ответы [ 3 ]

1 голос
/ 11 января 2012

Попробуйте установить отдельный класс / структуру хранения для редко используемых полей и удерживайте их как одно поле, скажем «редко» (например, это будет указатель в C ++ и ссылка в Java - вы не укажите свой язык.)

В вашем классе есть сеттеры / геттеры для этих полей. Сеттеры проверит, не совпадает ли значение со значением по умолчанию, и лениво инициализируют rarelyUsedFields, затем установят соответствующее значение поля (скажем, rarelyUsedFields.DisplayWhenConditionIsX = false). Получатели получают значение rarelyUsedFields и возвращают значения по умолчанию (true для DisplayWhenConditionIsX и т. Д.), Если оно равно NULL, в противном случае возвращаются rarelyUsedFields.DisplayWhenConditionIsX.

Этот подход используется довольно часто, в качестве примера см. Node.h WebKit (и его метод focused().)

0 голосов
/ 11 января 2012

Проблема, которую я вижу, больше связана с побочным эффектом объекта Foo. В вашем примере я вижу две функции: отображение и цену.

Я бы построил один или несколько Displayer (кто знает, как отображать) и сделал бы цену компонентным объектом со списком внутренних модификаторов цены.

Обратите внимание, что все это имеет значение, только если ваши объекты Foo вызываются многочисленными клиентами.

0 голосов
/ 11 января 2012

Абстракция делает ваш вопрос немного сложным для понимания, но я бы предложил использовать специальные методы получения, такие как Foo.getPrice() и Foo.getSpecialPrice().

Первый просто вернет атрибут, а второй сначала выполнит операции с ним.

Это возможно только в том случае, если есть способ вычислить «редко используемую версию» из исходного значения атрибута, но в большинстве обычных случаев это возможно, если вы можете получить доступ к данным из других параметров хранения объекта, таких как FooShop.getCurrentDiscount().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...