В этой статье утверждается, что класс данных - это «запах кода». Причина:
Это нормально, когда недавно созданный класс содержит только несколько открытых полей (и, возможно, даже несколько получателей / установщиков). Но истинная сила объектов в том, что они могут содержать типы поведения или операции над своими данными.
Почему для объекта неправильно содержать только данные? Если основная ответственность класса заключается в представлении данных, разве не будут добавлены методы, которые работают с данными, нарушающими принцип единой ответственности ?
Ответы:
Нет ничего плохого в том, чтобы иметь чистые объекты данных. Откровенно говоря, автор произведения не знает, о чем говорит.
Такое мышление вытекает из старой, неудачной идеи, что «настоящий ОО» - это лучший способ программирования, а «настоящий ОО» - это все о «богатых моделях данных», в которых смешиваются данные и функциональность.
Реальность показала нам, что на самом деле все наоборот, особенно в этом мире многопоточных решений. Чистые функции в сочетании с неизменяемыми объектами данных являются явно лучшим способом написания кода.
источник
Нет ничего плохого в том, чтобы иметь чистые объекты данных. У автора есть мнение, не разделяемое разработчиками программного обеспечения, которых я знаю.
Специально для отображения базы данных у вас вообще есть классы сущностей, которые содержат только поля, хранящиеся в базе данных, а также методы получения и установки. Википедия Hibernate (рамки)
Идея дырки Java-бинов, используемых многими инструментами / средами, основана на классах данных, называемых бинами, которые содержат только поля и связанные методы получения и установки. Wikipdia JavaBeans
Фазит:
Если кто-то утверждает, что что-то «плохо» или «пахнет кодом», вы всегда должны искать причины. Если причины не убеждают, спросите кого-то еще о лучших причинах или ином мнении. (Как вы сделали на этом форуме)
источник
Хороший аргумент, почему Мартин Фаулер:
«Tell-Don't-Ask - это принцип, который помогает людям помнить, что объектная ориентация заключается в объединении данных с функциями, которые работают с этими данными. Он напоминает нам, что вместо того, чтобы запрашивать у объекта данные и действовать на основе этих данных, мы вместо этого следует сказать объекту, что делать. Это побуждает перемещать поведение в объект для передачи данных ».
https://martinfowler.com/bliki/TellDontAsk.html
источник
baz
в качестве параметра статический метод, но для этого вам сначала нужно запросить объект. Возможно, в парадигме программирования, где методы были первичными (как, скажем, функциональное программирование), это имеет смысл, но в ОО-среде это абсолютно не так, потому что объекты являются первичными и должны содержать как данные, так и функции, которые будут воздействовать на него. Насколько я могу судить, ваше утверждение о том, что удаление метода из объекта привело к увеличению инкапсуляции, также является в точности обратным , поскольку это означает, что теперь выbaz
появлялись за пределами объекта.Вам нужно понять, что существует два вида объектов:
Объекты, которые имеют поведение . Они должны воздерживаться от предоставления публичного доступа большинству / любому из своих членов данных. Я ожидаю только очень мало методов доступа, определенных для них.
Примером может служить скомпилированное регулярное выражение: объект создается для обеспечения определенного поведения (чтобы сопоставить строку с определенным регулярным выражением и сообщить о (частичных) совпадениях), но как скомпилированное регулярное выражение выполняет свою работу, не относится к пользователю бизнес.
Большинство классов, которые я пишу, относятся к этой категории.
Объекты, которые на самом деле просто данные . Они должны просто объявить всех своих членов публичными (или предоставить им полный набор средств доступа).
Примером будет класс
Point2D
. Абсолютно нет инварианта, который должен быть гарантирован для членов этого класса, и пользователи должны иметь возможность просто получать доступ к данным черезmyPoint.x
иmyPoint.y
.Лично я не очень часто использую такие классы, но я полагаю, что нет более крупного кода, который я написал, где бы не использовался такой класс.
Стать опытным с объектной ориентацией включает в себя понимание того, что это различие существует, и обучение классификации функции класса в одну из этих двух категорий.
Если вы кодируете на C ++, вы можете сделать это различие явным, используя
class
для первой категории объектов иstruct
для второй. Разумеется, они эквивалентны, за исключением того,class
что по умолчанию все члены являются закрытыми, а по умолчаниюstruct
объявляет всех участников открытыми. Какую именно информацию вы хотите сообщить.источник