Наприклад, врахуйте, що у мене є клас для інших класів, який слід продовжити:
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 потрібен сетер і getter, потрібно скопіювати більше кодів:
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())
і ви все зробили. Або ви використовуєте принцип відкритого закритого типу, щоб зробити модуль аутентифікації, який можна динамічно додавати на будь-яку сторінку. Існує маса способів боротьби з дублюванням коду, в основному це стосується пошуку нової абстракції. LoginPage
швидше за все, це неправильне ім'я, що ви хочете переконатися, що користувач перевіряє автентифікацію під час перегляду цієї сторінки, при цьому він переспрямовується на LoginPage
або відображається належне повідомлення про помилку, якщо його немає.