Principe de substitution de Lisk

Bonjour à tous, mon nom est Konstantin. Je développe en Java sur Tinkoff.ru et j'adore SOLID. Dans cet article, nous allons formuler le principe de substitution de Lisk, montrer sa connexion avec le principe ouvert-fermé, apprendre à former correctement la hiérarchie d'héritage et répondre à la question philosophique de savoir si un carré est un rectangle.



, , , .


-. , , , . . ( LSP) — , - . — , LSP, -.


:


, , -, .


:


, : o1 S o2 T, P, T, P , o2 o1, S — T.


, LSP, , , , . -, , .


LSP


, :


void drawShape(Shape shape) {
   if (shape instanceof Square) {
       drawSquare((Square) shape);
   } else {
       drawCircle((Circle) shape);
   }
}

. Shape, , drawCircle, , — .


drawShape Shape. , , Shape , . Shape, -.



, LSP . , , . :


public class Rectangle {
    private int width;
    private int height;

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int perimeter() {
        return 2 * height + 2 * width;
    }
}

. , . , , , , , — Square. ?


, «» (ISA). , , ISA , , .


— . , ISA. , Square Rectangle. , , , , .


, Square height width, , side, . , ( , , ), . , Square setWidth setHeight. , :


    @Override
    public void setWidth(int width) {
        super.setWidth(width);
        super.setHeight(width);
    }

    @Override
    public void setHeight(int height) {
        super.setHeight(height);
        super.setWidth(height);
    } 

Square . . Square. . , , , , .



, Rectangle :


public class RectangleTest {

    @Test
    public void perimeter() {
        Rectangle rectangle = new Rectangle();
        rectangle.setHeight(5);
        rectangle.setWidth(7);

        int result = rectangle.perimeter();

        assertEquals(24, result);
    }

} 

, Square . Square ISA Rectangle, , Rectangle Square. , :


public class RectangleTest {

    @Test
    public void perimeter() {
        Rectangle rectangle = initRectangle();
        rectangle.setHeight(5);
        rectangle.setWidth(7);

        int result = rectangle.perimeter();

        assertEquals(24, result);
    }

    protected Rectangle initRectangle() {
        return new Rectangle();
    }

}

public class SquareTest extends RectangleTest {

    @Override
    protected Rectangle initRectangle() {
        return new Square();
    }

}

, SquareTest.perimeter , perimeter 24, , 28. : , , ? — . , Rectangle, Square. Square Rectangle , Rectangle ( ) , Rectangle Square. SquareRectangle, LSP .


— ?


— , , , SquareRectangle. , Square Rectangle. , .


, ISA . , , . , .


. — , , . , , .


?


: . . , .


, , , , , . Shape Square Rectangle.


, . , . Quadrangle , , , , . .



- , , .


, , . , , , , , -.


1996 — The Liskov Substitution Principle. . , , C++. , , LSP .


All Articles