이번 항목부터 40 항목까지 스타일에 대한 이야기를 한다.

1 ) 명료하고 이해하기 쉬운 코드는 누구에게 도움이 될까?

당연히 누구에게나 도움이 된다. 그 중 가장 도움이 되는 사람은 바로 자기 자신일 것이다. 예전에도 그랬고 지금도 그런데, 일화로 3주일 전에 짠 코드를 다시 볼 일이 생겼었다. 코드를 보니, 최적화를 한다고 여기 저기 if 들이 있었고, 변수명과 함수명으로는 도저히 감을 못잡겠다. 더군다나 어떻게 돌아가는지 몰라서, 결국 실행해 보면서 코드를 쫒아 보는 사태가 발생했다.

.. 이 경험을 통해서 한가지 교훈을 얻게 되었는데, "나 때문에 코드를 간단하게 만들자." 로 되었다.


2 ) 다음 코드는 기존 컨테이너들에 대한 색인 테이블 생성을 위한 흥미롭고 유용한 관용구를 보여준다. 색인 테이블에 대한 좀 더 자세한 설명은 원래의 글[Hicks00]을 보기 바란다.

아래 코드를 조사하고, 다음을 지적하라.

a. 유효하지 않는 구문이나 이식성이 없는 관례 등의 기술적인 오류들

4 라인, 이 헤더 파일은 표준이 아니다. 그러므로 algoritm 으로 변경 해야 한다.

원래 책이라면, std:: 라 든지, iostream 이라든지, main 이라든지의 문제점을 지적하지만, 이건 알고 있는 관계로 넘긴다.


b. 코드의 명료성, 재사용성, 유지보수성을 향상시킬 수 있는 스타일 상의 개선 사항들

위의 코드는 무엇을 하는것인가?

컨테이너를 정렬시킨 후 정렬된 것으로 되돌려 준다. 그런데, 일반화되어 있지 않아, 고쳐보기로 하자.

ㄱ. const 정확성을 지킬 것

어디서? 바로 sort_idxtbl_pair 의 멤버 함수에서이다. 그 중에 operator < 는 내부 요소를 변경시키지 않으므로 const 를 붙여 주는게 좋다.

ㄴ. 잉여 코드를 제거 할 것

.. struct 에 굳이 set을 만들 필요가 없다.(간혹 사용하기 편하게 하기 위해서 쓸 때도 있다. 경우에 따라서 아닐 수도 있으니, 분석해 보고 잘 처신해야 될 것이다.)

ㄷ. 이름을 잘 선택 할 것

sort_idxtbl 은 .. 오해하기 쉽다. 왜냐하면 색인 테이블을 만들어 주는 함수를 색인테이블 이라고 했으니 말이다.

ㄹ. 일관성을 지킬 것

36, 45 라인에서 for 문의 사용이 다르다. 초기화 구역에 선언해도 되면 초기화 구역에 쓰는게 100번 좋다.

ㅁ. 불필요한 복잡성은 제거 할 것

변수를 불필요하게 사용하여, 복잡성을 가중 시켰는데, 29 라인은 전혀 필요가 없고, 33, 34, 35 라인 역시 필요가 없다. 함수의 매개변수 first 사용해도 무방하다. 43라인, 역시 똑같으며, 44 라인에선 ... 잠깐 생각하게 만든다.


ㅂ. 재사용 첫 번째 : 표준 라이브러를 좀 더 많이 재사용할 것.

sort_idxtbl_pair 은, std::pair 로 대체가 가능하고, boost::tuple 로도 대체가 가능하다. 재사용도 재사용이지만, 이해가 훨씬 빨라지는 장점도 있다.

ㅅ. 재사용 두 번째 : 구현 자체를 좀 더 재사용하기 쉽게 만들면 일석이조의 효과를 얻을 수 있다.

sort_idxtbl_pair 을 표준 std::pair 를 사용하지 않는다면, 사용 자체를 재사용 있게 했다면 좋았을 것이다. 예를 들자면 int i 말고 T i 로 했으면 더 좋았을 것이다.

ㅇ. 재사용 세 번째 : 함수 서명을 개선할 것

27라인, int * 보다 T형 으로 받아 vector 등도 받을 수 있게 바꾸었으면 좋았을 것 같다.

ㅈ. 재사용 네 번째 : 반복자를 비교할 때에는 != 선호 할 것

당연하다. 다른 iterator 를 받아야 될 때 컴파일 에러가 뜬다.

ㅊ. 이전 값이 꼭 필요한 것이 아니라면 전증가를 선호하라.

36, 45 라인의 for 문 후처리 구역에서, iterator 을 후위연산을 했는데, 다 알겠지만 쓸때없는 작업을 한다. 일전에 포스팅 한거 같은데, http://www.ikpil.com/653 에서 참조 하면 된다.


총평

..한번 만들어 보는 것도 도움 될 듯. ^^ 17 라인에서 함수의 매개변수를 "_변수명" 이라고 했는데 앞에 " _ " 를 넣는 것은 비추한다. 왜냐하면 컴파일러가 전처리기에 많이 쓰기 때문이다. 읽는 내내 오캄의 면도날이 생각 났다.

신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요