Davranışsal alt tipleme - Behavioral subtyping

In nesne yönelimli programlama , davranışsal alt tiplemesi , saygılarımla sözdizimsel güvenliği olarak değil, sadece (örneğin yokluğu olarak hataları "yöntemi-bulunamadı") değil, aynı zamanda alt sınıflar üst sınıf Çeşidi referanslar yoluyla alt sınıf nesneleri erişen istemcilerin beklentilerini karşılamak esastır davranışsal doğrulukla ilgili olarak. Spesifik olarak, istemcilerin bir nesnenin varsayılan türünün belirtimini kullanarak kanıtlayabilecekleri özellikler, nesne aslında bu türden bir alt türünün üyesi olsa bile tutmalıdır.

Örneğin, her ikisi de bir öğe eklemek için bir put yöntemi ve birini kaldırmak için bir get yöntemi içeren bir Yığın türü ve bir tür Kuyruğu düşünün . Bu türlerle ilişkili belgelerin, Stack'in yöntemlerinin yığınlar için beklendiği gibi davranacağını (yani LIFO davranışını sergileyeceğini ) ve bu tür Queue yöntemlerinin kuyruklar için beklendiği gibi davranacağını (yani FIFO davranışı sergileyeceklerini) belirttiğini varsayalım . Şimdi, Stack türünün Queue türünün bir alt sınıfı olarak bildirildiğini varsayalım. Çoğu programlama dili derleyicisi dokümantasyonu yok sayar ve yalnızca tür güvenliğini korumak için gerekli kontrolleri gerçekleştirir . Queue türünün her bir yöntemi için Stack türü, eşleşen bir ada ve imzaya sahip bir yöntem sağladığından, bu denetim başarılı olacaktır. Bununla birlikte, bir Yığın nesnesine bir Kuyruk türü referansı aracılığıyla erişen istemciler, Kuyruğun belgelerine bağlı olarak FIFO davranışını bekler, ancak LIFO davranışını gözlemler, bu müşterilerin doğruluk kanıtlarını geçersiz kılar ve potansiyel olarak programın bir bütün olarak yanlış davranışına yol açar.

Yığın türü, Queue türünün davranışsal bir alt türü olmadığından, bu örnek davranışsal alt türlemeyi ihlal eder: Yığın türünün (yani LIFO davranışı) belgelerinde açıklanan davranışın, Queue türünün (FIFO davranışı gerektiren) belgelerine uyması durumu değildir. .

Buna karşılık, Yığın ve Kuyruk hem bir tür alt sınıfları olan şartname için Çanta, bir program nerede olsun o kaldırır o sadece olan bazı , eleman davranışsal alttiplendirmesinde tatmin yapar ve onlar nesneleri tahmin edilen türlerine göre doğruluğu hakkında güvenle nedenle istemcilerin verir etkileşimde olmak. Gerçekte, Yığın veya Sıra spesifikasyonunu karşılayan herhangi bir nesne, Torba spesifikasyonunu da karşılar.

S tipinin T tipinin davranışsal bir alt tipi olup olmadığının sadece T tipinin spesifikasyonuna (yani dokümantasyonuna ) bağlı olduğunu vurgulamak önemlidir ; Uygulama herhangi varsa tipi T, bu soruya tamamen alakasız. Aslında, tip T'nin bir gerçeklenimine sahip olmasına gerek bile yoktur; tamamen soyut bir sınıf olabilir. Bir başka durum olarak, yukarıdaki Yığın tipi, Torba tipinin uygulaması FIFO davranışı sergilemesine rağmen, Torba tipinin davranışsal bir alt tipidir : Önemli olan, Torba tipinin spesifikasyonunun get yöntemi ile hangi elemanın kaldırıldığını belirtmemesidir . Bu aynı zamanda, davranışsal alt tiplemenin sadece ilgili her tip için belirli bir (davranışsal) spesifikasyona göre tartışılabileceği ve ilgili tiplerin iyi tanımlanmış davranış spesifikasyonlarına sahip olmaması durumunda davranışsal alt tiplemenin anlamlı bir şekilde tartışılamayacağı anlamına gelir.

Davranışsal alt tiplemeyi doğrulama

S spesifikasyonunun izin verdiği her davranışa T spesifikasyonu tarafından da izin veriliyorsa, S tipi, T tipinin davranışsal bir alt tipidir. Bu, özellikle, T'nin her bir M metodu için, S'deki M spesifikasyonunun T'deki olandan daha güçlü

Bir ön koşul P s ve bir son koşul Q s tarafından verilen bir yöntem özelliği, bir ön koşul P t ve bir son koşul tarafından verilen olandan daha güçlüdür Q t (resmi olarak: (P s , Q s ) ⇒ (P t , Q t )) eğer P s olan zayıf P den t (yani P t P eder ler ) ve Q s Q, daha güçlü olan t (yani s s s ima t ). Yani, bir yöntem spesifikasyonunun güçlendirilmesi, son koşulu güçlendirerek ve ön koşulu zayıflatarak yapılabilir . Aslında, bir yöntem belirtimi, halihazırda desteklenen girdiler için çıktılara daha özel kısıtlamalar getirirse veya desteklenmesi için daha fazla girdi gerektiriyorsa daha güçlüdür.

Örneğin, bir x bağımsız değişkeninin mutlak değerini hesaplayan, 0 ≤ x ön koşulunu ve 0 ≤ son koşulunu belirten bir yöntemin (çok zayıf) belirtimini düşünün . Bu belirtim, yöntemin x için negatif değerleri desteklemesi gerekmediğini ve yalnızca sonucun negatif olmadığından emin olması gerektiğini söylüyor . Bu belirtimi güçlendirmenin iki olası yolu, sonucu = | x | belirtmek için son koşulu güçlendirmektir, yani sonuç x'in mutlak değerine eşittir veya ön koşulu "true" olarak zayıflatarak, yani x için tüm değerler desteklenmelidir . Tabii ki, biz de devletler sonuç mutlak değerine eşit gerektiğini bir şartname içine, hem birleştirebilirsiniz x herhangi değeri için, x .

Ancak, son koşulu (Q s ⇏ Q t ) güçlendirmeden bir spesifikasyonu ((P s , Q s ) ⇒ (P t , Q t )) güçlendirmenin mümkün olduğunu unutmayın . 0 ≤ x ön koşulunu ve son koşul sonucunu = x belirten mutlak değer yöntemi için bir belirtim düşünün. Ön koşul "true" ve son koşul sonucu belirten belirtim = | x | son koşullu sonuç = | x | olmasına rağmen bu belirtimi güçlendirir son koşul sonucunu güçlendirmez (veya zayıflatmaz) = x. Önkoşul P bir teknik özellik gerekli bir koşul ler ve hedefşart S s önkoşul P bir tarifname daha güçlü olduğu , t ve hedefşart Q t p olmasıdır s P daha zayıftır t "Q ve s veya p s " "daha güçlü Q t veya değil P t ". Aslında, "sonuç = | x | veya yanlış", "sonuç = x veya x <0" sonucunu güçlendirir.

"İkame Edilebilirlik"

OOPSLA 1987 programlama dili araştırma konferansında veri soyutlama ve sınıf hiyerarşileri üzerine etkili bir açılış konuşmasında Barbara Liskov şunları söyledi: "Burada istenen, aşağıdaki ikame özelliği gibi bir şeydir: S tipindeki her nesne için bir nesne varsa T olarak tanımlanan tüm P programları için, P'nin davranışı , yerine geçtiğinde değişmez, bu durumda S, T'nin bir alt tipidir. " Bu karakterizasyon o zamandan beri yaygın olarak Liskov İkame İlkesi (LSP) olarak biliniyor . Ne yazık ki, yine de birkaç sorunu var. İlk olarak, orijinal formülasyonunda çok güçlüdür: Bir alt sınıfın davranışının süper sınıfının davranışıyla aynı olmasını nadiren isteriz; Bir üst sınıf nesnesi için bir alt sınıf nesnesinin değiştirilmesi, davranışsal alt tiplemeye uyulsa da programın istenen özelliklerini koruyacak şekilde programın davranışını değiştirmek amacıyla yapılır. İkinci olarak, bahsedilmemektedir özelliklerine yanlış bir okuma davet böylece, uygulama tipi S karşılaştırılır uygulanması T. Bunun birkaç nedeni problemlidir tipi T olduğu, bir varlık ortak davasını desteklemiyor soyuttur ve uygulaması yoktur. Üçüncüsü ve en ince olarak, nesne yönelimli zorunlu programlama bağlamında, belirli bir türdeki nesneler üzerinde evrensel veya varoluşsal olarak nicelleştirmenin veya bir nesneyi diğeriyle ikame etmenin ne anlama geldiğini kesin olarak tanımlamak zordur. Yukarıdaki örnekte, bir Bag nesnesi için bir Stack nesnesini değiştirmiyoruz, sadece Bag nesnesi olarak bir Stack nesnesini kullanıyoruz.

Liskov, 2016 yılında yaptığı bir röportajda, açılış konuşmasında sunduğu şeyin "gayri resmi bir kural" olduğunu, Jeannette Wing'in daha sonra "bunun ne anlama geldiğini tam olarak anlamaya çalıştıklarını" önerdiğini ve bu da davranışsal konular üzerine ortak yayınlarının yapılmasını sağladığını açıkladı. alt tipleme ve aslında "teknik olarak buna davranışsal alt tipleme" denir. Görüşme sırasında, kavramları tartışmak için ikame terminolojisini kullanmaz.

Notlar

Referanslar

  • Parkinson, Matthew J .; Bierman, Gavin M. (Ocak 2008). "Ayırma mantığı, soyutlama ve kalıtım". ACM SIGPLAN Bildirimleri . 43 (1): 75–86. doi : 10.1145 / 1328897.1328451 .