Zincirleme ne zaman kullanılır?
İşlev zincirleme çoğunlukla otomatik tamamlamalı bir IDE'nin yaygın olduğu diller arasında popülerdir. Örneğin, hemen hemen tüm C # geliştiricileri Visual Studio'yu kullanır. Bu nedenle, C # ile geliştiriyorsanız yöntemlerinize zincirleme ekleme, Visual Studio zinciri oluşturmanıza yardımcı olacağından, bu sınıfın kullanıcıları için zaman tasarrufu sağlayabilir.
Öte yandan, PHP gibi doğada oldukça dinamik olan ve genellikle IDE'lerde otomatik tamamlama desteğine sahip olmayan diller, zincirlemeyi destekleyen daha az sınıf görecektir. Zincirleme sadece zincirlenebilir yöntemleri ortaya çıkarmak için doğru phpDoc'lar kullanıldığında uygun olacaktır.
Zincirleme nedir?
Foo
Aşağıdaki iki adında bir sınıf verildiğinde , her iki yöntem de zincirlenebilir.
function what() { return this; }
function when() { return new Foo(this); }
Birinin geçerli örneğe bir başvuru olması ve yeni bir örnek oluşturması, bunların zincirlenebilir yöntemler olduğunu değiştirmez.
Zincirlenebilir bir yöntemin yalnızca geçerli nesneye başvurması gerektiğine dair altın bir kural yoktur. Etkili, zincirlenebilir yöntemler iki farklı sınıfta olabilir. Örneğin;
class B { function When() { return true; } };
class A { function What() { return new B(); } };
var a = new A();
var x = a.What().When();
this
Yukarıdaki örneğin hiçbirinde referans yoktur . Kod a.What().When()
bir zincirleme örneğidir. İlginç olan, sınıf türünün B
hiçbir zaman bir değişkene atanmamış olmasıdır.
Bir yöntem, dönüş değeri ifadenin sonraki bileşeni olarak kullanıldığında zincirlenir.
İşte biraz daha örnek
// return value never assigned.
myFile.Open("something.txt").Write("stuff").Close();
// two chains used in expression
int x = a.X().Y() * b.X().Y();
// a chain that creates new strings
string name = str.Substring(1,10).Trim().ToUpperCase();
Ne zaman kullanılır this
venew(this)
Çoğu dilde dizeler değişmezdir. Bu nedenle zincirleme yöntemi çağrıları her zaman yeni dizelerin oluşturulmasına neden olur. Nerede StringBuilder gibi bir nesne olarak değiştirilebilir.
Tutarlılık en iyi uygulamadır.
Bir nesnenin durumunu değiştirip geri dönen this
yöntemleriniz varsa, yeni örnekleri döndüren yöntemlerle karıştırmayın. Bunun yerine, Clone()
bunu açıkça yapacak denilen belirli bir yöntem oluşturun .
var x = a.Foo().Boo().Clone().Foo();
İçinde neler olduğu konusunda çok daha net a
.
Dış ve Arka Adım
Buna adım ve geri hile diyorum, çünkü zincirleme ile ilgili birçok ortak sorunu çözüyor. Temel olarak orijinal sınıftan yeni bir geçici sınıfa adım atıp orijinal sınıfa geri dönmeniz anlamına gelir.
Geçici sınıf yalnızca orijinal sınıfa özel özellikler sağlamak için vardır, ancak yalnızca özel koşullar altında bulunur.
Bir zincirin durumu değiştirmek zorunda kaldığı zamanlar vardır , ancak sınıf A
tüm bu olası durumları temsil edemez . Yani bir zincir sırasında geri referans içeren yeni bir sınıf tanıtılır A
. Bu, programcının bir duruma geçmesine ve geri dönmesine izin verir A
.
İşte benim örneğim, özel durum olarak bilinsin B
.
class A {
function Foo() { return this; }
function Boo() { return this; }
function Change() return new B(this); }
}
class B {
var _a;
function (A) { _a = A; }
function What() { return this; }
function When() { return this; }
function End() { return _a; }
}
var a = new A();
a.Foo().Change().What().When().End().Boo();
Şimdi bu çok basit bir örnek. Daha fazla kontrole sahip olmak istiyorsanız , farklı yöntemlere sahip B
yeni bir süper türe geri dönebilirsiniz A
.