2011-01-31 69 views
7

如果Single Responsibility Principle适用于OOP和Smalltalk(&红宝石一样)被认为是最OO语言为什么能Object类这么多的响应消息中的一个?单一职责

短短几年从Object methodDict explore

  • 检查,探索,浏览,打印:上:
  • 接受(?访问者模式中的所有对象)
  • 副本,deepcopy的,加盟,joinTo,在:在:修改:
  • asString,的asfunction,asOrderedCollection(为什么不是资产也?)
  • 海边的:asLink,asJson,asJavascript

这是不反对的责任(例如用户域模型应该只关心自己的私人邮件,支付等)

编辑:他们中的一些有意义的(asString,asOrderedCollection,接受通知),而其他人似乎很奇怪(在:,的asfunction,deepcopy的,加盟,joinTo)

+0

Whoaa,我们抱怨说,.NET的Object类是太大了(它只有7方法总数)! – 2011-01-31 09:46:40

+0

heh,Object.new在Ruby 1.9.2中有56个方法。 – steenslag 2011-01-31 10:18:54

回答

8

您必须考虑Smalltalk的模块化特性。即,方法定义独立于类定义,因此Object上的方法可以与它们相关的应用程序(例如Seaside)封装在一起。这些扩展方法不是基本系统的一部分,所以它们只从它们所属的包的角度向它们的类添加责任。其中很多方法都是简单的双派点:如果anObject asFoo只是简单地委托给Foo fromObject: anObject,我不会说它会给班级增加很多责任。

像反光方法inspectcopydeepCopy概念对他们Object的地方,但我同意,有更好的架构进行反思(Mirrors)。

现在,Smalltalk中可能与美的原则的理想,但你必须采取特定的实现与盐:)

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

6

有几个原因:

  • 对象和ProtoObject是Smalltalk的对象模型的基础上,所以这是正常的,他们有很大的responsibil ities,如照顾复制,序列化等
  • The law of Demeter可能在这里更重要:谁会照顾这些功能,如果不是对象本身?
  • 很多这些功能都用于调试和表示目的。你可以不浏览,浏览和检查(但它们非常有用)。

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

0

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

随着巨大的权力来承担巨大的责任。

在其他系统中,其中的对象仅仅是整个系统的一个子域,对象没有做那么多,所以并不需要给予这么多的命名责任。