"함수를 만드는 첫째 규칙은 '작게!'다. 함수를 만드는 둘째 규칙은 '더 작게!'다." (p.42)
"함수는 한 가지를 해야 한다. 그 한 가지를 잘 해야 한다. 그 한 가지만을 해야 한다." (p.44)
"코드를 읽으면서 짐작했던 기능을 각 루틴이 그대로 수행한다면 깨끗한 코드라 불러도 되겠다." (p.49)
"이상적인 인수 개수는 0개(무항)다. 다음은 1개(단항)고, 다음은 2개(이항)다." (p.50)
boolean fileExists("MyFile")
InputStream fileOpen("MyFile")
void passwordAttemptFailedNtimes(int attempts)
Point p = new Point(0,0)
assertEquals(expected, actual)
assertEquals(1.0, amount, .001)
render(boolean isSuite)
→ renderForSuite()
& renderForSingleTest()
String.format("%s worked %.2f hours.", name, hours);
write(name)
write(name)
→ writeField(name)
assertEquals()
→ assertExpectedEqualsActual(expected, actual)
나쁜 예
if (set("username", "myname"))
...
좋은 예
if (attributeExists("username")) {
setAttribute("username", "myname");
...
}
Try/Catch
블록을 별도 함수로 뽑아내고, try
문 안에서 실제 '작업' 메소드를 호출한다.thorws Exception
하여 모든 예외 처리를 한 곳에서 처리한다."어쩌면 중복은 소프트웨어에서 모든 악의 근원이다." (p.60)
바람직한 함수 코드의 예로 저자가 제시한 목록 3-7
코드를 읽었을 때, 코드 흐름만 따라가면 거의 다 바로바로 이해가 돼서 신기했다. 변수가 무슨 뜻인지, 메소드가 무슨 일을 하는 지 고민할 필요 없이 바로 흐름과 관계를 파악할 수 있었다. 이렇게 의문이 들지 않는, 잘 써진 글과 같은 코드를 만들기 위해 고민을 많이 했다는 흔적이 느껴졌다.
이번 챕터에서는 소제목 반복하지 마라
의 내용이 특히 공감이 되었다. 소스 코드에서 중복을 제거하려는 노력이 있었기에 지금의 프로그래밍 기법이 나올 수 있었다는 것이다. 최근 프로젝트에서 코드를 작성하면서, 조금씩 다르지만 사실은 같은 기능을 하는 메소드를 여러개 중복해서 작성한 적이 있다. 작성하면서도 스스로 이 중복으로 점칠된 더러운 코드가 나의 최선이냐며 자책했던 것이 기억이 난다. 여태는 중복된 부분을 고치고 싶어도 시간도 부족하고 올바른 방법을 모르니 일단 방치하고 넘어갔었다. 이제는 함수를 잘 작성하는 가이드를 읽고 배웠으니, 적극 참고해서 코드를 개선할 수 있을 것 같다.
또 한편으로, 나는 이렇게 깔끔한 코드를 쓴 경험이 없어서 걱정도 조금 됐다. 이렇게 좋은 코드를 쓰려면 얼마나 많은 시간을 투자해야 하는 건지, 한 모듈만 이렇게 리팩토링하는 것도 상당한 시간이 필요할 텐데 착착 해내는 능력이 없다면 현실적으로 직장에서 일을 하면서 이런 코드를 쓸 수 없는 게 아닐지 의문이 들었기 때문이다. 실제로 지인들의 인턴 경험을 들어 봤을 때, 이미 작성되어 있던 코드가 워낙 지저분해서 그거 이해하고 고치다가 몇 달이 다 가버렸다는 분들이 꽤 있었다. 현실적으로 고퀄리티의 결과물을 낼 수 있는 환경과 자원이 주어졌으면 좋겠다는 생각이 들었다.
저자는 이런 코드는 한 번에 뚝딱 만들어지는 것이 아니라, 다듬고 바꾸고 고치는 과정을 지나야 얻어지는 것이라고 한다. 클린 코드라는 책을 쓴 저자도 이런 말을 하는 것을 보니, 좋은 코드를 쓰기 위한 능력은 쉽게 얻어지는 것은 아닐 것 같다. 책만 읽고 그냥 넘어갈 것이 아니라, 시간을 많이 투자해서 내 코드들을 더 좋은 코드로 개선시키는 노력을 해야 겠다.