Edited at

オブジェクト指向の神 〜ゴッドクラス と ゴッドメソッド〜

More than 3 years have passed since last update.


はじめに

巷では、OOPでは大量のメソッドを保有する万能クラス (ゴッドクラス) を作ってはいけないらしい。また、1メソッドあたり3行程度であるべきで、長いメソッドを書くのはオブジェクト指向的ではないらしい。そういうコードを書くやつはオブジェクト指向がわかっていないのだそうだ。

そこで純粋オブジェクト指向言語Smalltalkの標準ライブラリではそのような原則が徹底されているのか、フリーな実装 (Pharo3.0, Pharo4.0(dev), Squeak4.5) のインストール直後でのクラスライブラリを調べてみた。


ゴッドクラスはいねーがー?

Smalltalkでは以下のコードでメソッド数最大のクラスを調べることができる。

"God class that defines the largest number of own methods in it"

(ProtoObject allSubclasses collect: [ :c | c selectors size -> c ]) max

結果

Smalltalk
class
number of own methods

Pharo3.0
Morph
887

Pharo4.0(dev)
ScriptLoader
919

Squeak4.5
Morph
1,185

Squeak4.5のMorphクラス単独で1185個のメソッドを定義している。

さすが多様性のSqueakである。そして、Morphクラスの多様なGUIフレームワークとしての面目躍如だ。

上記は各クラスが定義しているメソッド数を調べた。しかしSmalltalkには継承がある。そこで、継承されたメソッドも含めて全メソッド数を以下のコードで調べた。

"God class that holds the largest number of methods including inherited ones"

(ProtoObject allSubclasses collect: [ :c | c allSelectors size -> c ]) max

結果

Smalltalk
class
number of all methods

Pharo3.0
FileDialogWindow
1,736

Pharo4.0(dev)
FileDialogWindow
1,736

Squeak4.5
ZoomAndScrollMorph
2,066

やはりSqueak4.5の圧勝である。神と崇めよ。


ゴッドメソッドはいねーがー?

次にリファクタリング等で目の敵にされる長大なメソッドを調べる。

Smalltalkではメソッドもオブジェクトなので、以下のコードで最大行数のメソッドを簡単に調べることができる。

"God method that consists of the largest number of lines"

(CompiledMethod allInstances collect: [ :m | m getSource asString lines size -> m name ]) max

結果

Smalltalk
method
number of lines

Pharo3.0
ISOLanguageDefinition class>>iso3166Codes
1,964

Pharo4.0(dev)
ISOLanguageDefinition class>>iso3166Codes
1,964

Squeak4.5
ISOLanguageDefinition class>>iso3166Codes
1,964

まさに三国志の様相。5行以上のメソッドを「オブジェクト指向がわかってないヤツが書いたゴッドメソッド」と仮定すると、このメソッドには392柱の神が宿っていることになる。きっと、走る南風に乗ってくるに違いない。

行数だけではナンなので、文字数でも調べてみた。

"God method whose source code has the largest number of characters"

(CompiledMethod allInstances collect: [ :m | m getSource asString size -> m name ]) max

結果

Smalltalk
method
number of characters

Pharo3.0
OpenSansRegular class>>fontContents
664,639

Pharo4.0(dev)
SourceSansProRegular class>>fontContents
425,157

Squeak 4.5
UCSTable class>>initializeKSX1001Table
132,404

文字数では圧倒的な差がついた。メソッドの神はPharo3.0に宿るようだ。640*1024 < 664639であるから、DOSマシンの640KiBのメインメモリにはたかが1本のメソッドのソースも格納できないことがわかった。


まとめ

今回調べた3つの処理系いずれにも巨大なクラスがあり、また、極めて長大なメソッドがあることがわかった。特に、クラスの神はSqueakに宿り、メソッドの神はPharoに宿っているようだ。

ちなみにオレが納品したPharoベースの某システムには 832,489文字のメソッドが。神を超えたキリリ。メソッドのソースが812KiBということはオレが最初に買ったマシンであるPC-8801のメインメモリとVRAMが7台分あってもまだ足りない。科学技術の進歩に感謝します。


関連情報

PLHXさんがGNU Smalltalk でゴッドクラスとゴッドメソッドを調べるを投稿してくれました。なるほど、GNU Smalltalkは、とても清いSmalltalkなのですね。