Saya sedang mengerjakan desain, tetapi tetap saja memukul penghalang jalan. Saya memiliki kelas tertentu (ModelDef) yang pada dasarnya adalah pemilik pohon simpul kompleks yang dibangun dengan mem-parsing skema XML (pikirkan DOM). Saya ingin mengikuti prinsip-prinsip desain yang baik (SOLID), dan memastikan bahwa sistem yang dihasilkan mudah diuji. Saya memiliki setiap niat menggunakan DI untuk meneruskan dependensi ke dalam konstruktor ModelDef (sehingga ini dapat dengan mudah ditukar, jika perlu, selama pengujian).
Apa yang saya perjuangkan adalah penciptaan pohon simpul. Pohon ini akan terdiri dari objek "nilai" sederhana yang tidak perlu diuji secara independen. (Namun, saya masih bisa meneruskan Pabrik Abstrak ke ModelDef untuk membantu pembuatan benda-benda ini.)
Tetapi saya terus membaca bahwa seorang konstruktor tidak boleh melakukan pekerjaan nyata (mis. Cacat: Pembuat pekerjaan nyata ). Ini masuk akal bagi saya jika "pekerjaan nyata" berarti membangun objek yang sangat bergantung berat yang nantinya ingin dihilangkan untuk pengujian. (Itu harus diteruskan melalui DI.)
Tapi bagaimana dengan benda bernilai ringan seperti pohon simpul ini? Pohon itu harus dibuat di suatu tempat, kan? Mengapa tidak melalui konstruktor ModelDef (menggunakan, katakanlah, metode buildNodeTree ())?
Saya tidak benar-benar ingin membuat pohon simpul di luar ModelDef dan kemudian meneruskannya (melalui konstruktor DI), karena membuat pohon simpul dengan menguraikan skema memerlukan sejumlah besar kode kompleks - kode yang perlu diuji secara menyeluruh . Saya tidak ingin menurunkannya ke "lem" kode (yang seharusnya relatif sepele, dan kemungkinan tidak akan langsung diuji).
Saya telah berpikir untuk meletakkan kode untuk membuat simpul pohon di objek "builder" yang terpisah, tetapi ragu untuk menyebutnya "builder", karena itu tidak benar-benar cocok dengan Pola Builder (yang tampaknya lebih peduli dengan menghilangkan telescoping konstruktor). Tetapi bahkan jika saya menyebutnya sesuatu yang berbeda (misalnya NodeTreeConstructor), masih terasa seperti sedikit peretasan hanya untuk menghindari konstruktor ModelDef membangun pohon simpul. Itu harus dibangun di suatu tempat; mengapa tidak di objek yang akan memilikinya?