* Pattern
> 반복적으로 일어나는 문제에 대한 합리적인 해결책을 제공해서 프로그래머가 남는 시간과 에너지, 창의력을 진정 독창적인
문제 해결에 사용할 수 있게 해준다
> 지금 당장 무엇을 해야 할지를 알려준다
* Value
> 타인과의 커뮤니케이션을 중시하고, 코드의 과도한 복잡성을 피하면서도 유연성 있는 코드를 작성한다
> 패턴을 사용해야 하는 동기를 알려준다
> 커뮤니케이션
- 프로그램도 책처럼 줄거리가 있어야 하며 리듬감을 지니고 상큼한 표현 등을 지녀야 한다
- 커뮤니케이션에 초점을 맞춰서 프로그래밍을 하면 경제적으로도 효과가 높다
- 커뮤니케이션에 관심을 기울이다 보면 좀더 현실적인 관점에서 코드를 짜게 된다
> 단순성
- 복잡도를 낮추면 프로그램을읽고 사용하고 수정하는 사람들이 프로그램을 훨씬 빨리 이해할 수 있다
- 과도한복잡도를 제거함녀 코드를 새로운 관점에서 바라볼 수 있다
> 유연성
- 유연성이 있으면서도 당장 이득을 얻을 수 있는 패턴을 사용하라 당장 비용이 들어가지만, 앞으로 이득을 얻을 수 있을지
불확실한 패턴의 경우에는 일단 사용을 자제하는 편이 좋다. 이러한 패턴은 일단 사용을 보류했다가, 정말 필요한 때가 오면 그때 적용하라
- 유연성은 복잡도를 증가시킨다
* Principle
> 항상 중요하지만 때로는 직접 적용하기 어려운 가치와, 적용법은 명확하지만 조금은 지엽적인 패턴 사이의 가교 역할을 한다
> 동기를 행동으로어떻게 바꿔줄지 알려준다
> 지역적 변화
- 코드를 수정할 때 함께 바꿔야 하는 부분을 최소화 해라
> 최소 중복
- Parallel Class Hierarchy 도 중복의 일종이다. 프로그램 상의 어떤 개념을 수정했을 때 2개 이상의 클래스 계층을 수정해야 한다면,
이러한 수정은 지역적 변화의 원칙을 위배하는 것이다
> 로직과 데이터의결합
- 로직과 데이터를 함께 유지하라
> 대칭성
- 프로그램에서 대칭성을 찾아내서 명확히 표현해주면, 코드를 읽기가 수월해진다. 프로그램의 절반만 이해하면 나머지 절반은 자연스럽게
이해되기 때문이다
> 선언적 표현
- 수행 순서가 중요한 구문이나 조건부 구문이 없는 일반 구문의 경우, 선언적 표현을 통해 코드를 작성하는 것이 이해하기 쉽다
> 변화율
- 변화율이 다른로직과 데이터는 분리하라
* Motivation
> 소프트웨어 설계의 원동력은 경제성
> 전체비용 = 개발 비용 + 유지 비용
> 유지비용 = 이해 비용 + 수정 비용 + 테스트 비용 + 설치 비용
* Class
> Abstract Interface
- 구현이 아니라 인터페이스에 맞춰 코딩하라는 말이 있다. 이는 설계 상의 결정을 필요 이상으로 노출하지 말라는 뜻이다
- 인터페이스 수를 최대한 늘린다고 해서 소프트웨어 비용이 최소화 되는 것은 아니다. 따라서 인터페이스를 통해 유연성을
얻을 수 있는 경우에만 인터페이스에 비용을 지불해야 한다
- 수정하려면 구현과 인터페이스를 수정해야 한다
> Interface
- 다중 상속의 유연성을 제공하면서도 복잡성과 모호성을 갖고 있지 않은 적절하게 균형이 잡힌 메커니즘이다
- 사용하게 되면 구현을 바꾸는 것은 쉽지만, 인터페이스 자체를 바꾸기는 쉽지 않다 (모든 클래스를 같이 수정해야 함)
- 모든 연산이 공용이어야 한다
- 인터페이스 이름에는 "I" 를 붙이면 읽기 쉽다
> Abstract Class
- 기존 설계를 망가뜨리지 않고 새로운 연산을 얼마든지 추가할 수 있다
- 단점은 각 클래스가 단 1개의 상위클래스만을 지정할 수 있다
> Value Object
- 변화하는상태를 지닌 객체가 아닌 정수와 같은 객체
- 모든 객체를 매번 새로 생성하면 메모리 관리 시스템에 부담을 줄 수 있다
> Inner Class
- 클래스 사용에 따른 비용을 지불하지 않으면서도 클래스의 장점을 대부분 취할 수 있다
> Annonymous Inner Class
- Outer Class 의코드를 읽는 데 방해가 되므로 가급적 짧아야 한다
- 별도로 테스트 하기 어려워서 복잡한 로직에 적합치 않으며, 클래스 이름을 사용할 수 없으므로 클래스 이름을 통해
프로그래머의 의도를 전달할 수 없다
'SW 공학 > SE 서적' 카테고리의 다른 글
///실용주의 프로그래머 (0) | 2020.10.16 |
---|---|
★클린 아키텍처 / 로버트 C.마틴 / 인사이트 (0) | 2020.10.02 |
★ 자바와 JUnit을 활용한 실용주의 단위테스트 / 제프 랭어, 앤디 헌트, 데이브 토마스 / 길벗 (0) | 2020.09.20 |
/////////★ 테스트 주도 개발 / 켄트벡 / 인사이트 (0) | 2019.12.15 |
★ 소프트웨어 장인 / 산드로 마쿠소 / 길벗 (0) | 2019.08.04 |