プログラム(クラス)の設計はどのように行なえばよいでしょうか?

現在、Chordアルゴリズムを利用したP2Pソフトウェアを勉強のため製作しています。
ネットワーク機能を利用したりと小さくない規模なのでUMLを利用してきちんと設計をするべきだと思う(ふだんは思い付くまものい記述してからバグを削るタイプです)のですが、機能をどのように細分化してクラス単位に纏めればよいかの基準や手法がいまいち要領を得ません。
基本的な指針を御教授いただけないでしょうか。
また、参考になる本やWebサイトなどありましたら紹介していただけると助かります。

うまく伝えきれていない部分もあるかと存じますが、よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/01/27 02:21:15

ベストアンサー

id:cdaotg No.2

回答回数123ベストアンサー獲得回数35

オブジェクト指向でなぜつくるのか―知っておきたいプログラミング、UML、設計の基礎知識―

オブジェクト指向でなぜつくるのか―知っておきたいプログラミング、UML、設計の基礎知識―



 やや古い本ですが、私はこれで勉強しました。また、Webサイトですと http://www1.u-netsurf.ne.jp/~kitada/3H/ が比較的わかり易かったです。

> 機能をどのように細分化してクラス単位に纏めればよいかの基準や手法がいまいち要領を得ません。

 基本的には、「単一の機能を持つ、データ構造とアルゴリズムのまとまり」を1つのクラスとすべきです。

 例えば、「メインウィンドウ」「設定ウィンドウ」「ハッシュ値の計算部分」「ネットワークを介した通信を行う部分」等は、それぞれ1つのクラスとすると良いかと思います。

 また、私がよくやるのは、クラスの内部構成(持たせるデータやアルゴリズム)を仮決めした段階で、クラスの名前を考えます。で、複雑な名前になったらそれは「クラスの設計がまずい」と判断します。

 例えばアプリ内で「文字列の線形リスト」を扱う必要が出て来て、それをそのまま一つのクラスにすると「LinkedListOfString」みたいな名前になりますよね。

 で、これだと以下の2点から「複雑で悪い」名前だと判断します。

  • 長い
  • 複数の機能(線形リストと文字列)の名称が含まれる

 この場合、LinkedListクラスとStringリストの2つに分けると、それぞれの名前は短くシンプルになりますので、これは「良い名前=良いクラス設計」だと判断します。

 ものすごく大雑把に説明しましたが、クラス名を考えてそれを基準にクラス設計の良し悪しを判断するというのは、それなりに使える手法だと考えています。

id:Windymelt

適切な名前を利用するのはなるほどと思いました。
ありがとうございます。

2013/01/25 18:18:00

その他の回答1件)

id:Bookmarker No.1

回答回数191ベストアンサー獲得回数34

以下どちらも古い書籍ですが、おすすめです。
特に1冊目には、タイトルの通り「オブジェクト指向の考え方(こころ)」が書かれています。

id:Windymelt

書籍の紹介ありがとうございます。
参考にさせていただきます。

2013/01/25 18:16:11
id:cdaotg No.2

回答回数123ベストアンサー獲得回数35ここでベストアンサー

オブジェクト指向でなぜつくるのか―知っておきたいプログラミング、UML、設計の基礎知識―

オブジェクト指向でなぜつくるのか―知っておきたいプログラミング、UML、設計の基礎知識―



 やや古い本ですが、私はこれで勉強しました。また、Webサイトですと http://www1.u-netsurf.ne.jp/~kitada/3H/ が比較的わかり易かったです。

> 機能をどのように細分化してクラス単位に纏めればよいかの基準や手法がいまいち要領を得ません。

 基本的には、「単一の機能を持つ、データ構造とアルゴリズムのまとまり」を1つのクラスとすべきです。

 例えば、「メインウィンドウ」「設定ウィンドウ」「ハッシュ値の計算部分」「ネットワークを介した通信を行う部分」等は、それぞれ1つのクラスとすると良いかと思います。

 また、私がよくやるのは、クラスの内部構成(持たせるデータやアルゴリズム)を仮決めした段階で、クラスの名前を考えます。で、複雑な名前になったらそれは「クラスの設計がまずい」と判断します。

 例えばアプリ内で「文字列の線形リスト」を扱う必要が出て来て、それをそのまま一つのクラスにすると「LinkedListOfString」みたいな名前になりますよね。

 で、これだと以下の2点から「複雑で悪い」名前だと判断します。

  • 長い
  • 複数の機能(線形リストと文字列)の名称が含まれる

 この場合、LinkedListクラスとStringリストの2つに分けると、それぞれの名前は短くシンプルになりますので、これは「良い名前=良いクラス設計」だと判断します。

 ものすごく大雑把に説明しましたが、クラス名を考えてそれを基準にクラス設計の良し悪しを判断するというのは、それなりに使える手法だと考えています。

id:Windymelt

適切な名前を利用するのはなるほどと思いました。
ありがとうございます。

2013/01/25 18:18:00

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません