Hai… Selamat datang kembali di blog Ruang Developer Blog. Pada postingan ini kita akan belajar tentang apa itu dependency injection dalam pemrogramman. Kita juga akan bahas beberapa manfaat yang bisa kita dapatkan dengan menerapkan dependency injection pada kode program kita.
Apa Itu Dependency Injection?
Dalam rekayasa perangkat lunak, Dependency Injection (DI) adalah sebuah desain pattern dimana suatu objek menerima objek atau fungsi lain yang dibutuhkan oleh objek tersebut (ketergantungan). Dependency injection bertujuan untuk memisahkan bagian-bagian program yang menangani permasalahan yang berbeda (separation of concerns). Suatu objek dapat menggunakan fungsionalitas dari objek lain tanpa perlu mengetahui kerumitan-kerumitan apa yang terjadi di dalamnya.
Service & Client
Service adalah objek atau class yang berisi fungsi-fungsi yang dapat digunakan oleh client. Di sisi lain, client adalah objek atau class yang menggunakan fungsi-fungsi yang disediakan oleh service.
Sebuat service dapat berperan sebagai client jika menggunakan objek atau class lain sebagai dependency-nya. Begitu pun sebaliknya, client juga dapat berperan sebagai service jika digunakan oleh objek atau class lain.
Interface
Client seharusnya tidak perlu tahu dan tidak peduli bagaimana implementasi yang dilakukan dalam sebuah service yang digunakannya. Client hanya menggunakan API yang disediakan oleh service. Sebagai analoginya adalah ketika kamu berada di kedai kopi dan memesan secangkir espresso, kamu cenderung tidak perlu tahu apa yang dilakukan barista selama kamu bisa mendapatkan espresso sesuai dengan keinginan kamu, kamu hanya perlu menikmatinya.
Injector
Injector, atau biasa juga disebut dengan container, provider, atau ansembler adalah objek yang berfungsi untuk membangun dan menghubungkan objek-objek yang kompleks dimana objek-objek tersebut dapat berperan sebagai service, client, atau keduanya.
Manfaat Menerapkan Dependency Injection
Penerapan dependency injection dapat memberikan beberapa manfaat bagi sebuah aplikasi ataupun bagi developer yang menulis aplikasi. Sebagai contoh, pemisahan komponen-komponen aplikasi sesuai dengan peran dan fungsinya dapat memudahkan pembuatan unit test karena objek-objek yang berfungsi sebagai dependency dapat dengan mudah digantikan dengan teknik mocking (membuat objek palsu). Selain itu, penerapan dependency injection dapat memudahakan proses perubahan atau scaling aplikasi. Misalnya, pada saat pertama dirilis, aplikasi hanya bisa mengirimkan notifikasi melalui email. Kemudian karena permintaan user aplikasi diupgrade agar dapat mengirimkan notifikasi melalui pesan singkat selain melalui email.
Kekurangan
Di balik manfaat-manfaat yang ditawarkan oleh konsep dependency injection, faktanya konsep ini juka memiliki beberapa kekurangan yang mungkin perlu jadi perhatian sebelum diterapkan. Beberapa di antaranya adalah sebagai berikut:
- Kode agak sulit dilacak karena memisahkan perilaku dari konstruksi objek.
- Memerlukan usaha yang lebih saat awal pengembangan.
- Kode program sangat dinamis yang biasanya akan sedikit menyulitkan IDE untuk melakukan otomatisasi.
- Ketergantungan pada kerangka kerja.
Contoh
Berikut ini adalah contoh dependency injection sederhana yang ditulis dalam bahasa pemrogramman PHP
<?php
// Service Interface
interface NotificationService
{
// fungsi untuk mengirim notifikasi
public function send($message): bool;
}
// Service Implementation
class BaseNotificationService implements NotificationService {
public function send($message): bool {
// logic mengirim notifikasi
}
}
// Sebagai client
class OrderService
{
private NotificationService $notificationService;
public function __construct(NotificationService $notificationService) {
$this->notificationService = $notificationService;
}
public function createOrder()
{
// Menggunakan notificationService untuk mengirim notifikasi
// setelah membuat order
$this->notificationService->send('New order');
}
}
// Sebagai container/Injector
class App {
public function __construct()
{
// Membuat service
$notificationService = new BaseNotificationService();
// Inject service ke client
$orderService = new OrderService($noficationService);
// Menggunakan client seperti biasa
$orderService->createOrder();
}
}