- PR -

フォーム上の値のチェック

投稿者投稿内容
モンジ
ベテラン
会議室デビュー日: 2005/09/06
投稿数: 85
投稿日時: 2007-06-18 11:37
皆様、こんにちは。
いつも参考にさせていただいています。

VS2005(VB.NET)でWindowsアプリを開発しています。

今回お伺いしたいのは、
フォーム上の値のチェックについてなのですが、
単純なものなら、プロパティにSetする際にチェックをかけているのですが、
今回はチェックする数や深さがあるので、どうすべきか考えています。

今思いつくのは、
プロパティばかり増やしてもよくないと思いますので、
チェックのメソッドをクラスに実装して、せめてFormの記述や本筋のメソッド
だけはすっきりしたものにしようというレベルのものなのですが。


よい方法をご存知の方がいらっしゃれば、ご教授ください。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-06-18 12:21
以下の過去ログをあされば、幸せになれるかもしれません。
http://www.atmarkit.co.jp/fdotnet/index/bbs/dir118.html
モンジ
ベテラン
会議室デビュー日: 2005/09/06
投稿数: 85
投稿日時: 2007-06-18 16:57
かずくんさん、レスありがとうございます。

ただ、紹介していただいたサイト(”チェック”での検索結果?)
には、よいものが見つかりませんでした。

私が思うには、
フォーム上のコントロールの値チェックぐらいならば、
プロパティでできると思うのですが、
複数のコントロールの組み合わせでDBのマスタを見て、
その戻り値によって、さらに別のコントロールの値をチェックして・・・
などと行うようなチェックは、
どのようにクラスを設計するか?
というような問題だと思うのです。
間違っていたらごめんなさい・・・。

ただ、設計のあたりになると経験も
ないので、かなり難しく感じています。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2007-06-18 17:23
引用:

複数のコントロールの組み合わせでDBのマスタを見て、
その戻り値によって、さらに別のコントロールの値をチェックして・・・
などと行うようなチェックは、
どのようにクラスを設計するか?


まずは「コントロール」などフォームに関わる部分は忘れてください。
そして業務(項目)=仕様として考えてください。
Public Shared Function ValidateNenkinBango(ByVal NenkinBango As String) As Boolean
年金番号を受け取り妥当性を検証するわけですが、ポイントは上記の「年金番号」が値(概念)であることです。
そこに「コントロール」という存在が無いですよね。
まずはそのレベルでいわゆる末端の業務クラスをそろえましょう。
#ポイントは「どう使われるか」ではなく、「自分(年金番号)とは何か(何が必要か)」です。
最終的にフォームではそれらを呼び出すだけになります。

#フォームに書く程度の処理か、クラスにすべきか、は別の議論になります。
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-06-18 18:17
引用:

単純なものなら、プロパティにSetする際にチェックをかけているのですが、


この部分なのですが、具体的にどういうクラス設計になっているのでしょうか?

(1) プロパティはフォームクラスのプロパティですか?
あるいは別のクラスですか?

(2) プロパティのセッターで、エラーがあった場合に
何をしていますか?(例外をスローするとか)
できればコードのサンプルを提示頂ければと思います。

どこでつまずいているのかが、いまいちわかりません。
モンジ
ベテラン
会議室デビュー日: 2005/09/06
投稿数: 85
投稿日時: 2007-06-18 18:18
まどかさん、レスありがとうございます。

引用:

末端の業務クラスをそろえましょう。
#ポイントは「どう使われるか」ではなく、「自分(年金番号)とは何か(何が必要か)」です。



つまりオブジェクト指向らしくモノ・コトを定義することからはじめなさい、ということでしょうか。

私のいつも行う設計ですと、

クラス : 年金手帳
メンバ変数 : 年金番号、氏名、住所、生年月日、性別
メソッド : 有効かどうかチェックする()

というようにしています。

そして、今回の質問の主旨としましては、
東京都の男性の場合や、
大阪府の30歳以上などの組み合わせで、
内部の処理を変えたい場合はどのような方法があるかというものです。

私が思いつくのは、
東京都の男性()、大阪府30歳以上()
などというメソッドをクラスに追加する、
というものなのですが、もっとよい方法があればご教授いただきたいのです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-06-18 18:36
引用:

モンジさんの書き込み (2007-06-18 18:18) より:

単純なものなら、プロパティにSetする際にチェックをかけているのですが、


単純なものかどうかは関係ないですね。プロパティで検証すべきことは、プロパティで渡された引数が仕様外かどうかの一点です。仕様外であれば、業務続行不可能なので例外をスローするのが基本的なガイドラインでしょう。それ以外のチェックは直感的でないため行うべきではありません。

さて、一般的なアプリケーションでの検証処理は大きく 2 つに分けられます。
  1. Form 内にある Control (TextBox) の単体チェック (いわゆる、必須入力チェック / Format チェック)
  2. ビジネス ロジック的な検証 (業務的なまたは業務らしい検証)
当たり前ですが 2. は 1. が完了した後でなければ実行してはいけません。しかし、1. と 2. ではそれぞれ実装すべき場所が異なります。

1. であれば、Validating イベントを利用します。(ErrorProvider などと併用するのが個人的に好きです) 2. であれば、まどかさんの仰るとおり Control とは無関係の場所で検証して頂いて構いません。Control ではなくて Control が示す値 (Text プロパティ) を検証したいのですから当然です。

このあたりの実装箇所は仕様次第です。たとえば、データクラスの中にデータを保持しているのであれば、そのデータクラス内で検証も解決すべきです。簡単なアプリケーションであれば、Form 内に Static な検証メソッドを用意するというのも強ち間違いだとは言えません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
モンジ
ベテラン
会議室デビュー日: 2005/09/06
投稿数: 85
投稿日時: 2007-06-19 08:46
KIさん、レスありがとうございます。

引用:

具体的にどういうクラス設計になっているのでしょうか?



まだ、クラス設計は行っていません。
設計段階で考えているところです。


じゃんぬねっとさん、レスありがとうございます。

引用:

それ以外のチェックは直感的でないため行うべきではありません。



・確かに。プロパティであれこれと検証していると、直感的ではないと感じます。大変参考になりました。

引用:

このあたりの実装箇所は仕様次第です。たとえば、データクラスの中にデータを保持しているのであれば、そのデータクラス内で検証も解決すべきです。簡単なアプリケーションであれば、Form 内に Static な検証メソッドを用意するというのも強ち間違いだとは言えません。



どのように実装していくか。
この部分がいまいちピンとこないのです。クラスを作って、メンバ変数とメソッドを作って、抽象クラスを作って、継承して、オーバーライドして。
だけど、もっといいやり方があるんじゃないか、と。
設計や実装について、参考になるサイトや書籍があれば紹介していただけないでしょうか。このあたりが科学的でおもしろい部分なのですが、実現が難しいとも感じています。

最後に、じゃんぬさんのおっしゃっているデータクラスとは、どのようなものですか?
データセットやデータテーブルのお話でしょうか。

スキルアップ/キャリアアップ(JOB@IT)