Saya refactoring basis kode besar di mana sebagian besar kelas berada dalam satu paket. Untuk modularitas yang lebih baik, saya membuat sub paket untuk setiap fungsi.
Saya ingat belajar di suatu tempat bahwa grafik dependensi paket tidak boleh memiliki loop, tetapi saya tidak tahu bagaimana menyelesaikan masalah berikut: Figure
ada dalam paket figure
, Layout
ada dalam paket layout
, Layout
membutuhkan gambar untuk melakukan tata letak, jadi paket layout
tergantung pada paket figure
. Tetapi di sisi lain, a Figure
dapat berisi Figure
s lain di dalamnya, memiliki sendiri Layout
, yang membuat paket figure
tergantung pada paket layout
.
Saya memiliki beberapa solusi, seperti membuat Container
antarmuka yang Figure
mengimplementasikan dan memasukkannya ke dalam Layout
paket. Apakah ini solusi yang baik? Ada kemungkinan lain?
Terima kasih
sumber
Jawaban:
Anda harus memikirkan Pembalikan Kontrol
Anda pada dasarnya mendefinisikan antarmuka untuk Anda
Layout
yang terletak di suatu tempat dekat kelas Layout Anda dalam paket sendiri sehingga Anda akan memiliki paket implementasi dan paket antarmuka publik - misalnya menyebutnyaLayoutable
(saya tidak tahu apakah itu bahasa Inggris yang tepat). Sekarang - Layout tidak akan mengimplementasikan antarmuka itu kecualiFigure
kelas. Demikian juga Anda akan membuat antarmuka untuk Gambar ituDrawable
misalnya.Begitu
Sekarang - Gambar mengimplementasikan Layoutable dan dengan demikian dapat digunakan oleh Layout dan (saya belum yakin apakah itu yang Anda inginkan) - Layout mengimplementasikan Drawable dan dapat digambar dalam Gambar. Intinya adalah, bahwa kelas yang memperlihatkan beberapa layanan membuatnya tersedia oleh antarmuka (di sini: Layout dan Layoutable) - kelas yang ingin menggunakan layanan itu harus mengimplementasikan antarmuka.
Maka Anda akan memiliki sesuatu seperti objek pembuat yang mengikat keduanya. Jadi pencipta akan memiliki ketergantungan terhadap
Layout
maupun untukFigure
, tetapiLayout
danFigure
mereka sendiri akan mandiri.Itu ide yang kasar.
Sumber yang sangat baik untuk solusi untuk masalah ini adalah buku Java Application Architecture oleh Kirk Knoernschild.
sumber
Container
antarmuka seperti yang disarankan dalam pertanyaan?Container
masuk dalam paket yang samaLayout
. Itu tidak akan berhasil, sedangkan solusi Anda akan berhasil.Saya tidak terlalu jelas tentang apa
Figure
itu, tapi mungkin harus dalam paket yang samaLayout
?Container
Solusi antarmuka yang Anda usulkan tidak akan berfungsi - kecuali jika Anda menempatkanContainer
antarmuka dalam paket ke-3 maka Anda masih akan memiliki ketergantungan melingkar di antara kedua paket tersebut. Lihat jawaban michael_s untuk sesuatu yang akan bekerja.Hal lain, seperti yang disebutkan orang lain - mungkin tidak akan pernah menjadi masalah. Anda hanya akan mengalami masalah di masa depan jika
Figure
danLayout
ingin berada di modul terpisah . Anda dapat menangani ini jika dan ketika itu menjadi perlu, tetapi mengingat bahwa kedua kelas tampaknya sangat terkait, ini tampaknya sangat tidak mungkin.sumber