Единственная ответственность в Smalltalk - PullRequest
7 голосов
/ 31 января 2011

Если Принцип единой ответственности применяется к ООП, а smalltalk (и & ruby ​​также) считается одним из наиболее распространенных ОО-языков, почему класс Object может отвечать на такое количество сообщений?

Лишь немногие из Object methodDict explore:

  • проверять, просматривать, просматривать, распечатывать:
  • принять (шаблон посетителя на всех объектах?)
  • copy, deepCopy, join, joinTo, at :, at: modify:
  • asString, asFunction, asOrderedCollection (почему не asSet также?)
  • Приморские: asLink, asJson, asJavascript

Это не ответственность объекта (например, модель домена пользователя должна интересовать только его личные сообщения, платежи и т. Д.)

EDIT: некоторые из них имеют смысл (asString, asOrderedCollection, accept, notify), в то время как другие кажутся довольно странными (at :, asFunction, deepCopy, join, joinTo)

Ответы [ 3 ]

8 голосов
/ 31 января 2011

Вы должны учитывать особенности модульности Smalltalk. А именно, определения методов не зависят от определений классов , поэтому методы в Object могут быть упакованы с приложением, к которому они относятся (например, Seaside). Эти методы расширения не являются частью базовой системы, поэтому они только добавляют обязанности к своему классу с точки зрения пакета, к которому они принадлежат. Многие из этих методов являются простыми точками двойной отправки: если anObject asFoo просто делегирует Foo fromObject: anObject, я бы не сказал, что это добавляет большую ответственность классу.

Рефлексивные методы, такие как inspect, copy, deepCopy, концептуально имеют свое место в Object, но я согласен, что существуют более эффективные архитектуры для отражения ( Mirrors ).

Теперь, Smalltalk может быть идеалом с прекрасными принципами, но вы должны принять конкретные реализации с недоверием:)

Системы Smalltalk имеют тенденцию эволюционировать в большие монолитные системы, потому что базовую систему легко изменить, и потому что заманчиво использовать изображение в качестве артефакта разработки, минуя передовые методы непрерывной интеграции. В конце концов, многие из этих забавных классных обязанностей обусловлены историческими / практическими причинами; это особенно верно в отношении Squeak, потому что он в первую очередь разрабатывался в качестве платформы для быстрых мультимедийных экспериментов, а не для обучения в области разработки программного обеспечения или в промышленных целях (что и стремится Pharo).

6 голосов
/ 31 января 2011

Несколько причин:

  • Object и ProtoObject являются основой объектной модели Smalltalk, поэтому обычно они несут большие обязанности, такие как забота о копировании, сериализации и т. Д.
  • Закон Деметры может быть более важным здесь: кто позаботится об этих функциях, если не сам Объект?
  • Многие из этих функций существуют для целей отладки и представления. Вы можете работать без просмотра, изучения и проверки (но они действительно полезны).

По сути, все эти сообщения представляют все, что может сделать объект, и вы можете многое сделать.

0 голосов
/ 13 ноября 2015

Поскольку в Smalltalk - все является объектом, и корневой класс Object по существу должен управлять всем поведением системы, включая иерархию классов (поскольку все классы являются объектами) и иерархию метаклассов.

С великой силой приходит большая ответственность.

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

...