Örneğin, diğer sınıfların genişletmesi için bir sınıfım olduğunu düşünün:
public class LoginPage {
public String userId;
public String session;
public boolean checkSessionValid() {
}
}
ve bazı alt sınıflar:
public class HomePage extends LoginPage {
}
public class EditInfoPage extends LoginPage {
}
Aslında, alt sınıfın geçersiz kılacak bir yöntemi yoktur, Ana Sayfa'ya da genel bir şekilde erişemem, yani: Şunun gibi bir şey yapmazdım:
for (int i = 0; i < loginPages.length; i++) {
loginPages[i].doSomething();
}
Sadece giriş sayfasını tekrar kullanmak istiyorum. Ancak https://stackoverflow.com/a/53354’e göre buradaki kompozisyonu tercih etmeliyim çünkü LoginPage arayüzüne ihtiyacım yok, bu yüzden miras kullanmıyorum:
public class HomePage {
public LoginPage loginPage;
}
public class EditInfoPage {
public LoginPage loginPage;
}
fakat sorun buraya gelir, yeni sürümde kod:
public LoginPage loginPage;
yeni bir sınıf eklendiğinde çoğaltılır. LoginPage'in ayarlayıcı ve alıcıya ihtiyacı varsa, daha fazla kodun kopyalanması gerekir:
public LoginPage loginPage;
private LoginPage getLoginPage() {
return this.loginPage;
}
private void setLoginPage(LoginPage loginPage) {
this.loginPage = loginPage;
}
Öyleyse benim sorum şu, “mirasa ilişkin kompozisyon” “kuru ilkeyi” ihlal ediyor mu?
extends LoginPage
her yere kopyaladınız . ŞAH MAT!
LoginPage
bir dekoratörün olmasını sağlayın . Artık çoğaltma yok, sadece basit page = new LoginPage(new EditInfoPage())
ve bitirdiniz. Veya herhangi bir sayfaya dinamik olarak eklenebilecek kimlik doğrulama modülünü yapmak için açık-kapalı prensibini kullanırsınız. Çoğunlukla yeni bir soyutlama bulmak için kod çoğaltmayla baş etmenin birçok yolu vardır. LoginPage
Büyük olasılıkla hatalı bir addır, emin olmak istediğiniz, kullanıcının bu sayfaya göz atarken kimliğini doğrulaması , yönlendirilirken LoginPage
veya doğru değilse bir hata mesajı göstermesidir.