Saya punya proyek di mana saya memiliki dua kelas yang keduanya memerlukan objek akses database yang memperbarui tabel yang sama. Batasan-batasan dari kerangka kerja dan proyek membuatnya sehingga saya tidak dapat menggabungkan kedua kelas ini. Saya telah membuat case di bawah ini yang menunjukkan bagaimana pengaturannya. Kelas A harus dapat memperbarui dan membaca catatan, sedangkan kelas B harus dapat memperbarui dan menghapus catatan.
Jika saya menggunakan kelas sebagaimana adanya, itu berfungsi dengan baik, tetapi saya mengalami masalah dengan fakta bahwa masing-masing kelas membutuhkan fungsionalitas yang tidak digunakan untuk diimplementasikan. Misalnya, untuk menggunakan kelas A, saya harus memberikannya dao yang mengimplementasikan fungsi delete, meskipun tidak akan pernah dipanggil. Demikian pula, saya harus lulus kelas B a dao yang mengimplementasikan fungsi baca tetapi tidak akan pernah dipanggil.
Saya berpikir untuk mendekatinya dengan memiliki antarmuka yang mewarisi yang lain (IReadDao, IUpdatePOR, IDeletePOR menjadi daos yang akan diwarisi dari), tetapi pendekatan ini pada dasarnya akan memerlukan antarmuka yang berbeda untuk setiap kombinasi fungsi (IUpdateAndRead, IReadAndDelete, IReadAndUpdate ... )
Saya ingin menggunakan antarmuka untuk dao karena saya tidak ingin memasangkan aplikasi dengan database. Apakah ada pola atau metode untuk mencapai apa yang saya inginkan yang diketahui orang lain? Terima kasih sebelumnya.
class IDao {
void update(ModelDao model);
void delete(String guid);
ModelDao read(String guid);
}
Class A {
private IDao dao;
public A(IDao dao) {
this.dao = dao;
}
public void doStuff() {
ModelDao model = new ModelDao();
...
dao.update(model);
}
public void readThenDoSomething(String id) {
ModelDao model = dao.read(id);
...
}
}
Class B {
private IDao dao;
public B(IDao dao) {
this.dao = dao;
}
public void makeUpdate() {
ModelDao model = new ModelDao();
...
dao.update(model);
}
public void delete(String id) {
dao.delete(id);
}
}
sumber
I
dariSOLID
). Mungkin ingin membaca sedikit tentang itu.Jawaban:
Per komentar Christopher, mungkin sedikit lebih baik untuk memisahkan antarmuka . Jadi, Anda akan membutuhkan setidaknya
IReadDao
,IDeleteDao
, danIUpdateDao
. Perhatikan bahwa Anda tidak perlu tiga kelas; Anda dapat memiliki satu kelas DAO besar yang mengimplementasikan ketiga antarmuka, jika masuk akal jika basis kode digabungkan dengan cara itu.Untuk menghindari ledakan kombinatorial (misalnya untuk menghindari kebutuhan untuk
IReadUpdate
,IDeleteUpdate
, dll antarmuka) Anda dapat memberikan interface secara terpisah di injeksi konstruktor (Anda dapat melewati objek yang sama dua kali parameter yang berbeda), atau memberikan satu objek yang mendukung dua atau lebih interface dalam panggilan metode generik menggunakanextends
.Injeksi konstruktor:
Setter injeksi, menggunakan metode generik:
sumber
dao
keduanya.