• 締切済み

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

bleisの回答

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

またまた#1です。 * 多重継承について 多重継承については言及していないのですが・・・ とりあえず、多重継承について。 多重継承は、悪だとは言い切れません。 ただし、多重継承を語る上では、「機能(実装)の継承」と「型の継承」の区別ができている必要があります。 まずはこの2つの継承について理解する必要があります。 「実装の継承」とは、その名の通り、親クラスから子クラスへと実装を継承(コピー)することです。 この継承の形は、「差分プログラミング」とオブジェクト指向黎明期にはもてはやされましたが、 現在ではこの形での継承は積極的に利用するべきものではない、と言うのが一般的な認識です。 もう一方の「型の継承」は、イメージが掴みにくいかもしれません。 要は、共通のインターフェイスをくくり出すための仕組み、と言えばいいでしょうか。 「特徴」と言い換えてもいいかもしれません。 ここで言う型には実装が含まれないため、差分プログラミングにはなりません。 実装は子クラスで提供する必要が出てきます。 そして多重継承ですが、多重継承にも「実装の多重継承」と「型の多重継承」があります。 JavaやC#といった言語では、「型の多重継承」は可能ですが、「実装の多重継承」が禁止されています。 C++では、そもそも「実装の継承」も「型の継承」もシンタックス上の区別が希薄なため、どちらも可能となっています。 多重継承が即悪い設計、と言うわけではなく、「実装の継承」が悪い設計のサインとなっているため、 「実装の多重継承」も悪い設計のサインとなりますよね? また、単一継承よりも多重継承の方が複雑であるため、「実装の多重継承」はより悪い設計である可能性が高いと言えます。 以上のことから、多重継承でも正しいOOPというのが成立する可能性があることはわかっていただけるかと思います。 ただし、そう言ったケースは稀な上、下手をすると簡単に悪い設計になってしまうため、 C++よりも新しい言語では(実装の)多重継承ができなくなっているものが多いのです。 また、多重継承の特殊な形として、Mix-inというものもあるのですが、それはまた別の話・・・ *OOPも非OOPでも面倒なのは同じなら、慣れている非OOPでもいいのかな、とも思ってしまいます 面倒、という観点から見ると、どちらも同じなのはわかっていただけたようで。 ただし、利点はそれだけではありません。 ポリモーフィズム(多態、ポリモフィズム)を使うことで、可変性(差違)をクラスに閉じ込めることができます。 詳しくは、オブジェクト指向のこころをどうぞ。 *クラス設計やクラス化という言葉について ちょっと横道にそれて、クラス設計やクラス化という言葉について。 クラスベースのオブジェクト指向プログラミング言語なのだから、こういう言葉が出てくるのもある程度は仕方ないのですが・・・ 少し、誤解を与える言葉だと考えています。 静的型付けのOOPLのほとんどの言語でinterfaceと言うものがありますよね? C++には構文上はないですが、意味的には同じものを作ることができます(し、Javaを触ったことがあるようなので問題ないでしょう)。 本来ならば、こちら、interfaceを中心に考えるべきだと思うのです。 実際のクラスは、あとから出てくる(TDDで組むと、classからinterfaceをくくり出すため、逆ですが・・・それはまた別の話)。 ならば、クラス設計ではなく、インターフェイス設計と呼ぶか、せめてインターフェイス・クラス設計と呼ぶべきではないでしょうか。 クラス化についての違和感は更に強いものがあります。 (C++やJavaといった、静的型付けのクラスベースの)オブジェクト指向プログラミングでは、 複数のインターフェイス、複数のクラスが組み合わさって意味のある単位となっていることが普通です。 1つのクラスで完結するものの方が稀です。 ですが、クラス化という表現は、あくまで何らかのモノを1つのクラスへと落とし込むような、そんなニュアンスが感じられてしまうのです。 ちょっと結局何が言いたかったのか分かりにくくなっているような気もするのですが・・・ また、何かあれば書いていただければ反応します。

yuki7091
質問者

お礼

ご回答、ありがとうございます。 (本当に、返信遅くてすみません) 多重継承の件、分かりました。 (といっても70~80%くらいですが、、、  あとは実践で理解していけると思います。) 初心者の私としては、多重継承しないように コーディングしていきます。 >クラス設計ではなく、インターフェイス設計と呼ぶか、 >せめてインターフェイス・クラス設計と呼ぶべきではないでしょうか。 あぁ、なるほど、と思いました。 OOPが理解できないないので、インターフェイスの役割も正確に 理解はしておりませんが、簡単に対象(?)、機能(?)を切り替えられる というふうに認識しております。 そうすると、 ・インターフェイスにくっつくクラスはどれか? ・そのクラス達に共通するものはないか? ・共通したものを基本クラスとする という思考で設計していけば、OOP設計に近づくことが出来るの でしょうか。 もし、私の認識が間違っているようならば、ご指摘いただけると幸いです。

関連する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