Squeak Smalltalk のクラス階層の深さ

Smalltalk のクラス階層が深すぎる気がする

Twitter / 星一


というつぶやきを見かけたので、調べてみました。

| dict |
dict := Dictionary new.
SystemNavigation default allBehaviorsDo: [:class | 
    class isMeta not ifTrue: [
        (dict at: class allSuperclasses size ifAbsentPut: [OrderedCollection new]) add: class]].
World findATranscript: nil.
dict inspect; keysAndValuesDo: [:key :val |
    Transcript cr;
        show: key;
        show: ' -> ';
        show: (String new: (val size // 5 max: 1) withAll: $|)]


出力はこちら。

0 -> ||||
1 -> |
2 -> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3 -> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4 -> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5 -> |||||||||||||||||||||||||||||||||||||||||||||||||||||
6 -> |||||||||||||||||||||||||||||||||||||
7 -> ||||||||||||||
8 -> |||||||||
9 -> ||
10 -> |


確かに全体的に深めで、7 - 8 レベルにも馴染みのクラスが見つかります。最大が 10 というのもまた深いですね^^;。

EToyMultiChatMorph allSuperclasses asArray reversed
=> {ProtoObject . Object . Morph . BorderedMorph . RectangleMorph . AlignmentMorph . AlignmentMorphBob1 . 
    EToyCommunicatorMorph . EToyChatOrBadgeMorph . EToyChatMorph}
EToyProjectQueryMorph allSuperclasses asArray reversed
=> {ProtoObject . Object . Morph . BorderedMorph . RectangleMorph . AlignmentMorph . AlignmentMorphBob1 . 
    EToyGenericDialogMorph . EToyProjectRenamerMorph . EToyProjectDetailsMorph}