Должны ли существа иметь поведение или нет? - PullRequest
3 голосов
/ 19 сентября 2008

Должны ли существа иметь поведение? или нет?

Почему или почему нет?

Если нет, нарушает ли это инкапсуляцию?

Ответы [ 5 ]

6 голосов
/ 19 сентября 2008

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

Многие магазины говорят, что они практикуют SOA , когда они ведут себя глупо. Их оправдание состоит в том, что структура данных редко изменяется, а бизнес-логика меняется. Это заблуждение. Существует множество шаблонов для решения этой проблемы, и они не включают в себя сведение всего к сумкам добытчиков и сеттеров.

4 голосов
/ 03 апреля 2011

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

Вы можете прочитать больше в моем блоге: Объектно-ориентированный анти-шаблон - объекты данных с поведением .


[Предварительный просмотр] Объектно-ориентированный анти-шаблон - объекты данных с поведением:


Атрибуты и поведение

Объекты состоят из атрибутов и поведения, но объекты данных по определению представляют только данные и, следовательно, могут иметь только атрибуты. Книги, фильмы, файлы, даже потоки ввода-вывода не имеют поведения. Книга имеет название, но не умеет читать. В фильме есть актеры, но он не знает, как играть. Файл имеет содержимое, но не знает, как его удалить. Поток имеет контент, но он не знает, как открыть / закрыть или остановить. Это все примеры объектов данных, которые имеют атрибуты, но не имеют поведения. Таким образом, они должны рассматриваться как тупые объекты данных, и мы, как разработчики программного обеспечения, не должны навязывать им поведение.


Обход данных вместо поведения

Объекты данных перемещаются по различным средам исполнения, но поведение должно быть инкапсулировано и обычно относится только к одной среде. В любом приложении данные передаются, анализируются, обрабатываются, сохраняются, извлекаются, сериализуются, десериализуются и т. Д. Например, объект обычно переходит от уровня гибернации к уровню обслуживания, к уровню внешнего интерфейса и обратно. В распределенной системе он может проходить через несколько каналов, очередей, кэшей и в конечном итоге попадать в новый контекст выполнения. Атрибуты могут применяться ко всем трем слоям, но определенное поведение, такое как сохранение, анализ, сериализация, имеет смысл только в отдельных слоях. Следовательно, добавление поведения к объектам данных нарушает принципы инкапсуляции, модульности и даже принципы безопасности.


Код написан так:

book.Write();  
book.Print();   
book.Publish();  
book.Buy();  
book.Open();   
book.Read();  
book.Highlight();  
book.Bookmark();  
book.GetRelatedBooks();   

может быть изменен следующим образом:

Book book = author.WriteBook();  
printer.Print(book);  
publisher.Publish(book);  
customer.Buy(book);  

reader = new BookReader();   

reader.Open(Book);   

reader.Read();  
reader.Highlight();  
reader.Bookmark();  

librarian.GetRelatedBooks(book);  

Какую разницу может принести естественное объектно-ориентированное моделирование! Мы прошли путь от одного монструозного класса Книги до шести отдельных классов, каждый из которых отвечал за свое индивидуальное поведение.

Это делает код:

  • легче читать и понимать, потому что это более естественно
  • проще для обновления, потому что функциональность содержится в меньших инкапсулированных классах
  • более гибкий, потому что мы можем легко заменить один или несколько из шести отдельных классов переопределенными версиями.
  • легче тестировать, потому что функциональность разделена, и легче имитировать
1 голос
/ 19 сентября 2008

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

«Бизнес-сущность» - это моделирование объекта реального мира, и оно должно включать в себя всю бизнес-логику (поведение) и свойства / данные, которые объектное представление имеет в контексте вашего программного обеспечения.

0 голосов
/ 19 сентября 2008

Если вы планируете выставлять свои сущности миру, вам лучше (как правило) избегать поведения сущности. Если вы хотите централизовать свои бизнес-операции (т. Е. ValidateVendorOrder), вы не хотели бы, чтобы у Order был метод IsValid (), который запускает некоторую логику для проверки себя. Вы не хотите, чтобы этот код выполнялся на клиенте (что, если они его выдумали. Т. Е. Похоже на то, чтобы не предоставлять какой-либо клиентский интерфейс для установки цены на элемент, помещаемый в корзину для покупок, а размещать поддельную цену на URL-адресе. у вас нет проверки на стороне сервера, это нехорошо! И дублирование этой проверки ... избыточно ... СУХОЙ (не повторяйте себя).

Другим примером того, как поведение на объекте просто не работает, является понятие ленивой загрузки. Сегодня многие ORM позволят вам лениво загружать данные, когда свойство обращается к сущностям. Если вы создаете 3-уровневое приложение, это просто не работает, так как ваш клиент в конечном итоге непреднамеренно попытается сделать вызовы базы данных при доступе к свойствам.

Это мои аргументы, которые мне не подходят, чтобы скрыть поведение сущностей.

0 голосов
/ 19 сентября 2008

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

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