티스토리 뷰

golang

SOLID in GO - Open/Closed Priciple

주먹불끈 2021. 4. 1. 17:33

Photo by Austin Distel on Unsplash

 

이번에는 Open/Closed Priciple을 알아보자

 

- Single Responsibility Principle

- Open/Closed Principle

- Liskov Substitution Principle

- Interface Segregation Principle

- Dependency Inversion Principle

 

Open/Closed Principle

 

"Software entities should be open for extension, but closed for modification."

- Bertrand Meyer, Object-Oriented Software Construction

 

OOP 클래스를 기반으로한 언어에서는 가장 중요한 원칙이라 한다.

기존의 모듈은 새로운 모듈이나 기능을 추가할 있어야 한다(Open), 하지만 새로운 모듈이 기존의 모듈을 변경해서는 안된다.(Closed)

 

YouTube 예시부터 보자

YouTube: https://youtu.be/AKdvlr-RzEA?t=160

 

코드를 그대로 가져왔다.

 

문제가 있는 코드부터 보자

 

triangle 이라는 새로운 구조체를 추가하려면 어떻게 해야 할까?

무엇이든 인자로 받을 있는 calculator 구조체의 areaSum 메서드를 뜯어 고쳐야 한다.

 

코드 링크: https://play.golang.org/p/8gxI7YjdpPK

개선된 코드는 다음과 같다.

 

1. areaSum() 메서드는 shape 인터페이스만을 인자로 받는다. area() 라는 메서드가 구현된 녀석은 받을 있다는 것이다.

2. 이제 triangle이라는 새로운 구조체를 만들어도, area() 라는 메서드만 만들어주면 바로 있게 되었다.

 

Open. area() 메서드만 구현되어 있다면 어떤 인스턴스라도 인자로 받을 있고,

Closed. areaSum() 메서드는 변경되지 않는다.

 

코드링크: https://play.golang.org/p/h2xthTLxeR6

 

 

 

다른 예제 하나

 

Single Responsibilty Principle 정리했던 블로그의 포스팅인데 역시나 정리하였다 싶다

참고 링크: https://medium.com/@felipedutratine/solid-open-closed-principle-in-golang-3d23e8258a45

 

링크의 포스팅은 크게 둘로 나누어서 설명을 한다.

 

1. 구조체의 메서드가 있을 때에, 구조체를 임베딩한 구조체에 같은 이름의 메서드를 덮어쓸 있다. Override

 

말이 조금 어렵게 느낄 있는데, 코드를 보면 번에 이해될 것이다.

 

Animal1 Animal2 구조체는 Cat 구조체를 임베딩하였다.

하지만 Animal1 별도의 메서드 구현이 없었기에 Name() 메서드를 호출하면 임베딘된 Cat 구조체의 메서드가 호출되고

Animal2 별도 구현한 자체 메서드인 Name() 호출된다.

 

자체 메서드 구현으로 확장이 되면서도 (Open)

임베드된 Cat 구조체와 구조체의 메서드는 변경되지 않는다. (Closed)

 

예제 링크: https://play.golang.org/p/Bgg2SbTulYa

 

 

2. Strategy Design Pattern - 전략 패턴

 

전략 패턴이란 번째 예제에서 말한 것과 같다.

행동 방식을 필요에 따라 바꿀 있다는 것인데 번째 예제로 말한다면 area()라는 행위를 도형마다 다르게 구현해놓고

필요에 따라 도형에 맞는 행위를 실행할 있도록 하는 것이다.

 

1. 먼저 Work()라는 행위를 제공하는 EasyWork, HardWork 구조체를 만들어두고

2. Work() 행위를 있는 직원을 채용하는(=임베딩하는) Employee 구조체를 만들어보았다.

3. 그리고 전략에 따라(Strategy) aEmployee EasyWork 고용하였고, bEmplyee HardWork 고용하였다.

4. DoTheWork 일을 시키니 각각 알아서 일을 한다.

 

예제 링크: https://play.golang.org/p/jxrjAwdxQCU

 

 

반응형
반응형
잡학툰 뱃지
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함