This is a scary term for a very simple concept. It's formally defined as "If S
is a subtype of T, then objects of type T may be replaced with objects of type S
(i.e., objects of type S may substitute objects of type T) without altering any
of the desirable properties of that program (correctness, task performed,
etc.)." That's an even scarier definition.
The best explanation for this is if you have a parent class and a child class,
then the base class and child class can be used interchangeably without getting
incorrect results. This might still be confusing, so let's take a look at the
classic Square-Rectangle example. Mathematically, a square is a rectangle, but
if you model it using the "is-a" relationship via inheritance, you quickly
get into trouble.
### Liskov Yer Değiştirme Prensibi (LSP)
Bu terim bu kadar basit bir konsept için korkutucu. Resmi olarak tanımı şöyle: "Eğer S, T'nin alt türü ise, programın istenilen özelliklerinden herhangi birini değiştirmeden(doğruluğunu, yaptığı işi vb.)
T tipindeki nesneler S tipindeki nesneler ile yer değiştirebilir (yani, S tipindeki nesneler T tipindeki nesnelerin yerine geçebilir). Bu daha da korkutucu bir tanım.
Bunun için en iyi açıklama: eğer bir ebeveyn sınıfınız ve alt sınıfınız varsa, temel sınıf ve alt sınıf, yanlış sonuçlar ortaya koymadan birbirlerinin yerine kullanılabilir. Hala kafa karıştırıcı olabilir,
o zaman hadi klasik Kare-Dikdörtgen örneğine göz atalım. Matematiksel olarak kare bir dikdörtgendir ama eğer bunu kalıtım yoluyla, "is-a" ilişkisi kullanarak modellerseniz başınızın belaya girmesi çok gecikmeyecektir.
**Kötü:**
```javascript
classRectangle{
classDikdortgen{
constructor(){
this.width=0;
this.height=0;
this.genislik=0;
this.yukseklik=0;
}
setColor(color){
renginiBelirle(renk){
// ...
}
render(area){
olustur(alan){
// ...
}
setWidth(width){
this.width=width;
genisligiBelirle(genislik){
this.genislik=genislik;
}
setHeight(height){
this.height=height;
yuksekligiBelirle(yukseklik){
this.yukseklik=yukseklik;
}
getArea(){
returnthis.width*this.height;
alanHesapla(){
returnthis.genislik*this.yukseklik;
}
}
classSquareextendsRectangle{
setWidth(width){
this.width=width;
this.height=width;
classKareextendsDikdortgen{
genisligiBelirle(genislik){
this.genislik=genislik;
this.yukseklik=genislik;
}
setHeight(height){
this.width=height;
this.height=height;
yuksekligiBelirle(yukseklik){
this.genislik=yukseklik;
this.yukseklik=yukseklik;
}
}
functionrenderLargeRectangles(rectangles){
rectangles.forEach((rectangle)=>{
rectangle.setWidth(4);
rectangle.setHeight(5);
constarea=rectangle.getArea();// BAD: Returns 25 for Square. Should be 20.
rectangle.render(area);
functiongenisDikdortgenlerOlustur(dikdortgenler){
dikdortgenler.forEach((dikdortgen)=>{
dikdortgen.genisligiBelirle(4);
dikdortgen.yuksekligiBelirle(5);
constalan=dikdortgen.alanHesapla();// KÖTÜ: Kare için 25 döner. 20 olmalıydı.