Kode Python yang digabungkan secara longgar dengan Injeksi Ketergantungan
Software harus fleksibel untuk merespon perubahan. Injeksi ketergantungan adalah teknik untuk mengelola ketergantungan antar komponen perangkat lunak. Ini adalah pola desain yang menggunakan inversi kontrol untuk memberikan kemampuan menukar komponen untuk pengujian atau tujuan lain tanpa mengubah bagian lain dari sistem.
Gagasan utama di balik injeksi ketergantungan adalah untuk meneruskan tanggung jawab untuk menyediakan layanan dari fungsi konstruktor atau metode instantiasi langsung ke objek lain. Dengan kata lain, sebuah objek diberikan dependensinya alih-alih membuatnya. Dengan cara ini, jika kita ingin menambahkan fitur baru, kita tidak perlu mengubah kode yang sudah ada, melainkan meneruskan dependensi baru ke dalamnya.
Membuat Abstraksi dengan Antarmuka
Ada tiga langkah dalam menulis kode Python yang digabungkan secara longgar dengan injeksi ketergantungan. Langkah pertama adalah mengidentifikasi dependensi apa yang dibutuhkan kode, langkah kedua adalah membuat antarmuka untuk setiap dependensi, dan langkah ketiga adalah meneruskannya ke objek dependen melalui parameter konstruktor atau metodenya.
Baru-baru ini, saya mengimplementasikan fungsionalitas yang memerlukan encoder dan decoder byte untuk memanipulasi data bisnis ( saya telah menyederhanakan implementasinya untuk tujuan keterbacaan ). Saya mengabstraksi tanggung jawab mereka pada antarmuka. Python tidak memiliki kata kunci antarmuka seperti Golang, tetapi Anda dapat mereplikasi fungsionalitas antarmuka dengan perpustakaan ABC .
Berfokus pada IPacketEncoderantarmuka, kelas encoder beton harus mengimplementasikannya. Persyaratan bisnis awal mengharuskan semua jenis dikodekan dan string diisi dengan panjangnya. Untungnya, Python menyediakan pustaka struct untuk melakukan sebagian besar kerja keras.
Menerapkan Injeksi Ketergantungan
Fungsinya encode_nameadalah implementasi sederhana untuk membuat muatan yang disandikan dengan nama yang ditentukan. Dibutuhkan IPacketEncoderobjek dan string sebagai parameter.
Dua detail implementasi utama menggunakan IPacketEncoderantarmuka alih-alih PaddedPacketEncoderkelas konkret dan encodermerupakan argumen daripada diinisialisasi di dalam fungsi. Ini adalah injeksi ketergantungan. Karena IPacketEncoderdilewatkan, itu dapat dengan mudah diperpanjang, diubah atau dilengkapi dengan stub , sehingga menjaga sistem tetap longgar.
Beberapa minggu kemudian, ada persyaratan baru bagi pembuat enkode untuk menangani pengkodean yang dihentikan null. Untungnya, karena implementasi yang ada, dapat dengan mudah diimplementasikan.
NullTerminatedPacketEncoderpada dasarnya menambahkan NULL_BYTEsetelah setiap string yang disandikan. Kembali ke encode_namefungsi, instance dari NullTerminatedPacketEncoderadalah argumen pembuat enkode yang valid karena NullTerminatedPacketEncodermengimplementasikan IPacketEncoderantarmuka yang mirip dengan PaddedPacketEncoder.
Jika injeksi ketergantungan tidak digunakan di sini, ini dapat menghasilkan kode yang digabungkan dengan erat dan sulit diubah, misalnya:
Jika pembuat enkode baru diperlukan, encode_namefungsi tersebut harus diubah hampir seluruhnya bersamaan dengan pengujiannya, sehingga memperpanjang waktu pengiriman. Lebih buruk lagi, hal itu bisa mengakibatkan efek samping yang tersembunyi, terutama jika pengembang aslinya sudah tidak tersedia lagi.
Untuk menyimpulkan, saya akan memberikan contoh yang kurang sederhana menggunakan teknik ini. SocketServicebertanggung jawab untuk mendekodekan kode operasi, memanggil penangan yang relevan dan mengembalikan hasilnya. Semua tipe argumennya adalah abstraksi antarmuka, termasuk konstruktornya. CLI bertanggung jawab untuk menentukan pembuat enkode mana yang akan digunakan, yaitu NullTerminated atau Padded, dan meneruskan turunannya ke kelas SocketService.
Karena proyek terus berkembang, disarankan untuk menggunakan kerangka kerja injeksi ketergantungan untuk "menyuntikkan" ketergantungan ini secara otomatis, seperti Dependency Injector .
Mudah-mudahan, ini menunjukkan cara menulis kode Python yang digabungkan secara longgar dengan injeksi ketergantungan. Banyak pengembang Python tidak menyukai injeksi ketergantungan karena mereka merasa itu bukan "pythonic", tetapi saya berpendapat bahwa manfaatnya tidak dapat didiskreditkan, terutama ketika itu ada di banyak bahasa pemrograman lain.
Terima kasih telah membaca . Jika Anda ingin terhubung dengan saya, Anda dapat menemukan saya di Linkedin atau Github .

![Apa itu Linked List? [Bagian 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































