缶詰の中の缶切り |
カプセル化の目的
隠蔽の目的
| 継承の目的
| 多態の目的
| |
多機能マシンは使いづらい |
汎用性は無駄の固まり
抽象化は汎用性を削ぎ取る
| |
作る人と食べる人
エンドユーザーコンピューティング
| |
単機能部品 複合部品 制御部品 業務部品 ビジネス部品
機能別
| 二次元的分類
| |
手続き指向 -> データー中心指向 -> OBJ指向 |
缶詰の中の缶切り
よく、オブジェクト指向の概要とかっていう解説にはオブジェクト指向とは ・・・ 「デ ータと処理をカプセル化したもの」・・・ なんていうオブジェクト指向の定義みたいのが 載っているけど、でも、「それがどっした」って感じなんだよね!!
エライ学者さんが言ってたけど、オブジェクト指向を説明するにはスペイン語(オブジェ
クト指向)でスペイン語(オブジェクト指向)を解説するようなものでスペイン語(オブジェク
ト指向)がわからなければ解説自体わからない、逆にスペイン語(オブジェクト指向)がわか
れば解説なんていらない・・・
たぶん、オブジェクト指向自体、どっちかというとボトムアップ指向なので、理論から
入りたがる傾向があるのかな?
|
そこで、まずは、オブジェクト指向の目的から。
オブジェクト指向自体、その使う環境によって目的が違うと思うだが・・・.
たとえば、オブジェクト指向OSとかオブジェクト指向開発技術とか、オブジェクト指
向クッキング(?)とか・・・
いずれにしても、より使いやすくとか、作りやすくといったように、作業を楽にとか、
より良いものといった目的にでは一致するようだね。
これって、「ツール」っていう概念がもつ目的と同じような気がするのだが・・・。
ひょっとして オブジェクト指向 = ツールかな・・・・。
それじゃあ、どうしてオブジェクト指向を(ツールとして)使うと作業が楽になって、
良いものができるんでしょう・・・・
逆に、どう使えば、楽になって良いものができるか、さあ〜みんなで考えてみよう〜
話がわかりやすいように「オブジェクト指向開発技術」に特化して考えてみましょう。
カプセル化の目的
最初に、「データと処理をカプセル化したもの」 という定義について考えてみました。
たとえば、実世界をコンピュータの世界に置き換えることをモデリングと言うようです
が、従来は、これを、もともと実世界では一体となっているデータと処理をわざわざの2
つの側面(視点)に分解して、コンピュータの中に置き換え(投影し)て最終的にそれら
を再び関連付けてAPとするという方法で行っていました。
カプセル化の目的を素直に考えると以上のように実世界を忠実にコンピュータの世界に
モデリングするということが一つといえるのかな?
隠蔽の目的
|
実は上記以外にカプセル化の意味としてまだあるのですねぇ・・・ 一緒にするという意味は、なにも物理的に近くに置く(実メモリ上の近くに置く)とい う意味では無いですよね!!
それは、いままでのように、データとデータ、処理と処理、データと処理との関係がす
べて平等だったのに対し、オブジェクト指向では、「データと処理の固まり」対「データ
と処理の固まり」という関係のなかで、アクセスできるデータ・できない処理、と、いう
ように平等ではなくなってしまったのです。 それまで、ソフトウエアの世界では、アセンブラやC言語のように自由に何でもできる のが良いとする 風潮があったようですが、現在では、「プログラマーの勝手にはさせないぞ」といろいろ な規制をつけてきたのですよ。しかし、これによってプログラマーは反面、楽になったの です。自由という不自由、不自由という自由です。余計なことをしなくて良い分、ほかの ことに集中できるのです。個性が失われる危険性はありますが・・・。
話がそれましたが、隠蔽により、カプセル内のデータにはカプセル内の処理からしかア
クセスできなくし、外部からはカプセル内の外部インターフェースの役割をもつ処理が、
外部からのリクエストにもとづいて内部のデータにアクセスして結果を返すのです。 したがって、カプセル化の目的を発揮するためには、実世界を良く観察して理解し、適 切にカプセル化することと、カプセル内部の本質部分を現すデータには外面的な性質を現 すインターフェース関数からのみアクセスを許すように制限を適切に課すことが必要とな ります。
いろいろな性質をもつ複数の実体を一つのカプセルにしたり、アクセス許可を無制限に
なんかするようだと、オブジェクト指向を活用できないのです。
継承の目的
|
実は、オブジェクトには繁殖能力があるみたいなのです。
多態の目的 多態というのは態度が多い、つまり、親から受け継いだ性格(メソッド)をちょっとア
レンジ(変更)することができることを言います。でも、本質(データの形式)は変えら
れないのですね。 | この「ちょっと」というのがなかなか曲者で、完全に変えるには新たな性格を追加すれ ば良いのですが、この「ちょっと」にはちょっと深い意味があるのです。 「ちょっと」とは親と同じ名前の性格(メソッド)でちょっと違う性格を実装すること ができ、「ちょっと」でない場合は名前を変えるのです。また、こんなことは無いと思い ますが、性格を削除(実際には何もしないように定義)することもできます。 では、なぜこのようなことができるのかというと、親として産まれる子どもの性格が予 測できない場合にせめて性格の名前だけでも決めておきたいというような、けなげな親心 を実現するためかもしれません。 もし、産まれた子どもが決めた名前の性格をもっていなかったら、親が代わりに面倒み ることもできますし、親が子どもの使用者にこの性格は絶対実装してよって注意すること もできます。 また、親を汎用化でき、少ない親でいろんな子どもができるようになります。プログラ マーも親を造る手間が省けますし・・。 クラスライブラリーとして供給するときはこの機能は便利です。 ただし、これも使いすぎると・・・怪我のもと・・・
|
モジュールの評価
隠蔽の目的でも触れましたが、モジュールの良さをあらわす尺度として、「強さ」とい
う言葉があります。これはそのモジュールがどれだけ他の関連するモジュールからの影響
をブロックできるかを表します。
|
オブジェクトの自己完結
上記のモジュールの強さと優しさでもありましたが、強いモジュールは自己完結します。
統制だけを行うオブジェクトと完全な自己完結なオブジェクトの二つに分けてやれ・・
っと。 |
データは変わらない
オブジェクト内のデータは、そのものの本質を表すというのは、ちょっと述べましたが、
世の中にある実体でも、その本質は時間が経過してもほとんど変わりません。 |
多機能マシンは使いづらい
オブジェクト指向は優れた理論で、開発者に恩恵を与えることは事実かもしれませんが、
あまりにも多機能すぎて素人にはちょっと使いづらい道具でもあると思います。 |
汎用性は無駄の固まり
部品化する一つの目的はその部品をいろいろなシステムでも使用できるようにするとこ
ろにあるはずですが、自動車の部品でTVにも使える部品は決して多くないのと同じよう
に、似たようなシステム間では流用できても、まったく違ったシステムではほとんど使え
ないはずです。
抽象化は汎用性を削ぎ取る
よく、「開発資源の有効利用」なんていう、なんとも甘い言葉を聞きますが、開発しな
がら部品なんてできっこ無いと素人はかんがえるのです。 |
長くて、拙い文章を我慢強く読んでいただきありがとうございます。
とりあえず完結しました。
目次と内容に違いがあるのは愛敬です。
そのうちに目次にあって内容に無いものについては追加するかもしれません
期待しないでまっててね〜