search
LoginSignup
37

More than 5 years have passed since last update.

posted at

updated at

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

はじめに

巷では、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なのですね。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
37