Ad esempio, considera che ho una classe per altre classi da estendere:
public class LoginPage {
public String userId;
public String session;
public boolean checkSessionValid() {
}
}
e alcune sottoclassi:
public class HomePage extends LoginPage {
}
public class EditInfoPage extends LoginPage {
}
In effetti, la sottoclasse non ha alcun metodo per sovrascrivere, inoltre non accederei alla HomePage in modo generico, cioè: non farei qualcosa del tipo:
for (int i = 0; i < loginPages.length; i++) {
loginPages[i].doSomething();
}
Voglio solo riutilizzare la pagina di accesso. Ma secondo https://stackoverflow.com/a/53354 , dovrei preferire la composizione qui perché non ho bisogno dell'interfaccia LoginPage, quindi non uso l'ereditarietà qui:
public class HomePage {
public LoginPage loginPage;
}
public class EditInfoPage {
public LoginPage loginPage;
}
ma il problema arriva qui, nella nuova versione, il codice:
public LoginPage loginPage;
duplicati quando viene aggiunta una nuova classe. E se LoginPage necessita di setter e getter, è necessario copiare più codici:
public LoginPage loginPage;
private LoginPage getLoginPage() {
return this.loginPage;
}
private void setLoginPage(LoginPage loginPage) {
this.loginPage = loginPage;
}
Quindi la mia domanda è: la "composizione sull'eredità" viola il "principio secco"?
extends LoginPage
dappertutto. CHECK MATE!
LoginPage
decoratore. Niente più duplicati, solo un semplice page = new LoginPage(new EditInfoPage())
e il gioco è fatto. Oppure si utilizza il principio aperto-chiuso per creare il modulo di autenticazione che può essere aggiunto dinamicamente a qualsiasi pagina. Esistono molti modi per gestire la duplicazione del codice, principalmente attraverso la ricerca di una nuova astrazione. LoginPage
è probabilmente un brutto nome, ciò che si desidera assicurarsi è che l'utente sia autenticato durante la navigazione di quella pagina, mentre viene reindirizzato al LoginPage
o mostrato un messaggio di errore corretto se non lo è.