0

これはどれほど悪い練習ですか?私は現在、教授からこれを行うように求められていますが、これは私が言われたことすべてに反しています。この方法で検証してはいけない理由の例を誰か教えてもらえますか? (ASP Web ページの get / set メソッドで正規表現を使用する)

詳しくは:

彼が私たちにやりたいことのコードは次のとおりです。

public String FName
{
    get
    {
        return _fName;
    }
    set
    {
        if (validateName(value.ToString()))
            _fName = value;
    }
}

呼び出しているメソッド:

public static bool validateName(String name)
    {
        bool isGood = true;

        Regex regex = new Regex("^[A-Z]");
        if (!regex.IsMatch(name))
            isGood = false;

        return isGood;
    }
4

5 に答える 5

1

一般に、それは良くありませんが、そのまま検証すると、失敗も想定されます。

したがって、質問は次のとおりです。

  • constructorコード実行中の障害をどのように処理するつもりですか。?

  • で例外が発生した場合はどうなりますconstructorか?その後、オブジェクトの状態はどうなりますか?

それが一般的に悪い習慣である理由です。従うべき良い道は次のとおりです。

  1. オブジェクトを構築する
  2. 検証を実行します

しかし、これらはガイドであり、あなたはあなたの都合に応じてそれらを自由にブレーキすることができます。それで、あなたの教授を無視して、彼がこれを尋ねたと言うべきです:

  1. またはあなたにいくつかの考えをもたらすために
  2. またはあなたに何かを教えるために

それで、彼の道をたどって、なぜ彼がそのようにコードを書くように頼んだのかを理解しようとします。

于 2012-10-23T18:55:43.300 に答える
1

私はあなたのインストラクターに同意します。

一般に、値を「受け入れる」前に、設定可能な任意の場所で値を検証する必要があります。原則として、値を設定しようとするメソッドは、設定しようとするとすぐにフィードバックを受け取る必要があります。

あなたの例では、バリデーターを FName パブリック プロパティのセッター内に配置し、コンストラクターも FName 値を受け入れる場合は、コンストラクター内で FName セッターを呼び出して、プロパティの動作を完全にカプセル化します。プロパティが実装する動作またはその他のビジネス ルール:

public class User
{
    public User(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }

    private string _firstName;
    public string FirstName
    {
        get { return _firstName; }
        set
        {
            if (!IsValid(value))
                // throw / handle appropriately
            else
                _firstName = value;
        }
    }
}

また、略語は避けてください。FName は使用しないでください。FirstName を使用します。

于 2012-10-24T00:08:56.743 に答える
1

検証の意味によって異なります。ガード句はコンストラクターで非常に一般的な方法です。

if(param1 == null) 
     throw new ArgumentNullException("param1");

オブジェクトが後で使用するために一貫した状態であることを確認するのに役立ちます (使用時にチェックする必要がなくなります)。

オブジェクトが常に一貫した状態にあることを保証するために、プロパティ(ケースのように見えるもの)とメソッドにもガード句を使用することもできます。

于 2012-10-23T19:04:52.950 に答える
1

あなたの更新への返信として、私はそれが本当に面倒だと思います。例えば:

var a = new yourObject();
a.FirstName = 123;

私のコードが認識していないのは、検証に失敗したため、最初の名前のプロパティをまったく変更していないということです!

編集:

検証方法を簡素化することもできます。

public static bool validateName(String name)
{
    Regex regex = new Regex("^[A-Z]");
    return regex.IsMatch(name)
}
于 2012-10-23T19:12:10.060 に答える
0

コンストラクターの目的は、型のメンバーに値を割り当てることです。慣例により、検証はコンストラクターの責任ではありません。
情報の検証は、構築しているアプリケーションのビジネスに依存します。すべてのコンポーネントが特定の目的に使用されるモジュラー アプリケーションを作成している場合は、個別のクラスまたはクラスのセット (アプリケーションのサイズに応じて) を作成して、すべてのビジネス検証を実行することをお勧めします。このような検証は、データに適用される検証ルールに応じて呼び出す必要があります。

于 2012-10-23T18:59:37.453 に答える