11. stein.park@kakao
주요출처
[asd] Agile Software Development, Principles, Patterns, and Practices, 2003
[sd] Structured Design: Fundamentals of a Discipline of Computer Program and Systems Design, 1979/2008
[ca] The Clean Architecture(2017)
12. stein.park@kakao
주요출처
[asd] Agile Software Development, Principles, Patterns, and Practices, 2003
[sd] Structured Design: Fundamentals of a Discipline of Computer Program and Systems Design, 1979/2008
[ca] The Clean Architecture(2017)
14. stein.park@kakao
1부소개
• 1장 : 설계(design)과 아키텍처(architecture)란?
• 고수준에서 저수준으로 향하는 의사결정의 연속이며, 서로 이어져 있음
• 목표는 필요한 시스템을 만들고 유지보수하는 데 투입되는 인력을 최소하는 것
• 좋은 설계(TDD 등)를 갖추면 시작부터 끝까지 빠름
• 2장: 두 가지 가치에 대한 이야기
• 두 가지 가치 = 행위(behavior) + 구조(structure)
• 아키텍처는 형태(행위, 요구사항, 기능)에 독립적이어야하고, 그럴수록 더 실용적
• 변경을 쉽게 하는 구조를 만드는 것이 중요
16. stein.park@kakao
2부벽돌부터시작하기:프로그래밍패러다임
• 구조적 프로그래밍: 제어흐름의 직접적인 전환에 대해 규칙을 부과한다.
• 함수를 증명가능한 더 작은 단위로 분해 & 테스트
• 테스트는 버그가 있음을 보여줄 뿐, 버그가 없음을 보여줄 수는 없다. - 다익스트라
• 객체 지향 프로그래밍: 제어흐름의 간접적인 전환에 대해 규칙을 부과한다.
• 캡슐화에는 딱히 강하지 않고, 상속에는 편리함을 주며, 다형성에는 안전&편리를 제공
• 다형성으로 의존성 역전이 쉬움 => 컴포넌트 분리가 쉬워짐 => 설계 자유도 UP
• 함수형 프로그래밍: 할당문에 대한 규칙을 부과한다.
• 경합조건, 교착상태, 동시 업데이트 모두 가변상태 때문인데 FP에서는 이 문제가 줄어듦
• 이벤트 소싱으로 데이터를 관리함으로써 완전한 불변성을 가질 수도 있음. 예) git
패러다임은 ‘해서는 안되는 것’을 규정
17. stein.park@kakao
2부벽돌부터시작하기:프로그래밍패러다임
• 구조적 프로그래밍: 제어흐름의 직접적인 전환에 대해 규칙을 부과한다.
• 함수를 증명가능한 더 작은 단위로 분해 & 테스트
• 테스트는 버그가 있음을 보여줄 뿐, 버그가 없음을 보여줄 수는 없다. - 다익스트라
• 객체 지향 프로그래밍: 제어흐름의 간접적인 전환에 대해 규칙을 부과한다.
• 캡슐화에는 딱히 강하지 않고, 상속에는 편리함을 주며, 다형성에는 안전&편리를 제공
• 다형성으로 의존성 역전이 쉬움 => 컴포넌트 분리가 쉬워짐 => 설계 자유도 UP
• 함수형 프로그래밍: 할당문에 대한 규칙을 부과한다.
• 경합조건, 교착상태, 동시 업데이트 모두 가변상태 때문인데 FP에서는 이 문제가 줄어듦
• 이벤트 소싱으로 데이터를 관리함으로써 완전한 불변성을 가질 수도 있음. 예) git
패러다임은 ‘해서는 안되는 것’을 규정
goto 쓰지마
18. stein.park@kakao
2부벽돌부터시작하기:프로그래밍패러다임
• 구조적 프로그래밍: 제어흐름의 직접적인 전환에 대해 규칙을 부과한다.
• 함수를 증명가능한 더 작은 단위로 분해 & 테스트
• 테스트는 버그가 있음을 보여줄 뿐, 버그가 없음을 보여줄 수는 없다. - 다익스트라
• 객체 지향 프로그래밍: 제어흐름의 간접적인 전환에 대해 규칙을 부과한다.
• 캡슐화에는 딱히 강하지 않고, 상속에는 편리함을 주며, 다형성에는 안전&편리를 제공
• 다형성으로 의존성 역전이 쉬움 => 컴포넌트 분리가 쉬워짐 => 설계 자유도 UP
• 함수형 프로그래밍: 할당문에 대한 규칙을 부과한다.
• 경합조건, 교착상태, 동시 업데이트 모두 가변상태 때문인데 FP에서는 이 문제가 줄어듦
• 이벤트 소싱으로 데이터를 관리함으로써 완전한 불변성을 가질 수도 있음. 예) git
패러다임은 ‘해서는 안되는 것’을 규정
goto 쓰지마
상속된 것으로만 전환해
19. stein.park@kakao
2부벽돌부터시작하기:프로그래밍패러다임
• 구조적 프로그래밍: 제어흐름의 직접적인 전환에 대해 규칙을 부과한다.
• 함수를 증명가능한 더 작은 단위로 분해 & 테스트
• 테스트는 버그가 있음을 보여줄 뿐, 버그가 없음을 보여줄 수는 없다. - 다익스트라
• 객체 지향 프로그래밍: 제어흐름의 간접적인 전환에 대해 규칙을 부과한다.
• 캡슐화에는 딱히 강하지 않고, 상속에는 편리함을 주며, 다형성에는 안전&편리를 제공
• 다형성으로 의존성 역전이 쉬움 => 컴포넌트 분리가 쉬워짐 => 설계 자유도 UP
• 함수형 프로그래밍: 할당문에 대한 규칙을 부과한다.
• 경합조건, 교착상태, 동시 업데이트 모두 가변상태 때문인데 FP에서는 이 문제가 줄어듦
• 이벤트 소싱으로 데이터를 관리함으로써 완전한 불변성을 가질 수도 있음. 예) git
패러다임은 ‘해서는 안되는 것’을 규정
goto 쓰지마
상속된 것으로만 전환해
immutable 만세
20. stein.park@kakao
3부에앞서:결합도&응집도
모듈: expression, statement, function, procedure, method, class, … ‘aggregate identifier’
[Structured Design, 1978, 2008] Kent Beck - youtube
Stackoverflow - What does 'low in coupling and high in cohesion' mean
Coursera - 객체 지향 설계
단일 액터를 책임지는 코드
를 함께 묶어주는 힘 - [ca]
slide: CSC407-Structured Design by Dave A. Penny
21. stein.park@kakao
3부에앞서:결합도&응집도
모듈: expression, statement, function, procedure, method, class, … ‘aggregate identifier’
[Structured Design, 1978, 2008] Kent Beck - youtube
Stackoverflow - What does 'low in coupling and high in cohesion' mean
Coursera - 객체 지향 설계
모든 코드를 한
파일에 때려넣음
단일 액터를 책임지는 코드
를 함께 묶어주는 힘 - [ca]
slide: CSC407-Structured Design by Dave A. Penny
22. stein.park@kakao
3부에앞서:결합도&응집도
모듈: expression, statement, function, procedure, method, class, … ‘aggregate identifier’
[Structured Design, 1978, 2008] Kent Beck - youtube
Stackoverflow - What does 'low in coupling and high in cohesion' mean
Coursera - 객체 지향 설계
모든 코드를 한
파일에 때려넣음
단일 액터를 책임지는 코드
를 함께 묶어주는 힘 - [ca]
응집도를 높이고
결합도를 줄여서
최적점을 찾자!
slide: CSC407-Structured Design by Dave A. Penny
23. stein.park@kakao
결합도&응집도…
복잡하면 비용 증가 -> 나누자 -> 고려사항이 는다 -> 나눠도 비용증가???
고려사항이 많아지면
복잡도가 증가 고려사항을 줄이기 위해 문제를 나눴더니
작아진 조각들 간에 복잡도가 증가
막 나누면 안되고
결합도를 낮추고 응집도를 높여라
35. stein.park@kakao
OCP=개방-폐쇄원칙
A가 B를 확장하는 것은 열려있지만, 변경하는 것은 닫혀있다.
재무 데이터
재무 분석기
보고서용
재무 데이터
보고서를
웹에 표시
보고서를
프린터로 출력
PM 관점에서
[oosc, §3.3]
[oosc] https://web.uettaxila.edu.pk/CMS/AUT2011/seSCbs/tutorial/Object%20Oriented%20Software%20Construction.pdf
설명을 위해 화살표 방향을 바꿈
책에는 “데이터 흐름” 방향인데,
“의존성 방향”으로 바꿈
36. stein.park@kakao
OCP=개방-폐쇄원칙
A가 B를 확장하는 것은 열려있지만, 변경하는 것은 닫혀있다.
재무 데이터
재무 분석기
보고서용
재무 데이터
보고서를
웹에 표시
Open
Open
PM 관점에서
[oosc, §3.3]
[oosc] https://web.uettaxila.edu.pk/CMS/AUT2011/seSCbs/tutorial/Object%20Oriented%20Software%20Construction.pdf
설명을 위해 화살표 방향을 바꿈
책에는 “데이터 흐름” 방향인데,
“의존성 방향”으로 바꿈
37. stein.park@kakao
OCP=개방-폐쇄원칙
A가 B를 확장하는 것은 열려있지만, 변경하는 것은 닫혀있다.
재무 데이터
재무 분석기
보고서용
재무 데이터
보고서를
웹에 표시
Close
Close
PM 관점에서
[oosc, §3.3]
[oosc] https://web.uettaxila.edu.pk/CMS/AUT2011/seSCbs/tutorial/Object%20Oriented%20Software%20Construction.pdf
설명을 위해 화살표 방향을 바꿈
책에는 “데이터 흐름” 방향인데,
“의존성 방향”으로 바꿈
38. stein.park@kakao
OCP=개방-폐쇄원칙
A가 B를 확장하는 것은 열려있지만, 변경하는 것은 닫혀있다.
재무 데이터
재무 분석기
보고서용
재무 데이터
보고서를
웹에 표시
보고서를
프린터로 출력
Open
Close
Close
PM 관점에서
[oosc, §3.3]
[oosc] https://web.uettaxila.edu.pk/CMS/AUT2011/seSCbs/tutorial/Object%20Oriented%20Software%20Construction.pdf
설명을 위해 화살표 방향을 바꿈
책에는 “데이터 흐름” 방향인데,
“의존성 방향”으로 바꿈
39. stein.park@kakao
OCP=개방-폐쇄원칙
A가 B를 확장하는 것은 열려있지만, 변경하는 것은 닫혀있다.
재무 데이터
재무 분석기
보고서용
재무 데이터
보고서를
웹에 표시
보고서를
프린터로 출력
Open
Close
Reopen
PM 관점에서
[oosc, §3.3]
[oosc] https://web.uettaxila.edu.pk/CMS/AUT2011/seSCbs/tutorial/Object%20Oriented%20Software%20Construction.pdf
설명을 위해 화살표 방향을 바꿈
책에는 “데이터 흐름” 방향인데,
“의존성 방향”으로 바꿈
유형 별
enum
40. stein.park@kakao
OCP=개방-폐쇄원칙
A가 B를 확장하는 것은 열려있지만, 변경하는 것은 닫혀있다.
재무 데이터
재무 분석기
보고서용
재무 데이터
보고서를
웹에 표시
보고서를
프린터로 출력
Open
Close
Reopen
Reopen
PM 관점에서
[oosc, §3.3]
[oosc] https://web.uettaxila.edu.pk/CMS/AUT2011/seSCbs/tutorial/Object%20Oriented%20Software%20Construction.pdf
설명을 위해 화살표 방향을 바꿈
책에는 “데이터 흐름” 방향인데,
“의존성 방향”으로 바꿈
유형 별
enum
41. stein.park@kakao
OCP=개방-폐쇄원칙
A가 B를 확장하는 것은 열려있지만, 변경하는 것은 닫혀있다.
재무 데이터
재무 분석기
보고서용
재무 데이터
보고서를
웹에 표시
보고서를
프린터로 출력
Open
Close
Reopen
Reopen
Reopen
PM 관점에서
[oosc, §3.3]
[oosc] https://web.uettaxila.edu.pk/CMS/AUT2011/seSCbs/tutorial/Object%20Oriented%20Software%20Construction.pdf
설명을 위해 화살표 방향을 바꿈
책에는 “데이터 흐름” 방향인데,
“의존성 방향”으로 바꿈
유형 별
enum
49. stein.park@kakao
LSP=리스코프의치환원칙
A를 사용하는 P에서 A를 B로 치환해도 P의 행위가 변하지 않으면 B는 A의 하위타입이다.
Billing License
+ calcFee()
Personal
License
Business
License
- users
<I>
User Rectangle
+ setH, + setW
Square
+ setSide
50. stein.park@kakao
Square
+ setSide
OCP+LSP동시위반사례
Class User {
void DrawShape(Shape s) {
if (s instanceof Square)
…
else
…
}
}
User Rectangle
+ setH, + setW
Interface가 아닌 구현 클래스
를 알아야하므로 LSP 위반
Rectangle의 기능을 확장하는데 User가 변경
되는 문제가 발생했으므로 OCP 위반
[asp, p133]
51. stein.park@kakao
OCP+LSP동시위반사례
Class User {
void DrawShape(Shape s) {
if (s instanceof Square)
…
else
…
}
}
User Rectangle
+ setH, + setW
Interface가 아닌 구현 클래스
를 알아야하므로 LSP 위반
Rectangle의 기능을 확장하는데 User가 변경
되는 문제가 발생했으므로 OCP 위반
[asp, p133]
Open Open
52. stein.park@kakao
OCP+LSP동시위반사례
Class User {
void DrawShape(Shape s) {
if (s instanceof Square)
…
else
…
}
}
User Rectangle
+ setH, + setW
Interface가 아닌 구현 클래스
를 알아야하므로 LSP 위반
Rectangle의 기능을 확장하는데 User가 변경
되는 문제가 발생했으므로 OCP 위반
[asp, p133]
Close Close
53. stein.park@kakao
Square
+ setSide
OCP+LSP동시위반사례
Class User {
void DrawShape(Shape s) {
if (s instanceof Square)
…
else
…
}
}
User Rectangle
+ setH, + setW
Interface가 아닌 구현 클래스
를 알아야하므로 LSP 위반
Rectangle의 기능을 확장하는데 User가 변경
되는 문제가 발생했으므로 OCP 위반
[asp, p133]
Close Close
Open
54. stein.park@kakao
Square
+ setSide
OCP+LSP동시위반사례
Class User {
void DrawShape(Shape s) {
if (s instanceof Square)
…
else
…
}
}
User Rectangle
+ setH, + setW
Interface가 아닌 구현 클래스
를 알아야하므로 LSP 위반
Rectangle의 기능을 확장하는데 User가 변경
되는 문제가 발생했으므로 OCP 위반
[asp, p133]
Reopen
Close
Open
57. stein.park@kakao
DIP=의존성역전원칙
고수준 정책을 구현하는 코드는 저수준 세부사항 코드에 의존하면 안 된다. 대신 세부사항이 정책에 의존해야 한다.
a. 상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안된다. 둘 모두 추상화에 의존해야한다.
b. 추상화는 구체적인 사항에 의존해서는 안 된다. 구체적인 사항은 추상화에 의존해야 한다.
[asd]
DIP 예외
User가 Square 때문에
Open되는 문제 해결
의존성(dependency) 방향이 제어흐름
의 정반대 방향으로 역전(inversion)
(more…)