SOLID

mjini·2022년 5월 27일
0

CleanCode 1장_프리퀄과 원칙 부분에서 나왔던
객체 지향 프로그래밍의 다섯가지 원칙-SOLID에 대해 정리해보고자 한다.

SOLID원칙을 지키면, 직관적이면서 변경이 용이하고, 유지보수와 확장이 쉬워진다.

1. 단일 책임 원칙 (SRP, Single Responsibility Principle)

"어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다." - 로버트 C.마틴

하나의 모듈, 클래스,함수 는 하나의 파트에대해서만 책임을 가진다.

2. 개방 폐쇄 원칙 (OCP, Open Closed Principle)

"OCP를 무시한다면, OOP의 가장 큰 장점인 유연성, 재사용성, 유지보수성 등을 얻을 수 없다."

확장에 대해서는 개방, 수정에대해서는 폐쇄
-> 새로운 변경사항에 대해서는 코드를 유연하게 추가 가능하고, 수정할때 객체를 직접적으로 수정하는것은 제한.
추상화를 통해 인터페이스를 상속받는 구조를 가지면 용이

/**
*높은 응집도와 낮은 결합도

  • 응집도가 높다는건 하나의 모듈, 클래스가 하나의 책임 또는 관심사에만 집중되어 있다는 의미.
    같은 책임, 관심사를 기반으로 하나의 객체로 설계하기 때문에 객체에 변경이 발생하더라도 다른 곳에 미치는 영향이 제한적이다.

  • 결합도란 하나의 오브젝트가 변경이 일어날때, 관계를 맺고있는 다른 오브젝트에게 변화를 요구하는 정도로
    낮은 결합도란 변경이 발생할 때, 다른 모듈과 객체로 변경에 대한 요구가 전파되지 않는 상태를 의미
    **/

3. 리스코프 치환법칙 (LSP, Liskov Substitution Principle)

"서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다." - 로버트 C.마틴

객체는 프로그램의 정확성을 깨지 않으면서 하위 타입인 인스턴스로 바꿀수 있어야한다.
(하위 타입은 상위 타입을 대체할 수 있어야 한다)

좀더 풀어서 써보자

  • 하위클래스는 상위클래스의 한 종류다.
  • 구현 클래스는 인터이스가 하는 동작을 할 수있어야 한다.

위 두문장을 잘 지키고있다면 LSP를 잘 지키고 있다고 할 수 있다.

4. 인터페이스 분리 원칙 (ISP, Interface Segregation Principle)

"클라이언트는 자신이 사용하지 않는 메소드에 의존 관계를 맺으면 안 된다." - 로버트 C.마틴

각 역할에 맞게 인터페이스로 분리해 클라이언트가 사용하지 않는 인터페이스에 영향을 받으면 안된다.
많은 기능이 있는 하나의 인터페이스 보다는 특정 클라이언트를 위한 여러개의 인터페이스 분리가 더 좋다.
클라이언트에 따라 인터페이스를 분리하면 변경에 대한 영향을 더욱 세밀하게 제어할 수 있다.
ISP로 의존성을 약화시키면 유지보수 용이하다.

‼️단일 책임 원칙(SRP)과 인터페이스 분할 원칙(ISP)은 같은 문제에 대한 두 가지 다른 해결책이라고 볼 수 있다.
->

  • 상위 클래스는 풍성할수록 좋다.
    풍성할수록 하위 클래스에게 많은 기능을 확장시켜주는 것이고, 형변환, 코드 중복을 줄여줌
  • 인터페이스 내에 메소드는 최소한 일수록 좋다.
    인터페이스는 하위 클래스에게 구현을 강제하도록 하는 역할.
    최소한의 기능만 제공하면서 하나의 역할에 집중할것

5. 의존 관계 역전 원칙 (DIP, Dependency Inversion Principle)

"고차원 모듈은 저차원 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다. 추상화된 것은 구체적인 것에 의존하면 안 된다. 구체적인 것이 추상화된 것에 의존해야 한다. 자주 변경되는 구체(Concrete) 클래스에 의존하지 마라" - 로버트 C.마틴 -

고수준 모듈(변경이 없는 추상화된 클래스 또는 인터페이스)은 저수준 모듈(변하기 쉬운 구체 클래스)의 구현에 의존해서는 안 되며, 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 한다는 것.

추상화에 의존하며, 구체화에는 의존하지 않는 설계 원칙
-> 구현클래스(구현체)가 아니라 인터페이스(역할)에 의존하라.

OCP(개방 패쇄원칙)와 밀접하게 연결되어있다.


예제를 통해 쉽게 잘 설명된 영상

https://www.youtube.com/playlist?list=PLDV-cCQnUlIZcWXE4PrxJx6U3qKfRTJcK

profile
정신 차려보니 개발자가 되어있었다.

0개의 댓글