2010-11-25 16 views
0

私は、デザインパターン、クリーンコード、その他のもののようなオブジェクト指向の概念を研究していますが、今後の進め方について疑問が残っています。たとえば、私の例を見てみましょう。クラスのモデリングの助けが必要

私はモデルであるPersonクラスを持っています。年齢が生年月日に対応するかどうかをチェックし、名前に有効な文字が含まれているかどうかをチェックするなど、いくつかのバリデーションを人に追加したい。

私には2つのアプローチがありますが、どちらを使うべきかわかりません。

アプローチ1: 私はと呼ばれる新しいクラスを作成:

class ValidatePerson {} 

とクラスメソッドがあります:「validateAge()」と「validateName()」と私が持っています必要なすべてvallidationを新しいメソッドを実装する。

アプローチ2: 私はと呼ばれる抽象クラスを作成:すべての検証にはいくつかのcommumのメソッドを持っていますし、私が持っているでしょう ValidatePersonを{}:

class ValidatePersonAge extends ValidatePerson { validate();} 
class ValidatePersonName extends ValidatePerson {validate();} 

私はアプローチ2のために選びたい、原因追加しなければならないすべての新しい検証ルールは新しいクラスになり、他の検証ルールには影響しません。同様に、新しいルールに必要なcommumメソッドで何かを変更する必要がある場合は、単に上書きすることができます。最初のアプローチでは、私は別のメソッドを追加し、別のメソッドを作成するか、すでにクラッシュするかもしれない他のメソッドのために既に動作しているメソッドを変更する必要があります。

私はプログラミングに新しいので、私はいくつかの助けとそれについての説明を見たいと思っているので、このすべてのことに混乱しています。また、クラスは変更のために閉じられるべきであり、拡張のために開かれるべきであることを読んだことがあります。

+0

あなたがここで何を求めているかははっきりしません。 _正確に何を探していますか? – Oded

答えて

1

具体的な正解はありません。設計は、常に問題のドメインとビジネスコンテキストのコンテキスト内にある必要があります。そこでここでは、さまざまなオプション

オプション1 Personクラスを使用すると、彼は、現在の状態で検証すべてを実行するために呼び出すことができますvailidate()メソッドを持っています。

賛否

  • 変更が
  • 検証は、すべてのプロパティ
  • 短所

    • 人かもしれないを設定した後に実行される1つのクラスにローカライズされている

      • より良いカプセル化無効状態のb EFORE validate()メソッドは、したがって、呼び出されない何が
      • が異なる文脈2 各プロパティは、Personクラスでは、独自のvalidateXXX()メソッドを持ってい

      オプションに別の検証ルールを持つことはできません高速に失敗しています。各setXXX()メソッドは、対応するvalidateXXX()メソッドを呼び出す予定です。より良いカプセル化

    • 変更は1つのクラスにローカライズされている

      賛否

      • 失敗速い行動すなわちPersonオブジェクトは

      短所

        無効な状態になることはありません
      • は過度のベースかもしれませんコンテキスト
      • 上のdがあなたがこれらの検証チェックが含まれているPersonBuilderを持つことができ、別のコンテキスト

      オプション3 に別の検証ルールを持つことはできません。ビルダーは、Personオブジェクトを作成する前に、これらの検証を実行します。このようにしてPersonオブジェクトが構築されると、それはすべてのバリデーションと不変量を満たします。あなたは異なるコンテキストごとに異なる検証ルールが

    • Construnctionロジックをドメインオブジェクト
    • Personクラスから分離されていることができますので、ビルダークラスに検証を外部化している

      賛否

      • は不変行うことができます一度

      短所を構築

      • はValidatePersonAgeがValidatePersonと同じではありませんので、あなたのオプション2が正しくない

      いくつかのシナリオではやり過ぎかもしれません。その人を完全に検証するのではなく、自分の年齢を検証するだけです。だから彼らは意味的に異なっている。