티스토리 뷰
Photo by Austin Distel on Unsplash
이번에는 Open/Closed Priciple을 알아보자
- Single Responsibility 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
'golang' 카테고리의 다른 글
SOLID in GO - Interface Segregation Principle (0) | 2021.04.05 |
---|---|
SOLID in GO - Liskov Substitution Principle (0) | 2021.04.04 |
SOLID in GO - Single Responsibility Principle (0) | 2021.03.31 |
Go HTTP server를 GitHub Action을 이용해 Heroku로 deploy 해보자 (0) | 2021.03.29 |
Golang - http.Client에 context 패키지를 쓰면 더 좋다 (0) | 2021.03.05 |
- Total
- Today
- Yesterday
- OpenAI
- 독서후기
- 인텔리제이
- 오블완
- 체호프
- websocket
- Shortcut
- 2023
- agile
- intellij
- solid
- clean agile
- ChatGPT
- 노션
- 클린 애자일
- Gin
- golang
- bun
- API
- 티스토리챌린지
- github
- 잡학툰
- folklore
- 제이펍
- 독서
- Bug
- 영화
- go
- strange
- notion
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |