* 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 의코드를 읽는 데 방해가 되므로 가급적 짧아야 한다

- 별도로 테스트 하기 어려워서 복잡한 로직에 적합치 않으며, 클래스 이름을 사용할 수 없으므로 클래스 이름을 통해 

프로그래머의 의도를 전달할 수 없다

+ Recent posts