OOコード養成ギブスのコメント欄の和訳 その3

Binstock on Software: Perfecting OO's Small Classes and Short Methodsのコメント欄より。OOコード養成ギブスのコメント欄の和訳 - @katzchang.contextsの続きのOOコード養成ギブスのコメント欄の和訳 その2 - @katzchang.contextsの続き。

Paul Keeble said...

えっと、この練習をやったあとにどうなるかは面白そうだね:

  1. 作ったクラスは小さく多数になる。同僚が作るよりも、桁外れに。
  2. 再利用性が高く部品化された状態で仕上がる。
  3. 作ったドメインモデルには、作ってもない多数の拡張機能ができるし、多分二度と作らない。
  4. 2つしかインスタンス変数を持たないルールは、2回破る。出来るかどうか検討するために。
  5. getterとsetterがなくても寂しくなくなる。
  6. ビジネスコードの"Micro reports"はずっと問題になってたが、getterなしで書くとロジックと結合させられるので、全く必要なくなる。

個人的には、プログラムは短くて済んだかも知れないけど、ナイスでシンプルにユニットテストが出来るだろうし、理解しやすくなると確信できる。
そのコードは自分が普段書いたのとか一般的なものは違う感じだろう。この練習で上達したような気はするし、お勧めするよ。

言語構造にとって、係り受け超重要。

Terry said...

smalltalkでは超常識だね。他のsmalltalkルールとしては、Kent BeckSmalltalk Best Practice Patterns、pg 22によると、

プログラムを、一つの明示的なタスクを担当するメソッドに分割せよ。あるメソッドの演算は同じレベルで抽象化せよ。そうすれば、数行からなる小さなメソッドの多数の集合に、プログラムは自ずから仕上がる。

引用部、もっと良い訳はあるだろうけれども。

Net Pryce said...

面白いけど、オブジェクト指向にマッチしないのがあるね。手続き型言語での抽象データ型っぽい。オブジェクト指向言語で常識のルールに触れるのは1つじゃない。多態とか。
こんなルールはどう?:"else"だけじゃなく、"if"も使うな。

羽生さんが「if撲滅」って言ってたのを思い出した。

Ixulai said...

データベースの正規化問題と同種に見える。
第5正規形は知識として知っておいた方がいいけど、常に使うべきとはいえない、みたいな。
使いやすくて保守しやすいように非正規化する練習があるといいね。

第5正規形は、http://www.atmarkit.co.jp/fdb/rensai/db_enginer03/db_enginer03_4.html#10。エンティティの属性を分割する、みたいなやり方で、プリミティブを直接使うなとか、インスタンス変数は2個まで、とかの制約と、確かに似てる。

Christain Vest said...

クラス当り50行以下

ちゃんとしたjavadoc書くと無理じゃない?
厳密にjavadoc書くと30行くらいは必要。そんなに少ない行数くなら、不自然にクラスを分割することになって、低凝集で密結合になる。

Evangelos said...

Nat Pryceに同意。この制約の「手続き型言語での抽象データ型」問題が原因で、ドメインモデルじゃなく、CとかPythonとかLispをやたらとハックする方向になる。これを守ると、違う意味で局地汚染が問題になる。

LOC pollution(local pollution)は、何か有名なアンチパターン

Andrew Binstock said...

@christain vest.
君は正しい。この提案はJavadocなしの行数で考えている。じゃなきゃ、小さいメソッドはJavadocだらけになって、1画面にクラスがおさまるわけないからね。

ようやくご本人の登場。

Andrew Binstock said...

@nat pryce, @evangelos.
全体的には同意するけど、この練習はオブジェクト指向のキーであるカプセル化を支援するものだ。

多態よりもカプセル化という立場。

Nat said...

超知ったかぶりするけど、このルールで考えさせられるのは「データ隠蔽」で、「カプセル化」じゃない。直交する概念だよ。

冒頭の節「To be super pedantic, ...」は、謙遜のニュアンス?一般的にはデータ隠蔽によってカプセル化、だけど、どういうことだろか。

Christain Vest said...

@binstockへ、上限50行の件。
実際のJavaコードだけを数えて、Javadocの行数は50行にカウントしないとしたら、負けだね。エディタの画面にフィットするから良いっていう理由がないし。もちろん、javadocで自動改行を使うか、全メソッドに対して価値あるドキュメントを作るとしてinterfaceにjavadocをつけるか、どっちにしても綺麗じゃない。どちらもでっち上げの自傷行為への逝かれた答えだ。前者はloop-holeっぽいし、後者は…どうだろう。どっちにしても良いとは思わないし、まぁともかく、Qi4jとかのコードスタイルになるだろうね。

初心者にオブジェクト指向を叩き込むのには良いんじゃないかってコメントもある。それなら、javadocを書かない前提ってのを明示した方がいい。初心者にとって、この制約に従う方が、javadocを書く癖をつけるより重要ならね。

厳しいご意見。