Закон Деметры и HashMap - PullRequest
       1

Закон Деметры и HashMap

2 голосов
/ 28 января 2012

У меня есть несколько вопросов.Прежде всего, код ниже нарушает закон Деметры?

Map map = new HashMap<String, String>();
map.put("foo","bar");
map.put("fooo","baaar");
map.keySet().iterator()

Код IMO выше нарушает закон Деметра, потому что тип карты - Map, а keySet () возвращает объект Set.Оба разные.Я думаю о втором свойстве, которое содержит только «ключи», но это правильное решение?

1 Ответ

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

Да, технически это является нарушением закона Деметры, если его описывать в терминах методов. Тем не менее, способ исправить это можно было бы сделать так: добавить операцию типа "keysIterator" в класс Map , и это может быть разумным действием, за исключением того, что здесь Map не ваша код .

Цель Закона Деметры - уменьшить взаимосвязь между компонентами вашего приложения . Изменение того, как вы используете стандартные объекты библиотеки, на это не влияет. Ваше предлагаемое решение неэффективно расходует ресурсы и не имеет особой выгоды.

С другой стороны, набор ключей карты - это просто аспект карты. Вы должны думать об этом не столько как о третьем объекте (где LoD, по сути, говорит, что в любом взаимодействии не должно быть более двух объектов), как о способе классификации операций, которые предоставляет Карта.


Представьте себе другой сценарий: предположим, у вас есть класс приложения , например, категория в интернет-магазине. Было бы значимым нарушением LoD иметь

category.itemsSet().iterator()

и это то, что вы можете реорганизовать. Зачем? Поскольку он ограничивает класс Category для реализации Set, даже если единственная операция, которая действительно необходима, это итерация (или, как правило, меньшее количество операций, чем имеет интерфейс Set), а не реализация, которая выполняет только необходимую работу и может быть исправлено или переопределено легче

С другой стороны, если вещи, которые вы хотите сделать с категорией, охватывают все операции Set, то глупо не предоставлять Category.itemsSet() фасет.


Примечание: «Фасет» здесь означает объект, который находится в отношении 1: 1 к другому объекту и, по сути, представляет собой другое представление «того же самого», особенно более узкое представление. Это не совсем стандартный термин.

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