4

先頭と末尾の白いスペースなど、矛盾のあるデータを含むデータベースを扱っています。

一般的に、多くの開発者が、ある時点でユーザーが入力した可能性のあるデータベースからの文字列をほぼすべて削除することで、防御的コーディングを実践しているのを目にします。私の意見では、データが永続化される前にそのようなフォーマットを行う方が良いので、一度だけ行われ、データが一貫した信頼できる状態になることができます。残念ながら、これは当てはまりませんが、Trimメソッドを使用して次善の策にたどり着きます。

データ アクセス レイヤーの一部としてすべてのデータをトリミングする場合、ドメイン レイヤーのビジネス オブジェクト内で防御的なトリミングを気にする必要はありません。代わりに、C# プロパティの set アクセサーなどを使用して、トリミングの責任をビジネス オブジェクトに置くと、最終的には同じ結果が得られるはずですが、トリミングは、ビジネス オブジェクト プロパティに割り当てられたすべての値だけでなく、ビジネス オブジェクト プロパティに割り当てられた値にも適用されます。矛盾したデータベースから。

私が尋ねることができる答えを決定するかもしれないやや哲学的な質問として、「ドメイン層はデータの防御的/強制的なフォーマットを担当する必要がありますか?フォーマットされていない文字列またはフォーマットされた文字列をフォーマットしてから、必要に応じてフォーマットしようとしますか、それとも、この責任をプレゼンテーション層とデータ アクセス層に押し付けて、ドメイン層が受け入れるデータの種類をより厳密にする必要がありますか? これはより根本的な質問かもしれないと思います。

更新:以下は、このトピックについて共有する必要があると私が考えたいくつかのリンクです。

情報サービス パターン、パート 3: データ クレンジング パターン

LINQ to SQL - 保存する前に文字列をフォーマットしますか?

Linq to Sqlを使用して値をトリムする方法は?

4

3 に答える 3

3

アプリケーション層のデータを「クリーンアップ」することをお勧めします。ここでそれを実行したい理由(はい、Dev Artが提案したようにスタックの上位にあります)は、ドメインモデルがドメインを可能な限り「モデル化」する必要があるためです。ある時点ですべてのデータが「クリーン」である場合はどうなりますか?それでは、「クリーニング」を行うヘルパーメソッドを削除することをお勧めします。アプリケーションスタックの上位の場所から簡単に削除できます。

リフレクション(どのように機能するかがわかるまでリフレクションが遅いと言わないでください)またはドメインオブジェクトグラフのすべての「文字列」プロパティ(たとえば)を掘り下げる何かを使用する上品な拡張メソッドを使用します。この手法を使用してDateTimeDateTimeを固定オフセットに調整する例を次に示します。コレクションやその他のカスタムタイプの奥深くでも、すべての値を「オフセット」する方法に注意してください。あなたの場合、オフセットwlilはあなたのトリミングです。これは、ショー全体にsを追加するよりも確かに簡単で、.Trim()かなり簡単に切り離すことができます。

悪いデータはドメインに対する横断的関心事であるため、ドメインに直接結び付けるべきではないことを忘れないでください(AOPを考えてください)。

于 2010-05-11T17:38:39.803 に答える
2

データは永続化する前に消去する必要があります。永続化されたので、データベースでクリーニングする必要がある可能性のある汚れたデータがあります。顧客を名前で検索することを検討してください。保存したものが「John」、「Doe」の場合、「John」、「Doe」を見つけることができますか。

UI に近いデータをクリーンアップすると、コードがはるかに単純になります。防御コードは、クリーンアップ コードからアサーションに変更できます。(つまり、アサート文字列 = トリム (文字列))。この時点に到達するには、データベースと UI コードをクリーンアップする必要があります。

于 2010-05-12T03:22:19.753 に答える
0

データが永続化される前に、そのようなフォーマットを行うことをお勧めします

絶対。

ドメインは後でデータの防御的/強制的なフォーマットを担当する必要がありますか?

現在保存されているデータでは、トリムを導入する適切な場所が見つかりません。ストレージの一貫性が失われているためです。

自己修復アプローチを試すことができます。ダイアログに表示する前に、データを読み取り、どこかでトリミングします。ユーザーがこのダイアログを保存するとすぐに、データベース内のデータが「修正」されます。

新しい入力に関しては、データのトリミングは、ドメイン層にもデータ層にも属さないクリーニング操作であるという意見に傾いています。ユーザー入力は、実際にそのデータの操作を開始する前に、UI レイヤーに近い場所で「クリーンアップ」する必要があります。

于 2010-05-11T11:22:54.287 に答える