kagamihogeの日記

kagamihogeの日記です。

オブジェクト指向でやるということ

昨日のUML→Cの記事の反応を見て回ってたんですが、みんなボロクソに言ってますね。「こういうやり方もあるんだぁ」的見方なら、評価する点はあると思うけど・・・。Cらしくない異様なコードになるんだったら、素直な書き方したほうが楽じゃん、てのには同意だけどさ。

UML書いてCで実装する、ってとこまでは個人的にはいいと思う。けど、UMLで書かれてる内容を厳密にCに落とし込むのは反対。言語としてオブジェクト指向が備わってないところに無理に持ち込むと、せっかくオブジェクト指向で整理した内容が、かえって複雑な事態を招く原因になりかねない。

オブジェクト指向の目的は物事の単純化。単純化したい対象が複雑であればあるほど、階層をつけるとか順序をつけるとかの(オブジェクト指向に比べて簡易な)整理方法だけでは限界がくる。よって、複雑さに対抗するためにオブジェクト指向という複雑さでコントロールを試みる。

問題は、何らかのプログラミング言語を使用して実装に落とし込むところ。プログラミング言語にはそれぞれ制限があるので、それに適応する形でコードを書くことになる。ただし、「その言語で表現する」ことに捕らわれすぎると、言語固有のテクニックをいかしまくった、複雑怪奇なコードになりかねない。複雑さを緩和するためにオブジェクト指向とかUMLとかで整理してるのに、実装をさらに複雑にしたのでは意味が無い。

よって、方向を逆にする必要があると思う。

Cでオブジェクト指向をやる、のではなく、オブジェクト指向をCでやる。抽象度を落としてくいく方向が違う。前者はCという制限内から考えるが、後者はCという制限内に向かって考えていく。

Cでオブジェクト指向をぜんぶ表現するのは無理があるので、Cという制限内に収まるようにコードを書く。清濁併せ持つ、ってところでしょうか。

ちなみに、実装をJavaでやる場合もこの方向は変えてはいけないと思う。CよりもJavaのほうが格段にやりやすい、って話なだけで。

とはいえ、これをやるにはその言語についてもそれなりに知っている必要が当然ある。ただ、その言語を深く知っていると、どうしてもその言語中心に思考が偏ってしまう。言語ありきでやったほうが良い場面もある(コード品質度外視の速度重視とか)のが難しいところ・・・。