Sebagai contoh, pertimbangkan saya memiliki kelas untuk kelas lain untuk diperluas:
public class LoginPage {
public String userId;
public String session;
public boolean checkSessionValid() {
}
}
dan beberapa subclass:
public class HomePage extends LoginPage {
}
public class EditInfoPage extends LoginPage {
}
Bahkan, subclass tidak memiliki metode untuk menimpa, juga saya tidak akan mengakses HomePage secara umum, yaitu: Saya tidak akan melakukan sesuatu seperti:
for (int i = 0; i < loginPages.length; i++) {
loginPages[i].doSomething();
}
Saya hanya ingin menggunakan kembali halaman login. Tetapi menurut https://stackoverflow.com/a/53354 , saya harus memilih komposisi di sini karena saya tidak memerlukan antarmuka LoginPage, jadi saya tidak menggunakan warisan di sini:
public class HomePage {
public LoginPage loginPage;
}
public class EditInfoPage {
public LoginPage loginPage;
}
tetapi masalahnya ada di sini, pada versi baru, kode:
public LoginPage loginPage;
duplikat ketika kelas baru ditambahkan. Dan jika LoginPage membutuhkan setter dan getter, lebih banyak kode perlu disalin:
public LoginPage loginPage;
private LoginPage getLoginPage() {
return this.loginPage;
}
private void setLoginPage(LoginPage loginPage) {
this.loginPage = loginPage;
}
Jadi pertanyaan saya adalah, apakah "komposisi atas warisan" melanggar "prinsip kering"?
extends LoginPage
semua tempat. PERIKSA MATE!
LoginPage
dekorator Anda. Tidak ada lagi duplikasi, hanya yang sederhana page = new LoginPage(new EditInfoPage())
dan Anda selesai. Atau Anda menggunakan prinsip buka-tutup untuk membuat modul otentikasi yang dapat ditambahkan ke halaman mana pun secara dinamis. Ada banyak cara untuk menangani duplikasi kode, terutama yang melibatkan menemukan abstraksi baru. LoginPage
kemungkinan adalah nama yang buruk, yang ingin Anda pastikan adalah bahwa pengguna diautentikasi saat meramban halaman itu, saat sedang diarahkan ke LoginPage
atau ditampilkan pesan kesalahan yang tepat jika ia tidak.