PART Ⅲ. 코드 재작성하기.
12장. 생각을 코드로 만들기
- 복잡한 생각을 다른 사람에게 설명할 때 중요하지 않은 자세한 내용 때문에 듣는 사람을 혼동시키는 일이 종종 있다.
- '쉬운 말'로 자신의 생각을 지식이 부족한 사람에게 전달하는 기술은 매우 중요하다.
- 여기에는 설명할 내용을 걸러서 요지만 뽑아내는 능력이 요구된다.
- 코드도 마찬가지로 '쉬운 말'로 작성되어야 한다.
- 이 장에서 설명할 코드를 더 명확하게 만드는 간단한 과정은 다음과 같다.
1. 코드가 할 일을 다른 사람에게 설명하듯이 '쉬운 말'로 묘사하라.
2. 이 설명에 들어가는 핵심적인 단어와 문구를 포착하라.
3. 설명과 부합하는 코드를 작성하라.
__1. 논리를 명확하게 설명하기
- 예제 코드는 '사용자가 페이지를 볼 수 있는 허가가 있는지를 확인하고, 만약 허가되어 있지 않으면 이를 설명하는 페이지를 반환한다.'
- 예제 코드를 쉬운 말로 묘사하면 다음과 같다.
사용이 허가되는 경우는 두가지다.
1) 관리자다.
2) 관리자는 아니지만 소유하고 있는 문서이다.
그렇지 않으면 허가되지 않는다.
- 이를 이용해 수정한 예제 코드는 비어있는 본문 두개를 포함하게 되어서 조금 이상해보인다.
- 하지만 코드의 분량이 더 적고, 부정문이 없어서 논리도 더 간단해졌다.
- 즉, 더 이해하기 쉬워졌다.
__2. 라이브러리를 알면 도움이 된다.
- 간결한 코드를 작성하는 기술 중 하나는 라이브러리가 제공하는 기능을 잘 활용하는 것이다.
__3. 논리를 쉬운 말로 표현하는 방법을 더 큰 문제에 적용하기
- 예제 코드는 주식 구매현황을 기록하는 시스템이다.
- 각 거래는 다음의 네가지 데이이터 조각으로 포함한다.
time(구매의 정확한 날짜와 시간), ticker_symbol(예, GOOG), price(예, $600), number_of_share(예, 100)
- 문제는 이 값들이 시간과 세개의 값이 하나씩 포함된 세개의 서로 다른 테이블에 따로 존재하며 이를 합쳐야한다는 것이다.
- 더 큰 문제는 어떤 행은 아예 존재하지 않으며, 존재하지 않는 행을 무시하면서 세 개의 테이블에서 time값이 동일한 행을 연결해야한다는 것이다.
- 이를 해결하기 위해 하려는 일을 쉬운 말로 묘사하면 다음과 같다.
세 개 반복자를 병렬적으로 동시에 읽는다.
어느 행의 time이 일치하지 않으면, 일치할 때 까지 앞으로 한칸씩 나아간다.
일치된 행을 출력하고, 다시 앞으로 나아간다.
일치하는 행이 더 이상 없을 때 까지 이를 반복한다.
- 이 중 가장 지저분하게 작성되는 곳은 두번째 줄이며 이를 함수로 분리할 수 있다.
- 이 함수가 하는 작업을 다시 한번 쉬운말로 묘사하면 다음과 같다.
각 테이블의 현재 행에서 time을 확인한다. 값이 모두 같으면 작업이 완료된 것이다.
그렇지 않으면 값이 '뒤쳐진' 행을 한 칸 전진시킨다.
행이 모두 동일한 time을 가질 때까지 혹은 반복자 중의 하나가 끝에 이를 때까지 작업을 반복한다.
- 여기에서 주목할 부분은 이 설명이 우리가 해결하려는 상위 문제와 관련된 어떠한 사항도 언급하지 않는다는 점이다.
- 따라서 변수명을 더 간단하고 일반적이게 바꿀 수도 있다.
__4. 요약
- 자신의 문제를 쉬운 말로 설명할 수 없으면, 해당 문제는 무언가 빠져 있거나 아니면 제대로 정의되지 않은 것이다.