켄트백의 Tidy First?

켄트백의 소프트웨어 설계 시리즈 책으로, 개발자 스스로 할 수 있는 간단한 수준에서의 소프트웨어 설계를 다루고 있습니다. 본 책을 읽고 이해한 내용을 정리한 글입니다.
책에서는 큰 소프트웨어 설계보다 작은, 적절한 수준의 소프트웨어 설계를 통해 변화를 쉽게 만드는 것을 다루고 있습니다.

1장. 코드 정리법

  • 간단한 수준의 리팩토링을 다룹니다.
  • 반드시 작은 단계를 거쳐 코드를 정리해야 합니다. 큰 설계가 일으킬 장애가 무섭다면, 작은 단계로 작업합니다. 그래도 무섭다면 무서워지지 않을 때까지 작은 단계로 작업합니다.

보호 구문,Guard Clause

중첩된 조건은 가독성을 떨어트립니다.

1
2
if(조건)
if(다른 조건 부정)

위와 같은 코드보다는 다음과 같이 정리된 코드가 마치 코드의 세부사항을 살펴보기전에 전제조건이 있습니다 라고 말하는 것처럼 가독성이 좋습니다.

1
2
if(조건A) return 
if(조건B) return

안 쓰는 코드 제거

Reflection을 사용한 코드는 추적이 어려워, 코드 제거 후 테스트가 필요합니다. 코드를 제거하더라도 형상 관리 도구를 통해 원복할 수 있으니, 지우는 것을 걱정할 필요가 없습니다.

대칭으로 맞추기.

초기화 지연 코드를 예시로 같은 역할을 수행하는 코드라도 다른 방식으로 작성될 수 있습니다.

1
2
3
4
5
6
7
8
9
10
foo(){
return foo if foo not null;
foo := ...;
return foo;
}
foo(){
if foo is null
foo:= ...;
return foo;
}

위 코드들은 모두 foo 가 있으면 반환하고 없으면 만들어서 반환하라는 코드입니다. 어떤 방식이든 한 가지 방식을 선택해서 정합니다.
즉 일관성이 있어야 합니다. 일관성이 없으면 코드를 읽을 때 더 많은 노력을 요구합니다.

새로운 인터페이스로 기존 루틴 부르기

루틴을 호출해야 하는데, 기존 인터페이스 떄문에 어려운 경우는 새로 만든 통로 인터페이스(pass-through interface)를 만들어 기존 인터페이스를 호출합니다.

통로 인터페이스를 이용해 설계를 했다면 변경이 용이합니다.

읽는 순서

당연한 말이지만 읽기 좋은 순서로 코드를 정렬하는게 좋습니다.

응집도를 높이는 배치

변경이 같이 되는 코드는 가까이 위치시킵니다. 즉 두 루틴에 결합도가 높다면 바로 옆에 위치 시킵니다.
파일에 결합도가 높다면 같은 디렉토리에 위치시킵니다.

Read more