2

今後のいくつかのアプリケーションのコア ビジネス オブジェクト モデルとして機能する内部専用ライブラリを設計しています。主に、さまざまな種類の顧客とさまざまな種類のドキュメントをカバーしています。

これらのオブジェクトを使用する場合、特にシリアル化する場合は、それらが有効で正常な値を持っていることを確認したいのは明らかです。

たとえば、Customer には連絡先情報があり、それには電話番号が含まれます。インターフェイスITelephoneNumber、基本クラス、US 実装などがあります。ライブラリは、これらのクラスを使用してデータを検証します。

しかし実際には、Customer はより「コア」なビジネス オブジェクトであり、PhoneNumber はそうではありません。電話番号の構造を大量に書き、それを Our-Library-Goodness として公開するのは少し奇妙に感じます。それらは少し「範囲外」のようです。

電話番号は一例です。他にもあります。これらのクラス構造を静的メソッドにリファクタリングすることはできますが、コンストラクターが長くなり、コンストラクターはメソッドを使用することを「知っている」必要があります。

私の質問は

ライブラリの利用は、コア オブジェクトを定義するのに実際には必要ないこれらのヘルパー クラスを操作する必要がありますか? 次のように:

MyCustomer.SetTelephoneNumber(new USTelephoneNumber("555", "555", "5555%$&"));
コンパイル時のフィードバック、独自のメンバー (AreaCode、Exchange...) などを提供します。

それとも、有効な電話番号を取得する手段を実装に任せて、それについてもっと「ブラックボックス」にするべきですか? 次のように:

MyCustomer.SetTelephoneNumber("555-555-5555%$&");
エラーをスローするか、サイレントに失敗/成功するか、string.Empty などを返します。


この質問に「答える」ことができるかどうかはわかりませんし、聖戦も始めたくありません。いずれにせよ、何らかの理由を探しています。私たちは、コードの品質や保守性をあまり気にしないエージェンシーで正しいことをしようとしている 2 人のチームです。

4

3 に答える 3

1

お気づきのように、この質問にはおそらく答えられません。したがって、これは答えではありませんが、(コメントには長すぎるため)ここに書きます:両方のオプションを使用し、両方のオーバーライドを提供しますSetTelephoneNumber

Customer クラスは、電話番号を米国の番号として検証する方法をどのように知っていますか? 米国の顧客が米国の電話番号を持っていると想定している場合、その想定は場合によっては間違っている可能性があります。したがって、最も可能性の高いシナリオを処理する「単純な」オーバーライドと、まれなケースを指定できるオーバーライドの両方を使用することは公平です。

電話番号をクラスに「隠す」のではなく、さまざまなタイプの検証ロジックを注入できれば、システムのテストも容易になります。

とはいえ、私はこれをあまり考えすぎません。「正しいことをしようとする」のは良いことですが、FizzBu​​zz Enterprise Edition症候群に陥りやすいです。

于 2013-10-03T13:30:53.173 に答える
1

電話番号はドメインの一部のようですので、公開してください。理想的には、アプリ全体のすべてのコードがこの電話番号オブジェクトを共有し、それに基づいて標準化します。下位層 (顧客などの上位オブジェクトから独立したデータ形式ライブラリなど) にも存在する必要があるかもしれません。

于 2013-10-03T13:31:28.953 に答える