рд▓реАрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╕рд┐рджреНрдзрд╛рдВрдд

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░, рдореЗрд░рд╛ рдирд╛рдо рдХреЛрдВрд╕реНрдЯреЗрдВрдЯрд┐рди рд╣реИред рдореИрдВ рдЬрд╛рд╡рд╛ рдореЗрдВ Tinkoff.ru рдкрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ SOLID рд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рд▓рд┐рд╕реНрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╕рд┐рджреНрдзрд╛рдВрдд рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдУрдкрди-рдХреНрд▓реЛрдЬреНрдб рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рд╕рдВрдмрдВрдз рджрд░реНрд╢рд╛рдПрдВрдЧреЗ, рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдареАрдХ рд╕реЗ рдХреИрд╕реЗ рд╕реАрдЦреЗрдВрдЧреЗ, рдФрд░ рджрд╛рд░реНрд╢рдирд┐рдХ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рд╡рд░реНрдЧ рдПрдХ рдЖрдпрдд рд╣реИред



, , , .


-. , , , . . ( 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. Square тАФ Rectangle, LSP .


тАФ ?


тАФ , , , Square тАФ Rectangle. , Square Rectangle. , .


, ISA . , , . , .


. тАФ , , . , , .


?


: . . , .


, , , , , . Shape Square Rectangle.


, . , . Quadrangle , , , , . .



- , , .


, , . , , , , , -.


1996 тАФ The Liskov Substitution Principle. . , , C++. , , LSP .


All Articles