私はかなり独特な設計上の問題に悩まされています。私は、Java ORMを使用していて、次のように私のモデルクラスのいずれかを定義しています継承とインターフェイスに関する設計上の混乱
class User extends Model {
// . . .
}
は今、より多くのモデルがあり、私はそれらすべてのデータの検証をサポートしたいと思います。アイデアは簡単です:各セッターメソッドが呼び出されると、エラーの内部ArrayList
が生成され続けます。
エラー処理のメカニズムは、すべてのモデルクラスでまったく同じです。私は、次のインターフェイスを思い描くことができます。
public interface ErrorReportable {
ArrayList<String> errors = new ArrayList<String>();
boolean hasErrors();
ArrayList<String> getErrors();
void resetErrors();
}
は、今私は問題を抱えている:すべてのメソッドは抽象的で、私は私のクラスでは、それらのすべての実装を提供する必要がありますを意味しています。これは悲しいことです。これらのメソッドは全く同じ方法で実装されるためです。理想的には、これは私がうまく継承した別のクラスでしたが、悲しいことに、Javaでは多重継承はありません。
私の次のオプションは、インターフェイスのデフォルトメソッドを使用していますが、問題はerrors
フィールドです。これは静的になりますが、各インスタンスには通常のフィールドが必要です。
唯一の解決策のようですが、にhasErrors()
メソッドがある必要があります。これはreturn this.error_obj.hasErrors()
になります。これはうまくいきますが、私が物事を二度書く必要があるので、私の意見では本当にきれいではありません。
どうすればよいですか?
実際にバリデーションをセッターですぐに実行しますか? setterが2回呼び出され、最初に無効な値を提供するが、2回目の呼び出しで有効な値はどうなるでしょうか?また、クロスフィールドバリデーションが必要になった場合、セッターで検証することは悪夢になります。 –
@JiriTousek私が言う限り、それは起こりません。これは典型的なWebアプリケーションであり、コントローラはフィールドを1つずつ入力します。最後に、コントローラは 'hasErrors()'を呼び出し、応答をフロントエンドに返します。右のデータが来る次のサイクルでは、新しいオブジェクトがインスタンス化されます。しかし、私が要求に応じて検証を実行することを選択したとしても、デザインパズルは変わらないと思います。 – dotslash