• ベストアンサー

オブジェクト指向はなぜそんなにいいのですか?

perlやphpでも昨今オブジェクト指向で書く人が増えてます。 同じ処理を繰り返さなくて済むとよくいいますが、 共通のファイルをrequireしてそこに共通のfunctionを定義するのとどうちがうのでしょうか? perlであったらサブルーチンを定義するのも同様。 そういうことを考えるとオブジェクト指向に乗り換えっていうのができません。 ご助言いただければ幸いです。

  • PHP
  • 回答数5
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.1

Wikipediaでは、オブジェクト指向とは、 * カプセル化 * 継承 * ポリモーフィズム の3つの特徴をあげています。そして >>同じ処理を繰り返さなくて済むとよくいいますが、 の部分は、「継承」機能についてですね。もちろん、この部分は >>共通のファイルをrequireしてそこに共通のfunctionを定義する でも実現可能です。ただ、オブジェクト指向では、この部分の重要度は低いと思っています。逆に継承を多用すると、ソースが細切れになってしまい、判りにくくなります。 オブジェクト指向では、ポリモーフィズム、カプセル化のほうが重要だと思います。 そして、もっとも重要なのが、ポリモーフィズムではないでしょうか? これは、「プログラムロジックの記述を大幅減少させる」というメリットがあります。 つまり、「サブルーチンのようなものを書いていたら、なぜかメインロジックができあがって、最初からバグ無しで動作したぜ!!」(いくらか誇張あり。実際にはコンパイラがんばって記述してくれている)という結果となって現れます。 そして、「プログラマの書いてない部分にバグの生まれようは無い」わけで、仕様変更にとても強いものとなります。このあたりは、オブジェクト指向を紹介する雑誌や書籍であまり強調されてなく、執筆者の未熟さゆえだと思ってます。

その他の回答 (4)

  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.5

TVのリモコンの使い方さえ分かればTVの構造や原理をしらなくてもTVを見ることが出来ます 車の構造を知らなくても運転方法さえ知っていれば運転してどこでも好きなところへいけます そういうことです

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.4

>同じ処理を繰り返さなくて済むとよくいいますが、 >共通のファイルをrequireしてそこに共通のfunctionを定義するのとどうちがうのでしょうか? これはオブジェクト指向とは関係なく、構造化プログラミングのことです。 >そういうことを考えるとオブジェクト指向に乗り換えっていうのができません。 必要であればオブジェクト指向で作ればいいだけの話で、必要なければオブジェクト指向で作る必要もありません。 ただ、オブジェクト指向を理解することはいいことだと思います。 オブジェクト指向のメリットは実際にやってみなければ感じられないと思いますので、実際にオブジェクト指向でプログラミングしてみると良いと思います。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

オブジェクト指向の利点の1つに、手続きとデータを一緒くたに押し込められるというのがあると思います。 一緒くたにできない言語では、手続きはライブラリ的に呼び出すとしても、データ自体はプログラマが管理しないといけないですが、 これが一緒くたになっていることでオブジェクト自体に管理させることができるようになります。 オブジェクトは自分が何をできるかを知っており自分自身でその状態をもっています。 要は、面倒なことは何かに押し込むということにその利点があるのだと思います。 乗換の基準点としては、やらせたいことがどれくらい面倒なのかといううことにあるのかもしれません。 2つの数字を足したいだけなのに、数値演算するオブジェクトを作成しそれに演算を依頼する…よりは、単純な手続きを呼び出す方が簡明です。

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.2

連投ですいません。 このページの上に「オブジェクト指向とは?」というスポンサリンクが出ることがあり、それをクリックするとUMLツールの説明に飛んでゆきます。オブジェクト指向とUMLとは対象レベルが違いますし、全然関係ないです。「オブジェクト指向という単語が売れている」から「UMLはオブジェクト指向」と言い張れば「儲かるぜ!!」という、いわば「錯誤商法」です。ご注意を。

関連するQ&A

  • phpでオブジェクト指向と呼べる設計をするには・・・

    phpで、なるべく同じ処理は関数化し、 ひとつの大きな処理としてまとめています。 これは、オブジェクト指向といえるのでしょうか? オブジェクト指向とはもっと高度で汎用性が高く たんなる関数化ではオブジェクト指向とはいえないでしょうか? 綺麗なオブジェクト指向とは一体のどようなものなのでしょうか? どこまでオブジェクト化すれば オブジェクト指向なのかよく分かりません。 使いまわしがきけばオブジェクト指向なのでしょうか? 他のプログラムに影響を与えなければオブジェクト指向なのでしょうか? 質問が抽象的ですが、よろしくお願いします。

    • ベストアンサー
    • PHP
  • オブジェクト指向Perlの勉強の仕方について

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

    • ベストアンサー
    • Perl
  • perlでのオブジェクト指向の書き方

    以下のPHPソースをPerlで書き直したいのですが、Perlのコンストラクタがイマイチわからないので どなたかご教授ください。 可能であれば以下のソースのperlバージョンを記載して頂けると幸いで御座います。 ○呼び出し側 ・index.inc require_once('common.inc'); require_once('db.inc'); class index {     var $objCommon= '';     var $objDB= '';     function index() {         $this->objCommon = new common;         $this->objDB = new db("mysql");     }     function main() {         //DB接続         $db_connect = $this->objDB->connect();         //DBから値を取得         $data = $this->objDB->sample($db_connect);     } } ○呼び出される側 ・db.inc class db{     var $db_dsn_type;     function db_wrap($db_type){         $this->db_dsn_type = $db_type;         $this->objCommon = new common;     }     各function } ・common.inc class common{     各function } ※コンストラクタなし

  • オブジェクト指向の間違いと改善案について

    オブジェクト指向というより オブジェクト指向プログラミングについての間違いと改善案をブログに書いてみました。 http://chaosblogchaos.blog.fc2.com/?no=2 この考え方に間違いがあるでしょうか? 説明不足の点はないでしょうか? よろしくお願いします。 以下ブログの内容 ---------- ■カオス指向(仮) カオス指向(仮)とは、オブジェクトに処理を追加・削除することでオブジェクトの振る舞いに無限性を持たせる試みです。 カオス指向(仮)ではデータが主体となり、木構造で保持します。 (ファイルフォルダで例えると、フォルダがオブジェクト、ファイルがプロパティに当たるイメージです) 処理を追加・削除が可能なことからプロトタイプベースがもっとも近いですが、 オブジェクトが親子関係を持つことと オブジェクトの親子関係から処理が影響を受ける事が異なります。 ●オブジェクトの内容  ・配列か連想配列で子オブジェクトを保持できます。    オブジェクトどうしの強い関係を意味し、親が削除される場合、子も削除される関係にあります。    オブジェクトはルートからの木構造の中に必ず存在する事になります。  ・別途、変数領域を確保する。    処理で使用する値を保持します。    オブジェクトどうしの弱い関係を保持できます。  ・処理を持つ。    オブジェクトに処理を持たせることができるます。    プロトタイプベースと異なる点は、    オブジェクトが処理を持っていても、オブジェクトがその処理をするわけでは無く、自身と子オブジェクトに対して適用され、”認識タイプ”を持つ場合に処理します。  ・”認識タイプ”を持つ。    処理の実行を制御します。認識タイプを含むかどうかで処理を行うかどうかを決定します。    オブジェクトのクラスは”認識タイプ”で実現可能と考えて問題ありません。 ●”認識タイプ” オブジェクト指向なら、 人は歩く、話す、・・・。Aさんは人。Aさんは話す。 カオス指向なら、 歩けるなら歩く、話せるなら話す、・・・。Aさんは歩ける、話せる、・・・。Aさんは話す。(歩ける・話せるを認識するようにした場合) 人は歩く、人は話す、・・・。Aさんは人。Aさんは話す。(人を認識するようにした場合) のどちらでも作成が可能で、 話せるなら話す、・・・。の場合、ウサギAの”認識タイプ”に話せるを追加することで、ウサギAは話せるようになります。 話せるウサギは実用的ではありませんが、 特定ユーザーのアクセスログだけ出力したい場合は、 処理を用意し、対象ユーザーに”認識タイプ”を追加することでログ出力処理を追加することが出来ます。 ●木構造と処理 ユーザー   日本     Aさん     Bさん   アメリカ     Cさん とある場合、 全ユーザーの処理をユーザーに保持 日本用の処理がある場合、日本に アメリカ用の処理がある場合、アメリカに処理を追加します。 そうすることでAさんは日本の処理、Cさんはアメリカの処理が行われます。 ●同一処理による関係 処理には優先順位が存在し、その順番で処理します。 処理A、処理Bとある場合、処理Aの中で元処理として実行します。 処理Aの中で元処理を行わない場合、処理Bは行われません。 ■カオス指向(仮)でどうなるか? ・幾つかのデザインパターンが不要になります。   デコレータ・コンポジット・ステートパターン等 ・多重継承らしきものが出来るようになります。   ※根本から違うので、多重継承らしきものとします。 ・循環問題が発生しませんない   ファイルフォルダのような木構造では循環は起こりえない。 ■オブジェクト指向プログラミングの問題点 オブジェクトにつき1クラスという決め付けが オブジェクト指向プログラミングにはあったのではないかと考えております。 オブジェクト指向では、 オブジェクト:クラス:継承クラスは1:1:1で、1:1:*は条件により可能ですが原則不可能。 カオス指向では、 オブジェクト:クラスは1:*と頭からクラスを複数持たせることで多重継承らしき形が実現可能ということです。 クラスの継承がなくなっていますが、クラスを複数持たせる事とクラスに順番を持たせることで継承が可能です。 オブジェクト指向プログラミングでは、オブジェクトにつき1クラスという決め付けが継承というシステムを作り 多重継承を難しくしたのではないかと考えております。

  • 【PHP】オブジェクト指向の解説が分からない

    http://www.scollabo.com/banban/php/php_11.html のページで、オブジェクト指向の説明があるんですが その中でのこのくだり↓ //----------------------------------------- $newShopping = new Shopping(); $item = $newShopping->item メンバ変数に格納されている $item では、 もともと「コンピュータ」が定義されていましたが、 このようにして、その内容を随時変更することができます。 //----------------------------------------- この下りでの、"その内容を随時変更することができます"がよく分かりません。 たとえば、コンピューターという定義を MAC とかに変更できるということですか? だとしたらどうやって変更できるのでしょうか。

    • ベストアンサー
    • PHP
  • オブジェクト指向について

    連続質問で誠に恐縮ですが投稿させて頂きました。 もしTo_aru_User様が拝見したらご協力いただければと思います。 以前の質問でオブジェクト指向で件数の表示とページングの質問をさせて頂きました。 public function getComments($page) {      // 必ず1以上の整数になるようにする   $page = max(1, (int)$page);      // 開始オフセット   $offset = COMMENTS_PER_PAGE * ($page - 1);      // SQL実行   $stmt = $this->pdo->query(sprintf(     implode(' ', array(       'SELECT CALC_FOUND_ROWS *',       'FROM `comments`',       'LIMIT %d, %d',     )),     $offset,     COMMENTS_PER_PAGE   ));      // コメントを取得   $comments = $stmt->fetchAll();      // 現在件数を取得   // (PDOのコンストラクタでMYSQL_ATTR_USE_BUFFERED_QUERYを   // 有効化しているときだけSELECTに対してrowCountメソッドが使える)   $current_count = $stmt->rowCount();      // 総件数を取得   $whole_count = (int)$this->pdo->query('SELECT FOUND_ROWS()')->fetchColumn();      // メッセージ作成   $message = sprintf('全%d件中、%d件から%d件まで表示しています',     $whole_count,     $offset + 1,     $offset + $current_count   );      // 情報を連想配列で返す   return array(     'comments' => $comments,     'message' => $message,   );    } この記述はデータベース接続関連のクラスの中(DB.php)に記述したのですが正解でしょうか? またそれをindex.phpで呼び出そうとしてもうまくいきません。 申し訳ないのですがオブジェクト指向の呼び出しかたを指導していただけませんでしょうか? オブジェクト指向をこのご質問と合わせて勉強しようと思ったのですがPHPも覚えたてでアタフタ状態なので、今回の件をとりあえずちゃんと解決してから基礎からしっかり固めようとおもいます。 大変申し訳ございませんが、お力をお貸しいただけませんでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • オブジェクト指向の継承について。

    ごきげんよう。 オブジェクト指向、初心者です。 いろいろと素人ながら分かっているつもりなのですが、継承の利用法がピンと来ません。 なにかいいサンプルはないでしょうか? カウンタとする機能を継承させて、画像カウンターにするのは、便利と思ったのですが、PHPならではの書き込み処理や他の処理を継承させるコツがわかりません。 私の中で、継承はお客様の無理な仕様の変更や、最初のアイディアの甘さを埋めるためと認識しているので、一つの関数でできるだけ不備のないものを作ろうと考えるので、あまり継承がピンとこないのかもしれません。 わたくしは、あくまで自分のHP内で、一人でスクリプトを作っているもので。 例えば、掲示板を作るに当たって、継承を使うサンプルがあったら、おねがいいたします。

    • ベストアンサー
    • PHP
  • phpのオブジェクト指向でつまづきました・・・

    phpのプログラムをオブジェクト指向で書こうと思ったのですが、クラス間のデータのやり取りのあたりでつまづきました。 クラスはそれぞれ 1.設定用 2.データの読み書き用 3.入出力用 4.データ処理用 5.メイン です。 オブジェクト指向で書く前よりはコードも見やすくなったのですが、例えば4のデータ処理のところからは1、2、3の全てのプロパティを参照していたりして、なんだか複雑に。 オブジェクト指向で検索するとwikipediaには プログラムを構成するコードとデータのうちコードについては手続きや関数といった仕組みを基礎に整理され、その構成単位をブラックボックス とすることで再利用性を向上し、部品化を推進する仕組みが提唱され構造化プログラミング (structured programming) として1967年にエドガー・ダイクストラ (Edsger Wybe Dijkstra) らによってまとめあげられた と書いてありました。これだと関数を種類ごとにまとめただけであまり部品化はされておらず、前と変わらないような気がしてしまって・・・ 例えば設定用のクラスはのプロパティほとんどすべての所で値が必要になるのですが、毎回newを使うのは気が引けるので、クラスの外で new でインスタンス化して必要なところから毎回 global で呼び出したりしているんですが・・・使い方が間違っている気がするのですが、そういったことを解説しているサイトが見当たらなかったため、全く分からない状態です。そもそもこの場合、設定用の値はクラスにまとめるべきなのかどうか・・・。 書く時は$クラスー>メンバ変数 とか $クラスー>メンバ関数 のように書くので今何をしているのかが分かりやすく、それは便利だと思うのですが。 すみません。自分でも上手く説明できずによくわからない文章になってしまいましたが、結局の所オブジェクトがどんな物でどんな書き方をすれば良いかが分かっていないのだと思います。そういった所を分かりやすく教えてください。お願いします。

    • ベストアンサー
    • PHP
  • オブジェクト指向の実際について。

     初めまして、ラブ・ザ・ゲームといいます。 オブジェクト指向・・・、の理解度は単語だけ知っている、程度だと思います。 クラスを使っている掲示板があるので、さらにシンプルにして、質問させてください。 PHPは4を、想定しています。 Class main_bbs{ //ここはクラスで使う変数の宣言部分ですよね。 var $file ; var $name ; var $title ; var $message ; //ここで、コンストラクタが来ると思います。 function main_bbs(){} //Q1.コンストラクタは、何を初期化すればいいのでしょうか? //次は、データを格納する関数でしょうか。 //Q2.この部分は、クラス内で変数を使うためですよね? function FileInf($file, $name, $title, $message){ $this->file = $file ; $this->name = $name ; $this->title = $title ; $this->message = $message ; } //この掲示板では、チェックを複数に分けています。 //改行変換、危険タグの排除、等。 function Check($str){/* 処理内容 */ return $str; } //これらは、main_bbsクラス内に収まっているのですが、別のクラスに分けた方がいいと思うのですが、積極的にしない理由はありますか? //分ける理由は、その方が汎用性が高まると思うのですが。 //データの成形 function CreateDate(){ $this->name = $this->Check($this->name) ; $this->title = $this->Check($this->title) ; $this->message = $this->Check($this->message) ; } //書き込み処理 function Write(){ CreateDate()を使った後、書き込む処理。 } //書き込み処理も、別のクラスを作った方が、汎用性が高まると思うのですが、積極的にしない理由はありますか? } //呼び出し側、見ているサンプル $main_bbs = new main_bbs ; $bbs -> FileInf($file, $name, $title, $message) ; $bbs -> CreateDate() ; $bbs -> Write() ; ここまでは、参考にしている掲示板の通に書いたつもりです。 ある程度は理解できたと思います。 ・・・が、実際作成する場合、どこから着手すればいいのかが、分かりません。 小さな部分から作っていくって行けばいいのでしょうか?

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

    Perlのクラス定義の例題なんですが、わからないところがあります。 ファイルCapFile.pm package CapFile; sub new{ my $class = shift; my $path = shift; return(bless { ':path' => $path }, $class); } sub read { my $obj = shift; my $path = $obj->{':path'}; ..... ファイルcap-test #!/usr/bin/perl use CapFile; $cap = new CapFile ('/etc/termcap'); $cap->read(); ... サブルーチンreadにある my $path = $obj->{':path'}; なんですが、呼び出し側では引数がないのですが、$objには何が入っているんでしょうか。 そして$pathには何が入るんでしょうか。

    • ベストアンサー
    • Perl