郵便番号が使用されるすべての場所にその検証ロジックを置くDRY原則を破ることになります。
一方、多くの国やそれらの異なる郵便番号システムを扱う場合、問題の国を知らない限り郵便番号を検証することはできません。したがって、ZipCode
クラスには国も保存する必要があります。
しかし、その後、国をAddress
郵便番号の一部(郵便番号も含む)と郵便番号の一部(検証用)の両方として別々に保存しますか?
- そうした場合、DRYにも違反していることになります。DRY違反と呼ばない場合でも(各インスタンスは異なる目的を果たすため)、2つの国の値が異なる場合にバグへの扉を開くことに加えて、不必要に余分なメモリを占有します(論理的には決してすべきではありません) )。
- または、2つのデータポイントを常に同じにするために同期する必要があります。これは、いずれにしても、このデータを実際に単一のポイントに保存する必要があることを意味します。
- そうでない場合、それは
ZipCode
クラスではなくAddress
クラスであり、これには再び含まれますstring ZipCode
。
たとえば、郵便番号を含む文字列ではなく郵便番号についてビジネスアナリストと話すことができます。
利点は、ドメインモデルを説明するときにそれらについて話すことができることです。
情報に特定の変数タイプがある場合、ビジネスアナリストと話すときは常にそのタイプに言及する義務があるというあなたの根底にある主張を理解していません。
どうして?「zipcode」について単に話せず、特定のタイプを完全に省略することができないのはなぜですか?プロパティのタイプが会話に典型的なビジネスアナリスト(テクニカルではありません!)とどのような議論をしていますか?
私の出身地では、郵便番号は常に数値です。そのため、選択肢があり、int
またはとして保存できstring
ます。私たちは、データの数学的な操作のない期待はありませんので、文字列を使用する傾向があるが、決してビジネスアナリストは、それが文字列であるために必要なことを私に言っていません。その決定は開発者に任せられます(またはおそらくテクニカルアナリストですが、私の経験では、彼らは核心を直接扱っていません)。
アプリケーションが期待どおりに動作する限り、ビジネスアナリストはデータ型を気にしません。
検証は、人間が期待するものに依存しているため、取り組むのが難しい獣です。
1つは、(普遍的な真実として)データを常に検証する必要があることに同意しないためです。
たとえば、これがより複雑なルックアップの場合はどうなりますか?単純な形式チェックではなく、検証で外部APIに連絡して応答を待つ必要がある場合はどうでしょうか?ZipCode
インスタンス化するすべてのオブジェクトに対して、この外部APIをアプリケーションに強制的に呼び出しますか?
たぶん、それは厳しいビジネス要件であり、それから当然正当化できます。しかし、これは普遍的な真実ではありません。これが解決策よりも負担となるユースケースがたくさんあります。
2番目の例として、フォームに住所を入力する場合、国の前に郵便番号を入力するのが一般的です。UIですぐに検証フィードバックを行うのは良いことですが、実際の問題の原因は(たとえば)次のような理由で、アプリケーションが「間違った」zipcode形式を警告した場合、実際には(ユーザーとして)邪魔になります。私の国はデフォルトで選択されている国ではないため、検証は間違った国に対して行われました。
それは間違ったエラーメッセージであり、ユーザーを混乱させ、不必要な混乱を引き起こします。
永続的な検証が普遍的な真実ではないように、どちらも私の例ではありません。それはだ文脈。一部のアプリケーションドメインでは、何よりもデータの検証が必要です。他のドメインは、それがもたらす煩わしさが実際の優先順位と矛盾するため、優先順位のリストに高い検証を行いません(たとえば、ユーザーエクスペリエンス、または最初に欠陥のあるデータを保存して、決して許可するのではなく修正できるようにするため)保存済み)
生年月日:気づきよりも大きく、今日の日付よりも小さいことを確認します。
給与:ゼロ以上であることを確認します。
これらの検証の問題は、それらが不完全、冗長、またははるかに大きな問題を示していることです。
日付が思考よりも大きいことを確認することは冗長です。精神は文字通り、それが可能な限り最小の日付であることを意味します。また、どこに関連性の線を引きますか?防止するDateTime.MinDate
が許可することのポイントは何DateTime.MinDate.AddSeconds(1)
ですか?他の多くの値と比較して、特に間違っていない特定の値を選択しています。
私の誕生日は1978年1月2日です(そうではありませんが、そうだと仮定しましょう)。しかし、アプリケーションのデータが間違っているとしましょう。代わりに、私の誕生日は次のようになります。
- 1978年1月1日
- 1722年1月1日
- 2355年1月1日
これらの日付はすべて間違っています。それらのいずれも、他のものよりも「より適切」ではありません。ただし、検証ルールはこれら3つの例のうちの1つだけをキャッチします。
また、このデータの使用方法のコンテキストも完全に省略しました。これが誕生日リマインダーボットなどで使用されている場合、間違った日付を入力しても特に悪い結果はないため、検証は無意味だと思います。
一方、これが政府のデータであり、誰かの身元を認証するために生年月日が必要な場合(およびそうしないと、たとえば社会保障の拒否などの悪い結果につながります)、データの正確性が最重要であり、完全に必要ですデータを検証します。現在、提案されている検証は適切ではありません。
給与については、マイナスになることはできないという常識があります。しかし、無意味なデータが入力されていると現実的に予想する場合は、この無意味なデータのソースを調査することをお勧めします。官能的なデータを入力することを信頼できない場合、正しいデータを入力することも信頼できないためです。
代わりに給与がアプリケーションによって計算され、どういうわけか負の(そして正しい)数値で終わる可能性がある場合、より良いアプローチはMath.Max(myValue, 0)
、検証に失敗するのではなく、負の数値を0に変えることです。論理が結果が負の数であると判断した場合、検証に失敗すると計算をやり直す必要があり、2回目に異なる数になると考える理由がないためです。
そして、それが別の数になった場合、計算が一貫しておらず、したがって信頼できないと疑うことになります。
これは、検証が役に立たないと言っているわけではありません。しかし、無意味な検証は、問題を実際に解決するのではなく手間がかかり、人々に誤った安心感を与えるため、どちらも悪いです。