トップ回答者
オブジェクト指向開発の初歩

質問
回答
-
> 基礎を身に付けるには実践あるのみだと考えておりますので、VB2008での具体例などご教示いただければ幸いです。
残念ながら、書籍および WEB リソース上には、VB.NET によるオブジェクト指向の詳しい解説は非常に少ないと言わざるを得ません。OOP の基礎をしっかり身に着けたいなら、VB.NET という言語の縛りから離れる必要があります。
VB.NET で OOP を解説しているのは、知るところでは trapemiya さんが紹介されている中西さんの記事くらいですが、そのうち
> http://hccweb1.bai.ne.jp/tsune-1/
は、結城 浩さんの 「Java言語で学ぶデザインパターン入門」 に出てくるサンプルを VB・C# に書き換えたものです。サンプルを理解するためには 「Java言語で学ぶデザインパターン入門」 をどうしても避けては通れません。しかしこの本は、GOF のパターンの紹介がメインのため、実戦でどうパターンを適用するのか掴みづらいというのが感想です。パターンを実戦で使いこなせるようになるイチ押し本は 「デザインパターンとともに学ぶオブジェクト指向のこころ」 ですが、こちらも Java がメインです。
そこで私の提案としては、OOP の名著は Java で解説しているものが多いため、あえていったん Java を迂回して、これらの書籍を読まれることをお勧めします。これらの本で使われているサンプルは、Java で書かれているといってもさほど難しい構文ではありません。Java の基本構文さえ覚えれば十分読みこなせるでしょう。また Java が判ってくると C# もだんだん使えるようになってきます。スキルアップのために、一石三鳥の効果ありといったところでしょうか。
ひらぽん http://d.hatena.ne.jp/hilapon/- 回答としてマーク koyometal 2010年10月20日 2:57
すべての返信
-
VB6からVB2008への乗換について質問です。オブジェクト指向VB2008を使い、ソースの重複を無くす事を目標に考えておりますが、各書籍を見るとDBIOにはDataSetを利用する例が多く乗っています。これを利用すれば生産性が高く開発が出来ると思うのですが、オブジェクト指向の考え方「データとロジックをクラスに纏めてソースの重複をなくす」にはならないと思い悩んでいます。マスターメンテナスプログラム等、単純な実例がありましたら、ご教示願います。
微妙に質問の趣旨から外れているかもしれませんが、参考までに。
オブジェクト指向の考え方は、何も 「データとロジックをクラスに纏めてソースの重複をなくす」 とは限りませんよ。状況によっては、データとロジックを分離した方が保守性が高くなる場合もあります。また下手な継承はむしろ保守性を低下させるというのが、OOP の先達の共通意見です。いまは継承よりもコンポジションが好まれるようです。もし時間があるなら、一度以下の本に目を通されることをお勧めします。
http://www.amazon.co.jp/dp/4894712288
http://www.amazon.co.jp/dp/4894716844
http://www.amazon.co.jp/dp/4797347783OOP の名著は JAVA が多いため VB ユーザー、特にVB6ユーザーは敬遠される方が多いですが、我慢して読み進めると世界が変わります。自分の書いたコードの保守性・変更容易性が、劇的に跳ね上がるのを実感できると思います。原理は全くVB.NET・C# に応用できますので、読んで損はありません。
ひらぽん http://d.hatena.ne.jp/hilapon/ -
-
オブジェクト指向VB2008を使い、ソースの重複を無くす事を目標に考えておりますが
最初に誤解があるように見受けます。オブジェクト指向はソースの重複を無くすために存在するのではありません。VB6でソースの重複を無くすためにサブルーチンやメソッドを利用されていたと思いますが、VB2008でもそれはそのまま当てはまります。ソースの重複を避けるためのサブルーチンやメソッドが、そのままクラスに代わるわけではありません。VB2008でもソースの重複を避けるためのサブルーチンやメソッドは依然として存在します。
各書籍を見るとDBIOにはDataSetを利用する例が多く乗っています。これを利用すれば生産性が高く開発が出来ると思うのですが、オブジェクト指向の考え方「データとロジックをクラスに纏めてソースの重複をなくす」にはならないと思い悩んでいます。
なぜそのように思われたのでしょうか?その理由を示していただくと、できるだけ的を得た回答に近づけると思います。
マスターメンテナスプログラム等、単純な実例がありましたら、ご教示願います。
DBIOというのがよくわからなかったのですが(DataBase Input Outputの略ですか?)、各書籍に載っているDataSetの例で大丈夫だと思います。他の例としては、SqlCommandを使用してSQL文を直接発行するようなパターンがあります。
(参考)
社員テーブルを更新する 3
http://park5.wakwak.com/~weblab/mailMagazine/mag068.html
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/ -
ご回答有難うございます。具体的に書かせていただきます。
「入門はじめてのオブジェクト設計」という書籍によると、顧客マスタの一覧表を出力する場合、[テーブルスーパークラス]←[顧客テーブルクラス]←[顧客一覧帳票クラス]のようにテーブル毎にクラスを作成し、顧客マスタの登録や修正プログラムを作成する場合に、テーブルアクセスに関連するロジックの重複をなくす事が出来るという例が上げられていました。
これをVB2008に実装する場合、.NETデータ・プロバイダを使った接続型データアクセスではj問題ないのですが、ほとんどコード書かずに済むDataSetを使った非接続型の場合について悩んでいる次第です。
どうぞ宜しくお願い致します。 -
「入門はじめてのオブジェクト設計」という書籍によると、顧客マスタの一覧表を出力する場合、[テーブルスーパークラス]←[顧客テーブルクラス]←[顧客一覧帳票クラス]のようにテーブル毎にクラスを作成し、顧客マスタの登録や修正プログラムを作成する場合に、テーブルアクセスに関連するロジックの重複をなくす事が出来るという例が上げられていました。
これをVB2008に実装する場合、.NETデータ・プロバイダを使った接続型データアクセスではj問題ないのですが、ほとんどコード書かずに済むDataSetを使った非接続型の場合について悩んでいる次第です。う~ん・・・その本は読んだことがありませんが、「接続型データアクセス」 という部分だけ読むと、DataReaderを使った比較的簡単な継承による重複回避の例として挙げているように推測できます。でも実戦ではあまり効果的でない OOP の例題のような気がしてなりません。
「ほとんどコード書かずに済むDataSetを使った非接続型の場合」 というのは、おそらく TableAdapter を使われているのでしょうか?TableAdapter はウイザード形式で簡単に作成できるのですが、裏で生成されるコードは膨大になり、さらに XSD も生成されるので、スキーマに大きな変更が発生したり、また汎用化を考えるといまひとつ使いづらいという欠点があるのも事実です。悩むのもある意味当然かなと思う次第です。
個人的には ADO.NET のラッパーを用意して、極力 TableAdapter を使わずにプログラミングするようにしています。ADO.NET の主要クラスをラッピングして、比較的簡単なインターフェイスで操作できるようにしたものです。ADO.NET というサブシステム自体を隠蔽して、ユーザーが使いやすくする・・・ GOF でいうところの Facadeパターンですね。
http://d.hatena.ne.jp/hilapon/20100709/1278734481
より発展的な考え方としては、データプロバイダが変更されても対応できるようにクラス設計されてるといいかも知れませんが、上で紹介したラッパーはそこまではまだ対応できてません。この辺りの話は、佐祐里さんがいくつかのスレッドで仰ってますね。
http://social.msdn.microsoft.com/Forums/ja-JP/csharpgeneralja/thread/bb328188-f742-45b1-9e6c-4dd9c2a510e0/
http://social.msdn.microsoft.com/Forums/ja-JP/vbexpressja/thread/8718677f-1474-48d9-adaf-60d917e55abe/
なお最近では ADO.NET Entity Framework という技術も出てきたのですが、こちらはよく判りません。(勉強せねば・・)
ひらぽん http://d.hatena.ne.jp/hilapon/ -
その書籍は、継承によってテーブルアクセス部分を全て基底クラスで行うことにより、ロジックの重複を無くしているということなのですね。オブジェクト指向の一つの機能である継承に着目した例だと思います。しかし、オブジェクト指向において、全てをこのように継承して作成していくのではありません。オブジェクトそれぞれが連携し合って動作することをイメージして下さい。オブジェクトの元となるクラスは.NETに最初から用意されているものがたくさんあります。それらで間に合えばそれらを組み合わせてプログラムを作成できます。間に合わないのであれば、それらから継承して機能を付加したクラスを作成したり、全く新たにクラスを自作することもできます。画面を作成するために弄られているクラスもFormクラスを継承したものです。DataSetやDataAdapterなどデータベースを扱うためのクラスも最初からいろいろ用意されています。
繰り返しになりますが、オブジェクト指向ではオブジェクトが連携して動作することをイメージして下さい。そのためにはどのようなオブジェクトを用意すれば良いのか、つまりどのようなクラスを用意すれば良いのかを考えて下さい。正しく最適化されたクラス群においては、抽象化(端的に言えば共通部分の抜出)により継承関係が生まれ、結果的にコードの重複がなくなっていることに気付くはずです。つまり、私が言いたいのは、継承によるコードの重複化を無くすという視点で凝り固まってプログラムを設計しないでくださいということです。その視点が第一優先ではないということです。
オブジェクト指向は最初はとっつきにくのも事実だと思いますし、私が上で述べたことも的確に表現している文章になっているとは思っていません。それほどオブジェクト指向は広い概念を持っていると思います。オブジェクト指向は習うより慣れろだと思いますし、オブジェクト指向はスポーツと同じで頭で理解するだけではダメで、練習しなければ身に付かないと思っています。実践というか感覚が必要だからです。逆上がりの練習をするようなものです。幸い、ネット上には多くのサンプルコードがあります。それらを参考にマスターメンテナンスの画面などを作成することから始めてみて下さい。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/ -
オブジェクト指向は習うより慣れろだと思いますし、オブジェクト指向はスポーツと同じで頭で理解するだけではダメで、練習しなければ身に付かないと思っています。実践というか感覚が必要だからです。逆上がりの練習をするようなものです。幸い、ネット上には多くのサンプルコードがあります。それらを参考にマスターメンテナンスの画面などを作成することから始めてみて下さい。
ご回答有難うございます。trapemiya様の言うように確かに慣れだと思います。しかし知識がない為、どれがオブジェクト指向として良いサンプルなのか判断に迷っています。すぐに思いつくサイト、書籍などご教示いただければ幸いです。 -
オブジェクト指向をはじめて勉強するなら、下記URLの本がわかりやすくて個人的にお勧めです。
http://www.amazon.co.jp/dp/4822281957
オブジェクト指向がどんなものか掴めたら、ひらぽんさんが紹介された本を読むといいと思います。
なかむら(http://d.hatena.ne.jp/griefworker) -
個人的におすすめなのは、ファウラー先生の
> http://www.amazon.co.jp/dp/4894712288
ですね。いまや古典的名著です。
翻訳も非常にこなれていて、たいへん読みやすいのもポイントが高いです。なかむらさんが紹介した本 「オブジェクト指向でなぜつくるのか」 の著者・平澤さんも、本書の翻訳に参加されています。よってどちらの本にも共通することが書かれていると思います。
「リファクタリング」 には、オブジェクト指向がよく判らない VB6 ユーザーでも、読んだその日から実戦でただちに使えるプラクティスが豊富に紹介されています。例えば 「メソッドの抽出」 や 「条件記述の統合」 などは、オブジェクト指向でない言語・・・例えば VB6 プログラムにも適用できるうえ、効果がすぐに実感できます。
OOP 関連でも 「メソッドの移動」 や 「フィールドの移動」 等の簡単なプラクティスがあるので、これを切り口にして徐々に 「State/Strategy によるタイプコードの置き換え」 や 「Factory Method によるコンストラクタの置き換え」 等の高度な内容に進んでいくという方法もあります。
本書では、テストは必須となっていますが、初心者はテストにこだわらなくてもいいでしょう。ある程度リファクタリングに慣れてきたら NUnit 等のテストツールの導入を検討するといいかと思います。
ひらぽん http://d.hatena.ne.jp/hilapon/- 編集済み ひらぽんModerator 2010年10月14日 10:50 文章の追加
-
「入門はじめてのオブジェクト設計」を呼んでいないのではずしているかもわかりませんが、[テーブルスーパークラス]はDataTableに相当するものですね、顧客テーブルクラスと顧客一覧帳票クラスはウィザードで作成できると思われます。すべて手組みの場合は顧客テーブルクラスから顧客一覧帳票クラスを継承できますが、ウィザードでは継承関係のない別のクラスになります。
データとロジックの関係ですが、ウィザードで作成されたソースファイルがデータをあらわすものになります。ロジックはパーシャルクラスの仕組みを使って、別のソースの同じクラスにロジック用のメソッドを記述します。
ウィザードなどを利用した開発では型付きDataSetとBindingSourceを使うことになりますが、これは使いにくい点があります。データの参照はBindingSource→DataView→DataTableとなります。DataTableはウィザードにより型付きでクラスが生成されますが、DataViewは型付きにはならずDataViewレベルでロジックを記述しにくいのです。またDataTableには現在行の概念がないためこのレベルでもロジックが記述しにくいです。
私の場合は型付きDataSetが提供するフレームワークのあまりの使いにくさに辟易して、BindingSourceから直接参照できる現在行機能のある自作DataTable相当クラスと代替ウィザードを作成して使っています。
以下の記事も参考になりそうです。
http://d.hatena.ne.jp/iad_otomamay/20080723/p1
http://systemartlaboratory.com/ -
オブジェクト指向の具体例と言われましても、あまりにも広すぎて何を答えていいのかみなさんわからないのではないかと思います。ですので、何かやりたい事を決め、それをネットなりで検索しながらコーディングされてみてはいかがでしょうか? 例えばマスター管理画面の作成などです。その過程で多くの壁にぶつかると思いますが、それを乗り越える度に力が付いていくと思います。最初から優秀なコードを書く必要はありません。まずは自分なりに動くものを作られてはいかがでしょうか? 経験を積んでしばらく経ってそのコードを見た時、「今ならそんなコードは書かないな。はずかしい。」と思える日が来るものです。ただしその日はいつまでもいつまでも来るものですが(苦笑)
少し話が変わるかもしれませんが、「オブジェクト指向はなんとなく理解できたけど、コードを書こうとした際にどう書いてよいかわからない。」と悩まれることは想像に難しくありません。クラスやメソッド、プロパティなどの部品に関する知識と、それを実際にどう使うのかという実践的な知識は別なものだからです。
クラスやメソッド、プロパティなどオブジェクト指向で使う部品を料理に例えれば、それは食材や塩、砂糖などの材料です。材料はよく知っていても、そこから美味しい料理を作るにはレシピが入ります。そのレシピに相当するものの一つがデザインパターンにあたります。「こうやって食材と調味料を組み合わせて作るんだ。」が、そのまま、「こうやってクラスやインターフェースを使ってプログラムするんだ。」に相当します。デザインパターンは大変実践的なものですが、そういう意味ではオブジェクト指向に慣れるためにも有用なのではないかと思います。(参考)
.NETで始めるデザインパターン
http://www.atmarkit.co.jp/fdotnet/designptn/index/index.htmlDesign Patterns
http://hccweb1.bai.ne.jp/tsune-1/
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/ -
> 基礎を身に付けるには実践あるのみだと考えておりますので、VB2008での具体例などご教示いただければ幸いです。
残念ながら、書籍および WEB リソース上には、VB.NET によるオブジェクト指向の詳しい解説は非常に少ないと言わざるを得ません。OOP の基礎をしっかり身に着けたいなら、VB.NET という言語の縛りから離れる必要があります。
VB.NET で OOP を解説しているのは、知るところでは trapemiya さんが紹介されている中西さんの記事くらいですが、そのうち
> http://hccweb1.bai.ne.jp/tsune-1/
は、結城 浩さんの 「Java言語で学ぶデザインパターン入門」 に出てくるサンプルを VB・C# に書き換えたものです。サンプルを理解するためには 「Java言語で学ぶデザインパターン入門」 をどうしても避けては通れません。しかしこの本は、GOF のパターンの紹介がメインのため、実戦でどうパターンを適用するのか掴みづらいというのが感想です。パターンを実戦で使いこなせるようになるイチ押し本は 「デザインパターンとともに学ぶオブジェクト指向のこころ」 ですが、こちらも Java がメインです。
そこで私の提案としては、OOP の名著は Java で解説しているものが多いため、あえていったん Java を迂回して、これらの書籍を読まれることをお勧めします。これらの本で使われているサンプルは、Java で書かれているといってもさほど難しい構文ではありません。Java の基本構文さえ覚えれば十分読みこなせるでしょう。また Java が判ってくると C# もだんだん使えるようになってきます。スキルアップのために、一石三鳥の効果ありといったところでしょうか。
ひらぽん http://d.hatena.ne.jp/hilapon/- 回答としてマーク koyometal 2010年10月20日 2:57