Evet, gerçekten var. Sırala.
Newspeak'in statik durumu ve global durumu yoktur. Bu, bir bağımlılığa erişmenin tek olası yolunun açıkça enjekte edilmek olduğu anlamına gelir. Açıkçası, bu, dilin veya Newspeak durumunda daha kesin olarak, IDE'nin bağımlılık enjeksiyonunu kolaylaştırması gerektiği anlamına gelir , aksi takdirde dil kullanılamaz olacaktır.
Dolayısıyla, dil DI için tasarlanmamıştır, bunun yerine DI'nin gerekliliği dil tasarımının bir sonucudur.
Eğer statik bir durum ve küresel bir durum yoksa, o zaman etere sadece “uzanıp” erişemez ve bir şey çıkaramazsınız. Örneğin, Java'da paket yapısı statik durumdur. Söyleyebilirim java.lang.String
ve kendime bir String
sınıf verdim . Newspeak'te bu mümkün değil. Çalıştığınız her şey, size açıkça verilmek zorundadır, aksi taktirde alamazsınız. Yani, her şey bir bağımlılık ve her bağımlılık açıktır.
Bir dize ister misin? İlk önce stdlib
nesneden sana String
sınıfı vermesini istemek zorundasın . Oh, ama nasıl erişirsiniz stdlib
? İlk önce nesneyi platform
size vermesini istemeniz gerekir stdlib
. Oh, ama nasıl erişirsiniz platform
? Öncelikle, platform
nesneyi sana vermesini başka birinden istemelisin . Oh, peki ya dayanan birine nasıl erişirsiniz? İlk önce, başka bir kişiden size nesneyi size vermesini istemek zorundasınız.
Tavşan deliğinden ne kadar ileri gidiyor? Özyineleme nerede durur? Bunca yolu aslında. Durmuyor. O zaman Newspeak'te nasıl bir program yazabilirsiniz? Kesinlikle, kesinlikle konuşamazsın!
Hepsini birbirine bağlayan bazı dış varlıklara ihtiyacınız var. Newspeak'te bu varlık IDE'dir. IDE tüm programı görür. Ayrı parçaları birbirine bağlayabilir. Newspeak'teki standart model, uygulamanızın merkezi sınıfının adında bir erişimciye sahip olmasıdır platform
ve Newspeak IDE, programlamanın temel gerekliliklerinden bazılarını döndüren yöntemleri olan o erişimciye bir nesne enjekte eder: bir String
sınıf, bir Number
sınıf, bir Array
sınıf, ve bunun gibi.
Uygulamanızı test etmek istiyorsanız platform
, File
yöntemi kukla yöntemlerle bir sınıf döndüren bir nesneyi enjekte edebilirsiniz . Uygulamanızı buluta dağıtmak istiyorsanız, File
sınıfı gerçekten Amazon S3 tarafından desteklenen bir platform enjekte ediyorsunuz . Platformlar arası GUI'ler, farklı işletim sistemleri için farklı GUI çerçeveleri enjekte ederek çalışır. Newspeak bile, farklı bir GUI uygulamasını yerel masaüstünden tarayıcıya hiçbir değişiklik yapmadan, sadece farklı GUI öğelerini enjekte ederek değiştirmenize olanak tanıyan deneysel bir Newspeak'ten ECMAScript derleyicisine ve HTML destekli GUI çerçevesine sahiptir.
Uygulamanızı dağıtmak istiyorsanız, IDE, uygulamayı diskteki bir nesneye serileştirebilir. (Atalarından farklı olarak, Smalltalk, Newspeak görüntü dışı bir nesne seri hale getirme formatına sahiptir. Tüm görüntüyü yanınızda götürmeniz gerekmez, tam olarak tüm bağımlılıklar enjekte edilir: IDE uygulamanızın sistemin hangi bölümlerini tam olarak bildiğini bilir . kullanır ve bunu yapmaz. Bu nedenle uygulamanızı oluşturan nesne alanının bağlı alt metnini seri hale getirir, başka bir şey yapmaz.)
Bunların hepsi sadece nesne yönelimini en uç noktaya taşıyarak işe yarar: her şey sanal yöntem çağrısıdır (Newspeak'in soyundan gelen Smalltalk terminolojisinde "mesaj gönder"). Süper sınıf araması bile sanal bir yöntem çağrısıdır! Gibi bir şey al
class Foo extends Bar // using Java syntax for familiarity
veya, Newspeak’te:
class Foo = Bar () () : ()
Java'da bu Foo
, statik global ad alanında bir ad oluşturacak ve statik global ad alanına bakacak Bar
ve Bar
Foo
üst sınıf yapacaktır . Çok daha dinamik olan Ruby'de bile, bu hala global isim alanında statik bir sabit yaratacaktır.
Newspeak'te eşdeğer bildirim şu anlama gelir: adında bir getter metodu oluşturun Foo
ve bu metodu çağırarak üst sınıfına bakacak bir sınıfı geri getirin Bar
. Not: Bu, üst sınıf bildirimi olarak herhangi bir çalıştırılabilir Ruby kodu koyabileceğiniz Ruby'ye benzemez , ancak kod yalnızca sınıf oluşturulduğunda ve bu kodun dönüş değeri sabit üst sınıf olduğunda yalnızca bir kez çalıştırılır . Hayır. Her bir yöntem araması Bar
için yöntem çağrılır !
Bunun bazı derin etkileri vardır:
- bir karışım temelde henüz üst sınıfını bilmeyen bir sınıf olduğu için ve Newspeak'te, üst sınıf dinamik bir sanal yöntem çağrısıdır ve bu nedenle bilinmeyen her sınıf otomatik olarak bir karışımdır. Bedava miks olsun.
bir iç sınıf sadece bir sınıf döndüren bir yöntem çağrısı olduğundan, bu yöntemi dış sınıfın bir alt sınıfında geçersiz kılabilirsiniz, böylece her sınıf sanaldır. Ücretsiz sanal sınıflar alıyorsunuz:
class Outer {
class Inner { /* … */ }
}
class Sub extends Outer {
override class Inner { /* … */ }
}
Newspeak:
class Outer = () (
class Inner = () () : ()
) : ()
class Sub = Outer () (
class Inner = () () : ()
) : ()
süper sınıf sadece bir sınıf döndüren bir yöntem çağrısı olduğundan, bu yöntemi dış sınıfın bir alt sınıfında geçersiz kılabilirsiniz, süper sınıfta tanımlanan iç sınıfların alt sınıfta farklı bir üst sınıfları olabilir. Sınıf hiyerarşi mirasını ücretsiz alırsınız:
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 = () () : ()
) : ()
ve son olarak, bu tartışma için en önemlisi: çünkü (sınıfınızda tanımladığınızların dışında, açıkça) yalnızca sözlü olarak sınıfınızdaki sınıf (lar) ın ve üst sınıfın en üst sınıfındaki sınıfınızdaki yöntemleri çağırabilirsiniz. herhangi yöntemleri arayamam hiç açıkça enjekte edilenler dışında: üst sınıf bildirimi bir nedeni, bir üst düzey sınıf olan yöntemler de diyebiliriz kapatıcı bir sınıfı yok ve varsayılan dışında bir üst sınıfı olamaz yöntem çağrısı ve açıkçası (üst sınıf gidemez olduğunusüper sınıf) ve aynı zamanda sözcüksel sınıfa giremez, çünkü hiçbiri yoktur. Bunun anlamı, üst sınıf sınıfların tamamen kapsüllenmesi, yalnızca açıkça enjekte edildikleri şeye erişebilmeleri ve yalnızca açıkça istediklerini enjekte edilmeleridir. Başka bir deyişle: üst seviye sınıflar modüllerdir. Tüm modül sistemine ücretsiz sahip olursunuz. Aslında, daha kesin olmak gerekirse: üst düzey sınıflar modül bildirimleridir, örnekleri modüllerdir. Böylece, parametrik modül bildirimleri ve birinci sınıf modülleri ücretsiz olan bir modül sistemi elde edersiniz, çok, hatta çok karmaşık olan modül sistemlerinin yapamayacağı bir şey.
Tüm bu enjeksiyonu acısız hale getirmek için, sınıf beyanları alışılmadık bir yapıya sahiptir: bunlar iki beyandan oluşur. Biri sınıf yapıcı olduğunu değil oluşturur yapıcı örneklerini çevreyi sınıf vücut çalışır inşa sınıfın değil, yapıcı. Java benzeri bir sözdiziminde şuna benzer bir şey görünür:
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 () () : ()
) : ()
Bir Newspeak programcısının sınıf (ları) gerçekten görmesinin yolunun şöyle olduğuna dikkat edin :
Yine de adalet yapmaya başlayamam bile. Kendinle oynamak zorunda kalacaksın. Gilad Bracha, modülerlik dahil olmak üzere sistemin çeşitli yönleri hakkında birkaç konuşma yaptı . İlk saatini modülerlik hikayesi de dahil olmak üzere dilin kapsamlı bir tanıtımı olan gerçekten uzun (2 saat) bir konuşma yaptı . Newspeak Programming Platform'un 2. Bölümü modülerliği kapsamaktadır. Eğer Squeak'te Newspeak'i gözden kaçırırsanız - Çapraşıklar için bir Rehber (aka Newspeak-101) , sistem için bir fikir edinirsiniz. Örnek ile Newspeak canlı bir dökümandır (yani ECMASCript'in Newspeak-on-Port'unda çalışıyor, her kod satırı düzenlenebilir, her sonuç denetlenebilir) temel sözdizimini gösteren.
Ama gerçekten, onunla oynamak zorundasın. Sadece bir çok farklı o deneyimli olması gerekir, açıklaması zor olduğunu tüm ana akımdan ve hatta en olmayan ana akım dilleri.