• 締切済み

本当にオブジェクト指向プログラミングっていいのでしょうか?

bleisの回答

  • bleis
  • ベストアンサー率68% (11/16)
回答No.15

#1 です。 > OOPを理解していると自負されている方は数多くいらっしゃることは > 言うまでもなく、OOPについて説明している書籍はかなりあります。 > しかしながら、説明するキーワードは共通していても、 > 説明内容が各々で発散しすぎていると感じております。 これは仰るとおりです。 用語の揺れとしては、手前味噌ですが http://d.hatena.ne.jp/bleis-tift/20090201/1233426011 の他にも、オブジェクト・クラス・インスタンスという用語にも人によって揺れがあります。 > (あくまで私の見解なのですが、もし、OOPを理解している人達が、 > ある同じ問題を各々でOOPでコーデングするれば、 > 限りなく一意に近いソースコードに成ると思いますが、 > どうなのでしょうか。 > なるのであれば、なぜ説明が収束しないのか不思議です。) これはそれなりの規模で実験しないと分からないのですが、 似たようなグループはできるかもしれませんが、全てが同じようなものになることはないはずです。 なんというか、流派とでも言えばいいんでしょうか・・・ もしかすると、似たようなグループさえできず、 ちょっとずつ異なるものの連続になるかもしれませんが・・・ > コーディングする前に、必ずUMLで > シーケンス図やクラス図を書いておりました。 スケッチとしての UML はいいのですが、 「UML を書く」という工程を入れてしまうのはどうかと思います。 これは、ER 図などにもいえることなのですが、 何らかの図を用いて設計するのではなく、思考を可視化してまとめる、または共通認識を得るために図に起こすのです。 ここを取り違えると、UML を書くことが設計だと勘違いしてしまいます。 なので UML が正しいかどうか、というのは実は全く問題ではありません。 少し厳しいことを言いますが、手続き型の方が考えやすい、と言うのは、 手続き型では「ただなんとなく」コーディングしてきただけなのではないでしょうか? 今まで行ってきた「手続き型言語での開発における設計」は、完全無欠に正しいものだったのですか? > 初心者の私としては、多重継承しないように > コーディングしていきます。 ある意味正しい方針、正しい制約かもしれません。 場数を踏む内にどういうことか分かってくると思いますし。 > インターフェイスの役割 これまた説明するのは難しいのですが、一言でいえば、 「何らかの抽象的側面を表すもの」 でしょうか。何言ってんだ、って感じですね(汗 簡単に実装を切り替えられるというのは、あくまでインターフェイスの特徴であって、役割ではありません。 ・・・まぁあるコンテキストにおいて、ある interface が実装を切り替えることを目的としていることはあったりすのですが・・・ その場合でも切り替える実装の間には何らかの共通する抽象的側面があるはずです。 で、OOP のための設計の思考ですが・・・ あながち、間違いとは言い切れません。 共通性・可変性分析の、共通性のみに着目した考え方と言えるのではないでしょうか。 ですが、やはり可変性にも視点を向ける必要があると思います。 以下 #8 の人へ クラス設計ですが、表現としては普通に使われてはいるのです。 ただ、その用語は本当に言いたいことを表しているの?と、個人的に疑問を持っているだけで・・・ で、ちょっと関係ないですが本について。 「Java デザインパターン徹底攻略」は自分も持っていたのですが、 問題も多かったように記憶しています。 もう手元にないのでどこに問題があったかは詳しく覚えていませんが、 一つ覚えているのが、マルチスレッドに対応した Singleton の項で、double checked locking イディオムを使用していたことです。 たしか 6 だか 5 だかで double checked locking イディオムが使えるように VM に変更が加えられたはずですが、 この本は確か 1.3 とか 1.4 時代に書かれています。 他にもいくつか問題があったように記憶していますので、あまり真に受けるべき本ではないかと・・・ Java に限定するなら、結城浩さんの「増補改訂版 Java 言語で学ぶデザインパターン入門」という本がおすすめです。 ただし、この本も 1.4 時代の本なので、ジェネリクスとか使ってないのがアレですが・・・ また、「デザインパターンとともに学ぶオブジェクト指向のこころ」、「アジャイルソフトウェア開発の奥義」という本もおすすめです。 これらの本を読んだ後、「パターン指向リファクタリング入門」という書籍もおすすめです。 次に、オブジェクト指向の 3 つの特徴について。 カプセル化、継承、ポリモーフィズムというのはよく言われることなのですが、 あくまでこれは「クラスベースのの OOPL」の特徴と言うべきものです。 メッセージパッシングに重きを置いた OOPL や、そこから派生したプロトタイプベースの OOPL には当てはまりません。 また、質問者さんへの回答でも述べたとおり、カプセル化という言葉は揺れが大きすぎ、 カプセル化と書いただけでは何も言っていないのとほとんど等しいというのが現状です。 最後ですが、回答中に挙げているサイトについて。 「デザインパターンを読み解く」については、Facade は Wrapper でもあるんじゃ?とか、いくつか「?」が付くだけですが、 「オブジェクト指向」は言いたいことがいくつもあります。 全部は挙げませんが、 open(door); と door.open(); という「書き方」を取り上げて、前者が手続き的で後者がオブジェクト指向的だという説明は間違っています。 対象を明示すると言う意味で door.open() の方が分かりやすい、という説明ならいいのですが、 それでも open(door) が手続き的かどうかは、open の実装によりますし、door.open() だったらオブジェクト指向的か、 と言われると、「それは違う」と答えます。 コンテキストを無視したコード片では、手続き的かオブジェクト指向的かという判断はできないと考えています。 書き方、形式の違いを例に出すのは、間違った OOP への第一歩です。OOP はそこまでミクロな視点のものではない。 メソッドの分類では、モジュールと言う考え方を無視しているため、違和感があります。 クラスの導入へのステップに飛躍がありすぎる、と言いましょうか・・・ また、クラスは「データにメソッドを付属させたもの」ではありませんし、 「メソッドの集まりに状態を保持させたもの」でもありません。 それはあくまで実装の話であって、それが直接メリットになるわけではないのです。 で、カプセル化については・・・もういいですね。 オブジェクト指向の 3 原則・・・ももういいですね。 それ以降は長くなるので省きますが、「機能とデータを併せ持ったモノ」という考え方では、よい設計は生まれません。 クラスをそのように取り違えているこの文書もまた、あまり参考にすべきではないかもしれません。 まぁそれを言ったら、この意見も「クラスは機能とデータを併せ持ったモノだ」という意見をもつ人から見れば、 あまり参考にすべきではないものでしょう。 要は「何を正しいとするか」なのでしょうけど、「クラス = データ + 手続き」という考え方からはよい設計が生まれないと言うことを 「デザインパターンとともに学ぶオブジェクト指向のこころ」により知ってしまったので、 自分の考え方はこの本が「基礎」になっています。

関連するQ&A

  • オブジェクト指向プログラミング

    一般に、オブジェクト指向プログラミングといわれているプログラミングに関してですが、 「関数・手続きを使用するプログラミング」と 「クラスを作成してプログラミング」というのは おおきな違いがあるのでしょうか? (クラスを作成しなくても関数・手続きで、プログラミングすれば 一緒じゃないかなぁと思っていますので・・・。) どなたか、これに関して、お返事をして頂けたら今後いろいろな面でかなり助かります。

  • オブジェクト指向プログラミングはどのように使用(適用)する?

    あるシステム、またはフリーソフトでもいいのですが、 オブジェクト指向によるプログラミングを行おうとするとき、 そのシステム(ソフトウェア)全体に使用(適用)するのでしょうか? 書籍で学んでいると、オブジェクト指向プログラミングをする場合には オブジェクトとオブジェクトを組み合わせてゆくように書かれています。 もちろん、仕組みはそうではあると思いますが、 無理にシステム全体でオブジェクト指向プログラミングをする必要はなく、 たとえばシステム内である処理を行おうとしたとき、 オブジェクト指向プログラミングの方がいい場合に適用すればいいのではないでしょか?

  • オブジェクト指向の特徴

    プログラミングにおいて Java言語などのオブジェクト指向とは 「クラス(設計図)からインスタンス(実体)を量産できる。」がオブジェクト指向ではないプログラミング言語との決定的な違いなのでしょうか? またオブジェクト指向とオブジェクト指向ではない言語の決定的な違いや 実際に実務において経験した感覚的な違いなどがあれば教えてください。 インターネットに乗っていない些細なことでも構いません。

    • ベストアンサー
    • Java
  • オブジェクト指向に関して。

    Javaの解説本を読んでオブジェクト指向プログラミングという物があることをしりました。その本には「オブジェクトはデータとそのデータを扱うための機能を持っている。この機能はメソッドと呼ぶ。クラスは設計図のような物で変数とメソッドから構成されている。設計図を実際に形にした物がインスタンスである。」と書いてありました。私はオブジェクト=クラスのような感じがしたのですが、実際のところオブジェクト=クラスでいいのでしょうか?  また、友人に話したところ、オブジェクト指向はサブルーチンに似ているといっていました。私はプログラミングの知識が全くないのでサブルーチンという物が何なのかわからないのですが、サブルーチンとオブジェクト指向の考え方は違うような気がするのです。友人に説明して納得させるにはどうしたら良いのでしょうか? ぜひ、力を課してください。

  • オブジェクト指向、理解しやすい?

     最近、Javaの解説書や解説サイトを見ていて、しばしば、「Javaは完全なオブジェクト指向だから理解しやすい」といった記述を見かけます。(「プログラムが見やすくなる」とかではなく)  Javaに限った話ではないのですが、個人的に、オブジェクト指向の概念は、プログラミング初心者の最大の関門ではないかと勝手に思っています。僕はPHPから入ったのですが、ある程度基本事項をマスターした後も、オブジェクト指向だけは長い間苦手としてきました。(最近やっと慣れてきたところです。)  そこで伺いたいのですが、最初にやったプログラミング言語がオブジェクト指向だったという方、オブジェクト指向の概念は、 1.わかりやすかった 2.そこでつまずいた 3.特に意識せずに通り過ぎた 4.その他 いずれでしょうか? ※最初にJavaについて書きましたが、これはただの例なので、オブジェクト指向言語全般についての質問であるととらえてください。

  • オブジェクト指向プログラミングの多態性のメリット、目的は?

    オブジェクト指向プログラミングを学んでいます。 基本概念の多態性がどうも理解できません。 メリット、目的はなんなのでしょうか? 上位クラスを継承し、 その継承されたクラスのメソッドを上書きするということと何が違うのでしょうか? 学習の参考にしている書籍の中には ”多態性を使ったオブジェクト指向プログラミングの典型例”として、 異種リスト(=上位型に下位型を代入し、一族のオブジェクトを一括管理する)を紹介しています。 多態性はこのような使用のみを目的としているのでしょうか?

  • オブジェクト指向

    Perlの学習をはじめて2日目の初心者です。 Perlにおいて、オブジェクト指向をもちいて開発をしなくてはならないのです。 何冊か書籍を読んでみたのですが、この開発手法が理解できません。 Perlのモジュールとかを例にあげて、分かりやすく説明をお願いします。 また、参考サイトなどあれは、教えて下さい。

    • ベストアンサー
    • Perl
  • オブジェクト指向プログラミング

    大学の情報システムの授業で、様々なパワーポイントを作って発表しています。 現在オブジェクト指向プログラミングについてのパワーポイントを作成中なのですが、私自身あまり良く理解出来ていないためなかなか進みません。 それに関連した例などが載っている分かりやすいサイト等がありましたら教えて下さい。 また、説明して下さる方もいましたら是非! よろしくお願いします。

  • オブジェクト指向の本当の便利な点。

    オブジェクト指向の特徴は、ある程度分かりました。 が、個人で小さなソフトを作り、できるだけ自分でプログラムを作りたいため、オブジェクト指向の利点が今ひとつ分かりません。 PHPでは、構造化でできるだけグローバル変数を減らし、関数内でも関数名+変数名という変数名にしていたので、変数の名前が重複すると言ったこともなかったし。 関数名+でない場合も、関数内では不必要な変数は値を解放していたし。 過去の資産も関数を再利用する事もよくありましたし、継承のような事もしていました。 オブジェクト指向の便利さは分かるのですが、どうも実感できないというか、その便利さを持て余しているというか。 構造化プログラミングでも、さほど問題ないし。 delphiなので、JAVAのようにオブジェクト指向(クラス)が必須という訳でもないし。 逆にクラスを作ってしまうと、メモリーから解放しないといけないので、それが少し怖いです。 で、オブジェクト指向の利点をあげるとしたら何ですか? 可能なら、上位から3つくらいを詳しく書いてください。 ソフトは大規模か小規模か、制作者は大勢か少数・個人か、それは構造化プログラミングでは無理な事なのか? オブジェクト指向の利点や特徴は、分かるのですがピンとこないというか、実感できないというか・・・。

  • オブジェクト指向Perlの勉強の仕方について

    今までPerlで掲示板などを自作した事があるのですが、オブジェクト指向をまったく取り入れていません。 オブジェクト指向でないPerlプログラミングについてはおおよそ理解しているつもりなのですが、 オブジェクト指向Perlについては全く理解できていません。 書籍を探しても、Perlについての書籍は大抵が初心者向けのものか、私にとっては難解なもの(オライリーなど)ばかりで、ちょうどいい程度の書籍が見当たらないのですが、 何かオススメの書籍がありましたらご紹介ください。 ---参考:私が理解している範囲--- 1.Perlプログラミングの基礎 変数、配列、ハッシュなどのデータ型 ループやサブルーチン、ライブラリなどの構造 2.オブジェクト指向について MacromediaFlashのActionScriptがある程度 理解できていますので、 「オブジェクト指向とは何か」 は多少理解しているつもりでいます。 (錯覚かもしれませんが) 3.目的 PerlMagickなどのパッケージを利用したいのだが、 利用方法がわからないため ------------------ 以上、身勝手な質問で恐縮ですが、 よろしくお願いします。

    • ベストアンサー
    • Perl