• ベストアンサー

オブジェクト指向(具体的にはどんなクラスで作ります?)

 オブジェクト指向、クラスの便利さは大体わかりました。 (赤外線やマイクロ波の専門的な説明はわかったけど、リモコンや電子レンジに具体的に見てみないと、ぴんときていない状態だと、思います。) それに、一人で作っていることもあり、また構造化プログラミングで今まで作ってきたので、具体的にどういうクラスに分け、どういうことを将来予想し、作るのかがわかりません。 仮に、シンプルな日記から作る場合、どういったクラスを作り、どういうことを予想し、作りますか? 特に、継承や他に使いまわせるようにとか、ソフトを作り、何を想定するのかを知りたいです。

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

  • ベストアンサー
noname#45950
noname#45950
回答No.4

あんまり参考にならないかもしれませんが。 1人で自由にコーディングしているのであれば、まずどんどんソースを書いていって「何か似たようなコード書くことになるな」「同じコード書くことになるな」という段階で、クラス化します(まぁ最低限、最初の段階でReadクラスとWriteクラスと分けますが)。 仕事で客先からの要求がある場合は、あらかじめコーディング前に、「似たようなコード書くことになるな」「同じコード書くことになるな」を想定して、クラス化します。 余裕があれば、「この要件は、後々同じようなことを言ってくるだろうな」というのも、クラス化しておきます。が、「一歩先を見越す」程度でそれ以上はしません(限られた納期ですし、アテが外れる場合もありますから)。 それと、保守しやすい・見やすい(結果としてバグが出にくくなる)という点もクラス・メソッド設計では重視します(今、他人が作ったソースの保守・改修で泣きを見ているので)。 うーん、あまりレベルは高くないかもしれませんが(涙)、今の私の現状です。

dedelphi
質問者

お礼

delphiなので完全にクラス化しなくてもいいので、構造化で書いていっています。 一部クラス化もさせましたがまだ小さなソフトなため、継承等のオブジェクト指向を意識した書き方ではありません。 サブルーチンとあまり変わらないし、クラス化させるとメモリーから解放させないとまずいので、それが少し怖いです。 だったら、サブルーチンでもいいので、戻そうかどうか迷っています。 特にクラス化させなくてもif文で条件分岐させれば、オーバーロードっぽい事もできますし。 オブジェクト指向は、やはり大勢で大規模なソフトを作成する場合に、効果を発揮するものなんんですかねー。

その他の回答 (4)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.5

モデルに関しては、過去の資源がないならないで新規でもいいと思います。 あれば使う。特に勉強主眼ならば無理に探してまで流用する必要はないんじゃないでしょうか。 > こいつらをどう動かすかの部分は、 > UCやフレームワークへの依存度が大きくなりますね。 UC(Use Case)はご自身で決めるでしょうし、これを実現するための設計ですから当然依存します。 「始めに目的ありき」なのは最初から書いてる通りです。 で、UIとかビューの部分は、どうしてもライブラリなりフレームワークなりに依存してきますから、これなしにクラス構成を決めてもあまり意味がないです。 # 画面設計とかは依存しないと思いますが。

dedelphi
質問者

お礼

やはり、そのときの場合に依存する場合が大きいと言うことですね。 ありがとうございます。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.3

# 基本的には#2の方の回答に同意。 私の想定だと、 [人] (1) --- (N) [日記] (1) ◆--- (N) [頁] くらいは作ることになりそうな気がしますが、 そうすると、頁には「書く」「読む」とか、 日記には「頁をめくる」とか「この頁に書く」「この頁を読む」とか? # UC次第では「鍵をかける」とか「破り捨てる」とか? こいつらをどう動かすかの部分は、UCやフレームワークへの依存度が大きくなりますね。

dedelphi
質問者

お礼

やはりフレームワーク、過去の資源の有効利用ですか。 PHPのライブラリーはよく見かけましたが、他の言語の雛形を探したことがないので知りませんでした。 それでも、 一つは、全部自分で作りたい。 一つは、雛形には自分8の必要としない部分もあり、処理や負荷が大きくなるのでは?という不安。 (最近のPCは優秀なので、気にしなくてもいいとは思うのですが。 一つは、資源を使うことが勉強につながるのか? 一つは、探したことがないので、探し方がわからない。(それは自分でも調べますが。 おそらく、個人でのんびりとフリーソフトを作るか、納期を優先させている専門家によって、考え方も少し違ってくるとは思いますが。

  • dekopa-
  • ベストアンサー率42% (161/378)
回答No.2

UCとして「日記を読む」「日記を書く」だけと仮定して。 この場合「日記(dialy)」と「読み書きする人(person)」でしょうか。「誰が」がクラスになるかどうかはシステム次第ですが、ユーザー登録があると仮定して。 日記のメソッドとして「読む」「書く」ですね。 他にどんなメソッドが必要かは、ユースケース次第です。あるいはUCに追記されたシナリオにどういう記述があるか、ですね。 UCで想定されていないなら書きません。「足りないかな?」と思ったら、まずUC側を修正し、クラスに追記します。 日毎に分けるために「ページ」があり、「タイトル」「本文」があり、おまけで「天気」「気温」「絵日記の絵」があるかもしれません。 詳細レベルになると、今度は実装する言語のライブラリやフレームワークが強く影響します。 継承や再利用などは、現在はフレームワークとの兼ね合いを考えるのが主です。日記を読む、書くといったクラスなら、StreamクラスやReader/Writerクラスが必ずありますし、データベースに保存する場合はそれ用のクラスがあります。 入門書の継承の例は自分で作ったクラスを自分で継承するパターンが大半ですが、それは概念を教えるためのもので、現実にはフレームワークをうまく再利用する事が大事です。

dedelphi
質問者

お礼

とりあえず、日記については自作すると見なしてください。 入門書は、映画のように必要な物がすでに決まっていて、できレースな一面もあるので、いざ自分で作ろうとするとなにがなにやら分からなくなっています。 しかも、レンガの積み方を教えただけで、後はその応用なのでお城を造りましょう。と言われても。 せめて家の作り方くらいの中級者のソフトの作り方の指南書があればいいのです。 今は雛形を使う際に、それに不都合な場合、継承するという一面もあるんですか。 わりと完璧主義者の面もあるので、全て自分で作りたいと思ってしまうので、自分で作ったものを再利用する事に視点が言ってしまい大局をみていなかったのかもしれません。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

えっと、本クラスに集約されたページクラスがあって… とかそういうことを決めるのは後の話なので、 最初はユースケースとかで「シンプルな日記」というものの使い方や機能などをある程度決めます。 これをベースにして、これに対する機能変更や保守を想定したり、流用製を考慮したりするのであって、それを定義せずにどんなクラスを作りますか、と聞くのは難しいと思いますが。 # 目的があっての設計/方法論なので。 で、ご質問の件は設計/分析上の用語としては「クラス抽出」と呼ばれると思いますので、これで検索してみてください。 名前/名詞抽出とかいろいろな方法論が見つかると思います。 入門用で、最近私がわかり易いと思って進めている本を参考に載せておきますので、ご興味があれば本屋さんなどでご覧になってみてはいかがでしょう。 言語としては一応組み込み系のC++が想定されてますが、本質はモデリング~製造~評価まで一通りを舐めている本なので他言語でも考え方は使えると思います。 理論に走るというよりは、構造化とかで経験もあり基礎はわかっているような人がオブジェクト指向で作ってみる場合の入門指南書だと思ってます。

参考URL:
http://www.amazon.co.jp/gp/product/4798111767/250-8497647-4429828?v=glance&n=465392
dedelphi
質問者

お礼

クラス抽出で検索してみようと思います。 実際の場面で、クラス抽出のお手本を見ていないので、どう言うクラス抽出がいいのかが、ぴんときていない状態です。 ありがとうございます。

dedelphi
質問者

補足

目的は、質問者様の方である程度決めていただいて結構です。 なので、合えて言及しませんでした。 「自作で日記を作るとしたら。」と置き換えていただいてもかまいません。 プログラム全部を書いてほしいのではなく、クラスのイメージがわかる青写真の段階で問題ありません。

関連するQ&A

  • オブジェクト指向の教え方

    新入社員にJavaを教えているところなのですが、オブジェクト指向プログラミングをどのように教えていいか困っています。 全員がC言語研修を受講済みで、さらにJava言語も、継承やオーバーロード、例外まで一通り教えて、一応理解しています。 そこで、次のレベルとして、C言語風のプログラミング(「プログラム=関数の集まり」の考え方)から、オブジェクト指向(「プログラム=オブジェクトの集まり」の考え方)に意識改革させたいところです。 問題領域をオブジェクトの集まりとしてとらえ、そこからクラスを抽出していく、という説明がよくありますが、 「何をオブジェクトにするのか」「どのようにクラスを抽出したらいいのか」の部分を詳しく教えたいのですが、どのように説明したらいいでしょうか。また、参考になるWebサイトなどありませんでしょうか? 自分が普段作るときは、ほぼ「勘」でクラス設計していますので、それでは教えられなくて困っています。よろしくお願いします。

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

    【オブジェクト指向について】 こんにちは。初めて質問をさせていただきます。 さて、ただいまVBを勉強中なのですが、オブジェクト指向のところで躓いてしまいました。 質問したい事は以下の点です。 (1) オブジェクト指向の理解について   オブジェクト指向とは、プログラミングをするときに変数や機能などをクラスというものに格納しておくことで、プログラミングを円滑にすすめるための概念であると理解していますが、この理解は正しいのでしょうか? ご回答お待ちしております。よろしくお願いいたします。

  • オブジェクト指向について

    趣味でプログラミングをしているのですが オブジェクト指向の概念がうまく理解できていないので 教えていただけませんでしょうか? 解説本などを読むと、オブジェクト指向のクラスを動物クラスを継承して犬クラスや猫クラスなどと解説してあるのですが。 どうも、僕がプログラム設計するとしっぽクラスや泣き声クラスなどといった違った動物の類似機能をまとめてのクラスをつくり各メソッドとしてしまいまっています。 動物クラスや乗り物クラスを組み合わせてプログラムを設計する事ができません。 本格的なプログラムを組む用途では無いので気にしなくても目的の機能が実装できれば問題無いと知人からは言われ(面倒なので教えたくないのかもしれませんが)そのまま来てしまいました。 最近、気になって来たので。 正しい使い方を身に着けたいと思いチャレンジしていますが、変な癖がついていて犬や猫クラスなどと思いながら設計していると思考が止まってしまいます。 そこで、下記のことを教えていただけませんでしょうか? (1)泣き声クラスなどの同機能を1つのクラスにしてしまう設計しか出来ない(発想できない)のは考え方のどこがわるいのでしょうか? (追記:一部分だけならペンギンクラス猫クラスなどと言う動物クラスの継承的な発想はできるのですが実際のプログラミングの際は動物のようなわかり易い物オブジェクトとして目に見える物体ではない事柄をオブジェクト化にする事が難しく感じるのではないかと思います。) (2)今までの小さい規模での開発なら、クラスのつくり方がおかしくても不具合は無かったのですが、どのような時に困る事があるのでしょうか?(解説などでも再利用性などと、さらっと解説されていますがイマイチぴんときません) (3)正しくオブジェクト指向がマスター出来ている方にとって、どのクラスにどのメソッド実装するか悩む事などはあるのでしょうか? また、設計で一番悩むのはどのあたりですか? (4)UMLのマスターは必須でしょうか?(現在は、なんとなくUMLぽい感じでメモ書きをつくり、えせオブジェクト指向でプログラムを組んでいます。) (5)その他アドバイスがあればお願いします。 ※乱文で問題もハッキリせず質問の整理等がうまくいっていないと思いますが1つの項目だけでも構いませんので、ご教授お願いします。

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

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

  • オブジェクト指向に関して。

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

  • オブジェクト指向プログラミングについて

    VisualBasicを対象にしたオブジェクト指向プログラミングに関する参考書、Webサイトなどはないでしょうか。 現在、クラスモジュールなどを多用しオブジェクト指向プログラミングを実践しているつもりですが、あまり勉強したわけではないのでいまいちよくわからないです。 (オブジェクト指向プログラミングのメリットとデメリットなど)

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

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

  • VBがオブジェクト指向言語でない理由

    一般的にVBはオブジェクト指向ではない(VB7でその方向へ向かう)といわれていますが、実際にVBをさわり始め、いろんな本を読んでみると、 1)クラスが作成でき、構造体と関数を1つにまとめ、メンバ(プロパティ・メソッド)を定義付けできる 2)Implementsステートメントでクラスの継承が出来る と、ある程度のオブジェクト指向言語の要件を備えているように見えます。 といっても私はJAVAもSmallTalkも知らないので、「何が真のオブジェクト指向か」というのを良く判っていないのかも知れないのですが。 しかしC++関連書などを読んでいると出てくるクラスの使用例などはVBのそれと大差なく、なぜクラスの作成もできて、継承も可能なVBがオブジェクト指向ではないのか? という疑問がわいてきました。 JAVAとは何が違うのか? これが出来ないからオブジェクト指向ではないのだ! という理由をご存じの方、回答もらえればうれしいです。

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

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

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

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

    • ベストアンサー
    • Java

専門家に質問してみよう