Entry

本日の分からない設計 - フィールドを private にするは非常識

2009年02月03日

古本も含めて,「開発の現場」のバックナンバーを買い集めたもんで,順番に読んでたんですけれど,個人的に謎な設計があったので,ちょっと書いてみます。批判するとかではなくて,本当に分からない。

開発の現場 特別版 vol.001 The 実装技術!

翔泳社
売り上げランキング: 234826
おすすめ度の平均: 3.0
3 総集編

話は,「特別版 vol.001」にあった「昨日の常識は今日の非常識」というコラムから。

・フィールドは private とする

有効な理由: 常識

無効な理由: デザインパターンを適用する場合、Visitor、Builder、Factory、Iterator など、オブジェクトの実装と密接に関連する外部クラスを用意する必要が多々ある。逆に、フィールドを public/protected なゲッタメソッドで公開する代わりに、これらの外部クラス経由で操作させるほうがむしろカプセル化を守ることができる。すなわち、カプセルの単位を単独のクラスではなく関連するクラス群として考える。したがって、フィールドは private としてパッケージ内の関連クラスに直接公開するほうがよい

これは無効な理由がそのまま筆者の見解です。もちろん、大前提としてパッケージの範囲を狭く取ることが必要です。

「昨日の常識は今日の非常識」『開発の現場 特別版 vol.001 The 実装技術!』(arton,宇野るいも,翔泳社,2007年,p49)

これ,言ってる意味分かるでしょうか?あたしにはさっぱり分からない。日本語的に,「逆に」や「したがって」が何を受けているのか分からんってのもあるんですけれど,設計的にもちと分からない。

あたしゃ最近 C++ の人だから,パッケージプライベートってな概念が希薄なんですけど(Java ではアクセス修飾子を指定しないとパッケージプライベートになる),C++ で言うなら名前空間で括って,パッケージプライベートにしたいクラスを,ローカルヘッダで include することで対応できるんだと思います(コンパイル単位を分けて外部非公開のクラスを作るということ)。ただ,Java の文脈で見ても,オブジェクトのメンバを public/protected なアクセサで公開するかの話と,外部クラス経由でオブジェクト操作させるかの話は別物なんじゃないだろうか。つまり,やろうとしている目的のレベルが別物なわけで,両者は背反するもんじゃないんじゃないだろうか,とつらつら。

引用では,フィールドを private にする理由を「常識」で一蹴しているけれども,これには一応理由が合あって,オブジェクト内部のデータ構造をクライアントが意識しなくてもいい仕組みにするためだったりします。こうしておくと,内部のデータ構造を変更した場合も,クライアントにまで影響することがなくなります。一方,オブジェクトをパッケージプライベートにして,操作用のクラス経由で操作するっつのは,パッケージプライベートなオブジェクトの内容に依存しないで,「パッケージの」使い方(インターフェイス)を統一できることがメリットなんだと思う。ポリモーフィズムを使えば,ほぼ完全に内部実装を隠蔽することができます。

しかし,これって単純にカプセル化の単位が異なってるだけなんじゃないだろうか。どちらかを選択しなくちゃいけないってなものじゃない。つまり,パッケージ内部では,パッケージプライベートなオブジェクトも普通のオブジェクトなわけで,private にしておかないと,メンバは丸見えになってしまう。で,「丸見えでもいい」というのが引用の言なわけだけれども,そのメリットってなんなんだろう……。単純に,アクセサ作るのがめんどい,とかいった話なんだろうか。

また,「外部クラス経由で操作させるほうがむしろカプセル化を守ることができる」っつのも,どの単位で見るかによるんだと思う。全てアクセサ/アクセス用クラス経由でアクセスすることと比べたら,カプセル化の程度が下がってるようにしか思えないんだけれど……。何か勘違いしてるんだろうか,あたし。

個人的には(一般的にもそうだろうけど),メンバを丸のまま公開するってのは,大域変数を追加することと同じようなもんだと思っていて,どのレベルであれ,あまりするもんじゃねい,といった考え方だったりします。その方が拡張性を確保するにしても保守性を担保するにしても,安全牌だから。

ちょっと引用の趣旨がよく分からなくて,しばらく悩んでます。もすこし悩む。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN