• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:オブジェクト指向の勉強にちょうど良いソースコードはありませんか?)

オブジェクト指向の勉強にちょうど良いソースコードは?

このQ&Aのポイント
  • オブジェクト指向の勉強に役立つソースコードを探しましょう。VB6からVB.NETへの移行中で、オブジェクト指向について学びながらリファクタリングを進めています。デザインパターンのサンプルコードはあるものの、実際の開発にどのように適用するかがイメージできません。
  • オブジェクト指向ではオブジェクト間の結合度を弱くし、グローバル変数の使用を避けるとされていますが、設定値を管理するオブジェクトのように複数の場所で参照されるものはグローバルにするのが一般的でしょうか。設計の参考になるソースコードやサイトを教えてください。
  • 現在開発しているのは制御系のソフトウェアで、測定器や電源装置の制御やデータ収集を行っています。オブジェクト指向の応用について学びたいです。

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

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.3

オブジェクト指向&デザインパターンについては「デザインパターンとともに学ぶオブジェクト指向のこころ」がお勧めです。 解決したい問題をじっくり説明した後で、他の方法も試しながらデザインパターンに行き着くという流れなので、実際にどのように適用するのかを知るにはちょうど良いかと。 本文中に出てくる例もちょうど制御系ですし。 ■ デザインパターンとともに学ぶオブジェクト指向のこころ http://www.amazon.co.jp/dp/4894716844 もし、これが読みにくいと感じられたら、下記の本の方がとっつき易いので良いかも知れません。 ■ オブジェクト指向でなぜつくるのか http://www.amazon.co.jp/dp/4822281957 また、Webサイトは「オブジェクト指向 入門」などで検索すればいろいろ見つかると思います。下記は日経BPのサイトです。 http://itpro.nikkeibp.co.jp/article/COLUMN/20060921/248589/ > 設定値を管理するオブジェクトのようにあちこちから > 参照されるものはやはりグローバルにするのが一般的なのでしょうか。 システム中でただ一つの値を持つのが自然で、かつ変化しない設定値の様なものは、シングルトンやグローバル変数(定数?)として扱うことは良く有ります。これは特に問題では無いと思います。 しかし、参照される箇所が多いというだけでグローバル変数にするのは良く有りません。 どこでも変更されるか可能性が有るので、バグの温床になりますし、デバッグも難しくなります。 また、グローバル変数を多用したプログラムは並行性を持たせることがほぼ不可能になります。 なお、グローバル変数の使用を避けることの重要性は、オブジェクト指向プログラミングに限ったことではなく、プログラミング全般について言われている事です。 http://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E5%A4%89%E6%95%B0 ちなみに、下記の「レガシーコード改善ガイド」にも「グローバル参照のカプセル化」という項目が有ります。 リファクタリングについては下記の書籍が参考になると思います。 これらでも述べられていますが、リファクタリングは自動化された単体テストを作ながら行うのが定石です。 ■ リファクタリング http://www.amazon.co.jp/dp/4894712288 ■ レガシーコード改善ガイド http://www.amazon.co.jp/dp/4798116831

msx68000
質問者

お礼

回答ありがとうございます。 実は、ご紹介いただいた「デザインパターンとともに学ぶオブジェクト指向のこころ」はオブジェクト指向の勉強のとっかりに入手したんですが、そのときは内容がまったくピンとこなくて途中で投げ出しておりました。 で、あれから数年・・・オブジェクトを意識して書くようになってから引っ張り出してみるととても役立つ内容であることに気づき丁度読み返していることろです。 ですが、デザインパターン関連の本はプログラムの一部分に注目した説明で適用箇所が限られると思うので、身の回りのプログラムがどのように設計されているかを知りたいと思いました。 最後にご紹介された二冊も見てみます。Amazonでの評価がかなり高いですね!とても興味あります。  単体テストってテストを先に作ってコード組んでく方法ですよね。なんか手間がかかりそうなのでやったことはないです・・・  実際の開発現場では単体テストって常識なんでしょうか。 いろいろ勉強することが多く先は長いです。

その他の回答 (2)

回答No.2

再度投稿させて頂きます。 グローバル変数の問題は、ほとんどのオブジェクト指向のプログラミング言語での問題でもあります。 ある設定用のグローバルな変数がどうしても必要な場合は、 大域になる順に決めるとすれば ・グローバル関数に共用変数を持たせそれを返すメソッドを用意する ・シングルトンパターンを代用し、直接の参照をさせないようにする ・基底クラス(継承元のクラス)に共用変数を持たせ、カプセル化する  これにより継承したクラスのみが扱える変数にする ・引数として扱う ※共用変数とはC++で言うstatic変数です。  C++ではクラスのstaticメンバ変数は共用となり、  継承先の、どのクラスでも一つの変数を参照します。 となります。 下に行くほど結合度は低くなります。 上の二つはグローバル変数とほとんど同じですが、 アクセスの制限や特殊なメソッドを設けると変更があった場合に比較的楽に書きなおせます。 もしグローバル変数を直接使用していたら、使用していた箇所全てを書きなおさなければなりませんね。 ここら辺の設計は、オブジェクトとして収まりが良い方法を取り可読性を考えるか 実用性を考え結合度を低くするかを決めなければなりません。 (この問題こそがオブジェクト指向はオブジェクトで考える云々と矛盾しています。) フレームワーク等を作成したり、単体テストを行うような大規模なプロジェクトであれば 結合度は低い方が後に問題は少なくなります。 ただし記述量は増えますけど。

msx68000
質問者

お礼

回答ありがとうございます。 ご紹介いただいた本は近所の書店にありまして、 見たところよさそうだったので購入しました。 グローバル変数は引数にできないか見直します。 でも、設計が適切でなかったりすると、 アクセスできない変数等がでてきて、グローバル だったら楽なのに・・・と思うことがよくあります。

回答No.1

私がよく使う言語はC++なので、参考になるかどうか分かりませんがお答えします。 様々な本を読んできて、オブジェクト指向はオブジェクトを中心に考えるから云々と言われていますが 私にとっては意味のわからないうたい文句のように感じています。 結局何を言いたいのか要約しますと ・カプセル化をすることで変数やメソッドの隠ぺい ・クラス間の役割を、メッセージのやり取り(関数の呼び合い)で実現 ・クラス継承を利用して、能力の引き継ぎ だいたいこのくらいです。 あちらこちらで参照されるような値が本当に必要であれば、 値を取得するだけのグローバル関数を使うのが良いかもしれません。 単純にどこかでバグが起これば、バグが起こった場所を探すのに時間がかかりますよね。 (このような危険な手法を出来る限りしないのがカプセル化だからだとも言えます) この考え方による恩恵はすさまじいものがあります。 例えば、テレビのリモコンをクラス化するとしましょう。 扱う人(リモコンクラスを利用する人)にとっては、内部の電圧であったり 処理であったりはどうでもいいことなのは明白です。 これらを全て隠し、電源オンオフボタン、チャンネルを変えるボタン……と 限定したインターフェースを公開するだけで使いやすく分かりやすいクラスが出来るわけです。 そして、利用する人はカプセル化された情報を誤って操作することもありません。 また、リモコンとはチャンネルを変える方法を知るクラス(関数)などなどを 寄せ集めたクラスとも言えます。 このように機能を提供するクラスや、この寄せ集めて製品となったリモコンクラス それぞれにクラスとしての意味合いが変わってきます。 これらのクラスの意味を考え、パターン化したものがデザインパターンとなります。 つまり、「何故そのパターンが必要なのか」が分からないとデザインパターンを学んでも よく理解できるものではありません。 そしてデザインパターンを実現するためには、プログラム言語の仕様にも精通していないといけません。 どちらも満たすように学習していくには、質問者様がやられていますように 作ってはリファクタリングするのが王道だと思います。 知らずに自ずとデザインパターンを使っているものですしね。 個人的に理解の助けになったのは、javaになりますが 「java言語で学ぶデザインパターン入門」という書籍です。 もし必要があれば手に取ってみてください。

msx68000
質問者

お礼

回答ありがとうございます。 やはりグローバルはよくないんですね。 リファクタリングを進めてはいますが、 グローバルの扱いに苦慮しています。 引数で渡すのがいいんでしょうか。 ご紹介いただいた本もトライしてみます。

関連するQ&A