2011-01-31 70 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中 - 所有東西都是是一個對象,並且根對象類本質上必須控制所有系統行爲,包括類層次結構(因爲所有類都是對象)和元類層次結構。

隨着巨大的權力來承擔巨大的責任。

在其他系統中,其中的對象僅僅是整個系統的一個子域,對象沒有做那麼多,所以並不需要給予這麼多的命名責任。