Niftyの過去ログ集 - むすんでひらいての法則
むすんでひらいての法則
Open-Closed Principle(むすんでひらいての法則)の紹介です.この法則は,Robert C. Martin が C++ Report に書いた記事(下記参照)で初めて知りました.彼の存在を知ったのもこの記事が最初だったと思います.
00131/00131 BYI20012 まさーる RE^3:CRC
( 7) 97/05/13 00:32 00130へのコメント
おみな さん、こんにちは。
> 私がCRCを使っているのは、構造化を学んだ人にOOを見せる最初とし
>て一番良い方法ではないかと判断したためです。まさーるさんはどう思
>われますか?
僕は構造化を学んでない人なのでDFDとかどんなものなのか知らないんです。
(構造化といえば構造化プログラミングしか思い浮かばんし...^^;)
CRCカードは、各クラスの守備範囲とどのクラスと協力しあって自分の責任を果
たすか、という点が明確になるのでいいんじゃないかと思います。
ですからデータを中心にして物事を見るというのとは違うんじゃないかと。
うーん、やっぱDFDとか構造化がどんなものか知らないんで答えられないです。
ごめんなさい。
>>#もう一つのOOのイメージは、やっぱOpen-Closed Principleかな
>
> こちらは単語すらわかりません。直訳すると「開閉原理」?違いそう
>ですね(笑)。宜しければ教えてください、ポインタだけでもかまいま
>せんから。
ぼくは勝手に「むすんでひらいての法則」と訳してますが、こいつはいわばネッ
トスケープやフォトショップのプラグインモジュールみたいなもんです。
これらプラグイン対応アプリは、
・プラグインを付け加えたら機能を拡張できる
(拡張性について開いている、Open)
・でも、アプリ自身を修正する必要はない
(修正について閉じている、Closed)
っていうことになります。オブジェクト指向では、このことは継承をつかうと自
然に実現できます。つまり、
class プラグイン {};
class ネットスケープ { void プラグイン追加(プラグイン* ); };
というフレームワークさえあれば、ネットスケープクラスを拡張するのに
class ShockWave : public プラグイン {};
class RealAudio : public プラグイン {};
を作って加えていけばどんどん機能拡張できるし、ネットスケープクラスを修正
する必要はまったくありません。
ここで重要なのは、ネットスケープクラスは、プラグインクラスのインターフェ
イスしか知らないということです。ネットスケープがShockWaveやRealAudioにつ
いて知っていたら、それだけでOpen-Closed Principleが崩れ、拡張性や保守性
がなくなります。
だから、僕はあるプログラムがオブジェクト指向かどうか判定するとき、Open-
Closed Principleが破られてないか? という見方をします。そういう意味でオ
ブジェクト指向といわれてイメージするのはOpen-Closed Principleですね。
> ちなみに私にとってのOOは、モデルを構成する要素のグループ化手法
>の一つです。
そうですね。そういう一面もあると思います。でも、オブジェクト指向の特徴で
ある継承とポリモルフィズムが入ってくるためには、Open-Closed Principleが
あるからと考えるのが僕には一番しっくりきます。ただ、このPrincipleって日
本語で書かれたものを読んだことがないのであまり知られてないんでしょうね。
97/05/12(月) まさーる(BYI20012)
参考資料
- The Open Closed Principle, Robert C. Martin, C++ Report, Jan, 1996
