- かつひと
- 常連さん
- 会議室デビュー日: 2006/06/01
- 投稿数: 32
|
投稿日時: 2007-12-21 12:22
お世話になります。
C#でシステム開発を行っていますが、オブジェクト指向において、入力値検証の処理の実装場所はどこが適切なのか考えています。
システム全体は、主にMVCパターンで設計および実装しています。
例えば、Windowsアプリケーションでテキストボックスに入力された金額を検証する場合、Formクラスにそのままコーディングすることが考えられます(checkTextBox関数など)。
しかし、別のフォームで同様の値を検証する場合も考えられますし、仕様が変更になった場合、修正が大変になると予想されます。
また、VB開発でありがちな「何でも便利クラス(Utilityクラスなど)」を作るのは、やはり避けたいと思っています。
ASP.NETでは便利な検証クラスが用意されており、開発効率から言えば使い勝手は良いと思いますが、これも上記のような理由で後々のメンテナンスが難しくなることも多々あります。
モデルクラスに検証処理を入れることも考えられますが、エラーがあったときにメッセージボックスを表示したりする場合は、やはりユーザーインターフェースに依存してしまいます。
例)
public class Chuumon //注文
{
private DateTime mChuumonDateTime;
public DateTime ChuumonDateTime
{
set
{
・・・ここに検証処理?
}
get
{
・・・
}
}
private int mKingaku;
public int Kingaku
{
set
{
・・・ここに検証処理?
}
get
{
・・・
}
}
}
適切な方法がありましたら、ご教授頂けないでしょうか。
よろしくお願い致します。
|
- hei
- ベテラン
- 会議室デビュー日: 2006/09/07
- 投稿数: 78
|
投稿日時: 2007-12-21 12:33
delegateを引き数にしてはどうでしょうか?
[ メッセージ編集済み 編集者: hei 編集日時 2007-12-21 12:33 ]
|
- GENZO
- 大ベテラン
- 会議室デビュー日: 2003/11/26
- 投稿数: 111
- お住まい・勤務地: 名古屋
|
投稿日時: 2007-12-21 14:20
個々のプロパティではなく、全プロパティをチェックする検証用のメソッドをモデルに用意してはいかがでしょう?
そのメソッドをコントローラで実行し、検証が失敗したらビューにエラー表示するようなイメージです。
|
- かつひと
- 常連さん
- 会議室デビュー日: 2006/06/01
- 投稿数: 32
|
投稿日時: 2007-12-21 15:41
hei様、GENZO様ありがとうございます。
delegteを引数するのは、検証の処理自体はモデルクラスのメソッドに持たせておくということでしょうか。
お手数おかけしますが、具体的な例があればよろしくお願い致します。
|
- hei
- ベテラン
- 会議室デビュー日: 2006/09/07
- 投稿数: 78
|
投稿日時: 2007-12-21 16:37
ざっと書きましたがはずしてたらすみません。
コード: |
|
namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
Model model = new Model();
MessageBoxController m = new MessageBoxController(model);
ConsoleWriteLineController c = new ConsoleWriteLineController(model);
m.Check();
c.Check();
Console.ReadLine();
}
}
abstract class ContrllerBase {
protected Model _model;
protected Action<String> _showMessageDelegate;
public ContrllerBase(Model model) {
this._model = model;
this._showMessageDelegate = new Action<string>(this.ShowMessage);
}
public abstract void ShowMessage(String messge);
public void Check() {
_model.Check(this._showMessageDelegate);
}
}
class MessageBoxController : ContrllerBase {
public MessageBoxController(Model model) : base(model) { }
public override void ShowMessage(string messge) {
System.Windows.Forms.MessageBox.Show(messge);
}
}
class ConsoleWriteLineController : ContrllerBase {
public ConsoleWriteLineController(Model model) : base(model) { }
public override void ShowMessage(string messge) {
Console.WriteLine(messge);
}
}
class Model {
public void Check(Action<String> showMessageDelegate) {
try {
throw new ApplicationException("検証エラー発生");
}
catch(ApplicationException e) {
showMessageDelegate.Invoke("エラー");
}
}
}
}
|
|
- じゃんぬねっと
- ぬし
- 会議室デビュー日: 2004/12/22
- 投稿数: 7811
- お住まい・勤務地: 愛知県名古屋市
|
投稿日時: 2007-12-21 17:20
引用: |
|
かつひとさんの書き込み (2007-12-21 12:22) より:
C#でシステム開発を行っていますが、オブジェクト指向において、入力値検証の処理の実装場所はどこが適切なのか考えています。システム全体は、主にMVCパターンで設計および実装しています。
|
"オブジェクト指向において" なのか "MVC パターン" に依る質問なのかよくわからないわけですが、(OOP を拡大解釈しているような)
引用: |
|
例えば、Windowsアプリケーションでテキストボックスに入力された金額を検証する場合、Formクラスにそのままコーディングすることが考えられます(checkTextBox関数など)。しかし、別のフォームで同様の値を検証する場合も考えられますし、仕様が変更になった場合、修正が大変になると予想されます。
|
これだけなら検証するためのメソッドを別途用意するだけでも良いでしょう。
引用: |
|
また、VB開発でありがちな「何でも便利クラス(Utilityクラスなど)」を作るのは、やはり避けたいと思っています。
|
どの言語でもこの誤りはありがちです。(泣)
引用: |
|
モデルクラスに検証処理を入れることも考えられますが、エラーがあったときにメッセージボックスを表示したりする場合は、やはりユーザーインターフェースに依存してしまいます。
|
GUI が絡むクラス (Form) は検証結果を受け取ってその旨を表示するだけで良いという考え方で良いでしょう。 検証処理 + エラー表示を同じ場所に実装しようとする限りは望んでいる設計思想を実現できないでしょう。
引用: |
|
例)
public class Chuumon //注文
{
private DateTime mChuumonDateTime;
public DateTime ChuumonDateTime
{
set
{
・・・ここに検証処理?
}
get
{
・・・
}
}
|
プロパティ アクセサによる検証は、あってはならない値を検証するためのものでビジネス ロジック的な検証をするための場所ではありません。 そういった検証はアクション要素の強いメソッドなどで行います。 プロパティで行ってはいけません。 ちなみにプロパティで不正な値が検出された場合は例外をスローするのが一般的です。
_________________ C# と VB.NET の入門サイト
じゃんぬねっと日誌
|
- かつひと
- 常連さん
- 会議室デビュー日: 2006/06/01
- 投稿数: 32
|
投稿日時: 2007-12-21 21:44
hei様、じゃんぬねっと様ありがとうございます。
具体的なコード、またご指摘を頂き、大変参考になりました。
|