Banyak bahasa pemrograman umum cukup fleksibel untuk memungkinkan Anda mendukung injeksi ketergantungan. Bahkan tanpa dukungan pustaka atau kerangka kerja. Tetapi bahkan jika suatu bahasa Turing cukup lengkap untuk menyelesaikan masalah pemrograman, bahasa membuat pilihan yang berdampak pada apa yang mudah dan apa yang sulit dilakukan di dalamnya.
Apakah ada bahasa yang dirancang khusus untuk membuat injeksi ketergantungan menjadi mudah, dan sebaliknya, membuat membuat dependensi tersembunyi menjadi sulit?
Klarifikasi:
Karena keterbatasan beberapa bahasa (melihat Anda Java), banyak orang menganggap bantuan dengan kabel dan konstruksi sebagai bagian dari injeksi ketergantungan. Di sini saya hanya bermaksud bahasa yang dirancang untuk DI berarti bahwa ketergantungan tidak mudah disembunyikan dalam efek samping. Memiliki konvensi atas sistem konfigurasi juga hanya akan ditambahkan saus.
Saya tidak mencari rekomendasi bahasa. Itu pertanyaan historis. Pernahkah ada penulis bahasa yang secara eksplisit melakukan ini?
sumber
Jawaban:
Ya, memang ada. Semacam.
Newspeak tidak memiliki keadaan statis dan tidak memiliki keadaan global. Ini berarti bahwa satu-satunya cara yang mungkin untuk mendapatkan akses ke ketergantungan adalah dengan menyuntikkannya secara eksplisit. Jelas, ini berarti bahwa bahasa, atau dalam kasus Newspeak lebih tepatnya IDE perlu membuat injeksi ketergantungan mudah, jika tidak bahasa tidak akan dapat digunakan.
Jadi, bahasa tidak dirancang untuk DI, tetapi kebutuhan untuk DI adalah konsekuensi dari desain bahasa.
Jika tidak ada keadaan statis dan tidak ada keadaan global, maka Anda tidak bisa begitu saja "menjangkau" ke dalam eter dan menarik sesuatu keluar. Sebagai contoh, di Jawa, struktur paket adalah keadaan statis. Saya hanya bisa mengatakan
java.lang.String
dan saya memilikiString
kelas sendiri . Itu tidak mungkin di Newspeak. Segala sesuatu yang Anda kerjakan, harus secara eksplisit diberikan kepada Anda, jika tidak, Anda tidak bisa mendapatkannya. Jadi, semuanya adalah ketergantungan, dan setiap ketergantungan eksplisit.Kamu ingin string? Nah, Anda harus terlebih dahulu meminta
stdlib
objek untuk memberi AndaString
kelas. Oh, tetapi bagaimana Anda mendapatkan akses kestdlib
? Nah, Anda harus terlebih dahulu memintaplatform
untuk menyerahkanstdlib
benda itu kepada Anda . Oh, tetapi bagaimana Anda mendapatkan akses keplatform
? Nah, Anda harus terlebih dahulu meminta orang lain untuk menyerahkanplatform
benda itu kepada Anda . Oh, tetapi bagaimana Anda mendapatkan akses ke seseorang yang tinggal di sana? Nah, Anda harus terlebih dahulu meminta orang lain untuk menyerahkan benda itu kepada Anda.Seberapa jauh lubang kelinci ini? Di mana rekursi berhenti? Sepanjang jalan, sebenarnya. Itu tidak berhenti. Lalu, bagaimana Anda bisa menulis program di Newspeak? Sebenarnya, Anda tidak bisa!
Anda memerlukan entitas luar yang mengikat semuanya. Di Newspeak, entitas itu adalah IDE. IDE melihat keseluruhan program. Itu bisa menyatukan potongan-potongan yang berbeda. Pola standar dalam Newspeak adalah bahwa kelas pusat aplikasi Anda memiliki accessor yang disebut
platform
, dan IDE Newspeak menyuntikkan objek ke accessor yang memiliki metode yang mengembalikan beberapa kebutuhan dasar pemrograman:String
kelas,Number
kelas,Array
kelas, dan seterusnya.Jika Anda ingin menguji aplikasi Anda, Anda bisa menyuntikkan
platform
objek yangFile
metodenya mengembalikan kelas dengan metode dummy. Jika Anda ingin menyebarkan aplikasi Anda ke cloud, Anda menyuntikkan platform yangFile
kelasnya sebenarnya didukung oleh Amazon S3. GUI lintas platform bekerja dengan menyuntikkan kerangka kerja GUI yang berbeda untuk OS yang berbeda. Newspeak bahkan memiliki kompiler Newspeak-to-ECMAScript eksperimental dan kerangka kerja GUI yang didukung HTML yang memungkinkan Anda untuk port aplikasi GUI berfitur lengkap dari desktop asli ke dalam browser tanpa perubahan, hanya dengan menyuntikkan elemen GUI yang berbeda.Jika Anda ingin menggunakan aplikasi Anda, IDE dapat membuat serialisasi aplikasi menjadi objek di-disk. (Tidak seperti leluhurnya, Smalltalk, Newspeak memiliki format serialisasi objek out-of-image. Anda tidak harus mengambil seluruh gambar dengan Anda, justru karena semua dependensi disuntikkan: IDE tahu persis bagian mana dari sistem aplikasi Anda menggunakan dan yang tidak. Jadi, ia membuat serial persis subgraf yang terhubung dari ruang objek yang terdiri dari aplikasi Anda, tidak lebih.)
Semua ini bekerja hanya dengan mengambil orientasi objek ke ekstrem: semuanya adalah panggilan metode virtual ("pengiriman pesan" dalam terminologi Smalltalk, di mana Newspeak adalah turunan). Bahkan pencarian superclass adalah panggilan metode virtual! Ambil sesuatu seperti
atau, dalam Newspeak:
Di Jawa, ini akan membuat nama
Foo
di namespace global statis, dan mencariBar
di namespace global statis dan membuatBar
Foo
superclass. Bahkan di Ruby, yang jauh lebih dinamis, ini masih akan membuat konstanta statis di namespace global.Di Newspeak, deklarasi setara berarti: membuat metode pengambil bernama
Foo
dan membuatnya mengembalikan kelas yang mencari kelas supernya dengan memanggil metode bernamaBar
. Catatan: ini tidak seperti Ruby, di mana Anda dapat menempatkan setiap eksekusi kode Ruby sebagai deklarasi superclass, tetapi kode hanya akan dieksekusi sekali ketika kelas dibuat dan nilai kembali kode yang menjadi superclass tetap. Tidak. MetodeBar
ini dipanggil untuk setiap pencarian metode tunggal !Ini memiliki beberapa implikasi mendalam:
karena kelas dalam hanyalah pemanggilan metode yang mengembalikan kelas, Anda bisa mengganti metode itu dalam subkelas dari kelas luar, jadi setiap kelas adalah virtual. Anda mendapatkan kelas virtual gratis:
Newspeak:
karena superclass hanyalah pemanggilan metode yang mengembalikan kelas, Anda bisa menimpa metode itu dalam subkelas dari kelas luar, kelas dalam yang ditentukan dalam superclass dapat memiliki superclass yang berbeda di dalam subkelas. Anda mendapatkan warisan hierarki kelas secara gratis:
Newspeak:
dan terakhir, yang paling penting untuk diskusi ini: karena (terlepas dari yang Anda tentukan di kelas Anda, tentu saja) Anda hanya dapat memanggil metode di kelas lexically Anda yang tertutup (es) dan superclass Anda (es), kelas terluar tingkat atas tidak bisa memanggil metode sama sekali kecuali orang-orang yang secara eksplisit disuntikkan: kelas tingkat atas tidak memiliki kelas melampirkan yang metodenya bisa menyebutnya, dan tidak dapat memiliki superclass lain dari yang default, karena deklarasi superclass adalah metode panggilan, dan itu jelas tidak bisa pergi ke superclass (itu adalahsuperclass) dan juga tidak dapat pergi ke kelas lexically enclosure, karena tidak ada. Apa artinya ini adalah kelas tingkat atas benar-benar dienkapsulasi, mereka hanya dapat mengakses apa yang mereka disuntikkan secara eksplisit, dan mereka hanya mendapatkan suntikan apa yang mereka minta secara eksplisit. Dengan kata lain: kelas tingkat atas adalah modul. Anda mendapatkan keseluruhan sistem modul secara gratis. Bahkan, lebih tepatnya: kelas tingkat atas adalah deklarasi modul, instansnya adalah modul. Jadi, Anda mendapatkan sistem modul dengan deklarasi modul parametrik dan modul kelas satu gratis, sesuatu yang tidak bisa dilakukan oleh banyak, bahkan sangat canggih, sistem modul.
Untuk membuat semua injeksi ini tidak menyakitkan, deklarasi kelas memiliki struktur yang tidak biasa: mereka terdiri dari dua deklarasi. Salah satunya adalah konstruktor kelas, yang bukan konstruktor yang mengkonstruksikan instance kelas, melainkan konstruktor yang membangun lingkungan di mana tubuh kelas berjalan. Dalam sintaks mirip Java, akan terlihat seperti ini:
Newspeak:
Perhatikan bahwa cara seorang programmer Newspeak benar - benar akan melihat kelas adalah seperti ini:
Aku bahkan tidak bisa mulai melakukannya dengan adil. Anda harus bermain-main dengannya sendiri. Gilad Bracha telah memberikan beberapa ceramah tentang berbagai aspek sistem, termasuk modularitas. Dia memberikan ceramah yang sangat panjang (2 jam) , jam pertama yang merupakan pengantar menyeluruh untuk bahasa, termasuk kisah modularitas. Bab 2 Platform Pemrograman Newspeak mencakup modularitas. Jika Anda membaca Newspeak di Squeak - Panduan untuk yang Bingung (alias Newspeak-101) , Anda dapat merasakan sistem tersebut. Newspeak oleh Contoh adalah dokumen hidup (yaitu sedang berjalan di dalam port Newspeak-on-ECMASCript, setiap baris kode dapat diedit, setiap hasil dapat diperiksa) menunjukkan sintaks dasar.
Tapi sungguh, Anda harus bermain-main dengannya. Ini sangat berbeda dari semua bahasa utama dan bahkan sebagian besar bahasa non-mainstream yang sulit untuk dijelaskan, harus dialami.
sumber
Bahasa Pemrograman Wake dirancang untuk menggunakan injeksi ketergantungan. Pada dasarnya, ini memiliki kerangka injeksi ketergantungan yang setara dengan bahasa itu sendiri. Kelas mendefinisikan parameter yang mereka
need
danprovide
kompiler menghubungkan semuanya.sumber
Ini bukan bahasa yang praktis berguna, tetapi sistem yang dijelaskan dalam makalah ini. Memiliki efek yang menarik: ini memungkinkan Anda untuk menulis kelas abstrak menggunakan kelas / antarmuka abstrak (termasuk instantiating mereka) Kelas Anda kemudian dapat dibuat konkret dengan mengganti subkelas dari setiap kelas abstrak yang Anda gunakan pada titik instantiation. Melakukan hal itu menghilangkan perlunya injeksi ketergantungan pada setidaknya kasus sederhana, misalnya (menggunakan versi hipotetis Java yang diperluas dengan fitur ini) kita dapat mengambil kode ini:
dan ganti Klien dan penggunaannya dengan:
Perhatikan bahwa ini menyederhanakan titik penggunaan ketergantungan, bukan penciptaan. Ini juga memungkinkan kita untuk menghindari pola Pabrik (sebagai yang baru saya dapat dibuat sesuai permintaan kapan saja kita mau).
sumber
Saya belum menggunakannya, tetapi tagline resmi bahasa pemrograman Plastik adalah " Apa yang terjadi jika Anda mengambil injeksi ketergantungan dan memanggangnya menjadi bahasa pemrograman? ". Sepertinya cukup menarik
sumber