たとえば、他のクラスを拡張するクラスがあるとします。
public class LoginPage {
public String userId;
public String session;
public boolean checkSessionValid() {
}
}
およびいくつかのサブクラス:
public class HomePage extends LoginPage {
}
public class EditInfoPage extends LoginPage {
}
実際、サブクラスにはオーバーライドするメソッドがありません。また、一般的な方法でHomePageにアクセスしません。つまり、次のようなことはしません。
for (int i = 0; i < loginPages.length; i++) {
loginPages[i].doSomething();
}
ログインページを再利用したいだけです。ただし、https: //stackoverflow.com/a/53354によると、インターフェイスLoginPageは必要ないため、ここでは構成を優先する必要があります。したがって、ここでは継承を使用しません。
public class HomePage {
public LoginPage loginPage;
}
public class EditInfoPage {
public LoginPage loginPage;
}
しかし、問題はここにあります。新しいバージョンでは、コードは次のとおりです。
public LoginPage loginPage;
新しいクラスが追加されると複製されます。LoginPageにセッターとゲッターが必要な場合、さらにコードをコピーする必要があります。
public LoginPage loginPage;
private LoginPage getLoginPage() {
return this.loginPage;
}
private void setLoginPage(LoginPage loginPage) {
this.loginPage = loginPage;
}
だから私の質問は、「継承に対する組成」が「ドライ原則」に違反しているということです。
extends LoginPage
。チェックメイト!
LoginPage
、デコレーターを作成します。これ以上の複製は不要で、簡単page = new LoginPage(new EditInfoPage())
です。完了です。または、open-closed-principleを使用して、任意のページに動的に追加できる認証モジュールを作成します。主に新しい抽象概念を見つけることを含む、コードの重複に対処する方法はたくさんあります。LoginPage
おそらく悪い名前です。あなたが確認したいのは、そのページを閲覧している間にユーザーが認証され、LoginPage
そうでない場合は適切なエラーメッセージにリダイレクトされるか表示されることです。