Por ejemplo, considere que tengo una clase para que otras clases extiendan:
public class LoginPage {
public String userId;
public String session;
public boolean checkSessionValid() {
}
}
y algunas subclases:
public class HomePage extends LoginPage {
}
public class EditInfoPage extends LoginPage {
}
De hecho, la subclase no tiene ningún método para anular, tampoco accedería a HomePage de manera genérica, es decir: no haría algo como:
for (int i = 0; i < loginPages.length; i++) {
loginPages[i].doSomething();
}
Solo quiero reutilizar la página de inicio de sesión. Pero de acuerdo con https://stackoverflow.com/a/53354 , preferiría la composición aquí porque no necesito la interfaz LoginPage, por lo que no uso la herencia aquí:
public class HomePage {
public LoginPage loginPage;
}
public class EditInfoPage {
public LoginPage loginPage;
}
pero el problema viene aquí, en la nueva versión, el código:
public LoginPage loginPage;
se duplica cuando se agrega una nueva clase. Y si LoginPage necesita setter y getter, se deben copiar más códigos:
public LoginPage loginPage;
private LoginPage getLoginPage() {
return this.loginPage;
}
private void setLoginPage(LoginPage loginPage) {
this.loginPage = loginPage;
}
Entonces mi pregunta es, ¿la "composición sobre la herencia" está violando el "principio seco"?
extends LoginPage
todas partes. ¡COMPRUEBE MATE!
LoginPage
un decorador. No más duplicaciones, solo una simple page = new LoginPage(new EditInfoPage())
y ya está. O usa el principio de abrir-cerrar para hacer que el módulo de autenticación se pueda agregar a cualquier página dinámicamente. Hay muchas maneras de lidiar con la duplicación de código, principalmente involucrando encontrar una nueva abstracción. LoginPage
es probable que sea un mal nombre, lo que quiere asegurarse es que el usuario esté autenticado mientras navega por esa página, mientras se lo redirige LoginPage
o se le muestra un mensaje de error adecuado si no lo está.