클린아키텍쳐14 11. Dependency Inversion Principle 유연성이 극대화된 시스템이란 : 의존성이 추상abstraction이 아닌 구체concretion에 의존하지 않는 세스템이다. String은 구현체이지만 변동이 생길 가능성이 낮으므로 넘어가자 use나 import 문에서 구현체말고 되도록 인터페이스를 참조하도록 하자. 안정된 추상화인터페이스는 구현체보다 변동성이 낮다. 안정된 소프트웨어란 변동성이 큰 구현체에 의존하는 일은 지양하고 안정된 추상 인터페이스를 선호하는 아키텍쳐다. 변동성이 큰 구체 클래스를 참조하지 마라. : 대신 추상 인터페이스를 참조해라 변동성이 큰 구체 클래스로부터 파생하지 마라. : 상속하지 말라는 뜻인 듯 왜...? 구체 함수를 오버라이드 하지 마라. : 대체로 구체함수는 소스코드 의존성을 필요로한다. 따라서 오버라이드하면 의존성을.. 2021. 3. 5. 10. Interface Segregation Principle OPS클래스를 다수의 사용자가 사용한다고 가정해보자. user1은 op1을 2는 op2를 3은 op3을 사용한다. OPS +op1 +op2 +op3 user1은 op2와 op3을 사용하지 않아도 소스코드는 같은 클래스에 존재하고 결국 의존하게 된다. 심지어는 op2가 바뀌면 op1도 강제로 배포된다. 오퍼레이션을 인터페이스단위로 분리하여 해결할 수 있다. 이때 오퍼레이션마다 메소드가 하나씩 포함된 인터페이스를 작성하면 어떨까. 굳이 만들지 않아도 되는 2개의 메소드를 노출하지 읺아도 된다. 그리고 마지막에 3개의 작은 인터페이(role interface)를 모아서 OPS를 만들면 개이덕 ISP와 언어정적타입 언어는 import use같은 included문이 팔요하다 동적타입 안어는 included문이 필.. 2021. 3. 4. 9. Liskov Substitution Principle SubtypeS타입의 객체 o1 각각에 대응하는 T타입 객체 o2가 있고 T타입을 이용해서 정의한 모든 프로그램 P에서 o2자리에 o1을 치환하더라도 P의 행위가 변하지 않는다면 S는 T의 하위타입이다. 상속을 사용하도록 가이드하기같은 인터페이스로 정의된 객체 2개가 있을 때 호출하는 쪽에서 무엇을 사용하는지 의존하지 않는다. 정사각형/직사각형 문제Square는 Rectangle의 하위타입으로는 적합하지 않은데, Rectangle은 높이와 너비는 서로 독립적으로 변경될 수 있는 반면 Square는 함께 변경되기 때문. 2021. 2. 16. 8. Open-closed Principle 소프트웨어 개체는 확장에는 열려있어야 하고 변경에는 닫혀있어야 한다. 사고 실험웹페 데이터를 프린터용으로 포맷하도록 바꾼다고 했을 때 코드 수정은 0이 되어야 한다. 서로 다른 목적으로 변경되는 요소를 적절하게 분리하고 (단일책임원칙) 요소 사이의 의존상을 체계화함으로써 (의존성역전) 변경랑을 최소화 할 수 있다. 방향성 제어책의 다이어그램을 보면 gateway는 genertor와 dataMapper사이에 위치하는데 이는 의존성을 역전시키기 위해서이다. gateway가 없었다면 interactor 컴포넌트에서 database컴포넌트로 바로 향하게 된다. 정보은닉Requester는 controller가 interactor내부에 대해 너무 많이 알지 못하도록 막는 존재이다. 이게 없었다면 FinancialE.. 2021. 2. 16. 이전 1 2 3 4 다음