Sanırım bir blog yazısını sızdıran soyutlamalar hakkında faydalı bulabilirsin. İşte ilgili arka plan:
Soyutlama , bir dizi ilgili program parçası arasında ortak olanı almaya, farklılıklarını ortadan kaldırmaya ve programcıların doğrudan bu soyut kavramı temsil eden bir yapı ile çalışmasına yardımcı olan bir mekanizmadır. Bu yeni yapı (hemen hemen) her zaman parametreleştirmeler yapar : yapının kullanımını özel gereksinimlerinize uyacak şekilde özelleştirmek için bir araç.
Örneğin, bir List
sınıf, bağlantılı liste uygulamasının ayrıntılarını uzaklaştırabilir - manipülasyon next
ve previous
işaretçiler açısından düşünmek yerine, bir diziye değer ekleme veya çıkarma düzeyi üzerinde düşünebilirsiniz. Soyutlama, çok daha küçük bir ilkel kavram kümesinden kullanışlı, zengin ve bazen de karmaşık özellikler oluşturmak için gerekli bir araçtır.
Soyutlama, kapsülleme ve modülerlik ile ilgilidir ve bu kavramlar çoğu zaman yanlış anlaşılmaktadır.
Olarak List
, örneğin, kapsülleme , bir bağlantılı liste uygulama ayrıntılarını gizlemek için de kullanılabilir; Bir nesne yönelimli dilde, örneğin, sen yapabilir next
ve previous
yalnızca Liste uygulaması bu alanlara erişimin izin verilecek yerleri, işaretçileri özel.
Kapsülleme soyutlama için yeterli değildir, çünkü zorunlu olarak yapılar hakkında yeni veya farklı bir anlayışa sahip olduğunuz anlamına gelmez. Bir List
sınıfın yaptığı tüm size ' getNext
' / ' setNext
' tarzı erişimci yöntemleri verdiyse, uygulama ayrıntılarından sizden alınacaktır (örneğin, ' prev
' veya ' previous
' alanını adlandırdınız mı? Statik türü neydi?), Ancak Çok düşük bir soyutlama derecesi olurdu.
Modülerlik , bilginin gizlenmesi ile ilgilidir : Bir arayüzde kararlı özellikler belirtilmiştir ve bir modül, tüm uygulama detaylarını modül içinde tutan bir arayüze sahiptir. Modülerlik, programcıların değişimle başa çıkmalarına yardımcı olur, çünkü diğer modüller yalnızca kararlı arayüze bağlıdır.
Bilginin gizlenmesi, kapsülleme ile desteklenir (kodunuz kararsız uygulama detaylarına bağlı değildir), ancak kapsülleme modülerlik için gerekli değildir. Örneğin, bir uygulayabilirsiniz List
'teşhir, C yapısını next
' ve ' prev
dünyaya' işaretçiler, aynı zamanda bir arayüz sağlamak içeren initList()
, addToList()
veremoveFromList()
fonksiyonlar. Arabirimin kurallarına uyulması koşuluyla, veri yapısının her zaman geçerli bir durumda olmasını sağlamak gibi belirli özelliklerin her zaman geçerli olacağının garantisini alabilirsiniz. [Parnas’ın modülerlik üzerine klasik makalesi, örneğin montajda bir örnekle yazılmıştır. Arayüz bir sözleşme ve tasarım hakkında bir iletişim şeklidir, bugün buna güvenmemize rağmen, mekanik olarak kontrol edilmesi gerekmez.]
Her ne kadar soyut, modüler ve kapsüllenmiş gibi terimler pozitif tasarım tanımları olarak kullanılsa da, bu özelliklerden herhangi birinin varlığının otomatik olarak iyi bir tasarım vermediğini fark etmek önemlidir:
Bir n ^ 3 algoritması "güzel bir şekilde kapsüllenmiş" ise, yine de geliştirilmiş bir n log n algoritmasından daha kötü bir performans gösterecektir.
Bir arayüz belirli bir işletim sistemine geçerse, bir video oyununun Windows'tan iPad'e taşınması gerektiğinde modüler tasarımın yararlarından hiçbiri gerçekleştirilmez.
Oluşturulan soyutlama çok fazla gereksiz ayrıntı ortaya çıkarırsa, kendi işlemleriyle yeni bir yapı oluşturmak başarısız olur: Aynı şey için başka bir ad olacaktır.