凪瀬 Blog
Programming SHOT BAR

目次

Blog 利用状況
  • 投稿数 - 220
  • 記事 - 0
  • コメント - 1293
  • トラックバック - 163
ニュース
  • 2008-04-01 *で始まるタイトルはエイプリルフールネタです
    2008-01-26 わんくま勉強会東京#16
    ライブプログラミング
    2007-12-08 わんくま勉強会名古屋#1
    「わんくま初めてのJava」
    2007-07-28 開店
広告
  • Java開発者募集中
  • 経歴不問
  • 腕に自信のある方
  • 富山市内
  • (株)凪瀬アーキテクツ
アクセサリ
あわせて読みたい
凪瀬悠輝(なぎせ ゆうき)
  • Java技術者
  • お茶好き。カクテル好き。
  • 所属は(株)凪瀬アーキテクツ

書庫

日記カテゴリ

 

Javaの登場によってオブジェクト指向(以下OOP)は一気に普及しました。 そのJavaもリリースが1996年と、もはや干支も廻るぐらいの時が経ち、OOPを扱える技術者も増えました。 身近なところでもOOPを使える人が見つかる可能性は高くなりましたし、学習がより行いやすい環境になってきていると思います。

それでもOOPを解するための壁は厚いと言わざるを得ません。 静的オブジェクト指向は設計者が苦労を背負込むシステム の稿では

Javaの静的オブジェクト指向というのは、クラスを設計する側の立場に立つと非常に苦労するものなのですが、クラスを使う側には非常に楽なものなのです。 Java界隈で仕事をする会社の新人教育は、この「クラスを使うことができる」レベルまで到達出ていればよいとされていると言って過言ではないでしょう。

と、OOPで設計されたクラスの「使い手」と「作り手」に求められる技術力の壁を指摘し、まずは「使い手」レベルまで到達する必要があることを述べました。

ソースコードを追いかけにくい理由

OOPの壁はなんといってもポリモフィズム(多態)ではないでしょうか。

ポリモフィズムによって、実行時に動的に処理のフローチャートが切り替わるのです。

この動的フローは 構造化定理で挙げられる「順次・反復・分岐」の3つの基本的な論理構造と、 それを基に構造化プログラミングで提唱された「サブルーチン」という古典的な処理フローとは異なるパラダイムです。

そして、このパラダイムは 高階関数(関数を引数や戻り値とする関数)などを用いる場合には理解していなければならなず、 既存の言語でそれを得てきているのであれば、ポリモフィズムを理解するための基礎的な道具は揃っており、 OOPへの移行はそれほど大きな壁とはならないことでしょう。

具体的には、C言語でも関数ポインタを自在に操れる人であれば、 実行時に動的にフローチャートが切り替わることを利用した アルゴリズムを組んだり設計をしたりすることが出来ることでしょう。 この関数ポインタによる動的な処理フローこそが、OOPを解するための一番の壁ではないかと私は睨んでいるのです。

OOPのコードが追いにくいのは動的なフローであるからです。 そしてそれは契約に基づくプログラミングでは「結果を返してくれる何か」と抽象化して委譲するので そこより先のフローに立ち入りません。

つまり、デバッグ時以外ではこの動的フローを強く意識せずともプログラムは書けるわけで、 動的フローが身についていないままデバッグの段で動的フローに触れることになると、 「OOPは役に立たない。コードの可読性を損なうだけで百害あって一利なしだ!」 と憤慨することになりかねないのです。

オブジェクト指向の学習のお膳立て

OOPを解するためのお膳立てとして、以下のようなものを揃える必要があると思います。

  • 構造化定理における「順次・反復・分岐」
  • 構造化プログラミングにおける「サブルーチン」
  • C言語の構造体などの、階層化したデータ構造
  • 関数ポインタ、高階関数に見られる動的な処理フロー

これらの材料がそろっているのであれば、OOPを理解するまではさほど時間はかかりません。型システムを理解し 契約プログラミング(programming by contract. 契約に基づくプログラミング、などとも呼ばれる。) を抑え、OOPを形作るのにいくらかの実習を行えば済むことでしょう。

投稿日時 : 2008年6月22日 14:30
コメント
  • # re: オブジェクト指向のコードが追いにくい理由
    通りすがり
    Posted @ 2008/06/22 15:38
    12年で一巡するのは十二支。干支が一巡するのは60年。
  • # re: オブジェクト指向のコードが追いにくい理由
    ひろえむ
    Posted @ 2008/06/22 22:00
    頭のいい人っていうのはこうやって物事を整理できるんだなぁと思うワケです。はい。
  • # ぴーびーしー
    東方算程譚
    Posted @ 2008/06/23 0:38
    ぴーびーしー
  • # ぴーびーしー
    東方算程譚
    Posted @ 2008/06/23 1:49
    ぴーびーしー
  • # re: オブジェクト指向のコードが追いにくい理由
    ネタ好き未記入
    Posted @ 2008/06/23 10:29
    東方算程譚で先に書いてしまったけど、オブジェクト指向のコードを「読む」のが原因だと思います。
    オブジェクト指向のコードに限らずコードは読むものではなくて頭の中で動かすものだと私は思うのです。
  • # re: オブジェクト指向のコードが追いにくい理由
    凪瀬
    Posted @ 2008/06/23 14:30
    > 12年で一巡するのは十二支。干支が一巡するのは60年。
    あぁ、干支と書くと十干十二支のことになるんですね。うっかりしてた。

    > 頭のいい人っていうのはこうやって物事を整理できるんだなぁと思うワケです。はい。
    オブ熱とかの刺激があったからこそです。はい。交流は大事ですね。

    > オブジェクト指向のコードに限らずコードは読むものではなくて頭の中で動かすものだと私は思うのです。
    自分が最初にTemplate Methodパターンと向かい合った時、脳内VMで実行するのにえらく手間取りました。

    それは、当時の脳内VMの性能が、「順次・反復・分岐・サブルーチン」を実行する程度の機能性かなかったからではないかと思っています。
    私の場合、動的なフローの切り替わりを理解するきっかけになったのは、自己コードを書き換えるマシン語のプログラムであったりとか、バッファオーバーランに見られるフローの切り替わりだったように思います。

    今でもソースを流れに沿って追いかけるのは一苦労です。それはOOPでは契約プログラムで思考を分離することで抽象化していることに逆らうからに他ならないと思うのです。
    動的な切り替わりが多数ある中、ステータスがどう変化するのかということは、本質的に複雑になりすぎるため避ける。そのためにサブルーチンを作る時にステートレスになるようにするし、変数宣言は最小限のスコープにする。
タイトル  
名前  
Url
コメント