smalltalk中的单一责任

Kam*_*šík 7 ruby oop smalltalk object

如果单一责任原则适用于OOP并且smalltalk(以及ruby也被认为是最OO语言之一)为什么Object类可以响应这么多消息?

只有几个Object methodDict explore:

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

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

编辑:其中一些是有意义的(asString,asOrderedCollection,接受,通知),而其他似乎很奇怪(at:,asFunction,deepCopy,join,joinTo)

Dam*_*let 8

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

像反光方法inspect,copy,deepCopy在概念上有他们的地方Object,但我同意,有反思(更好的架构镜).

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

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

  • Ruby中需要这些元编程方法,因为开发人员必须处理文本文件.在Smalltalk中,我们将正在运行的程序修改为活动对象,因此元编程通过一次性IDE命令完成,并且很少出现在域代码中.Lisp中没有宏设施.对于访问者,我们只是告诉浏览器请生成它们,它创建了2个新方法.重构也是如此.对于更复杂的东西,我们可以根据需要生成整个类,但这不是常见的做法. (2认同)

小智 6

原因如下:

  • Object和ProtoObject是Smalltalk对象模型的基础,因此它们承担着很大的责任是正常的,比如负责复制,序列化等.
  • 德米特定律在这里可能更重要:谁将负责这些功能,如果不是对象本身?
  • 很多这些函数都用于调试和表示.你可以在没有浏览,探索和检查的情况下工作(但它们确实非常有用).

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