1

Songのドメインモデルクラスがあるとしましょう。曲には、常に正の数である必要があるテンポ属性(int)があります。この要件は、ドメインモデルの一部である必要がありますか、それとも外部(SongManager /ビジネスロジックレイヤークラスなど)である必要がありますか?

次のように実装することを選択したとしましょう。

class Song {
  private int tempo;
  // ...

  public void setTempo(int tempo) {
    if (tempo > 0) {
      this.tempo = tempo;
    } else {
      // what?
    }

  }

}

// what?上記を次のように置き換えますか?

  1. 何もない。Songインスタンスが与えられた場合ss.setTempo(-10)オブジェクトの状態を変更することはありません。
  2. テンポを最小値に設定します1。例:
  3. 句にチェックマークをsetTempo付けてマークします。このように、コントローラーまたは他のコンポーネントは、無効なテンポ値をキャッチし、例外の処理方法を決定する責任があります。 throws InvalidTempoExceptionthrowelse
  4. ランタイムInvalidTempoExceptionをスローします。
  5. tempo属性をTempoクラスに抽出し、そこに「0より大きくなければならない」をカプセル化します。
  6. 他の何か。

最近、一般的な「階層化アーキテクチャ」アプローチ、特にドメイン層を調査しているので、質問します。

4

3 に答える 3

2

曲には、常に正の数である必要があるテンポ属性(int)があります

これが適切な初期化の要件である場合はSong、対応する例外をスローする必要があります。IllegalArgumentException

于 2012-05-20T19:56:40.013 に答える
2

この要件はドメイン モデルの一部にする必要がありますか、それとも外部 (SongManager / ビジネス ロジック レイヤー クラスなど) にする必要がありますか?

ドメイン関連のロジックは、ドメイン モデルに存在する必要があります。Manager として何かを呼び出すことは、コードを配置する場所と適切な名前を付ける方法がわからないことを示していることがよくあります。

何もない。Song インスタンス s が与えられた場合、s.setTempo(-10) は単にオブジェクトの状態を変更しません。

テンポを設定する必要があり、渡される引数をほとんど制御できない場合は、テンポ設定の失敗を無視しても問題ありません。UDP プロトコルの場合と同様に、失敗しても問題ありません。それに応じて名前を付けるだけです-s.trySetTempo(-10)のようなものです。

テンポを最小値、たとえば 1 に設定します。

それは最初のケースの拡張のようなものです。曲のテンポをゼロ近くにデフォルト設定する必要がある場合のビジネス ケースを思いつかないのは私だけです。

チェックされた throws InvalidTempoException で setTempo をマークし、else 句でそれをスローします。このように、コントローラーまたは他のコンポーネントは、無効なテンポ値をキャッチし、例外の処理方法を決定する責任があります。ランタイム InvalidTempoException をスローします。

例外をスローするということは、テンポを設定しようとするものはすべて、適切な入力に対して責任があることを意味します。通常、canSetTempo (または isTempoChangeable のようなもの) インジケーター メソッドを記述して、実際の取引を試みる前に外の世界がヒットできるようにする必要があります。

tempo 属性を、「0 より大きくなければならない」がカプセル化された Tempo クラスに抽出します。

これは、ドメインの形状によって異なります。他の何か (SoundSample クラス、MidiClip クラスなど) でテンポの概念を使用する必要がある場合は、良い考えかもしれません。また、ビジネスとほとんど関係がなく、Song クラスのより興味深いロジックを汚染している場合は、テンポをカプセル化することをお勧めします。


個人的には、アクションが利用可能であるがアクション自体がエラーをスローする場合に、ドメイン モデルが回答を提供する場合が好きです。これにより、UXも向上します。テンポの変更を担当するフィールドとボタンが表示されないか、無効になります。これは、まだ何かを行うことができないという即時のフィードバックです。

于 2012-05-22T07:41:58.130 に答える
1

aSongが 0 または負のテンポ値で有効でない場合、これは確かに 内でモデル化された不変式である必要がありますSong

Song無効な値が試行された場合は、例外をスローする必要があります。これにより、無効な状態ではないことが保証されます。

于 2012-05-20T19:57:41.067 に答える