C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: オブジェクト指向の設計に関する質問


(過去ログ 84 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■49746 / inTopicNo.1)  オブジェクト指向の設計に関する質問
  
□投稿者/ える (1回)-(2010/05/14(Fri) 21:42:08)

分類:[C#] 

現在、フォーム上から顧客情報を入力する業務用の
フォームアプリケーションを作成しています。

やみくもにフォームのイベントハンドラやコード部分に
処理をごりごり書いて完成させました。

ですがこれでは保守性がいまいち高くないような気がします。
そこでオブジェクト指向を活用してコードを見直したいと思っています。

まず考えたのが顧客の情報を保持する顧客クラスを作ると言うことです。
この顧客クラスを作る際に、顧客クラスのメンバ変数にフォームに入力された
顧客名や住所などを格納したいわけですが、
この際にメンバ変数へ情報を格納する手法として最も自然なやり方をご教示下さい。

いろいろ方法は考えましたが
例えば顧客クラスをインスタンス化する際にコンストラクタへ
入力フォームのオブジェクトだけを引数として渡し、
顧客クラス側から入力フォームの情報を取得するという方法を考えました。
例) cu = new Customer(this);

もう一つの方法として、全ての情報を引数で一つずつ渡すと言うことも考えました。
例) cu = new Customer(textBoxName.Text, textBoxTel.Text, textBoxAddress.Text);

どういった手法がオブジェクト指向的に自然なのでしょう。
他にももっといい方法があれば教えて頂きたいです。
引用返信 編集キー/
■49748 / inTopicNo.2)  Re[1]: オブジェクト指向の設計に関する質問
□投稿者/ やじゅ (1610回)-(2010/05/14(Fri) 22:09:31)
やじゅ さんの Web サイト
2010/05/16(Sun) 01:51:21 編集(投稿者)

No49746 (える さん) に返信
> 例えば顧客クラスをインスタンス化する際にコンストラクタへ
> 入力フォームのオブジェクトだけを引数として渡し、
> 顧客クラス側から入力フォームの情報を取得するという方法を考えました。
> 例) cu = new Customer(this);

それをしてしまうと、Customer側にもフォームのオブジェクトが必要になってしまうので
クラスとしての独立性が高くないですね。

> もう一つの方法として、全ての情報を引数で一つずつ渡すと言うことも考えました。
> 例) cu = new Customer(textBoxName.Text, textBoxTel.Text, textBoxAddress.Text);

顧客の属性が増えると引数も増えるよね、数個なら気にならないだろうけど10個とか多くなったら
クラスを使う側がしんどくないかな。

一般的には
cu = new Customer();
cu.CustmerName = textBoxName.Text;
cu.Tel = textBoxTel.Text;
cu.Address = textBoxAddress.Text;

追記:
参考になりそうなサイトを紹介しておきます。

クラスの独立性について
http://simizuna.exblog.jp/1603061/
http://www.itsenka.com/contents/development/java/object.html

引数の妥当数 3個以内で抑えたい。人間が把握できるのは7個まで。
http://blogs.wankuma.com/nakamura/archive/2008/09/17/156777.aspx

MVCについて
http://www.unisys.co.jp/dotnet/pdf/java_vs_dotnet.pdf
引用返信 編集キー/
■49751 / inTopicNo.3)  Re[2]: オブジェクト指向の設計に関する質問
□投稿者/ ちゃっぴ (15回)-(2010/05/15(Sat) 01:50:38)
ちゃっぴ さんの Web サイト
別に好きなようにすればいいと思いますが。Constructor はいくらでも over load できるので。
自分が使いやすいと思う constructor を好きな数だけ用意すればいいんじゃないかな。
個人的にはどちらの方式もありだと思います。
Form の instance を渡す constructor はそれ以外の constructor も用意するという条件付きで。


初期化後に変更させたくない要件があるなら、constructor のみで property は read only にするのが自然ですね。
引用返信 編集キー/
■49753 / inTopicNo.4)  Re[1]: オブジェクト指向の設計に関する質問
□投稿者/ れい (919回)-(2010/05/15(Sat) 04:51:14)
No49746 (える さん) に返信
> まず考えたのが顧客の情報を保持する顧客クラスを作ると言うことです。
> この顧客クラスを作る際に、顧客クラスのメンバ変数にフォームに入力された
> 顧客名や住所などを格納したいわけですが、
> この際にメンバ変数へ情報を格納する手法として最も自然なやり方をご教示下さい。

自然というのが…バックグラウンド次第で如何様にもなり得るので、
「私にとって」自然というのしか言えませんが。

> 顧客クラス側から入力フォームの情報を取得するという方法を考えました。
> 例) cu = new Customer(this);

これだとGUIと顧客が密接に関連してしまいますよね。
GUIの変更のたびにCustomerクラスを確認する必要があります。
それは一般的に見て保守性が高いとは言えないように思います。
でも、必ずフォームと一体であるならむしろ変更がすくなくなります。

> もう一つの方法として、全ての情報を引数で一つずつ渡すと言うことも考えました。
> 例) cu = new Customer(textBoxName.Text, textBoxTel.Text, textBoxAddress.Text);

これは項目が多いときに長くてつらい。
増えたときに困ります。
ですが、ちゃっぴさんの言うようにReadOnlyにするなら、これが一番わかりやすい。

No49748 (やじゅ さん) に返信
> 一般的には
> cu = new Customer();
> cu.CustmerName = textBoxName.Text;
> cu.Tel = textBoxTel.Text;
> cu.Address = textBoxAddress.Text;

項目変更時にズラっと並んでいるのひとつずつなおして確認する、というような工程は
ある種の人以外は工程数に比例したミスが生じますよね。
必須なフィールドを忘れてしまう場合もあるかも。
でも、わかりやすくはあります。


今後さらに拡張を考えるなら、「顧客」がデータベースに入ることも念頭にクラス化する必要があるかもしれません。
データベースとの間でのマッピングの際の制約、開発環境のサポート、
自分の知識・技術力の問題など、いろいろ問題が出てきます。

考えるべきことが多すぎて、答えられませんし、そもそも把握しきれません。


プログラミング言語は自由度高く作られていますから、いろいろ手があります。
それらをすべて検討して、いいところ悪いところを検討し、
その中から最善のものを選ぶのはかなりつらい作業です。

えるさんの示した内容からでは誰にも最善の手はわかりませんし、
それを検証する手もありません。
オブジェクト指向的に一般的なのも、状況次第です。

> やみくもにフォームのイベントハンドラやコード部分に
> 処理をごりごり書いて完成させました。

ごりごりやって、完成したわけですね。
完成ということは、動いていると。

> ですがこれでは保守性がいまいち高くないような気がします。
> そこでオブジェクト指向を活用してコードを見直したいと思っています。

いますぐにコードを治す必要に迫られているわけではないのですね。
ということは、将来の発生するかわからない保守を念頭に、修正をいれようとしているわけですね。

でしたら、「何もしない」をオススメします。

保守が発生した時に、保守する上で障害となる、なった部分を考え、
それが改善されるように少しずつ治しましょう。

今完成しているなら、もう保守のことを考えるには遅すぎます。

保守のことを考えずに作ったのであれば、保守の経験が足りません。
私の持つ一番大切な保守の経験は「保守の事を考えずに作ると大変なことになる」というものです。

保守の経験が足りないのですから、保守性を考慮して変更してもうまくいくとは思えません。

もし経験を積んでも大切さがわからないのであれば、それは稀有な才能があることになります。
その場合も保守性のために手を入れる必要はありません。
引用返信 編集キー/
■49756 / inTopicNo.5)  Re[2]: オブジェクト指向の設計に関する質問
□投稿者/ Jitta on the way (637回)-(2010/05/15(Sat) 06:46:06)
No49753 (れい さん) に同意

私が最初にオブジェクト指向言語をひねくって、課長から「オブジェクト指向って、どう?」と尋ねられたとき、こう答えました。
「保守を楽にするために、最初に時間をかけて苦労する」

完成して、保守の段階にあるなら、もう遅いかと。
これから保守のために手を入れるなかで、「こう作っておけば、保守しやすかった」を学んで下さい。この経験を伝えることは、ウェブを通すと、非常に困難だと思います。
引用返信 編集キー/
■49761 / inTopicNo.6)  Re[3]: オブジェクト指向の設計に関する質問
□投稿者/ える (2回)-(2010/05/15(Sat) 23:02:32)
みなさんたくさんのアドバイスやコメントを頂きありがとうございました。
自分にとって本当に有益な情報が得られましたし、納得も出来ました。

自分の勉強のためにも、現在完成させたコードをバックアップを取った上で
クラス化やコードのスリム化などに取り組もうと思います。

あと、今ではありませんが今後機能追加などの手を加えることはもう分かっているので、
今の内にコードの保守性が高い状態に保っておきたいのです。

急いで作ったというのもありますが、最初の設計をしっかりしていなかったのが原因です。
次からの開発ではこの経験を生かしてコーディングしたいと思います。

本当に沢山のご回答ありがとうございました。
解決済み
引用返信 編集キー/
■49763 / inTopicNo.7)  Re[1]: オブジェクト指向の設計に関する質問
□投稿者/ επιστημη (2496回)-(2010/05/15(Sat) 23:05:07)
επιστημη さんの Web サイト
2010/05/15(Sat) 23:06:21 編集(投稿者)

> 例えば顧客クラスをインスタンス化する際にコンストラクタへ
> 入力フォームのオブジェクトだけを引数として渡し、
> 顧客クラス側から入力フォームの情報を取得するという方法を考えました。
> 例) cu = new Customer(this);

顧客情報が入力フォームに依存するのは考えものですけど
入力フォームが顧客情報に依存するのはアッタリマエなので
主客を逆転させて

InputForm form = ...
CustomerInfo cust = form.MakeCustomer(); // 入力を基に顧客情報を生成する

ってのはいかがでしょ。

※ あらー、僅差で解決しちゃったのねー

解決済み
引用返信 編集キー/
■49785 / inTopicNo.8)  Re[4]: オブジェクト指向の設計に関する質問
□投稿者/ Jitta on the way (638回)-(2010/05/17(Mon) 07:02:48)
No49761 (える さん) に返信
> あと、今ではありませんが“今後機能追加などの手を加えることはもう分かっている”ので、
> 今の内にコードの保守性が高い状態に保っておきたいのです。
(二重引用符追加)
それがすでに「保守の段階」なんですよ。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -