Raku'nun tasarımının amacı bu mu?
Raku'nun bu alanda tamamen açılmamış olduğunu söylemek doğru. Sorunuz Raku'nun tasarımında, her ikisinin de küçük bir tartışmaya değer iki temasına değiniyor.
Raku birinci sınıf l değerlerine sahiptir
Raku, l-değerlerini birinci sınıf bir şey olarak bolca kullanır. Yazdığımızda:
has $.x is rw;
Oluşturulan yöntem:
method x() is rw { $!x }
is rw
Burada yöntem dönen olduğunu gösterir l-değeri olduğunu, atanabilecek bir şey -. Böylece yazdığımızda:
$obj.x = 42;
Bu sözdizimsel şeker değildir: gerçekten bir yöntem çağrısıdır ve daha sonra atama operatörü sonucuna uygulanır. Yöntem çağrısı Scalar
özniteliğin kapsayıcısını döndürdüğü için , daha sonra bu öğeye atanabilir. Bu, önemsiz bir sözdizimsel dönüşüm olmadığını görmek için bunu iki adıma bölmek için bağlamayı kullanabilir. Örneğin, bu:
my $target := $obj.x;
$target = 42;
Nesne özniteliğine atanır. Aynı mekanizma, liste ataması da dahil olmak üzere diğer birçok özelliğin arkasındadır. Örneğin, bu:
($x, $y) = "foo", "bar";
Bir oluşturarak çalışır List
kapları içeren $x
ve $y
ve sonra bu durumda atama operatörü atama yapmak için her yan çiftler halinde dolaşır. Bu, rw
orada nesne erişimcilerini kullanabileceğimiz anlamına gelir :
($obj.x, $obj.y) = "foo", "bar";
Ve hepsi doğal olarak çalışıyor. Bu aynı zamanda dizi ve karma dilimlere atamanın arkasındaki mekanizmadır.
Ayrıca Proxy
, okuma ve yazma davranışının kontrolünüz altında olduğu bir l-değeri konteyneri oluşturmak için de kullanılabilir . Böylece, yan eylemleri devreye sokabilirsiniz STORE
. Ancak...
Raku "ayarlayıcılar" üzerinde anlamsal yöntemleri teşvik ediyor
OO'yu tanımladığımızda, "kapsülleme" ve "veri gizleme" gibi terimler sıklıkla ortaya çıkar. Buradaki anahtar fikir, nesnenin içindeki durum modelinin - yani davranışlarını (yöntemleri) uygulamak için ihtiyaç duyduğu verileri temsil etmeyi seçme biçiminin - örneğin yeni gereksinimleri ele almak için gelişmekte özgür olmasıdır. Nesne ne kadar karmaşıksa, o kadar özgürleştirici hale gelir.
Ancak, alıcılar ve ayarlayıcılar, devletle örtülü bir bağlantısı olan yöntemlerdir. Veri gizleme gerçekleştirdiğimizi iddia edebilirsek de, doğrudan bir duruma erişemeyen bir yöntemi çağırdığımızdan, deneyimim, dış kodun bir işlemi gerçekleştirmek için ayarlayıcı çağrıları dizileri yaptığı hızlı bir şekilde sonuçlandığımızdır. özellik bir tür gıpta anti-desen. Yaptığımız Ve eğer o , biz bir operasyon gerçekleştirmek için alıcı ve ayarlayıcı operasyonların bir karışımını yapar nesnenin mantık dışı ile bitireceğiz oldukça kesin. Gerçekten, bu operasyonlar neyin başarıldığını tanımlayan bir isme sahip yöntemler olarak ortaya konmuş olmalıdır. Eğer eşzamanlı bir ortamdaysak bu daha da önemli hale gelir; iyi tasarlanmış bir nesnenin yöntem sınırında korunması genellikle oldukça kolaydır.
Bununla birlikte, birçok kullanımı class
gerçekten kayıt / ürün türleridir: bir grup veri öğesini basitçe gruplamak için vardır. Bu tesadüf değil .
desen sadece ayrıca bir erişimci üretmek değil,:
- Özniteliği varsayılan nesne başlatma mantığı (yani, a
class Point { has $.x; has $.y; }
olarak örneklenebilir Point.new(x => 1, y => 2)
) tarafından ayarlanmayı seçer ve bunu .raku
damping yönteminde de oluşturur.
- Özniteliği varsayılan
.Capture
nesneye seçer , yani onu yok etme işleminde kullanabiliriz (örn. sub translated(Point (:$x, :$y)) { ... }
).
Daha prosedürel veya işlevsel bir tarzda yazıyor ve class
bir kayıt türü tanımlamak için bir araç olarak kullanıyorsanız , istediğiniz şeyler bunlar .
Raku tasarımı, ayarlayıcılarda akıllı şeyler yapmak için optimize edilmemiştir, çünkü bu optimize etmek için kötü bir şey olarak kabul edilir. Bir kayıt türü için gerekenin ötesinde; bazı dillerde, atananların doğrulanmasını istediğimizi iddia edebiliriz, ancak Raku'da bunun için subset
türlere başvurabiliriz . Aynı zamanda, gerçekten bir OO tasarımı yapıyorsak, konum belirleme başarısızlığına neden olan alıcılar / belirleyiciler açısından düşünmek yerine, devlet modelini gizleyen anlamlı davranışlar için bir API istiyoruz. Zaten OO yapmanın en önemli noktası olan veri ve davranış.