Liskov Altung Prensi: Güvenilir Sınıf Hierarchies
Table of Contents
Pratikte, iki sağlam ve adapte edilebilir olan bina sistemleri sürekli meydan okumadır.Bu hedefe doğru rehberlik eden temel ilkeler Liskov Substitution Prensipleri (LSP) 1987 yılında Barbara Liskov tarafından devralınır, LSP, yazılım tasarımı için beş temel ilkedir ve bu konuda kritik bir soru sorar: Bir ebeveyn sınıfından miras alan bir alt sınıf oluşturursanız, herhangi bir ebeveynin örneklerini güvenle değiştirebilirsiniz.
Liskov Altung Prensi Nedir?
Liskov Altung Prensibi, süper sınıfın nesnelerinin, programın doğruliğini etkilemeden alt sınıflarının nesnelerle değiştirilmesi gerektiğini belirtir. Başka bir deyişle, bir işlev veya yöntem bir temel türü ile çalışmak için tasarlanmıştır, aynı zamanda nesne odaklı bir tasarım olmadan elde edilen herhangi bir türle çalışmalıdır. Barbara Liskov bu fikri ilk kez 1987 yılında Object-Oriented Programming Systems, Diller ve Uygulamaları (OOPSLA) Konferansında önemli bir adrese yönlendirdi.
LSP temel olarak davranışsal altlama hakkındadır. Bir alt sınıf, bir alt sınıfın ebeveyni olarak aynı yöntemi imzası olduğu kadar değildir (syntactic uygunluk); alt sınıf da onurlandırmalıdır - o zaman alt sınıf bir ebeveyn yönteminin temel davranışını değiştirirse - örneğin, ebeveynin asla atladığı bir istisna, ebeveynin sözleşmesini ihlal eden bir değer döndürür veya daha katı ön koşullara sahip olmalıdır.
Formal Tanım ve Arka Plan
Barbara Liskov'un orijinal resmi tanımı şöyle:
“Her bir nesne için [Düz:0)[Dönetici: 1[Dönemli) bir nesne varsa ) Bu tür bir T türü, T olarak tanımlandığında, P'nin davranışı, [FLT: 7) yerine getirilir.
Bu tanım, bir alt türün (S), süper tipi (T) herhangi bir programda (P) herhangi bir programda (P) yazılması gerektiğini vurgulamaktadır.Programın gözlemlenebilir davranışın korunması gerekir.Bu konsept, yalnızca ön koşullara ve ön koşullara dayanan tasarımla yakından ilişkili; her yöntemin doğruyu alt koşullara sahip olması gerekir.
Daha fazla okuma için, orijinal [[Döntgen:0)Liskov ve Kanat Kağıt[Dönetici] kavramı resmi olarak ifade eden (İngilizce) olarak, [[Üye Tarihi: 2)Wikipedia LSP[DDÜye Tarihi: 3 )
LSP neden önemli?
LSP'ye yönelik olarak, nesne odaklı sistemlere birkaç kritik fayda getiriyor:
- [FONT:0)Reliability and correctness:[Dön tip kullanan kod, alt sınıfın temel türe göre davranacağına güvenebilir. Bu, alt sınıf beklenmedik bir davranış olduğunda meydana gelen ince böcekleri önler.
- [FONT=0)Polymorphism: [DÜDÜDÜDÜDÜDÜDÜDÜDÜSÜŞÜN:0)Polymorphism: [DÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜŞÜ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Ü
- [FONT:0)Maintainability ve Extenability:[Dönetici:0) LSP ihlallerinden kaçınıldığında, yeni alt sınıfları eklemeye gerek yok, temel türe bağlı olarak mevcut kodu değiştirmek gerekir. Bu uyumluluk / Kısa Prensiple (OCP) - yazılım varlıkları değiştirme için açık olmalıdır.
- [FONT:0)Testability:[Dönetici sınıfına ait olan birim testleri alt sınıfları doğrulamak için yeniden kullanılabilir.Eğer bir alt sınıf LSP'yi ihlal ederse, bu testler başarısız olur, tutarsızlık erken ortaya çıkarır.
LSP sadece bir akademik konsept değildir; örneğin, ödeme işleme sisteminde, temel sınıfın tahmin edemeyeceği bir taban var ise ödeme işlemine doğrudan pratik sonuçlar verirsiniz.0) Yöntem, tüm alt sınıfları (örneğin,FLT:3).
Liskov Altlement Prensibinin Ortak İhtisası
LSP ihlallerini tanımak, onları düzeltmeye yönelik ilk adımdır. İşte ilkeyi kıran bazı tipik modeller:
Ön Koşulluluğu güçlendirmek
Bir temel sınıf yöntemi tam bir parametre bekliyorsa, alt sınıfta bir koşul ekleyerek, tamsanın pozitif olması gerekir (o zaman temel sınıf herhangi bir tamsayı kabul eder) ön koşulu güçlendirecektir.
// Base class
class UserService {
public void assignRole(int userId) { ... }
}
// Subclass violation
class AdminService extends UserService {
@Override
public void assignRole(int userId) {
if (userId <= 0) throw new IllegalArgumentException("Invalid ID");
...
}
}
Posta koşullarını azaltıyoruz
Eğer temel sınıf belirli bir geri dönüş değerini veya yan etkisini garanti ederse, garantinin LSP'yi ihlal ettiğini azaltır. Örneğin, bir temel sınıf yöntemi her zaman bir non-null dizesini geri döndürür; bazı durumlarda döndürür.TELFLT:5).
Yeni Dışları Atmak
Alt sınıflar, temel sınıfın atamayacağı istisnaları atmamalı (bu istisnalar zaten izin verilen istisnalar alt sınıflardır). Eğer taban sınıfın müşterileri sadece 16.Ş. ve alt sınıf atlar aİLFLT:7) beklenmedik bir çökecektir.
Inherited Olmalı veya Aşırılaştırma Yöntemleri Yeniden Hareket Etmeli
Bir alt sınıf aşırılık, hiçbir şey yapmamak için bir yöntem veya aritFLT:8 at atmak için bir yöntemse, bu açık bir ihlaldir. alt sınıf amaçlanan temel sınıf olarak hareket etmiyor.
Klasik Örnek: Durt bok, Square ve Alan Tuzağı
LSP ihlalinin en çok alıntı örneği geometrik şekiller içerir. Birçok ders kitabı, doğruyu uygulamak için başlangıçtır:) ve [[DÜT:11|||||||BİLMİNCİHAYORUMLAR) yöntemleri ve sonra, alt sınıfları genişleterek, bu sorunu üst düzeye çıkarmak için kullanır:
// Base class
class Rectangle {
protected int width, height;
public void setWidth(int w) { width = w; }
public void setHeight(int h) { height = h; }
public int getArea() { return width * height; }
}
// Subclass violation
class Square extends Rectangle {
@Override
public void setWidth(int w) {
width = height = w;
}
@Override
public void setHeight(int h) {
width = height = h;
}
}
Şimdi bir işlevi düşünün aritFLT:14 ile çalışır:
void resize(Rectangle r) {
r.setWidth(5);
r.setHeight(10);
assert r.getArea() == 50; // Expect 50
}
Bir de olsa, kare genişliği = 10,4, alan = 100. paragrafın uzunluğu 5'e kadar uzatılır.
[FONT:0] Tamamlanan: [DÜDÜŞÜ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ÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜN
Gerçek Dünya Örneği: Ödeme Gateway Entegrasyonları
Bir temel sınıf ile e-ticaret sistemi düşünün:)
abstract class PaymentGateway {
public abstract void charge(double amount);
public void refund(double amount) { /* default implementation */ }
}
Alt sınıflar, PayPal'ın API'si için bir geri ödeme yapılmasını talep ediyor, ancak bir miktar talep edebilir.Şimdi bir hesapta bulunan herhangi bir kod var.Afrin|langıçta # 5,00 $ 'a kadar.
[FONT:0) Nasıl düzeltilecek: [Dönder: [Dönder: 0] Ya (a) temel sınıfın sözleşmesini içeren bir arayüz içerir (örneğin, bu destek geri ödemelerini yerine getirir.Müşteri o zaman bir başarı boolean veya kontrol edilen bir istisnai ilan eder veya (b) geri ödeme yapan arsaya bu kadar LSP'ye saygı gösterir. Örneğin, bir arayüz sunar.
Uygulamada Liskov Altlement Prensliği Nasıl Takip Edilir
LSP'yi uygulamak tasarım ve test disiplini gerektirir. İşte eylem edilebilir kılavuzlar:
- [[Dönetici:0) Sözleşme tarafından Tasarlanmış:[Dönemli:[Dönemli:0) Java için Sözleşmeler gibi her yöntemin ne beklendiğini ve garanti ettiğini belgeleyin.
- [[DÜDÜ:0)Favor Interfaces over Abstract classes:) Interfaces, uygulama ayrıntıları olmadan bir sözleşme tanımlar. LSP ile doğal olarak uyumludur, çünkü herhangi bir uygulama sınıfı tüm arayüzleri yerine getirmelidir.
- [FONT:0) Kompozisyonu Inheritance:[DÜT:1) Bir alt sınıf, temel sözleşmeyi bozma noktasına kadar aşırı davranışı aşırılamalı, örneğin, örneğin, [[DÜye Olmayanlar İçindekiler İçindekiler İçin Daha İyidir.
- [FONT:0) Substitutability için Test:) Test, aynı senaryoları her iki temele ve türe karşı yürütür.Eğer bir test, baz türü ile geçer ancak elde edilen bir LSP ihlali ile başarısız olur.
- [FONT=0) Covariant Return Type için kontrol edin:[Dönetici: 0 ) Bazı diller, ortak geri dönüş türlerine izin verir (örneğin, alt sınıf bir yöntem, temelden daha spesifik bir tür geri dönebilir).Bu, geri dönüş nesnesini değiştirmek için uzun zamandır iyi.
- [0]Bir alt sınıfta beton yöntemlerinden yoksundur:[Dönetici: 1 ) Alt sınıfta bir beton yöntemi aşırılamak zorunda hissediyorsanız, miras doğru araç olup olmadığını sorun. Belki de temel sınıf çok betondu.
LSP ve Diğer SOLID İlkeleri
LSP, diğer SOLID ilkeleri ile derinden bağlantılıdır, özellikle Açık / Kısa Prensip (OCP) ve Bağımlılık Prensipleri (DIP):
- [FONT:0]LSP ve OCP:[Dönetici:[Dönetici:0)LSP ve OCP:[Döneticiler) LSP olmadan, yeni bir alt sınıf eklemek için müşteri kodunu değiştirmek zorunda kalacak, OCP'yi devre dışı bırakmalı.
- DIP:0)LSP ve DIP:[DÜDÜT:1) DIP, soyutlığa bağlı olarak tavsiyelerde bulunur, konkresyonlar değildir. LSP burada önemlidir, çünkü soyutlama (yüzlü veya temel sınıf) LSP'yi ihlal ederse, soyutlama artık güvenilir bir bağımlılık değildir ve sistem kırılgan hale gelir.
- [FONT:0]LSP ve Interface Segregation (ISP): [Dönetici: 0,0) ISS küçük, odaklanmış arayüzleri teşvik eder. Bu doğal olarak LSP'yi destekler, çünkü küçük bir arayüz, aşırı büyüklükte bir arayüz uygulayan bir sınıf, tüm parçaları yerine getirmek için mücadele edebilir, fırlatma gibi ihlallere yol açabilir.
SOLID ilkelerinin kapsamlı bir bakışı için, İZFLT:0)Wikipedia'nın SOLID makalesi[DÜ:1).
Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç
Liskov Altung Prensibi teorik bir güzellikten çok daha fazlasıdır; sınıf hiyerarşileri inşa etmek için pratik bir araç, mirasın üzerinde kompozisyonu açıkça tanımlanmış sözleşmeler ve sağlam testlerin yapılmasını sağlamak için güvenli ve kolay bir şekilde teşvik eder.
Unutmayın, LSP ihlalleri genellikle bu kırmızı bayrakların dikkatli olarak görünür ve yukarıda tartışılan kurallarla ilgili olarak, zamanın testine karşı duran bir yöntem veya daha güvenilir ve esnek bir yazılım için, daha fazla çalışma için, Robert C. Martin'in Yazılım Geliştirmesini dikkate alarak: Maddeler, Desenler ve Uygulamalar[değiştir | kaynağı değiştir]
Bu makalede kullanılan dış referanslar:
- [FONT:0) “Bir Davranışçının Ölçeği” – Liskov ve Kanat (1994)).
- [FONT=0)Wikipedia: Liskov Altung Prensibi).
- [0]Wikipedia: SOLID İlkeleri).
- [0]Wikipedia: Sözleşme tarafından Tasarım).