İlk önce paradigma konusunda açık konuşalım.
- Veri Yapıları -> Uygun şekilde bilgili işlevler tarafından değiştirilebilen ve değiştirilebilen bir bellek düzeni.
- Nesneler -> uygulamasını gizleyen ve iletişim kurulabilecek bir arayüz sağlayan kendi kendine yeten bir modül.
Bir alıcı / alıcı nerede yararlıdır?
Veri Yapıları'nda alıcılar / Belirleyiciler yararlı mı? Yok hayır.
Veri Yapısı, bir işlev ailesi tarafından ortak olan ve manipüle edilen bir bellek düzeni belirtimidir.
Genel olarak, herhangi bir eski yeni fonksiyon ortaya çıkabilir ve bir veri yapısını değiştirebilir, eğer diğer fonksiyonların hala anlayabileceği şekilde yaparsa, fonksiyon aileye katılır. Aksi halde, hileli bir işlev ve bir hata kaynağıdır.
Beni yanlış anlamayın, her yerde snitch, turn-coats ve double-agent'larla birlikte veri yapısı üzerinde savaşan birkaç fonksiyon ailesi olabilir. Her birinin oynayacağı kendi veri yapısına sahip olmaları iyi, ama paylaştığında ... siyaset konusunda anlaşamayan birkaç suçlu aileyi hayal edin, çok hızlı bir karmaşa olabilir.
Ortalık genişletilmiş fonksiyon ailelerinin başarabileceği göz önüne alındığında, hileli fonksiyonların her şeyi karışmadığı şekilde veri yapısını kodlamanın bir yolu var mı? Evet, bunlara Nesneler denir.
Alıcılar / ayarlayıcılar Nesnelerde yararlı mı? Yok hayır.
Bir veri yapısını bir nesneye sarmanın amacı, hileli işlevlerin bulunmamasını sağlamaktı. Eğer fonksiyon aileye katılmak isterse, önce iyice incelenmiş ve sonra nesnenin bir parçası olmuş olmalı.
Alıcı ve ayarlayıcının amacı, nesnenin dışındaki işlevlerin doğrudan nesnenin bellek düzenini değiştirmesine izin vermektir. Bu hilelere izin vermek için açık bir kapı gibi geliyor ...
Kenar Çantası
Bir kamu alıcı / belirleyicisinin mantıklı olduğu iki durum vardır.
- Nesne içindeki veri yapısının bir kısmı nesne tarafından yönetilir, ancak nesne tarafından kontrol edilmez.
- Bazı öğelerin uygulama nesnesinin kontrolünde olmaması beklenen bir veri yapısının üst düzey soyutlamasını açıklayan bir arayüz.
Konteynerler ve konteyner arayüzleri bu iki durumun her ikisine de mükemmel örneklerdir. Kap, veri yapılarını (bağlantılı liste, harita, ağaç) dahili olarak yönetir, ancak spesifik eleman üzerinde herkese ve muhtelif ellere kontrol eder. Arayüz bunu soyutlar ve uygulamayı tamamen görmezden gelir ve sadece beklentileri açıklar.
Maalesef birçok uygulama bunu yanlış anlar ve gerçek nesneye doğrudan erişim sağlamak için bu tür nesnelerin arayüzünü tanımlar. Gibi bir şey:
interface Container<T>
{
typedef ...T... TRef; //<somehow make TRef to be a reference or pointer to the memory location of T
TRef item(int index);
}
Bu bozuk. Konteyner'in uygulamalarının, içlerinden birinin kontrolünü, kimlerin kullandığı üzerinde açıkça ele alması gerekir. Bunun iyi olduğu değiştirilebilir bir değer dili görmedim (değişmez değer anlambilimine sahip diller, veri bozulma perspektifinden tanım gereği iyidir, ancak mutlaka veri casusluk bakış açısıyla değil).
Alıcıları / ayarlayıcıyı yalnızca kopya anlambilimini kullanarak veya bir proxy kullanarak geliştirebilir / düzeltebilirsiniz:
interface Proxy<T>
{
operator T(); //<returns a copy
... operator ->(); //<permits a function call to be forwarded to an element
Proxy<T> operator=(T); //< permits the specific element to be replaced/assigned by another T.
}
interface Container<T>
{
Proxy<T> item(int index);
T item(int index); //<When T is a copy of the original value.
void item(int index, T new_value); //<where new_value is used to replace the old value
}
Muhtemelen hileli bir işlev burada hala kargaşa oynayabilir (çoğu şeyin mümkün olması için çaba sarfedilir), ancak kopya-anlambilim ve / veya vekil bir dizi hata olasılığını azaltır.
- taşma
- Yetersizlik
- alt eleman ile etkileşimler tip-kontrol / tip-kontrol edilebilir (tip kaybetme dillerinde bu bir nimet)
- Asıl öğe bellekte yerleşik olabilir veya olmayabilir.
Özel Alıcılar / Belirleyiciler
Bu, doğrudan tür üzerinde çalışan alıcıların ve belirleyicilerin son basamağıdır. Aslında ben bu alıcıları ve ayarlayıcıları bile çağırmam, erişimciler ve manipülatörler demeyi.
Bu bağlamda, bazen veri yapısının belirli bir bölümünü manipüle etmek, her zaman / hemen hemen her zaman / genellikle belirli bir kitap tutmanın gerçekleşmesini gerektirir. Bir ağacın kökünü güncellediğinizde, bir yana bakan önbelleğin temizlenmesi gerektiğini veya dış veri öğesine erişirken bir kilit kazanılması / bırakılması gerektiğini söyleyin. Bu durumlarda, DRY sorumlusunu uygulamak ve bu eylemleri birlikte düzenlemek mantıklıdır.
Özel bağlamda, ailedeki diğer fonksiyonların bu 'alıcı ve ayarlayıcıları' adım adım atması ve veri yapısını değiştirmesi hala mümkün. Bu yüzden onları daha çok erişimciler ve manipülatörler olarak düşünüyorum. Verilere doğrudan erişebilir veya bu bölümü doğru yapmak için başka bir aile üyesine güvenebilirsiniz.
Korumalı Alıcı / Alıcı
Korumalı bir bağlamda, genel bir bağlamdan çok farklı değildir. Yabancı muhtemelen haydut işlevler veri yapısına erişmek istiyor. Yani hayır, eğer varlarsa kamu alıcıları / belirleyicileri gibi çalışırlar.
this->variable = x + 5
veyaUpdateStatistics
ayarlayıcıda bir işlev çağırmak isteyebilirsiniz ve bu durumlardaclassinstancea->variable = 5
sorunlara neden olabilir.