Architecture

[Clean Architecture 정리] 9장. LSP

테리는당근을좋아해 2022. 7. 20. 00:53

리스코프 치환 원칙 (LSP, Liskov Substitution Principle)

바바라 리스코프가 정의한 하위 타입

"하위 타입에서 필요한 것은 치환 원칙이다. S타입의 객체 o1 각각에 대응하는 타입 객체 o2가 있고, T타입을 이용해서 정의한 모든 프로그램 P에서 o2의자리에 o1을 치환하더라도 P의 행위가 변하지 않는다면, S는 T의 하위 타입이다."

 

 

리스코프 치환 원칙

- 상위 타입의 객체를 호출하는 동작에서 하위 타입의 객체가 상위 타입의 객체를 완전히 대체할 수 있어야(치환 가능해야) 한다.

 

 

정사각형/직사각형(Square/Rectangle) 문제

- LSP를 위반하는 전형적인 문제

class Rectangle():
    def __init__(self, width=0, height=0):
        self.__width = width
        self.__height = height
        
    def setWidth(self, width):
        self.__width = width
    
    def setHeight(self, height):
        self.__height = height
        
    def getArea(self):
        return self.__width * self.__height


class Square(Rectangle):
    def __init__(self, side=0):
        super().__init__(side, side)
        
    def setSide(self, side):
        super().setHeight(side)
        super().setWidth(side)
    
    def setHeight(self, height):
        self.setSide(height)
    
    def setWidth(self, width):
        self.setSide(width)


if __name__ == "__main__":
    print("Super class")
    ret = Rectangle()
    ret.setHeight(5)
    ret.setWidth(2)
    print("Rectangle's area is {}".format(ret.getArea()))
    
    print("Sub class")
    sq = Square()
    sq.setHeight(5)
    sq.setWidth(2)
    print("Square's area is {}".format(sq.getArea()))

- 정사각형은 논리적으로 생각했을 때, 직사각형의 하위 타입으로 볼 수 있다.

- 하지만 위 코드를 실행했을 때 직사각형과 정사각형에 같은 메소드와 파라미터를 넘겨주었지만 결과값은 다른 것을 확인할 수 있다.

- 즉, 하위 클래스가 상위 클래스와 다르게 동작하므로써 하위 클래스가 상위 클래스를 대체할 수 없게 되어버린 것이다.

- 결국 해당 클래스를 사용하는 클라이언트 코드에서는 if 문 등을 사용해서 타입 체크를 해줘야하는 일이 발생한다.

 

 

LSP와 아키텍처

- LSP는 "하나의 인터페이스와 이를 구현하는 여러 개의 클래스", "동일한 메서드 시그니처를 공유하는 여러 개의 클래스", "REST 인터페이스에 응답하는 서비스 집단" 등의 형태로 존재하는 인터페이스와 구현체에 적용되는 광범위한 소프트웨어 설계 원칙이다.

 

 

리스코프 치환 원칙(LSP, Liskov Substitution Principle)

- LSP는 아키텍처 수준까지 확장 가능하고, 확장해야 한다.

- 치환 가능성이 위배된다면 아키텍처가 오염되고 타입 체크 등의 별도의 메커니즘이 필요해진다.

 

 

서적 : http://www.yes24.com/Product/Goods/77283734

 

클린 아키텍처 - YES24

살아있는 전설이 들려주는 실용적인 소프트웨어 아키텍처 원칙『클린 코드』와 『클린 코더』의 저자이자 전설적인 소프트웨어 장인인 로버트 C. 마틴은 이 책 『클린 아키텍처』에서 이러한

www.yes24.com