Masalah
Saya baru-baru ini membaca banyak tentang Singletons yang buruk dan bagaimana injeksi ketergantungan (yang saya pahami sebagai "menggunakan antarmuka") lebih baik. Ketika saya menerapkan bagian ini dengan callbacks / interfaces / DI dan mengikuti prinsip pemisahan antarmuka, saya berakhir dengan cukup berantakan.
Ketergantungan dari induk UI di mana pada dasarnya anak-anak dari semua anak-anaknya digabungkan, sehingga semakin tinggi hirarki elemen UI, semakin konstruksinya semakin besar.
Semua jalan di atas hirarki UI adalah kelas Aplikasi, memegang info tentang pilihan saat ini dan referensi ke model 3d yang perlu mencerminkan perubahan. Kelas aplikasi mengimplementasikan 8 antarmuka, dan ini hanya sekitar seperlima dari produk (/ antarmuka) yang akan datang!
Saat ini saya bekerja dengan singleton yang memegang seleksi saat ini dan elemen UI memiliki fungsi untuk memperbarui diri. Fungsi ini menetes ke bawah pohon UI dan elemen UI kemudian mengakses singleton pilihan saat ini sesuai kebutuhan. Bagi saya, kode ini tampak lebih bersih.
Pertanyaan
Apakah tunggal mungkin yang sesuai untuk proyek ini?
Jika tidak, apakah ada cacat mendasar dalam pemikiran dan / atau implementasi DI saya yang membuatnya sangat rumit?
Info tambahan tentang proyek
Jenis: Keranjang belanja untuk apartemen, dengan lonceng dan peluit
Ukuran: 2 man-bulan untuk kode dan
Pemeliharaan UI : Tidak ada pembaruan berjalan, tapi mungkin "versi 2.0" nanti
Lingkungan: Menggunakan C # di Unity, yang menggunakan Entity Sistem komponen
Dalam hampir semua kasus, interaksi pengguna memicu beberapa tindakan. Misalnya, ketika pengguna memilih item
- bagian UI yang menunjukkan item itu dan uraiannya perlu diperbarui. Untuk ini, ia juga perlu mendapatkan beberapa info dari model 3d untuk menghitung harganya.
- lanjut ke UI, harga total keseluruhan perlu diperbarui
- fungsi yang sesuai di kelas pada model 3d perlu dipanggil untuk menampilkan perubahan di sana
sumber
Jawaban:
Saya pikir pertanyaannya adalah gejala, bukan solusi.
Solusi mencari masalah; itu dan kesalahpahaman itu mungkin merusak desain Anda. Sudahkah Anda membaca pertanyaan SO tentang DI vs Singleton, konsep yang berbeda atau tidak? Saya membaca bahwa hanya dengan membungkus singleton sehingga klien tidak harus berurusan dengan singleton. It.is.just.good.old.encapsulation. Saya pikir itu tepat.
Bangun bit yang lebih kecil terlebih dahulu kemudian masukkan ke dalam konstruktor dari benda yang mereka miliki dan berikan benda yang lebih besar ke dalam konstruktor hal yang lebih besar berikutnya ...
Jika Anda memiliki masalah konstruksi yang kompleks, gunakan pola pabrik atau pembangun. Intinya ada konstruksi kompleks yang ditarik ke kelasnya sendiri untuk menjaga kelas lain tetap rapi, bersih, mudah dipahami, dll.
Ini terdengar seperti tidak adanya perpanjangan kemampuan. Desain inti tidak ada dan semuanya dijejali dari atas. Seharusnya ada lebih banyak konstruksi, komposisi, dan pewarisan dari bawah ke atas yang terjadi.
Saya ingin tahu apakah desain Anda "sangat berat." Kedengarannya seperti kita sedang berusaha membuat satu kelas menjadi segalanya atau apapun itu. Dan fakta bahwa itu adalah kelas UI, bukan kelas domain bisnis, yang benar-benar membuat saya bertanya-tanya tentang pemisahan masalah.
Tinjau kembali desain Anda dari awal dan pastikan ada abstraksi produk yang solid dan mendasar yang dapat dibangun untuk membuat produksi kategori yang lebih kompleks atau berbeda. Maka Anda lebih baik memiliki koleksi khusus dari hal-hal ini sehingga Anda memiliki tempat untuk meletakkan fungsionalitas "tingkat koleksi" - seperti "model ke-3" yang Anda sebutkan.
Banyak dari ini mungkin cocok di kelas koleksi kustom. Mungkin juga struktur kelas yang independen karena kedalaman dan kompleksitas. Kedua hal ini tidak saling eksklusif.
Baca tentang pola pengunjung. Ini adalah ide untuk memiliki seluruh chuck fungsionalitas kabel secara abstrak ke berbagai jenis.
Desain dan DI
90% dari semua injeksi dependensi yang akan Anda lakukan adalah melewati konstruktor parameter. Demikian kata quy yang menulis buku itu . Rancang kelas Anda dengan baik dan hindari mencemari proses berpikir itu dengan gagasan yang samar-samar tentang perlunya menggunakan wadah-benda DI. Jika Anda membutuhkannya, desain Anda akan menyarankannya untuk Anda.
Fokus pada pemodelan domain belanja apartemen.
Hindari pendekatan Jessica Simpson untuk mendesain : "Saya sama sekali tidak tahu apa artinya itu, tetapi saya menginginkannya."
Berikut ini salah:
sumber
"Class heirarchy" adalah sedikit bendera merah. Hipotetis: halaman web dengan 5 widget. Halaman ini bukan merupakan leluhur dari salah satu widget. Ini mungkin memiliki referensi ke widget tersebut. Tapi itu bukan leluhur. Alih-alih hirarki kelas, pertimbangkan untuk menggunakan komposisi. Masing-masing dari 5 widget dapat dibangun sendiri, tanpa merujuk ke widget lain atau halaman atas. Halaman atas kemudian dibangun dengan informasi yang cukup untuk membangun halaman dasar dan tata letak objek widget (Koleksi) yang diteruskan ke sana. Halaman ini bertanggung jawab untuk tata letak, dll, tetapi tidak untuk konstruksi dan logika widget.
Setelah Anda menggunakan komposisi, DI adalah teman terbaik Anda. DI memungkinkan Anda menukar setiap widget untuk versi atau tipe widget apa pun yang Anda tetapkan dalam DI. Konstruksi widget ditangkap dalam DI dan terpisah dari halaman atas. Mungkin bahkan komposisi Koleksi dapat didefinisikan dalam DI Anda. Halaman atas melakukan tata letak berdasarkan widget yang diteruskan ke sana, sebagaimana mestinya. Tidak diperlukan perubahan pada konstruktor halaman atas. Halaman atas hanya membutuhkan logika untuk melakukan tata letak widget dan meneruskan info ke / dari widget berdasarkan antarmuka yang ditentukan.
Alih-alih melewati pendengar ke atas dan ke bawah rantai komposisi, menyuntikkan koleksi pendengar ke widget yang membutuhkannya. Suntikkan koleksi ke penerbit sehingga mereka dapat mempublikasikan ke koleksi. Suntikkan koleksi di pendengar sehingga mereka dapat menambahkan diri ke koleksi. Koleksi memotong semua objek dalam rantai komposisi.
sumber