Ön koşulların güçlendirilmesi ve son koşulların zayıflaması Liskov ikame ilkesini nasıl ihlal eder?


19

Liskov'un ikame ilkesinin aşağıdaki durumlarda ihlal edildiğini okudum :

  1. Ön koşullar güçlendirildi veya

  2. Son koşullar zayıfladı

Ancak bu iki noktanın Liskov oyuncu değiştirme ilkesini nasıl ihlal edeceğini henüz tam olarak anlayamıyorum. Birisi lütfen bir örnekle açıklayabilir mi? Özellikle, yukarıdaki koşullardan herhangi biri, bir alt sınıf nesnesinin bir üst sınıf nesne için değiştirilemediği bir duruma nasıl neden olur?

Yanıtlar:


29
  1. Baseclass'ınızın bir üye int ile çalıştığını varsayın. Şimdi alt tipiniz bu int'in pozitif olmasını gerektirir. Bu güçlendirilmiş ön koşullar ve şimdi negatif ints ile mükemmel bir şekilde iyi çalışan herhangi bir kod kırıldı.

  2. Benzer şekilde, aynı senaryoyu varsayalım, ancak temel sınıf, üyenin çağrıldıktan sonra olumlu olacağını garanti etmek için kullanılır. Daha sonra alt tür, negatif ints'e izin vermek için davranışı değiştirir. Nesne üzerinde çalışan (ve post-condition'un pozitif bir int olduğunu varsayan) kod artık post-koşul yükseltilmediğinden bozuldu.

Bunlar elbette önemsiz örneklerdir, ancak kavram geçerlidir. Bir dosya / veritabanı bağlantısını açık bırakmak gibi şeyler, sorunlara yol açan kolaylaştırılmış bir post-koşul örneğidir.


1

resim açıklamasını buraya girin

Invariant - Tüm alt türlerde değişmeden kalan SelfDrivingVehicle şablonu, yani hedefe ulaşmak için geçersiz kılınan davranışları yürüttüğü sıra.

Burada bir yöntem daha alalım

           -List<SelfDrivingVehicle> vehicles 
           +Add(SelfDrivingVehicle vehicle)
            vehicles.add(vehicle)

Önkoşul - SelfDriveAraç Tipinin içinde araç yoktur (burada bağlam Ekle'dir) ve Zayıf Ön Koşulunda, özellik araçlarını değiştirerek ve Açıkça Güçlendirerek alt türlerinden herhangi biri tarafından değiştirilemez. Alt türlerden herhangi biri yalnızca Ekle'yi çağırabilir.

Postcondition - Add çağrıldıktan sonra Base Type Güçlendirilmiş Postcondition içinde olan ve alt türler tarafından araçların değeri değiştirilerek zayıflatılamayacak durumda.

Taban Türü Durumu, Davranış Ekle çağrıldıktan sonra Orijinal Durumuna geri döner.


-1

Bu örnek neredeyse tamamen dövüldü, ancak Kare / Dikdörtgen veya Daire / Elips olasılığını düşünün. Uzunluğu ve genişliği olan bir nesneyi tanımlayan bir temel sınıf Dikdörtgeni olduğunu varsayalım. Rectangle sınıfını devralan bir Square sınıfınız varsa, setter / getter öğesinde uzunluk veya genişlikte yapılan herhangi bir değişikliğin karşılıklarını değiştirmesini gerektiren bir kuralı olur. Bu boyutsal gereksinimler ön koşulları güçlendirir, çünkü bir kare için ikame edilmiş bir dikdörtgenin bu boyutsal gereklilikleri eksik olması gerekir. Bir Dikdörtgenin bir Kareyi miras alacak şekilde mirasını tersine çevirdiğinizi varsayalım, Dikdörtgenin bağımsız davranmasını sağlamak için boyut gereksinimlerini gevşeterek post koşullarını zayıflatacaksınız.

Bununla birlikte, boyutsal değişiklik yeteneğini kaldıracaksanız, ikame ilkesi, bir Dikdörtgen veya Kare boyutlarını değiştiremezse, kalıtımdan bağımsız olarak eşit ön ve son koşullara sahip oldukları için geçerlidir. Her ikisinin de uzunluğu vardır, her ikisinin de genişliği vardır ve ikisi de bu değerleri değiştiremez.

ref: Wikipedia - http://en.wikipedia.org/wiki/Liskov_substitution_principle


1
Ne yazık ki bu örneğin resmi doğrulama ile ilgisi yoktur. Sözleşme yok.
Frank Hileman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.