私はクラスを持っています:スケジュール。
public class Schedule {
private int locationNum;
private int cost;
private String costReason;
private Date weekOfChange;
private Date dayOfChange;
private String changeReason;
// and all those getters and setters
public Schedule(int locationNum, int cost, String costReason, Date weekOfChange, Date dayOfChange, String changeReason) throws ApplicationException {
//change is all or nothing - all attributes are present or none
if((weekOfChange!=null && dayOfChange!=null && changeReason!=null) || (weekOfChange==null && dayOfChange == null && changeReason == null)) {
this.weekOfChange = weekOfChange;
this.dayOfChange = dayOfChange;
this.changeReason = changeReason;
}
else { throw new ApplicationException();}
//similary another if block to ensure that if cost is specified
//then there exists the corresponding reason code for it.
}
}
これまでのところ、スケジュールクラスが気に入っています。ただし、チェックは完了していません。他のチェックを行う必要があります。
- locationNumは、データベース内の有効なストア番号です。
- changeReasonテキストは、データベース内の6つの異なるchangeReasonコードの1つです。
- などなど...
通常、これらをScheduleクラスに書き込むことはありません。明らかに、このクラスからDAOを呼び出すことはできません。したがって、ビジネスレイヤーとある種のバリデータークラスがあり、Scheduleタイプのオブジェクトを受け入れ、一連のデータベース検証を順番に実行し、表示などのエラーを収集します。
さて、ここに私の質問があります:
- ScheduleをPOJOとして扱い、オブジェクトがそれ自体を検証する責任を負わないと主張する場合、コンストラクター内のすべてのコードをビジネスレイヤーのバリデータークラスに移動する必要があります。しかし、私がこれを行うとしたら、スケジュールは貧血ではありませんか?これは、彼らが単一責任の原則の違反と呼んでいるものですか?
- コンストラクターにあるコードをビジネスレイヤークラスに移動して、あらゆる種類の検証がビジネスレイヤーに含まれるようにしたとしましょう。データストアで誰かがdayOfChangeをNULLに変更し、データベースからオブジェクトを読み込んでいると仮定します。さて、この種のオブジェクトを使用すると、アプリケーションが破損する可能性がありますね。coz検証ルールが満たされていると仮定してコードを記述します。私の質問は混乱していると思いますが、私が言いたいのは、このコンテキストでは、Scheduleクラスによって隠されたデータの整合性を確保するために、コンストラクターでこれらのチェックを実行したいということです。
- それは通常どのように行われますか?ベストプラクティスは何ですか?
この議論へのあなたの関与に感謝します。