• ベストアンサー

構造化手法、データ中心アプローチ、オブジェクト指向の違い

ソフトウェア方法論で、構造化手法、データ中心アプローチ、オブジェクト指向の違いについてイメージが掴めない状態です。 個々の用語の説明については、情報処理試験などの参考書で概要は調べています。 企業の業務システムで例示してもらえるとありがたいのですが・・・ 特にDOA(データ中心アプローチ)とOOA(オブジェクト指向)の区別が明確ではありません。よろしくお願いします。

noname#85865
noname#85865

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

  • ベストアンサー
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.1

まず最初に「比較できない」ことを頭に置いてください。 各用語の意味はご存知なようなので割愛します。 「構造化」は手続き型パラダイムにおけるプログラミング手法のひとつです。 「オブジェクト指向」はプログラミングパラダイムであり、比較すべきは手続き型プログラミングパラダイムです。 「データ中心アプローチ」は手続き型パラダイムでもオブジェクト指向パラダイムでも利用可能なプログラミング手法で、構造化プログラミングでも利用することが出来ます。

noname#85865
質問者

お礼

「手続き型」と「オブジェクト指向」を対比して捉えたら良いというのは、ヒントになりました。 もっと勉強したいと思います。

関連するQ&A

  • 構造化手法の必要性

    構造化手法の必要性について、詳しく教えて下さい。 または、解説しているページはありますか? (オブジェクト指向ではなく)

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

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

    • ベストアンサー
    • Perl
  • オブジェクト指向による座標変換とクラス構造

    オブジェクト指向的プログラミングをすると以下はどうなるのか、結構悩んでおります。 流れ: 或る物体が有る  ・位置情報算出のためのパラメータを変数にセット  ・時刻情報を入れ、上記パラメータより、或る時刻における位置が求まる   (計算に必要なパラメータを代入したら時刻情報がたぶん唯一の引数になります)  ・原点はそのままでXYZ軸に対して回転座標変換を施す  ・結果が求まる。 悩み: 初めに与えたパラメータを保持しておきたい。 座標変換を行った前と変換後の座標も保持しておきたい。 こういった場合、どういうアプローチが良いのでしょうか? 従来型のプログラミングですと構造体を引き回すことになりますが、パラメータと変換後の座標を独立して保持することになり、スマートな気がしません。 折角オブジェクト指向を使うので出来れば全て1パックにしておくのが望ましいと思うのですが、メンバ、メソッド…どうすれば良いのか分からず、こちらで質問させていただきます。 よろしくお願いします

  • phpのオブジェクト指向でつまづきました・・・

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

    • ベストアンサー
    • PHP
  • オブジェクト指向の間違いと改善案について

    オブジェクト指向というより オブジェクト指向プログラミングについての間違いと改善案をブログに書いてみました。 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クラスという決め付けが継承というシステムを作り 多重継承を難しくしたのではないかと考えております。

  • オブジェクト指向全般、及び、クラス設計について。

    オブジェクト指向全般、クラス設計についての質問です。 当方、C#の日曜プログラマであり、数年まえから趣味のプログラミングを楽しんでおりました。 これまではあまりOOPに関する深い部分の理解をしないままなんとなくプログラミングをしてきましたが、このほど、そこらへんの理解を深めるべく名著と呼ばれる以下の書籍を買い漁って理解を深めようと模索しておりましたが、どうも、しっくりきません。 リファクタリング プログラミングの体質改善テクニック(マーチンファウラー) オブジェクト指向でなぜつくるのか(平澤章) デザインパターンとともに学ぶ オブジェクト指向のこころ(アラン・シャロウェイ) (これ以外に名前は失念してしまいましたが、UNLの書籍も読みました) それぞれの書籍を読んで「うん。なるほど。」というある程度の理解はできているつもりですが、如何せん、自分のコードで・・・となると、ちょうど作文の最初の一文が見つから無いときのような、そんな感覚に襲われてしまします。 これまでの自分のプログラミングというのは、「動けば良い」という部分が最優先であり、かつ、それのみにしかこだわって無かったことも原因としてはありそうです。 その中でも、特に戸惑ってしまうのが、「何をクラスにするのか」という最も基本的な部分です。 今習作として、2ch用ブラウザのコードを書いていますが クラス候補としていくつかのものを、確信の無い状態で挙げてはみますが ワード及び原則としての「責務」「単一責任の原則」「高凝集度」「疎結合」・・・ (それぞれの用語や原則の意味は、ある程度理解しているつもりですが) これらの用語の海で溺れてしまっている感覚で、何をクラスとすればよいのか?という部分で すでにアップアップしているような感じとなってしまいます。 また、個々のオブジェクトの関連において、あるオブジェクトを保持するのはどのオブジェクトである べきか?また、あるオブジェクトにメッセージパッシングするのはどのオブジェクトであるべきなのか?等など・・・このあたりについても、一向に頭の中の霧が晴れてくれません。 このような、悩みを解消する考え方、方法、その他おすすめの書籍でも構いませんが、ご助言いただけませんでしょうか? よろしくおねがいします。

  • 「手続き」と「オブジェクト」一人開発で有利なのは?

    人工知能を用いたソフト・3DCGソフト・音声編集ソフト等のソフトウェアを一人で開発する際に「手続き型・構造化」と「オブジェクト指向」どちらの手法を使えば有利でしょうか? 短期間でラクにできるとしたら、どちらの手法が有利でしょうか? 私自身の考えとして、オブジェクト指向を用いると、ifやswitch等の条件分岐を削減出来て、コードの記述も省力化できると思うので「オブジェクト指向」のほうが有利だと思いますが・・・ 回答のほうお願いします。

  • POA,DOA,OOA(開発アプローチ)

    情報の勉強超初心者です。 教科書に システム開発においてシステム化の対象となる業務を分析する 必要があり、代表的アプローチ方法が3つあり (プロセス指向アプローチ、データ思考アプローチ、オブジェクト指向アプローチ) 最後のオブジェクト指向の概念をあらわす代表的な用語が カプセル化、インヘリタンス、ポリモルフィズムとあります。 それぞれの説明を読むと書いてあることはわかるのですが システム開発に 携わったことがないので いまいち感覚がつかめません。 下記質問です。 1.カプセル化、インヘリタンス、ポリモルフィズムなどの用語は 開発者の間で日常的に使われることば、もしくは 日常的に 使っているのでしょうか。それぞれの定義が カプセル化(データと手続きをオブジェクトとして一体化) インヘリタンス(上位クラスで定義したデータや手続きを下位クラスでそのまま利用できること) ポロモルフィズム(同じメッセージを送っても受け取るオブジェクトによって振る舞いが異なることをいう)などなど 実体験もなく 理解力もないのでいろいろ ネットで調べても くつの上からかくような感じで頭にはいってきません。 2。もしできれば少しかみくだいてもしくはたとえなど使って どなたかわかりやすく もう少しイメージがわくように ご説明いただけますと幸いです。 よろしくお願いします。

  • PHPで開発効率をあげる方法。

    初めまして、ラブ・ザ・ゲームといいます。 初めて質問するのですが、独学でPHPを勉強しています。 自作のプログラムを作ったり、オブジェクト指向がなんとなくわかってきた・・・と思います。 そこで、みなさんが実践している開発効率を上げる方法を教えてください。 私は、どのプログラムでも使う基本のデータと、個々のプログラムで使用するデータを分けたいのですが、こういう方法が正しいのかが、わかりません。 多くのプログラム使う、 『No,oya,res(ツリー構造のため),名前、タイトル、コメント、日付、IP』 で、データをまとめる、サブルーチンなりクラスにします。 それを追加・変更サブルーチンや、クラスの継承で、 『No,oya,res(ツリー構造のため),名前、タイトル、コメント、日付、IP』 に、『アドレス、画像』 を付け加えたいのです。 こうすれば、バグや修正するときに、楽だと思うのですが。 この方法は、どうでしょうか? サブルーチンなのでしょうか? オブジェクト指向は、データ中心だと読んだので、こういう方法は少し地が浮きもするのですが。 クラス・オブジェクト指向でも可能なのでしょうか? また、ほかに、開発効率を挙げる方法がありましたら、お教えください。

    • ベストアンサー
    • PHP
  • 関数から構造体を返す一般的な手法は

    たとえば下のような平面上の点を表す構造体があって、 typedef struct { const int x; const int y; } Point; 2点間の中心を計算する関数を書くとします。 この場合、計算結果をどのように返せばよいでしょうか。 「ただ動けばよい」コードを書くことはできるのですが、 私が知りたいのは、どのような書き方が一般的かということです。 構造体の要素が const なので、 下のコードはコンパイルできません。 void center(Point* result, Point* p1, Point* p2) {  result->x = (p1->x + p2->x) / 2;  result->y = (p1->y + p2->y) / 2; } 新しいオブジェクトを作ってコピーする? void center(Point* result, Point* p1, Point* p2) {  Point p = { (p1->x + p2->x) / 2, (p1->y + p2->y) / 2 };  memcpy(result, &p, sizeof(Point)); } この例のような小さい構造体であれば、 オブジェクトをまるごとリターンしてもよい? Point center(Point* p1, Point* p2) {  Point p = { (p1->x + p2->x) / 2, (p1->y + p2->y) / 2 };  return p; } あるいは、そもそも構造体の要素を const にする手法は C言語では一般的でないのでしょうか? どうかご教授願います。