趣味でプログラミングをしている者です。
オブジェクト指向設計というのでしょうか? それを学びたいのですが、
何かわかりやすいサイトはありませんでしょうか?
わかりやすい・わかりにくい というのは人によって違うというのはわかっていますが、
私が自分で調べた範囲では ( 調べ方が悪いのか ) わかりにくいサイトがほとんどです。
JavaやC++ のような言語そのもの ではなくて、私が知りたいのは、
「オブジェクト指向の考え方を使ってどのように設計すべきか」です。
たとえばCの関数を使って C++で使える ファイルの入出力クラスを作るとします。
私が簡単に思いつくのが
- ファイルパス : 文字列
- FILEポインタ : FILE*
- Write関数 : bool
- Read関数 : bool
という感じです。
もうちょっとマシなものでも 入力用, 出力用 を分離するぐらいです。
ですが、Javaの場合は 「対象はどこか ( ファイル? コンソール? )」と 「処理」が分離されています。
( 入力用, 出力用 の分離は当たり前として。 )
私は Cを拡張して楽にしたような感覚 ( BetterC ) で C/C++を使っているので、
構造化というのでしょうか。その感覚でやってしまいます。
あとは、「株式会社アークシステム(infoARK)」のサイトでの
「関数とユーティリティクラスは禁止 - 株式会社アークシステム(infoARK)」
と
「privateメソッド禁止 - 株式会社アークシステム(infoARK)」には、
「関数はオブジェクト指向では不要」となっています。
メンバ関数という意味ではなく、メンバ変数 ( フィールド ) にアクセスしないメンバ関数のことのようです。
ですが、私からすると変に感じます。
たとえば、コンストラクタで
-
引数を受け取ってメンバ変数 ( フィールド ) に設定
-
メンバオブジェクトであるvector ( listでもいいですが。 ) にデータを詰める
-
その他の前処理
を行うとします。
これをすべてコンストラクタに書けということなのでしょうか?
私の考えでは
引数 から メンバ変数
=> データ設定だけなので そのままコンストラクタ内で。
vectorにデータを詰める
=> 詰めるデータが多いので 関数化して void PushDataToVector() とします。
その他の前処理
=> 長くなるようなら関数化
となります。
ですが、上記サイトではダメとなっています。
こういう風に考え方が全然違う場合が多いので、
オブジェクト指向設計を説明しているサイトが欲しいのです。
オブジェクト指向の強みを生かしながらする方法が知りたいのですが、
「オブジェクト指向 設計」等で検索しても、
- Amazon のような 書籍販売
or
- 書籍の広告
or
- 実際の業務である事
がほとんどです。
"実際の業務..." はまだいいですが、サンプルコードがそんなに載っていなかったりしてイメージしづらいものばかりです。
ファイルの入出力等ならそれでもいいかもしれませんが、DB ( MySQL etc. ) にアクセスして データを取得編集するクラス
とか言われてもイメージしづらい...
( MySQL 等は 名前はよく見るが 使ったことないし... )
どちらかと言えば その手の学校に通っている ( または 通って卒業した etc. ) 人か 上級者を対象としているのではないか
と...
プログラミングそのものはできる(?) のですが、オブジェクト指向で設計できているかどうかと言われたら、
まったくだと思います。
それなのに 上記のような説明されてもイメージができません。
私は最低でも
-
箇条書きで必要要件等が記載されているような感じであること
-
サンプルとして そのソースコード が最低限 ( 呼び出し側からの使い方も含む ) が記載されていること
-
その他の条件等を文章で説明していること
で理解できる状態です。
特に サンプルがないとイメージができません...
たとえば、もし私が デザインパターンを説明するサイトを作るなら、
パターン名: TemplateMethodパターン このパターンは 親クラス ( abstract, 通常クラス ) の メソッド ( メンバ関数 ) で 基本的な処理順番を記載し、継承させて実装させるパターンである。 [必要要件] * TemplateMethodメンバ関数 ( 名前は変えてもいい ) を 親クラスで定義し、その中に処理を順番に書いていくこと * 子クラスで定義するメンバ関数を (純粋)仮想関数 として親クラスで保持すること [適用する場面] * インターフェースのような親クラス ( abstract, 通常クラス ) として使用し、流れは一緒だが、 実際に行う処理が違う場合 例: [ C++ ] class CParentTest{ public: CParentTest(){} virtual ~CParentTest(){} // 与えられた数値から文字列を生成する。 // TemplateMethodパターン。 // このように親クラスで使用するメンバ関数内で流れを書いておけば // 親クラスのように動かすことができる。 std::string TemplateMethod( int a, int b ){ int c = calc( a, b ); int d = check( c ); return name( d ); } protected: // 以降は継承した子クラスで定義するメンバ関数 virtual int calc( int a, int b ) = 0; virtual int check( int n ) = 0; virtual std:string name( int n ) = 0; }; class CChildTest{ public: private: // 親クラスで純粋仮想だった関数の定義 int calc( int a, int b ){ int n; // 何らかの計算 return n; } int check( int n ){ int n; if( n == 0 ){ // 略 }else{ // 略 } return n; } std::string name( int n ){ string str; // 何らかの計算 return str; } }; int main( void ){ // FactoryMethodパターンのように // 親クラス型として 生成。ただし、中身は 子クラス。 CParentTest* Test = new CChildTest(); cout << Test->TemplateMethod( 1, 2 ) << endl; delete Test; return 0; }
のような感じの方がイメージしやすいのです。
( サンプルでは 「何らかの処理」ってありますが、例の例なので省いています。実際にはちゃんとした式かなんかが書いてあるとします。 )
その手の学校に行けば学べると思いますが、私は趣味で独学でやっているのでその方法は無理です。
書籍を買う方法もありますが、できれば無料でできたらなぁと。
言語は できれば C/C++ ( C++ ) がいいですが、 Javaでも OK です。
宜しくお願い致します。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。