SOLID에 대해 매우 많이 들어보고 어떤 것인지도 알지만 정리 해본적은 한번도 없어 글을 작성하게 되었다.
객체 지향 소프트웨어 디자인의 5가지 설계 원칙이다.
SOLID를 지켜 설계할 시, 다양한 측면에서 유지 보수, 확장, 수정, 테스트 등을 수월하게 할 수 있다.
SOLID는 아래의 5가지 원칙의 앞글자를 딴 내용이다.
단일 책임 원칙(Single Responsibility Principle)
개방 폐쇄 원칙(Open-Closed Principle)
리스코프 치환 원칙(Liskov Substitution Principle)
인터페이스 분리 원칙(Interface Segregation Principle)
의존 역전 원칙(Dependency Inversion Principle)
이제 각각 하나씩 알아보자.
객체는 단 하나의 책임(기능)만 가지고 있어야 한다.
하나의 객체는 하나의 기능만 수행해야 하며, 기능이 여러개일 시, 여러개의 객체로 분리해야한다.
만약 하나의 객체가 여러개의 기능을 수행하면, 기능 변경 시 수정해야 될 부분이 많아진다.
SRP를 잘 지킬 시 한 기능의 변경으로 인해 발생하는 연쇄 변경을 막을 수 있다.
기능의 단위는 절대적으로 정해진 것이 없으며, 개인마다 다를 수 있다.
확장에는 개방 되어 있고, 변경에는 폐쇄되어 있어야 한다.
기존 코드의 수정은 최소화하면서 기능을 확장할 수 있어야 한다.
기능의 확장 시, 객체를 추가하거나 인터페이스를 활용(추상화)해 코드를 확장해야한다.
다형성과 확장을 가능케 하는 객체지향의 장점을 극대화하는 기본적인 설계 원칙
서브 타입은 언제나 부모 타입으로 치환 가능해야 한다.
다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야 한다
다형성을 지원하기 위한 원칙이다. 즉, 인터페이스를 구현한 구현체를 믿고 사용하려면 이 원칙이 필요하다.
특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
즉, 인터페이스를 사용에 맞게 각각 분리해야 한다.
SRP가 클래스의 단일 책임 원칙을 강조한다면, ISP는 인터페이스의 단일 책임을 강조한다.
클라이언트의 목적에 맞게 인터페이스를 분리하고 용도에 적합한 인터페이스를 제공해야 한다.
프로그래머는 구체화에 의존하지 말고 추상화에 의존해야 한다.
즉, 구현 클래스에 의존하지 말고, 인터페이스에 의존해야 한다.
어떠한 클래스를 참조하는 일이 생긴다면, 구현 클래스를 직접 참조하지 말고 인터페이스를 참조해야 한다.
변화하기 쉬운 것에 의존하는 것이 아닌, 변화하지 않는 것에 의존해야 한다.
이렇게 변화하지 않는 것(인터페이스)에 의존할 시 유연하게 구현체를 변경할 수 있다.