Apa gunanya sekelompok suku cadang mobil duduk di trek balap lakukan siapa pun?
Jika semua kelas mobil Anda lakukan adalah memegang bagian-bagian mobil itu berguna seperti tas basah bagian.
Pemakaian
Sebagai pengemudi, apa yang saya inginkan adalah sesuatu yang dapat saya kendalikan. Itu merespons ketika saya meminta kecepatan. Pegangan seperti itu di rel. Itu bisa berhenti dengan uang receh.
Yang saya inginkan adalah kelas mobil yang dapat digunakan. Itu bisa saya katakan untuk melakukan sesuatu tanpa harus memikirkan cara kerja karburator. Saya hanya berpikir tentang pedal gas. Bagaimana mereka terhubung bukanlah sesuatu yang saya khawatirkan. Itu abstraksi.
Injeksi Ketergantungan
Ketergantungan injeksi tidak ada hubungannya dengan itu. Ketika saya mengendarai mobil saya tidak berpikir tentang bagaimana itu dibangun. Selama ini berhasil, saya tidak peduli bagaimana mereka menggabungkannya.
Tidak, DI adalah apa yang memungkinkan kru pit saya dengan cepat menukar ban saya dengan yang lebih baik ketika hujan mulai turun di lintasan. Sangat menyenangkan bisa melakukan itu tanpa harus naik ke mobil yang sama sekali berbeda.
DI benar-benar tentang mengikuti prinsip: Pisahkan penggunaan dari konstruksi.
Sebuah mobil yang dapat memasang ban baru dengan kecepatan 90 mil per jam mungkin terdengar keren tapi saya tidak berpikir itu akan memenangkan balapan dengan ban yang memasang alat.
DI adalah tentang memasang komponen Anda dengan cara yang memungkinkan kru pit Anda mendapatkannya. Ketika Anda menggunakan new
di tempat yang sama Anda memprogram perilaku itu seperti Anda mengelas karburator ke tempatnya. Tentu saja obor asetilena dapat menghilangkannya, tetapi harap pertimbangkan untuk menggunakan mur dan baut terlebih dahulu.
Itulah DI. Tentu itu tidak semudah memasukkan new
sesuatu segera setelah Anda menyadari bahwa Anda menginginkannya. Sebaliknya Anda harus menulis kode terpisah yang tahu cara membuat mobil Anda. Tapi itu pasti membuatnya lebih mudah untuk mengubah keadaan nanti. Dan itu berarti Anda tidak perlu menyeret pabrik perakitan mobil di sekitar lintasan bersama Anda.
Konstruksi
Sesuatu, di suatu tempat, harus tahu apakah bannya adalah Goodyear. Di mana kemudian untuk meletakkan kode konstruksi mobil? Jika bukan mobil maka kru pit? Tidak, jejaknya? Tidak. Semua itu memiliki kode perilaku. Kode yang harus tampil saat balapan. Membangun mobil harus terjadi sebelum balapan di tempat yang dihapus dari kode perilaku. Mark Seemans menyebut tempat ini Root Komposisi . Kebanyakan orang menyebutnya utama.
Ini pola yang sederhana. Secara utama, buat grafik objek lalu panggil satu metode perilaku pada satu objek dalam grafik objek. Itu dia. Ini adalah tempat konstruksi HANYA dan perilaku harus bersama.
Itu tidak berarti konstruksi harus menjadi tumpukan kode prosedural yang semuanya ditata secara berurutan. Anda bebas menggunakan setiap alat dalam bahasa untuk melakukan konstruksi. Hanya saja jangan mencampurnya dengan perilaku.
Melakukan ini dalam bahasa dan tidak menggunakan beberapa kerangka DI atau wadah IoC disebut DI murni . Ini bekerja dengan sangat baik. Sudah sejak lama. Kami biasa menyebutnya referensi lewat .
Alat DI
Apa alat DI membeli Anda adalah rincian konstruksi dipindahkan ke bahasa yang berbeda (xml, json, apa pun) yang menegakkan pemisahan antara konstruksi dan perilaku. Jika Anda tidak memercayai sesama programmer Anda untuk tidak menggunakan new
saat mereka seharusnya tidak menarik.
Yang menarik adalah tergoda untuk membiarkan detail alat DI menyebar ke seluruh basis kode. Terkadang menginfeksi basis kode dengan anotasi eksklusif. Contoh-contoh yang mereka berikan tentu mendorong ini. Alat ini cenderung pindah ke ruang bahasa sampai Anda tidak bisa hanya mengiklankan pekerjaan sebagai pekerjaan pemrograman Java tetapi sebagai pekerjaan pemrograman Java / Spring.
Prinsip desain
Untuk waktu yang lama saya memprogram kelas-kelas Mobil karena sudah jelas bagi saya bahwa saya memerlukan kelas mobil jika saya memprogram logika mobil. Tetapi dengan DI tidak begitu jelas bagi saya. Masih bertanya-tanya apakah itu idiom bagi DI untuk tidak membuat kelas Mobil jika saya tidak memiliki peran yang pasti untuknya?
Saya pikir Anda belajar tentang abstraksi dan mengubah cara Anda memutuskan kelas diperlukan. Itu bagus. Tapi itu bukan tentang DI. DI tidak membantu Anda memutuskan apakah Anda membutuhkan kelas mobil. DI membantu Anda menjaga agar mobil tidak tahu, dan karenanya peduli, jika bannya adalah ban Goodyear. DI membantu Anda menjaga jalur agar tidak mengetahui apakah mobil tersebut dibuat di Jepang.
Salah satu pertanyaan paling mendasar dalam desain perangkat lunak adalah "apa yang tahu tentang apa?" Itulah hal utama yang ditunjukkan diagram UML kepada Anda. Ketika Anda menemukan sesuatu yang Anda capai melewati itu antarmuka ke hal konkret yang sekarang Anda terikat. Mobil sekarang harus tahu bahwa bannya adalah Goodyear. Yang agak menyebalkan jika Michelin ingin mensponsori Anda.
Menghindari melakukan itu disebut mengikuti prinsip inversi ketergantungan . Secara formal, modul tingkat tinggi (seperti kelas mobil) tidak boleh langsung bergantung pada modul tingkat rendah (seperti kelas GoodyearTire). Itu harus bergantung pada abstraksi (seperti antarmuka Tyre).
Cara untuk menghindari hal itu disebut Pembalikan kontrol . Di sini penekanannya adalah pada mengubah aliran kontrol. Apakah ban menggerakkan mobil atau mobil menggerakkan ban? Memikirkan hal ini dengan cara yang benar memungkinkan kita untuk tidak memasangkan mobil dan ban secara statis. DI adalah salah satu cara khusus untuk mengikuti Inversion of Control.
Tidak ada yang memberi tahu Anda jika Anda membutuhkan kelas mobil. Jika Anda memprogram "logika mobil" itu bagus jika ada satu tempat untuk menyimpannya daripada menyebarkannya di mana saja. Hanya saja jangan tertipu dengan berpikir logika konstruksi mobil sama dengan logika perilaku mobil sehingga semuanya harus hidup di tempat yang sama. Tetapi jika Anda tidak memiliki roll yang ditentukan untuk mobil maka Anda juga tidak perlu. Balap motor di trek jika Anda suka.
Maksud saya apakah boleh menggunakan SteeringWheel untuk dikendarai, BoltsAndNuts beroda untuk kru pit dan semua jenis antarmuka lucu lainnya tanpa memiliki instance yang mewakili mobil secara keseluruhan?
DI atau tidak DI, boleh saja memiliki instance yang mewakili mobil secara keseluruhan, tetapi instance itu bukan sesuatu yang ingin saya ketahui secara langsung jika saya tidak perlu. Berikan saya abstraksi mobil jadi saya tidak perlu peduli apakah itu berjalan pada gas, diesel, atau listrik ketika saya menggunakannya. Itu hanya sesuatu yang harus saya pedulikan ketika saya membangun atau memeliharanya. Sangat menyenangkan jika kode yang menggunakan mobil tidak harus tahu atau peduli bagaimana cara kerjanya. "Aku tidak tahu. Aku tidak ingin tahu."