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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.49746 の関連記事表示

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

    分類:[C#] 

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

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

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

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

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

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

    どういった手法がオブジェクト指向的に自然なのでしょう。
    他にももっといい方法があれば教えて頂きたいです。
親記事 /過去ログ84より / 関連記事表示
削除チェック/

■49748  Re[1]: オブジェクト指向の設計に関する質問
□投稿者/ やじゅ -(2010/05/14(Fri) 22:09:31)
>
    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
記事No.49746 のレス /過去ログ84より / 関連記事表示
削除チェック/

■49751  Re[2]: オブジェクト指向の設計に関する質問
□投稿者/ ちゃっぴ -(2010/05/15(Sat) 01:50:38)
>
    別に好きなようにすればいいと思いますが。Constructor はいくらでも over load できるので。
    自分が使いやすいと思う constructor を好きな数だけ用意すればいいんじゃないかな。
    個人的にはどちらの方式もありだと思います。
    Form の instance を渡す constructor はそれ以外の constructor も用意するという条件付きで。


    初期化後に変更させたくない要件があるなら、constructor のみで property は read only にするのが自然ですね。
記事No.49746 のレス /過去ログ84より / 関連記事表示
削除チェック/

■49753  Re[1]: オブジェクト指向の設計に関する質問
□投稿者/ れい -(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;

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


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

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


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

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

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

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

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

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

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

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

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

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

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

    もし経験を積んでも大切さがわからないのであれば、それは稀有な才能があることになります。
    その場合も保守性のために手を入れる必要はありません。
記事No.49746 のレス /過去ログ84より / 関連記事表示
削除チェック/

■49756  Re[2]: オブジェクト指向の設計に関する質問
□投稿者/ Jitta on the way -(2010/05/15(Sat) 06:46:06)
    No49753 (れい さん) に同意

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

    完成して、保守の段階にあるなら、もう遅いかと。
    これから保守のために手を入れるなかで、「こう作っておけば、保守しやすかった」を学んで下さい。この経験を伝えることは、ウェブを通すと、非常に困難だと思います。
記事No.49746 のレス /過去ログ84より / 関連記事表示
削除チェック/

■49763  Re[1]: オブジェクト指向の設計に関する質問
□投稿者/ επιστημη -(2010/05/15(Sat) 23:05:07)
>
    2010/05/15(Sat) 23:06:21 編集(投稿者)

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

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

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

    ってのはいかがでしょ。

    ※ あらー、僅差で解決しちゃったのねー
記事No.49746 のレス / END /過去ログ84より / 関連記事表示
削除チェック/

■49761  Re[3]: オブジェクト指向の設計に関する質問
□投稿者/ える -(2010/05/15(Sat) 23:02:32)
    みなさんたくさんのアドバイスやコメントを頂きありがとうございました。
    自分にとって本当に有益な情報が得られましたし、納得も出来ました。

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

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

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

    本当に沢山のご回答ありがとうございました。
記事No.49746 のレス / END /過去ログ84より / 関連記事表示
削除チェック/

■49785  Re[4]: オブジェクト指向の設計に関する質問
□投稿者/ Jitta on the way -(2010/05/17(Mon) 07:02:48)
    No49761 (える さん) に返信
    > あと、今ではありませんが“今後機能追加などの手を加えることはもう分かっている”ので、
    > 今の内にコードの保守性が高い状態に保っておきたいのです。
    (二重引用符追加)
    それがすでに「保守の段階」なんですよ。
記事No.49746 のレス / END /過去ログ84より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -