2014年04月

getter setterしかないクラスを作るのはオブジェクト指向的ではない

ある日いきなりアクセスが増え始めた。まぁ、どうせ一時的なものだろうから、今のうちに何かと書いておこう。

オブジェクト指向入門書で一番の問題は、動物クラスから派生したキリンクラスとかいう説明をすることだ。もしくは、だった。こういった例は実に説明しやすい。多重継承だって完璧だぜ。ポリーモルフだって、dog->bark()でOKだ。じゃあ何が問題なのか?どっかのだれかが一般システム思考というのはよろしくないといっていたが、それと同じことだ。

こういった本を読みオブジェクト指向に入っていった人は勘違いする傾向が多い。何でもかんでも一般化してしまいたがる。だから、役にも立たないクラスをたくさん作ることになる。フレームワークで規定されているなら仕方がない。フレームワークとはそういうものだからだ。そうでもないのに、getter setterしかないクラスをたくさん作ってどうなるというのだ。直接アクセスをさせないから安全?それは明らかに間違っている。

class Human{
private:
String  name;
String address;
public
        String getname()
String getAddress()
        String setname()
String setAddress()

}

human.name と書くことが、human.setnameと書くよりどれだけ安全だというのだ。
そしてこれはカプセル化では決してない。何一つ隠蔽していないでしょ。データ構造を見せずに処理を行ってこそカプセル化なわけだ。だから単純なgetter setterしかないのならばカプセル化とは完全に無関係だ。犬や猫に限らず、現実世界から想定したものをデザインに加えると、ほとんどのクラスがスカスカのgetter setterのみになる。だから僕らは現実世界から想定したクラスを作成するべきではないのだ。

もう一度クラス作成のメリットを思い出そう。データとその操作を一緒くたにできることだ。だから、クラスを作成するのに一番役に立つのは、個別メンバにいちいちアクセスさせるのは面倒であるような構造をもったデータ型がある場合だ。XXTreeとかXXMatrixなんてものだと最適だろう。

だから間違ってもDBから表を作って画面に出すだけなのに、DBの内容をわざわざ人間クラスやらに再構築して、画面で再構成などしてはいけない。そのDBに人間が直感的に理解できる現実世界の意味などないかもしれないが、表という構造にはそれ以上の確実な価値があるからだ。インピーダンスミスマッチなどというものは実際存在せず、仕事もしないおたく連中が作り出した妄想に過ぎない。

オブジェクト嗜好に愛をこめて

「実はオブジェクト指向ってしっくりこないんです」から4年

 相互リンクも張らずにひっそりやっているページなのに、何か人が多いと思ったらここから来てたのか。ふふふ、上記リンクが僕の別名HPだとはしらずに・・・・・・ウソだよ。

一言だけ言っておくと、僕のこの話は4年どころではなく10年以上前の話だ。もしも10年前といわれたら、彼とはどこかで一緒に仕事したという疑いを持ったに違いない。デザインパターンをそこまで批判的に語る人間というのは結構限られているからだ。

デザインパターンが一般教養的に語られる状況でそれが役に立たないことに気づく、そういう場合に謙虚にもこう思ってしまう人が結構いる。「有名な人たちが言っていることだし、それが役に立たないのは自分たちが悪いんじゃないか」と。そして、そう考えない人間もいるが少数派だろう。その社会不適合者は、もともと斜に構えているかその有名な人たちが出来ないということを知っているかだ。僕は後者だ。そして、有名人に近づくきっかけとなったのは「有名な人たちが言っていることだし、それが役に立たないのは自分たちが悪いんじゃないか」 という思考だった。若かったなぁ。 

まぁ、そんな取るに足らない話より明日の名人戦が気がかりだ。羽生奪還なるか。 
最新コメント
QRコード
QRコード
  • ライブドアブログ