Table of Contents

Liskov Altung Prensibini Kullanan Aşırı Sistemler Tasarlamak

Bina eklenebilir sistemler yazılım mühendisliğinde kalıcı bir meydan okumadır. gereksinimlerinin geliştikçe, mevcut kod yeniden yazılmamış mimarileri sistemden ayrı ayrı ayrı ayrı ayrı olarak geliştirme yeteneği sağlar. Liskov Substitution Principles (LSP) uygulama için pratik bir temel sunar ve LSP'nin diğer tasarım ilkelerinin nasıl sağlam, ölçeklenebilir uygulamalarla birlikte çalıştığını gösterir.

Liskov Altung Prensibini Anlayın

Barbara Liskov, adını 1987 yılında bir konferans gazetesinde "Data Abstraction ve Hierarchy" başlıklı bir açıklama yaptı: “Ücretsiz:0) Eğer her bir nesne için o1 tipi S'nin nesnelere ait bir tür T'nin tüm programları için tanımladığı bir nesne varsa, P'nin davranışı o2 için değişmeden, o1'in dışsal nesneyle eşit derecede iyi bir şekilde çalışmaması gerekir.

Prensipler basit yöntem imzalarının ötesine geçer. LSP davranışsal uyumluluk talep eder: alt sınıf sadece nesnenin yaşam boyu sabit kalmamalıdır, bu sınırlamaları temel sınıf hakkında yapar.Bu, ön koşullar (bir yöntem aramadan önce gerçek olmalıdır), ön koşullar (taraflar) ve değişmezler (belkiler boyunca sürekli olarak kalan koşullar)

LSP hakkında düşünmek için somut bir yol, "is-a" ilişkisidir.Eğer bir GÜNCELSE:0) ÂFFT:0, o zaman her işlev bağımsız ve yüksekliğe izin verir; müşteri kodu genişleyen ve yüksekliğe sahip değildir.

LSP'nin dört Temel Koşulları

Davranış alt tipi uyumluluk sağlamak için, LSP alt sınıfların tatmin etmesi gereken dört özel koşul uygular. Bu koşullar, Sözleşme tarafından Tasarım prensibinden elde edilen, sınıf hiyerarşilerini değerlendirmek için bir kontrol listesi sağlar.

Ön koşullar güçlendirilemez

Bir yöntem önceden tutulması gereken bir koşuldur. Eğer temel sınıf yöntemi parametresi [[DÜSÜSÜSÜSÜSÜSÜSÜSÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜ

Posta koşulları zayıflanamaz

Posta koşulları, uygulama sonrası yöntemin garanti altına alınmasının ne olduğunu tanımlar. Eğer temel sınıf yöntemi, taban sınıfından gelenlere kadar en azından güçlü olmasını garanti eder.

Invariants korunması gerekir

Invariants nesnenin yaşam boyu doğru kalan koşullardır. Örneğin, aritFLT:10), her zaman elementlerin sipariş edildiği değişmez. alt sınıf, değişmez (örneğin, bir elementi sıralayarak) bu, programın beklentilerini kırarsa, alt sınıfların her zaman sipariş ettikleri anlamına gelir.

Tarih kısıtlaması

Örneğin, bir baz sınıfı yasakladığı devlet değişikliklerine izin vermemelidir. Örneğin, bir baz sınıfı LSP'yi ihlal eden bir alt sınıf varsa, bir dizicüyü ihlal eden bir alt sınıf LSP'yi ihlal eder.

LSP neden Extencept için kritik

Yeni bir alt sınıf sıfır değişikliklerle eski koda yapıştırılabilir. LSP olmadan, temel sınıf hiyerarşisi kırılgan hale gelir. LSP'nin her alt sınıfı onurlandırılması ve yeni bir alt sınıf sıfır değişikliği ile yapıştırılabilir. Bu, regresyon riskini ve hızlarını azaltır. LSP olmadan, temel sınıf hiyerarşisi kırılgan hale gelir.

Bir sistem olarak ödeme yapar. Bir temel sınıf 03.12.) bir yöntem olarak tanımlar.Ücretsiz: A.D.T: 16) ve [[Döneticileri, yöntemi uygularsa, LSP'yi takip eden bir sözleşmeyi uygular.

LSP ayrıca, dokümantasyon ve ekip iletişimini geliştiren sözleşme ile tasarıma da teşvik eder. Geliştiriciler her alt sınıf uygulamayı okumadan temel sınıf özelliklerine güvenebilirler. Bu özellikle birçok katkıda bulunan büyük kodbases'te değerlidir. Ek olarak, LSP, genel mimariyi değiştirmeden bileşenler takas etmesine veya özel nedenlerle değiştirilmesine izin vererek sistem ölçeklendirmesini destekler.

Common LSP Violations ve Them'dan Nasıl Kaçırılır

LSP ihlallerini tanımak, uygulanabilir sistemler yazmak için gereklidir. Aşağıda, prensipleri kırmak için sık sık desenler vardır, bunları düzeltmek için stratejilerle birlikte.

Rect bok-Square Problemi

Bahsettiği gibi, bir alt üst köşede bir dikdörtgen olarak modellemek LSP'yi ihlal ediyor çünkü meydan okumalar eşit olmak için genişlik ve yüksekliğe sahip değil. Daha iyi bir tasarım, paylaşılan bir şekilde paylaşılan ve karesel bir arayüz uygulayan sınıflar yapmak veya uygun nesneleri geri döndüren bir fabrika yöntemi kullanmak.

Subclass Hedefleri Beklenmeyen Tarafları

Temel sınıf yöntemi herhangi bir istisnai ifade etmezse, kontrol edilen bir istisnayı ihlal eden bir alt sınıf yöntem LSP'yi ihlal eder ve temel sözleşmede kontrol edilmemiş bir istisna atlatabilir.

Yöntem Override Weaker Type döndürür

Java ve C# gibi dillerde, kovariant geri dönüş türleri izin verilir (altınlık bir yöntem daha spesifik bir tür geri dönebilir). Ancak, ters döndürülemez: daha zayıf veya daha az spesifik bir tür sözleşmeyi geri döndürür. Örneğin, taban sınıfı bir dereceye kadar döndürürse, LSP'yi geri döndürür.

Alt sınıf Davranışları

Bazen boş bir vücutla bir yöntem aşırı sınıf, etkili bir şekilde işlevsellik ortadan kaldırırsa, müşteri bu yöntemin bir etkisi olduğu, davranış değişiklikleri. Örneğin, algDT:21) bir mutableİLETİŞİMCİYLEŞİ genişletir ve aşırı sağdan çıkarmaz.Eğer bir kullanıcı, bir arayüz ayrımı veya kompozisyonu kullanarak dikkate alır.

Ön Koşulluluğu güçlendirmek

Doğrulayıcı parametreleri kabul eden aşırı kullanım yöntemlerine göre yaygın olarak görülür.Eğer temel sınıf bir parametre için kabul edilirse, bir alt sınıf için bir istisna atlar bir ön ihlal oluşturur. Dokümantasyona izin verilir ve tüm alt sınıflarda bu ücretin kritik olduğunu korur.

Sahtekarlıklardan kaçınmak için, minimum, odaklanmış davranışlar tanımlayan arayüzlerle başlayın. “is-a” ilişkisi sorgulanabilir. Hem temel hem de alt sınıf davranışını doğrulamak ve sürekli entegrasyon içinde koşmak.

LSP'yi Sistem Tasarımında Uygulama

LSP için tasarım hem mimari hem de uygulamada kasıtlı düşünce gerektirir. İşte gelişim iş akışınıza dahil etmek için pratik kılavuzlar.

PDF Sözleşmeleri Kullanın

Ön koşullar, ön koşullar ve invarianslar belgelerini içeren beklenen davranışları ifade eden temel sınıfları veya arayüzleri tanımlayın.Taraflar ve invariants.In languages that support Design by Contract (like Eiffel), bu sözleşmeli olarak uygulayabilirsiniz.

Inheritance üzerinde kompozisyon tercih et

İki sınıf arasındaki ilişki kesinlikle "is-a" değildir, örneğin LSP ihlali tamamen test etmek daha kolay olan daha esnek sistemler üretmek yerine.

Sözleşme Testleri Yaz

Tüm alt sınıfların geçilmesi gereken temel sınıf için bir test paketi oluşturun. Bu testler, ön koşullar, ön koşullar ve invariants hold. Örneğin, [[ŞampFLT:31 için bir test ekranı, iade değerinin verildiği boyutlar için olumlu olduğunu doğrulamalıdır. Herhangi bir alt sınıf LSP uyumluluğu sağlamak için aynı testleri geçmek zorundadır.Bu teknik, genellikle "substitutive test" olarak bilinen ihlalleri erken yakalar.

Davranışsal Subtyping

İlk önce davranışsal yönü göz önünde bulundurun: “Bu alt sınıfla bir örnek değiştirirsem, müşteriler davranışta herhangi bir fark fark fark eder mi?” Cevabı iptal ederse, mirası yeniden tasarlayın.

Refaksiyonlar Ne Zaman Bululur

Kod incelemeleri veya test başarısızlıklarından sonra, hiyerarşiyi yeniden ele alalım. Ortak bir temel sınıf veya arayüze ortak bir davranış yazın ve ayrı sınıflara özel davranışları itin.Template Method)|proflar belirli adımlara izin verirken tutarlı bir algoritmayı takip edin.

Modern Programlama Dilleri LSP

LSP, tip sistemler, miras modelleri ve istisna işlemlerindeki farklılıklar nedeniyle diller arasında değişir. Aşağıda popüler diller için dikkate alınır.

Java ve C#

Her iki dil de arayüzleri ve soyut sınıfları destekler ve sınıfların tüm koşulları yerine getirmesini sağlar. LSP daha önce bahsedilen LSP ihlalleri (daha önce bahsedilen LSP ihlalleri, Java ve C#. Use theENFLT:32) annotasyon C# to avoid disaster method imzalarından kaçınmak için C#.

Typenot

TypeScript'un yapısal tipleme sistemi LSP'yi daha da kritik hale getiriyor. Tip uyumluluk nominal hiyerarşiden ziyade yapıya dayanıyor, aynı yöntemleri olan bir sınıf ancak farklı davranışlar substitutable sintactically olabilir, ancak davranışsal olarak uygulamamalıdır. Geliştiriciler LSP'yi test ve belgeleme sözleşmeleri ile manuel olarak uygulanmalıdır.

Python Python Python Python

Python dinamik olarak tiplenmiş, bu da LSP ihlallerinin sadece iş zamanında belirgin hale gelmesi anlamına gelir. Kompör çekler olmadan sağlam birim testleri yaz ve gerekli yöntemleri tanımlamak için soyut temel sınıfları (ABC) kullanın. Python’un örtme türü zaten LSP’yi varsayıyor, bu yüzden davranışsal tutarlılık önemlidir.

Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go Go

Go, arayüzleri kapalı olarak kullanır. Bir tür bir satisfies bir arayüz uygularsa, tüm yöntemleri uygular. LSP'de Go, arayüzlerin küçük ve odaklanmış olması gerçeği ile uygulanır. Yine de dikkatli olun: eğer iki tip aynı arayüze sahiptir, ancak sözleşmeyi farklı davranırsa, müşteri kodu başarısız olur.

LSP ve Diğer SOLID İlkeleri

LSP izolasyonda bulunmuyor. Önemli şekillerde diğer dört SOLID ilkeleriyle etkileşime giriyor.

Tek Sorumluluk Prensi (SRP)

SRP, sınıfları odaklanmış tutmalarına yardımcı olur, bu da LSP'yi ihlal etme şansı azaltır. Tek bir sorumlulukla sınıf, yanlışlıkla değişen davranışlar olmadan alt tipte daha kolaydır. Örneğin, veri depolamadan geçerlilik mantığını ayırmak hem temel hem de alt sınıfları daha basit hale getirir.

Açık / Kısa Prensip (OCP)

OCP, sınıfların uzatma için açık olması gerektiğini belirtir, ancak değiştirme için kapalı olmalıdır. LSP, mevcut kodu değiştirmeden davranışı uzatmaya izin vererek OCP'ye izin verir.Eğer LSP ihlal edilirse, müşterileri değiştirmeden yeni alt sınıfları güvenle ekleyemiyorsunuz, böylece OCP'yi kırabilirsiniz.

Interface Segregation Principles (ISP)

ISS yağ arabirimlerini daha küçük, özel olanları kırılacak şekilde teşvik eder. Bu, alt sınıfın sözleşmeleri bozmak için alt sınıfların uygulama yöntemleri uygulama olasılığını azaltır.

Bağlanma Prensipleri (DIP)

DIP, soyutlamaya bağlı olarak tavsiyelerde bulunur, sorgulayıcılara bağlı değildir. arabirimlere bağlı olarak LSP, herhangi bir beton uygulamasının özgürce yerine getirilebileceğini garanti eder. LSP olmadan, soyutlama katmanı güvenemez hale gelir ve geliştiriciler doğrudan uygulamalara bağlı olabilir, violating DIP.

LSP uygunluk testi için test

LSP'nin her zaman basit olmadığını belirtmek gerekir, ancak sistematik test metodolojileri erken ihlalleri yakalamaya yardımcı olabilir. İşte LSP testlerini iş akışınıza dahil etmek için stratejilerdir.

Bir Base Contract Test Sınıfı Oluşturun

Sınıf sözleşmesini uygulayan soyut bir test sınıfı veya test paketi yazın. Her bir ön şart ve ön şart için, bir test yazın. Örneğin, taban sınıfı yöntemi [[149DÜŞÜNÜCÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜ

Use Property-Based Test

HızlıCheck gibi araçlar (Inkell için, aynı zamanda alt sınıf davranışları hakkında bir yöntem arayarak diğer dillerde de kullanılabilir.) rastgele girişler ve Invariants hold.For LSP için, aşağıdaki gibi özellikleri ifade edebilirsiniz: "Herhangi bir geçerli yöntem aramaları için, alt sınıf davranışına bir yöntem aramadan sonra devlet.

Davranışsal Invariant Execution

Bazı diller, Java'da, kelime veya kütüphaneyi C#,ENFLT:41'de veya [[DÜye Olmayanlar ve Ön Koşullarda Kontroller, Erken Geliş sırasında ihlaller.

LSP'nin Action'daki Gerçek Dünya Örnekleri

Birçok standart kütüphane ve çerçeve, LSP'ye doğru düzgün bir şekilde çalışmak için güvenir. Bu örneklerin ilke için takdirini anlama.

Java Koleksiyonları Çerçeve

AMBALAÇLAR: ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

Veritabanı Access Katmans

Veritabanı depolarını uygulama yaparken, temel bir arayüze sahip olan LSP, uygulama mantığını değiştirmiyor.Bu, MySQL, PostgreSQL için geçerli olan ve in-memory depolaması için geçerli olan bir uygulamadır. LSP, alt veritabanını değiştirip uygulama mantığını değiştirmesini sağlar.

Akış İşleme Boruları

Fonksiyonel programlamada, akışlarda dönüşümler (örneğin, filtre, azalt) sözleşmeler tarafından tanımlanır. Herhangi bir işlev, akışın değişmezliğini korumak için saf bir dönüşüm olmalıdır (örneğin, dışsal durumu değiştirme).

Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç

Liskov Altung Prensibi teorik bir konseptten daha fazlasıdır - LSP'ye giriş yapmak için pratik bir araçtır, daha geniş SOLID felsefesi ile uyumlu hale getirilebilir.

LSP'yi etkili bir şekilde uygulamak için, davranışsal sözleşmelere odaklanmak, kapsamlı testler yazmak ve mirastan korkan kompozisyon kullanmak.Dörtüncü koşulları tanımak - ön koşullar, ön koşullar, değişmezler ve tarih kısıtlamaları - her yeni alt sınıf için kontroller yapmak.

Daha fazla okuma için, Barbara Liskov'un orijinal kağıdını ([DÜ:0)Data Abstraction ve Hierarchy) keşfedin, Robert C. Martin'surFLT:2[DÜye Olmayanlar İçin Tıklayınız.