Por exemplo, considere que tenho uma classe para outras classes estender:
public class LoginPage {
public String userId;
public String session;
public boolean checkSessionValid() {
}
}
e algumas subclasses:
public class HomePage extends LoginPage {
}
public class EditInfoPage extends LoginPage {
}
De fato, a subclasse não possui métodos para substituir, também não acessaria a HomePage de maneira genérica, ou seja: Eu não faria algo como:
for (int i = 0; i < loginPages.length; i++) {
loginPages[i].doSomething();
}
Eu só quero reutilizar a página de login. Mas de acordo com https://stackoverflow.com/a/53354 , eu devo preferir composição aqui porque não preciso da interface LoginPage, portanto não uso herança aqui:
public class HomePage {
public LoginPage loginPage;
}
public class EditInfoPage {
public LoginPage loginPage;
}
mas o problema vem aqui, na nova versão, o código:
public LoginPage loginPage;
duplica quando uma nova classe é adicionada. E se o LoginPage precisar de setter e getter, mais códigos deverão ser copiados:
public LoginPage loginPage;
private LoginPage getLoginPage() {
return this.loginPage;
}
private void setLoginPage(LoginPage loginPage) {
this.loginPage = loginPage;
}
Portanto, minha pergunta é: "composição sobre herança" está violando "princípio seco"?
extends LoginPage
todo o lugar. VERIFICAR MATE!
LoginPage
um decorador. Chega de duplicação, apenas um simples page = new LoginPage(new EditInfoPage())
e pronto. Ou você usa o princípio aberto-fechado para criar o módulo de autenticação que pode ser adicionado a qualquer página dinamicamente. Existem várias maneiras de lidar com a duplicação de código, principalmente envolvendo encontrar uma nova abstração. LoginPage
é provavelmente um nome ruim, o que você deseja garantir é que o usuário seja autenticado enquanto navega nessa página, sendo redirecionado para a LoginPage
mensagem de erro adequada ou mostrada uma mensagem de erro adequada.