General/Pattern

[구현패턴] 패턴과 프로그래밍 이론

croute 2012. 1. 21. 20:03


켄트벡의 구현패턴 2장 패턴과 3장 프로그래밍 이론에 대해 짧게 정리합니다.
실제로 책에서는 여러가지 예를 들어가며 설명해 줘서 읽을때 약간 재미(?)있네요.

2-3장에서는 패턴, 가치, 원칙, 구현패턴의 이론적 배경에 대해서 설명합니다.



2장. 패턴
 

대부분의 프로그램에 적용되는 법칙
  • 프로그램을 새로 짜는 경우보다는 기존 프로그램을 읽는 경우가 많다.
  • 프로그램에 있어 "완성"은 없다. 최초에 프로그램을 개발하는 데 드는 노력보다는 잉후 프로그램을 수정하는 데 들어가는 노력이 더 크다.
  • 프로그램 구조는 몇 가지 상태와 제어 흐름 개념으로 결정된다.
  • 프로그램을 읽는 사람은 개념과 더불어 세부 사항까지도 이해해야 한다. 세부 사항을 이해해야 전체 개념에 대한 그림을 그릴 수 있고, 한편 전체 개념을 이해해야 세부적인 구현 내용을 이해할 수 있기 때문이다.  

패턴이란?
  • 일련의 사항들을 고려하는 것이 패턴의 시작이다!
  • 패턴은 결정 요소들의 패턴이라고 할 수 있다.
  • 각 패턴은 문제에 대한 해결책을 제시해준다. 

패턴은!
  • 패턴은 시간과 에너지를 줄여준다.
  • 패턴은 절대적인 진리가 아니므로, 사람의 의사결정을 돕는 도구정도로 생각하는 것이 좋다.
  • 패턴은 반복적으로 일어나는 문제에 대한 합리적인 해결책을 제공해서 프로그래머가 남는 시간과 에너지, 창의력을 진정 독창적인 문제 해결에 사용할 수 있게 해준다.
  • 프로그래머는 패턴을 통해 프로그래밍의 지루한 부분을 좀더 저렴한 비용으로 빠르고 정확하게 처리할 수 있어서, 각 프로그램의 독창적인 문제 해결에 더 많은 시간과 에너지를 투입할 수 있게 된다.



3장. 프로그래밍 이론

가치, 원칙, 패턴을 사용하면 균형있는 개발 스타일을 얻을 수 있다.
패턴은 지금 당장 무엇을 해야 할지를 알려주고, 가치는 패턴을 사용해야 하는 동기를 알려주며, 원칙은 동기를 행동으로 어떻게 바꿔줄지 알려준다.

 

동력force
  • 결정 사항에 영향을 미치는 많은 동력force이 존재한다.
    동력을 가치value와 원칙principle 두가지로 나눈다.


가치value
  • 모든 프로그래밍에 적용되는 주제
  • 커뮤니케이션, 단순성, 유연성
  • 프로그램밍을 할 때 내리는 모든 의사 결정에 영향을 미침

  • 최고의 프로그래머는 프로그램의 확장성을 고려해서 프로그램을 짜지만, 불필요한 요소를 사용하지 않으며, 읽고 이해하기 쉬운 프로그램을 짠다.
  • 커뮤니케이션: 개발자가 코드를 쉽게 이해하고, 수정하고, 사용할 수 있는 코드
  • 단순성: 복잡도를 낮추면 프로그램을 읽고 사용하고 수정하는 사람들이 프로그램을 훨씬 빨리 이해할 수 있다. 또한 코드를 읽는 독자의 수준을 고려해야한다.(독자 수준에 따라 단순하다고 생각했던 코드는 단순하지 않을 수 있다.)
  • 유연성: 비효율적인 코딩이나 설계를 정당화해주는 가치. 유연성이 있으면서도 당장 이득을 얻을 수 있는 패턴을 사용해야한다.
 


원칙principle
  • 원칙은 가치처럼 언제나 적용되지는 않지만 많은 패턴에서 사용
  • 항상 중요하지만 때로는 직접 적용하기 어려운 가치와, 적용법은 명확하지만 조금은 지엽적인 패턴 사이의 가교 역할
  • 특히 어떤 패턴도 적용할 수 없는 경우나, 두 개의 패턴 중 하나를 선택해야 할 경우 원칙이 중요한 역할을 함

  • 원칙을 명확하게 알고있다면 새로운 패턴을 만들어낼 수 있다. 원칙을 이해하고 있다면, 각 패턴의 세부 내용뿐 아니라 패턴을 사용하는 근본적인 이유에 대해 알 수 있으므로 새로운 상황에 부딪혔을 때 적절히 대처할 수 있다.
  • 지역적 변화: 코드를 수정할 때 함께 바꿔야 하는 부분을 최소화하라.
  • 최소 중복: 지역적 변화를 돕는 다른 원칙 최소 중복(Minimize Repetition)의 원칙
  • 로직과 데이터의 결합: 지역적 변화의 원칙에 근거한 다른 원칙은 로직과 데이터를 함께 유지하는것이다. 
  • 대칭성: 프로그램에서 대칭성은 여러 곳에 존재한다. add() 메소드가 있는 곳에는 remove() 메소드가 있다. 대칭성은 하나의 아이디어를 프로그램 전체에서 일관된 방식으로 표현하는 통일성이라고 할 수 있다.
  • 선언적 표현: 명령형 프로그래밍은 강력하고 유연하지만 프로그램을 이해하기 위해서는 수행흐름을 따라가야 한다. 수행 순서가 중요한 구문이나 조건부 구문이 없는 일반 구문의 경우, 선언적 표현을 통해 코드를 작성하는 것이 이해하기 쉽다.
  • 변화율: 마지막 원칙은 함께 변하는 로직과 데이터를 함께 관리하고, 변화율이 다른 로직과 데이터는 분리하는 것이다.