凪瀬 Blog
Programming SHOT BAR

目次

Blog 利用状況
  • 投稿数 - 260
  • 記事 - 0
  • コメント - 2527
  • トラックバック - 192
ニュース
広告
  • Java開発者募集中
  • 経歴不問
  • 腕に自信のある方
  • 富山市内
  • (株)凪瀬アーキテクツ
アクセサリ
  • あわせて読みたい
凪瀬悠輝(なぎせ ゆうき)
  • Java技術者
  • お茶好き。カクテル好き。
  • 所属は(株)凪瀬アーキテクツ
  • Twitter:@nagise

書庫

日記カテゴリ

 

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では契約プログラムで思考を分離することで抽象化していることに逆らうからに他ならないと思うのです。
    動的な切り替わりが多数ある中、ステータスがどう変化するのかということは、本質的に複雑になりすぎるため避ける。そのためにサブルーチンを作る時にステートレスになるようにするし、変数宣言は最小限のスコープにする。
  • # re: オブジェクト指向のコードが追いにくい理由
    ネタ好き未記入
    Posted @ 2008/06/23 20:36
    今ふと思ったのですが他人のOOのコードが追いかけにくい要因として、オブジェクト指向のクラス設計が駄目だという外的要素もあるように思えます。
    いくら優秀な人であっても実装が滅茶苦茶だと追えないはずです。そういった業界レベルの教育的側面があるのではないでしょうか?
  • # re: オブジェクト指向のコードが追いにくい理由
    凪瀬
    Posted @ 2008/06/23 22:07
    OOPでなくとも、ステートフルなプログラムは凄く読みにくいんですが、そういう汚いスパゲッティコードをOOPのように処理フローも動的にしてしまうと読解不可能になってしまう。

    読みやすさってのは一度に頭に入れておかないといけない物事の量と少なからず関係すると思っていて、ステートフルなプログラムは常にステータスの変化という実行時にわかる動的な状態をもち、かつ、意識し続けなければならないという点で最悪ですね。

    これは、OOPかそうでないかにかかわらない別の概念でのことになりますが、プログラムの可読性というか読み解きやすさはフローの静動よりもそっちのほうが影響がでかいのかもしれませんね。
  • # re: オブジェクト指向のコードが追いにくい理由
    道化師
    Posted @ 2008/06/23 23:35
    >Javaの登場によってオブジェクト指向(以下OOP)は一気に普及しました。

    ヽ(#`Д´)ノ その言葉、C++脳の俺には聞き捨てならんぞ-!
  • # re: オブジェクト指向のコードが追いにくい理由
    凪瀬
    Posted @ 2008/06/24 0:19
    C++はOOPを強制しませんでしたから、使う人だけ使っていたというのが実情でしょう。

    Javaのリリースされた1996年というのは、当然ながらSmalltalkなどに代表されるようにOOPは既知のものでありました。JavaはC++のOOPを参考にしていることも事実です。しかし、広く普及していたかというと疑問です。
    90年代末ごろ、ゲーム業界の人たちがオブジェクト指向なんて使えないといった話を盛んにしていたのをGAMEBASIC for SEGASATURNのOff会で聞いています。

    JavaはOOPを強制した言語で、多くのユーザを獲得した初めての言語でしょう。
    C++で開発していた人がどれだけC++の++の部分を使えていたのかさえ懐疑的です。
    C++は私も使いましたが、その当時はOOPなぞ使いこなせもせず、C++でCの範疇のことしかできていませんでした。++の部分といえば//のコメントぐらいしか使えていなかった。

    そうした状況を鑑みるに、C++によってOOPが既に十分に普及していたと主張するのは難しいことでしょう。
    JavaはOOPを必修科目に据えていますから、初心者でも一応のOOPを習わされている。C++はどうだったか。少なくとも、当時のC++ユーザはみなOOPを習っていたかというと私を含め使えていなかったのが現実でしょう。
  • # re: オブジェクト指向のコードが追いにくい理由
    ネタ好き未記入
    Posted @ 2008/06/24 8:24
    確かにC++はベターCとして使っていた人が多かったとC++の設計と進化で描かれていますものね。
  • # re: オブジェクト指向のコードが追いにくい理由
    道化師
    Posted @ 2008/06/25 0:59
    不毛な議論をするつもりは毛頭なかったんですけど...乗りかかった船というかなんというか以下のようなレスをしてみる。

    えぇっと、最初にこの議論がそもそも不毛である点について。
    まずなにを持ってして「オブジェクト指向が普及した」としてるんでしょうか?
    この定義はかなり幅広い解釈が可能なのでここで言ってる「オブジェクト指向が普及した」というのがどういう意味合いで言ってるのかハッキリと定義せずに、この議論を続けることは非常にナンセンスです。不毛です。


    >C++はOOPを強制しませんでしたから、使う人だけ使っていたというのが実情でしょう。

    それはただの主観。普及云々を語っている時に意味のある話ではありません。


    >90年代末ごろ、ゲーム業界の人たちがオブジェクト指向なんて使えないといった話を盛んにしていたのをGAMEBASIC for SEGASATURNのOff会で聞いています。

    それはクローズドな話で、普及云々を語っている時に(rya


    >JavaはOOPを強制した言語で、多くのユーザを獲得した初めての言語でしょう。

    自然に導くようになっているというのなら話は別ですが、形だけ強制されることと意味ある本質的な利用がなされていることには大きな隔たりがあり形だけ強制されることはさほど意味があるとは思えません。


    >C++で開発していた人がどれだけC++の++の部分を使えていたのかさえ懐疑的です。

    これもただの主観。普及云々を(rya


    >C++は私も使いましたが、その当時はOOPなぞ使いこなせもせず、C++でCの範疇のことしかできていませんでした。++の部分といえば//のコメントぐらいしか使えていなかった。

    それはあなたがそうであっただけの話。普及云(rya


    >そうした状況を鑑みるに、C++によってOOPが既に十分に普及していたと主張するのは難しいことでしょう。

    「そうした状況」が普及云々を語っている時に意味のある情報足り得てませんので否定の論拠として不十分です。
    というか、逆説的に別に私がそう明言したわけでもないのに「C++によってOOPが既に十分に普及していた」を否定しようとしているのは暗にそれを認めているようなものですよ。


    >JavaはOOPを必修科目に据えていますから、初心者でも一応のOOPを習わされている。C++はどうだったか。

    それは一理ありますね。


    >少なくとも、当時のC++ユーザはみなOOPを習っていたかというと私を含め使えていなかったのが現実でしょう。


    これもただの主観。普(rya


    ついでに些末な揚げ足取りをしておきますと、「オブジェクト指向=OOP」じゃないですよ。

    あんまり、わんくま界隈でおいたしてるとεπιστημηさんに怒られそうなんでこのへんで退散します。
  • # re: オブジェクト指向のコードが追いにくい理由
    凪瀬
    Posted @ 2008/06/25 6:31
    > まずなにを持ってして「オブジェクト指向が普及した」としてるんでしょうか?
    国語辞典の定義からすれば、OOP習得者の人口増をもって普及したと言っていいのではないでしょうか。
    特定の集団に限定するならば、その集団中の利用者比率をもって「ある集団内では普及していた/いなかった」と言っていいのではないでしょうか。

    >>C++はOOPを強制しませんでしたから、使う人だけ使っていたというのが実情でしょう。
    >それはただの主観。普及云々を語っている時に意味のある話ではありません。

    意味がないことはありません。というのも、

    >>JavaはOOPを必修科目に据えていますから、初心者でも一応のOOPを習わされている。C++はどうだったか。
    >それは一理ありますね。

    とあるように、JavaではOOPが必修科目であるがためにJava技術者のほぼ100%がOOPをある程度のレベルで解していると見なせますが、C++ではその100%がOOPを解しているとは見なせません。
    「それは一理ありますね。」と同意いただいたとおりです。
    そして、「普及」については、人口もしくは人口比率によって捉えることでしょうから、言語使用者中のOOP習得者比率は重要な意味を持ちます。

    また、「使う人だけ使っていた」を「ただの主観」と切って捨てた返す言葉でC++では必修ではなかったことを「一理ある」と言われましても。
    それこそ主観で批判しているのでは、と言わざるを得ません。

    >>JavaはOOPを強制した言語で、多くのユーザを獲得した初めての言語でしょう。
    >自然に導くようになっているというのなら話は別ですが、形だけ強制されることと意味ある本質的な利用がなされていることには大きな隔たりがあり形だけ強制されることはさほど意味があるとは思えません。
    OOPに触れたこともないというのと、よく分からないもののOOPに触れたことがあるの間には大きな隔たりがありますよね。
    Java習得者のうちのほとんどがOOPを理解していないというのであれば、強制したところで普及には効果がなかったと言えるでしょう。
    しかし、そうではない現実がある以上、意味がないと思うのはあなたの主観と言わざるを得ません。

    > 「そうした状況」が普及云々を語っている時に意味のある情報足り得てませんので否定の論拠として不十分です。
    以上からも「凪瀬の主観だ」とするあなたの意見は主観と言わざるを得ず、否定の論拠として不十分です。


    さて、どういう資料があれば客観性を保てるのでしょうか?
    時代とプログラム言語利用者の推移グラフなどがあれば、重要な基礎資料となることでしょう。
    また、それぞれの言語中でのOOP利用者比率なんてピンポイントな資料があれば確実なのですが、そんな存在は期待が持てません。C++利用者中のOOP利用者比率の推定は難しいものがあります。

    こちらのPDF資料には2001年度までのプログラム言語別の人口推移があります。
    http://www.cobol.gr.jp/knowledge/material/021211_report/08.pdf
    しかし、2001年度までとデータが古いためちょっと使えないですね。
    C++人口はJava登場以前にすでに相当な量に達していたわけですが、OOPが普及していたとみるにはC++利用者のうちどの程度がOOPを利用できていたかが焦点となりましょう。

    > あんまり、わんくま界隈でおいたしてるとεπιστημηさんに怒られそうなんでこのへんで退散します。
    それが「議論」であるならば一向に構いませんが、主観による一方的な批判であれば「おいた」と思われても仕方ないことでしょう。
    そして「おいた」なのであればεπιστημη氏を立てるまでもなく、みな怒るものです。
  • # Hello All and assorted!
    GrieriaAnaesy
    Posted @ 2011/06/06 1:24
    Hello everyone. I'm ahttp://www.buysale.ro/anunturi/auto/autoturisme/romania.html?Marca=Opel - [anunturi opel - up to tryst member.http://www.buysale.ro/anunturi/auto/autoturisme/romania.html?Marca=VW - [anunturi VW - Looking maiden to facts from this valuable resource. http://www.buysale.ro/anunturi/auto/autoturisme/romania.html?Marca=Mercedes%20Benz - [anunturi mercedes benz -
    http://www.buysale.ro/anunturi/auto/autoturisme/romania.html?Marca=Audi - [anunturi audi - Wishes do my jot about means of donating and sharing from beyond to time. http://www.buysale.ro/anunturi/auto/autoturisme/romania.html?Marca=BMW - [anunturi BMW -

    Thanks.
  • # SlGJcoOenZIs
    http://crorkz.com/
    Posted @ 2014/08/28 0:58
    OFBvnh Hello, i think that i noticed you visited my blog so i came to ???return the desire???.I'm trying to to find things to improve my site!I suppose its ok to use a few of your ideas!!
  • # SbJVWyMysePpYXGf
    http://youtu.be/pJYaev2gZYc
    Posted @ 2014/09/17 22:34
    Great write-up, I'm regular visitor of one's blog, maintain up the excellent operate, and It's going to be a regular visitor for a lengthy time.
  • # gold love bracelet cartier replica
    rfmsagyde@aol.com
    Posted @ 2015/08/08 13:49
    gift code minecraft za darmo chomikuj
    gold love bracelet cartier replica http://www.blu-dvds.com/2015/03
  • # bvlgari snake watch women replica
    deiafwmvhefsxvqgqjedloa@hotmal.com
    Posted @ 2017/07/04 2:10
    You article was best.It gave me all my needs of information
    bvlgari snake watch women replica http://www.serpentijewelry.nl/bulgari-serpenti-tubogas-diamond-pink-gold-twotone-watch-sp35bspgd2t-p767/
タイトル  
名前  
Url
コメント