SOLID
solid는 약자로 이루어져있습니다.
S → single responsiblity: 단일 책임의 원칙
O → open closed: 개방 폐쇄 원칙
L → Liskov subsituation: 리스코프 치환 원칙
I → interface segregation: 인터페이스 분리 원칙
D → dependency inversion: 의존 역전 원칙
단일 책임의 원칙
객체는 한 가지 역할(책임)만 가져야 한다. = 객체가 변경되는 이유는 단 한가지여야 한다.
책임은 변경의 축이기 때문에 분할되는 것이 중요하다.
→ 여러개의 책임을 가지게 된다면 요구사항의 변경이 일어났을 때 연쇄적인 변화가 발생할 것이다.
어떻게 해결할 수 있나
추상화를 통해 객체를 설계하는 과정에서 적절한 한 개의 역할만 갖도록 구상
→ 책임의 분배는 정답이 없기 때문에 경험이 중요하다
개방 폐쇄 원칙
객체는 확장에 열려있고 변경에는 닫혀있어야 한다.
확장에 열려있다 → 객체의 행위가 확장될 수 있다. 행위를 추가해 객체가 하는 일을 바꿀 수 있다.
변경에 닫혀있다 → 객체의 확장이 소스 코드의 변경을 초래하지 않아야 한다.
왜 지켜야 하나
기존 코드를 쉽게 확장할 수 있으므로 유연성, 재사용성, 유지보수성을 얻을 수 있다.
어떻게 해결할 수 있나
객체에 새로운 기능이 추가될 때 코드의 변경 없이 확장이 이뤄져야 한다.
모듈은 잘 변하지 않는 추상화에 의존해 수정에는 닫혀있고 추상화의 구현체를 추가해 확장에는 열려있게 된다.
리스코프 치환 원칙
서브 타입은 자신의 기반 타입으로 교체할 수 있어야 한다.
= 하위 클래스가 상위 클래스로 바뀌어도 역할 수행에 문제가 없어야 한다.
= 서브 타입은 기반 타입이 정해둔 약속을 지켜야 한다.
왜 지켜야 하나
리스코프 치환 원칙의 위반은 곧 개방 폐쇄 원칙의 위반하는 것과 같기 때문이다.
개방 폐쇄 원칙은 상속을 통해 이루어지고 리스코프 치환 원칙은 규약이 준수된 상속 구조를 보장한다.
기반 타입으로 대체가 안되면 구현체가 들어왔을 때 적절한 역할의 수행이 어렵다.
리스코프 치환 원칙은 어떻게 지킬 수 있는가?
- 하위 클래스 is - a 상위 클래스
- 구현 클래스 is able to 인터페이스
이 두 관계가 지켜지면 된다.
행위에 대한 is - a 관계도 잘 생각해봐야 한다.
ex) 직사각형 정사각형
- 정사각형 is - a 직사각형 ⇒ 어색하지 않음
- 정사각형의 높이 변경 is - a 직사각형의 높이 변경 ⇒ 어색하게 느껴짐
인터페이스 분리 원칙
인터페이스는 자신의 클라이언트가 사용할 메서드만 가지고 있어야 한다.
= 클라이언트는 자신이 사용하지 않는 메서드에 의존하게 강제되면 안된다.
왜 지켜야 하나
인터페이스가 비대해지면 같은 인터페이스를 구현하는 클라이언트간의 결합도가 높아진다
→ 특정 클라이언트를 위한 메서드를 추가 할 때, 다른 클라이언트에서도 구현이 강제되고 변경에 영향을 끼친다.
어떻게 해결할 수 있나?
자신의 클라이언트가 필요로하는 함수만 선언한다.
⇒ 인터페이스의 역할에 충실한 기능만 제공한다.
의존 관계 역전 원칙
구체적인 것이 추상화 된 것에 의존해야 된다. → 자주 변경되는 것(구체적인 것)에 의존하지 말아라
왜 지켜야 하나
상위 객체는 애플리케이션의 본질을 담고 정책을 결정하는 역할
하위 수준의 객체에 의존하면, 하위 수준의 변화가 상위 객체에 영향
구체적인 것의 변화에 따라 규칙이 변한다 ⇒ 어색하게 느껴진다.
추상화를 자유롭게 재사용하기 위함
만약, 상위가 하위 객체에 의존을 가지고 있다면 맥락에 맞게 재사용 변경해 재사용 불가
즉, 추상화가 구체적인 것에 의존하면 추상화를 자유롭게 재사용할 수 없다
어떻게 해결할 수 있나?
의존성은 이행적이다.
→ 한 레이어는 의존하고 있는 다른 레이어의 의존에도 의존하게 된다.
동일 레벨에서는 추상화를 의존하고 하위 레벨은 상위 레벨은 의존하게 만든다
'공부 > 기타' 카테고리의 다른 글
백엔드 진화과정 (0) | 2024.08.09 |
---|---|
RESTful API (1) | 2024.08.09 |
개발 프로세스 (0) | 2024.08.09 |
Unity로 만든 공 굴리기 게임[My_First_Game: Roll The Ball] (0) | 2021.07.14 |