Semenjak berkembang banyak framework di berbagai bahasa pemrograman, membuat suatu project menjadi lebih mudah. Sebab di dalam framework tersebut, fitur dependency injection dan modular digunakan secara masif. Apa yang sebenarnya terjadi?
Pola Desain Inti Semua Framework
Semua framework menerapkan pola desain inti (design pattern) yang fokus pada separation of concern (pemisahan perhatian). Arti nya, seluruh framework ini dipecah menjadi banyak komponen yang masing-masing nya dapat berjalan secara independen namun secara berangsur membentuk tujuan akhir yang sama (modularitas). Dengan prinsip modularitas ini, seorang programmer bisa lebih leluasa menentukan mau pakai modul yang mana untuk mengembangkan fitur yang dibutuhkan dalam business workflow yang sedang dikerjakannya.
Pengembang framework kemudian memanfaatkan fitur dalam bahasa pemrograman yang digunakan untuk framework tersebut salah satu nya adalah dependency injection. Omon-omon, di awal tadi dibilang "komponen yang berjalan secara independen" kok tiba-tiba ada istilah "dependency injection", kan makna nya bertolak belakang? Gasskeun penjelasan selanjutnya...
Suntikan Ketergantungan: Apa Ini Sebenarnya?
Dependency injection itu makna nya suatu prosedur (bisa function, method, class, dsb) yang dipanggil dari prosedur lain ketika prosedurnya itu dibutuhkan seketika. Saat prosedur utama dijalankan, masing-masing injected dependency itu "muter" sendiri, artinya memproses sesuai aturannya masing-masing. Namun hasil akhirnya tetap dikendalikan oleh prosedur utama. Jadi sebenarnya, yang dependent alias bergantung itu adalah prosedur utama nya. Sedangkan modul yang disuntikan itu independent.
Kalau yang pernah belajar "jeroan" pemrograman, pasti pernah dengar istilah sub routine. Nah, modul adalah sub routine yang berada di file terpisah. Dalam konsep modularitas, suatu sub routine bisa memiliki sub routine lagi. Sehingga terjadilah hirarki modul. Tiap sub routine ini memiliki logika nya sendiri-sendiri. Namun mereka memproses suatu potongan data yang akan dikumpulkan dan digunakan oleh prosedur utama.
Contoh singkat, misalnya ada suatu prosedur hendak memecah route
GET /api/v1/students/{id}
Nah di situ prosedur perlu sub routine antara lain
- HTTP method filter
- HTTP URI analyser
- Controller matcher
- Query builder
- Response builder
Setiap sub routine itu juga mungkin butuh sub routine lain misalnya
- Regular Expression matcher
- Route config matcher
- Error handler
Setiap sub routine ini akan berproses secara mandiri dan hasil nya akan disuntikkan ke prosedur utama secara hirarkis. Nah sekarang jelas kan gambaran dari dependency injection?
Cara Memanfaatkan Dependency Injection
Nah berikut ini ada contoh sederhana dependency injection untuk bahasa pemrograman php dan typescript.
class Request {
public body = {
id: 1,
name: "Astomo typescript"
}
}
class MyNewInjected {
public injector(request: Request) {
const name = request.body.name
return name
}
}
function testInjector() {
const my_inject = new MyNewInjected
const request = new Request
const inject_data = my_inject.injector(request)
console.log(`hello, ${inject_data}`)
}
testInjector()
Untuk contoh dependency injection pada typescript ini, class MyNewInjected ini berisi method injector yang membutuhkan argument request dengan tipe data Request. Tipe data Request ini merupakan suatu class Request yang memiliki property body yang berupa object dengan property id dan name. Nah cara memanggil tipe data Request ini lah yang disebut menyuntikkan dependency. Class Request bisa diletakkan di file lain untuk kemudian diimport ke dalam file tempat class MyNewInjected berada. Bisa juga dibuat lebih fleksibel dengan menambahkan interface ke class Request.
Selanjutnya semua class dipanggil ke dalam function testinjector yang berperan sebagai routine utama. Dalam framework real, routine utama nya berada di library node_modules, jadi tidak terlihat. Yang terlihat hanyalah class MyNewInjected yang biasanya berupa controller.
<?php
class Request {
public $body = [
"id"=>"1",
"name"=>"Astomo P"
];
}
class MyClass {
public function getData(Request $req) {
$name = $req->body["name"];
return "hello, " . $name;
}
}
$request = new Request();
$my_class = new MyClass();
echo json_encode($my_class->getData($request),true);
Untuk contoh dependency injection pada php ini, class MyClass ini berisi method getData yang memerlukan argument $request dengan type hint Request. Type hint Request ini merupakan suatu class Request dengan property $body yang berisi array dengan key id dan name. Kalau di php cara memanggil dependency injection ialah melalui type hint seperti ini. Class Request ini bisa diletakkan di file terpisah untuk diimport ke dalam file di mana class MyClass berada.
Selanjutnya semua class di running ke dalam file routine utama. Di real framework, file routine utama ini berada di library vendor, jadi tidak terlihat. Yang terlihat hanyalah class MyClass yang biasanya berupa controller.
Kalau kedua kode ini di running hasil nya sbb:
Kesimpulan
Perkembangan framework dalam berbagai bahasa pemrograman sangat memudahkan pengembangan project. Apalagi framework modern sudah menerapkan design pattern yang memanfaatkan modularitas dan dependency injection dengan masif. Meskipun demikian modul-modul tersebut diletakkan dalam library yang diinstall dari direktori repository publik seperti node_modules dan vendor. Jika framework modern dirasa mahal, silakan membuat dependency injection sendiri.