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 memiliki String
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 Anda String
kelas. Oh, tetapi bagaimana Anda mendapatkan akses ke stdlib
? Nah, Anda harus terlebih dahulu meminta platform
untuk menyerahkan stdlib
benda itu kepada Anda . Oh, tetapi bagaimana Anda mendapatkan akses ke platform
? Nah, Anda harus terlebih dahulu meminta orang lain untuk menyerahkan platform
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 yang File
metodenya mengembalikan kelas dengan metode dummy. Jika Anda ingin menyebarkan aplikasi Anda ke cloud, Anda menyuntikkan platform yang File
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
class Foo extends Bar // using Java syntax for familiarity
atau, dalam Newspeak:
class Foo = Bar () () : ()
Di Jawa, ini akan membuat nama Foo
di namespace global statis, dan mencari Bar
di namespace global statis dan membuat Bar
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 bernama Bar
. 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. Metode Bar
ini dipanggil untuk setiap pencarian metode tunggal !
Ini memiliki beberapa implikasi mendalam:
- karena mixin pada dasarnya adalah kelas yang belum mengetahui superclass-nya, dan di Newspeak, superclass adalah panggilan metode virtual yang dinamis, dan karenanya tidak diketahui, setiap kelas secara otomatis juga merupakan mixin. Anda mendapatkan mixin gratis.
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:
class Outer {
class Inner { /* … */ }
}
class Sub extends Outer {
override class Inner { /* … */ }
}
Newspeak:
class Outer = () (
class Inner = () () : ()
) : ()
class Sub = Outer () (
class Inner = () () : ()
) : ()
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:
class Outer {
class MyCoolArray extends Array { /* … */ }
}
class Sub extends Outer {
override class Array { /* … */ }
// Now, for instances of `Sub`, `MyCoolArray` has a different superclass
// than for instances of `Outer`!!!
}
Newspeak:
class Outer = () (
class MyCoolArray = Array () () : ()
) : ()
class Sub = Outer () (
class Array = () () : ()
) : ()
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:
class Foo(platform) extends Bar {
Array = platform.collections.Array
String = platform.lang.String
File = platform.io.File
| // separator between class constructor and class body
class MyArray extends Array { /* … */ }
// Array refers to the method defined above which in turn gets it from the
// platform object that was passed into the class "somehow"
}
Newspeak:
class Foo using: platform = Bar (
Array = platform collections Array
String = platform streams String
File = platform files ExternalReadWriteStream
) (
class MyArray = Array () () : ()
) : ()
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.