はじめに
巷では、OOPでは大量のメソッドを保有する万能クラス (ゴッドクラス) を作ってはいけないらしい。また、1メソッドあたり3行程度であるべきで、長いメソッドを書くのはオブジェクト指向的ではないらしい。そういうコードを書くやつはオブジェクト指向がわかっていないのだそうだ。
そこで純粋オブジェクト指向言語Smalltalkの標準ライブラリではそのような原則が徹底されているのか、フリーな実装 (Pharo3.0, Pharo4.0(dev), Squeak4.5) のインストール直後でのクラスライブラリを調べてみた。
ゴッドクラスはいねーがー?
Smalltalkでは以下のコードでメソッド数最大のクラスを調べることができる。
(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](http://qiita.com/PLHX)さんが[GNU Smalltalk でゴッドクラスとゴッドメソッドを調べる](http://qiita.com/PLHX/items/a602342ba439b06e818c)を投稿してくれました。なるほど、[GNU Smalltalk](http://smalltalk.gnu.org/)は、とても清いSmalltalkなのですね。