Eternity's Chit-Chat

aeternum.egloos.com



유연한 설계를 위한 패턴과 원리 - 2.의도를 명확하게 2부 Supple Design

PATTERNS & PRINCIPLES

INTENTION-REVEALING INTERFACE

프로그래밍을 처음 시작했던 어린 시절에 프로그램은 단순히 컴퓨터와의 대화였다. 머리 속에 떠오른 아이디어를 컴퓨터가 이해할 있는 방식으로 변환하고 컴퓨터가 의도대로 결과를 반환해주면 아무런 문제가 없다고 생각했다. 당시 내가 생각하는 프로그램의 정의는 컴퓨터가 이해할 있는 명령을 나열한 텍스트였다. 문제는 몇일 후에 프로그램을 수정하려고 컴퓨터 앞에 앉았을 발생했다. 정작 자신은 프로그램을 이해할 없었던 것이다.

프로그래밍 언어에 언어라는 용어를 사용하고 있다는 사실에서 있는 것처럼 프로그램은 사람과 사람 간의 의사소통을 위한 것이다. Gerald M. Weinberg 비자아적 프로그래밍(egoless programming)’이라는 개념을 통해 명확하고 읽기 쉬운 프로그램의 중요성을 강조했다. 프로그램은 단순히 컴퓨터를 위한 텍스트가 아니다. 프로그램을 읽게될 사람을 위한 것이다. 그렇다고 해서 프로그램을 작성하기 위해 이타적일 필요까지는 없다. 프로그램을 읽게 사람이 바로 자기 자신이 확률이 높기 때문이다.

프로그램이 사람을 위한 것이라면 프로그래밍의 중심축은 원활한 커뮤니케이션으로 옮겨진다. 소프트웨어에 있어 가장 비용이 발생하는 부분은 유지보수 단계이다. 유지보수는 보통 소프트웨어 비용의 40~80%(평균 60%) 차지한다. 따라서 타이핑 시간을 줄이기 위해 변수 명을 짧게 쓰거나 자신만이 알아 있는 메소드 명을 사용하는 것을 자제해야 한다. 코드를 작성하는 것은 번이지만 코드가 읽혀지는 것은 수백 번에 이른다.

읽기 편한 코드는 명확한 코드다. 명확한 코드는 의도를 드러내는 코드다. 의도를 드러내는 코드는 코드를 이해하는데 필요한 모든 세부사항이 인터페이스에 드러나는 코드다. 만약 코드를 읽는 사람이 인터페이스에서 필요한 모든 정보를 얻을 없다면 코드의 내부 구석구석을 뒤져봐야 한다. 방법이 아닌 의도를 표현하는 추상적인 인터페이스 뒤로 모든 까다로운 메커니즘을 캡슐화시켜야 한다. 객체 지향의 미덕은 캡슐화를 통해 복잡한 세부 내용을 감출 있다는 점이다.

도메인 내에 존재하는 개념을 클래스나 메소드의 형태로 명확하게 모델링함으로써 가치를 얻기 위해서는 해당 도메인 개념을 반영하도록 클래스와 메소드의 이름을 지어야 한다. , 수행 방법에 관해서는 언급하지 말고 결과와 목적만을 표현하도록 클래스와 오퍼레이션의 이름을 지어야 한다. 인터페이스를 구성하는 요소의 이름은 설계 의도를 드러낼 있는 가장 훌륭한 수단을 제공한다. 기회를 허투로 흘려버리지 마라.

INTENTION-REVEALING INTERFACE 구축하기 위해서는 타입 이름, 메소드 이름, 인자 이름 모두에 명확한 의도를 나타내는 이름을 지어야 한다. INTENTION-REVEALING INTERFACE 목적을 달성하는 가장 훌륭한 방법은 코드를 작성하기 전에 클라이언트 관점에서 테스트 케이스를 작성하는 것이다.

wons() dollars() 사용해서 작성된 Money 코드는 valueOf() 사용해서 작성된 코드에 비해 명확한 의도를 표현하고 있다. 작은 차이가 INTENTION-REVEALING INTERFACE 만든다.


덧글

  • muscly 2009/11/26 12:57 # 삭제

    "이타주의적 프로그래머" 블로그 주인입니다.
    "이타적일 필요까지는 없다"에서 뜨끔 했습니다. ^^;;;
  • 이터너티 2009/11/30 23:35 #

    전 muscly님 comment보고 뜨끔 했습니다. ^^;;
    이타적이면 더 좋다는 뜻으로 적은 것 잘 아시죠? ^^
※ 로그인 사용자만 덧글을 남길 수 있습니다.