smalltalk中的单一责任

时间:2011-01-31 08:31:20

标签: ruby oop object smalltalk

如果Single Responsibility Principle适用于OOP而smalltalk(以及& ruby​​)被认为是最OO语言之一,为什么Object类可以响应这么多消息?

来自Object methodDict explore的几个:

  • 检查,浏览,浏览,打印:on:
  • 接受(所有对象上的访客模式?)
  • copy,deepCopy,join,joinTo,at:,at:modify:
  • asString,asFunction,asOrderedCollection(为什么不asSet?)
  • 海边的:asLink,asJson,asJavascript

这不是对象的责任(例如,用户域模型应仅对其私人消息,付款等感兴趣)

编辑:其中一些是有意义的(asString,asOrderedCollection,accept,notify),而其他人看起来很奇怪(at:,asFunction,deepCopy,join,joinTo)

3 个答案:

答案 0 :(得分:8)

您必须考虑Smalltalk的模块化功能。也就是说,方法定义独立于类定义,因此Object上的方法可以与它们相关的应用程序打包(例如,Seaside)。这些扩展方法不是基本系统的一部分,因此它们只从它们所属的包的角度向其类添加职责。其中许多方法都是简单的双重发送点:如果anObject asFoo只是委托给Foo fromObject: anObject,我就不会说它给这个类增加了很多责任。

inspectcopydeepCopy这样的反思方法在Object概念上占有一席之地,但我同意有更好的反思架构(Mirrors )。

现在,Smalltalk可能是一个具有美丽原则的理想,但你必须采取一些盐的特定实现:)

Smalltalk系统倾向于演变成大型单片系统,因为它很容易改变基础系统,并且因为它很容易将图像用作开发工件,绕过了持续集成的良好实践。最后,很多这些有趣的阶级责任归因于历史/实践原因;对于Squeak来说尤其如此,因为它主要是作为快速多媒体实验的平台开发的,而不是用于软件工程教育或工业目的(Pharo的目标)。

答案 1 :(得分:6)

有几个原因:

  • Object和ProtoObject是Smalltalk对象模型的基础,所以他们有很大的责任,比如照顾副本,序列化等,这是正常的。
  • The law of Demeter在这里可能更重要:谁将负责这些功能,如果不是对象本身?
  • 很多这些功能都用于调试和表示。你可以在没有浏览,探索和检查的情况下工作(但它们非常有用)。

基本上,所有这些消息都代表了一个对象可以做的所有事情,而且你可以做很多事情。

答案 2 :(得分:0)

因为在Smalltalk中 - 所有是一个对象,并且根对象类本质上必须管理所有系统行为,包括类层次结构(因为所有类都是对象)和Metaclass层次结构。

强大的力量带来了巨大的责任。

在其他系统中,对象只是整个系统的子域,Object不必这么做,因此不需要赋予这么多命名的职责。