Фон
Я читаю «Чистую книгу кодов», и, в частности, я работаю над художественными объектами Kata, как банковский счет, и я застрял на этом правиле:
Девятое правило художественных объектов - мы не используем геттеры или сеттеры.
Это кажется довольно забавным, и я согласен с этим принципом. Более того, на странице 98-99 Чистого кода автор объясняет, что геттеры / сеттеры нарушают абстракцию и что нам не нужно спрашивать наш объект, но мы должны сказать наш объект.
Это имеет смысл в моем сознании, и я полностью согласен с этим принципом. Проблема приходит на практике.
контекст
Например, у меня есть приложение, в котором я должен перечислить некоторых пользователей и отобразить данные о них.
Мой пользователь состоит из:
-> Name
--> Firstname --> String
--> Lastname --> String
-> PostalAddress
--> Street --> String
--> PostalCode --> String
проблема
Как я могу это сделать, или что я могу сделать, чтобы избежать получения, когда мне нужно только показать простую информацию ( и я должен подтвердить, что мне не нужны дополнительные операции с этим конкретным полем ), чтобы отобразить значение Firstname в простом ( случайный) выходной поддержки?
Что приходит мне в голову
Одним из решений является сделать:
user.getName().getFirstName().getStringValue()
Что ужасно, нарушая многие правила художественных объектов и нарушая Закон Деметры.
Еще один будет что-то вроде:
String firstName = user.provideFirstnameForOutput();
// That would have called in the user object =>
String firstName = name.provideFirstnameForOutput();
// That would have called in the name object =>
String firstName = firstname.provideFirstnameForOutput();
Но я не чувствую себя комфортно с этим решением, которое кажется только «средством доступа более высокого порядка», как обход стандартного метода получения / установки с помощью метода, который нацелен только на соответствие закону Деметры ...
Есть идеи ?
источник
Одним из направлений, по которому следует подумать, было бы предоставить общую функцию-член форматирования строк, а не предоставлять доступ к необработанным данным. Что-то вроде этого:
Видите ли, с этим подходом вы не ограничены просто предоставлением полных данных, как есть, вы можете предоставить средства для преобразования данных в удобных, значимых способов. Например, вам может понадобиться подшутить над регистром персонажа:
Вы также можете определить некоторые часто используемые, возможно, сложные форматы один раз, так что вы можете сказать, например,
Прелесть этого подхода в том, что он сохраняет отдельные строки внутри
User
класса, фактически предоставляя значительно больше функциональности вызывающему коду. Однако недостатком является то, что вам нужно реализовать механизм шаблонов, внутриformatDescription()
которого будет несколько строк кода.Таким образом, это может быть полным излишним: Никогда не забывайте, что принципы программирования являются лишь рекомендациями. И когда следование другому принципу нарушает принцип KISS, лучше всего просто сделать это простым способом. Итак, если у вас нет хотя бы какой-то потребности в таком элементе форматирования, я бы не стал реализовывать его ради простоты, используя подход, основанный на методах доступа.
источник
User
синтаксический анализ и компиляцию / интерпретацию языка шаблонов лежит на объекте?User
класс должен сам реализовать эту функциональность. Если бы у меня было только два класса, которые нуждались в такой функциональности, вы могли бы поспорить на то, что я выделю механизм замены шаблона в свой собственный класс. Это должно быть примером того, как вы можете поднять абстракцию,User
обеспечивающую уровень, на котором она фактически больше, чем просто контейнер данных. И я верю, что это то, что нужно избегать аксессоров: делать ООП вместо обработки множестваstruct
s.