지난 글에 이어서 클린코드를 읽어 보고 마음에 든 부분을 발췌하였다.
코드 형식은 의사소통의 일환이다. 의사소통은 전문 개발자의 일차적인 의무다. (96p)
오늘 구현한 기능이 다음 버전에서 바뀔 확률은 아주 높다. 그런데 오늘 구현한 코드의 가독성은 앞으로 바뀔 코드의 품질에 지대한 영향을 미친다. (96p)
신문 기사처럼 작성하라 (98p)
개념적 유사성. ...친화도가 높을수록 코드를 가까이 배치한다. (106p)
탐은 한 가지 규칙에 합의해야 한다. 그리고 모든 팀원은 그 규칙을 따라야 한다. 그래야 소프트웨어가 일관적인 스타일을 보인다. 개개인이 따로국밥처럼 맘대로 짜대는 코드는 피해야 한다. (113p)
객체는 동작을 공개하고 자료를 숨긴다. ...자료 구조는 별다른 동작 없이 자료를 노출한다. ...시스템을 구현할 때, 새로운 자료 타입을 추가하는 유연성이 필요하면 객체가 더 적합하다. 다른 경우로 새로운 동작을 추가하는 유연성이 필요하면 자료 구조와 절차적인 코드가 더 적합하다. (127-128p)
디미터 법칙(Law of Demeter)은 잘 알려진 휴리스틱으로, 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙이다.
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath()
흔히 위와 같은 코드를 기차 충돌(train wreck)이라 부른다. 여러 객차가 한 줄로 이어진 기차처럼 보이기 때문이다.
Options opts = ctxt.getOptions();
File sctatchDir = opts.getScratchDir();
final String outputDir = sctatchDir.getAbsolutePath();
오류 코드보다 예외를 사용하라. (130p)
이 부분은 코드를 보면 명확하게 이해할 수 있다.
if () {
// 동작
if () {
// 동작
} else {
// 에러 처리
}
} else {
// 에러 처리
}
위 같은 방식은 끔찍하다. 예외를 지원하지 않는 프로그래밍 언어가 많았던 시절에 쓰던 방법이었지만 이제 다음과 같이 예외를 던지는 방법을 사용할 수 있다.
try {
동작함수()
} catch (e) {
// 에러 처리
}
동작함수 () {
동작();
throw new Error("에러 발생");
}
위 코드는 결과적으로 동작 알고리즘과 에러 처리 알고리즘을 분리하여 코드 품질도 나아졌다.
try-catch-finally 문부터 작성하라. (132p)
예외가 발생할 코드를 짤 경우 try-catch-finally 구조로 먼저 시작해 보자. try-catch 구조로 범위를 정의한 이후 TDD로 나머지 논리를 추가하면 코드 작성을 수월하게 할 수 있다고 한다.
null을 반환하지 마라 (138p)
null을 전달하지 마라 (140p)
오류 처리는 조금 더 나아가 특수 상황을 직접 처리할 필요 자체를 없애는 것이 좋다고 한다. 특수 사례를 처리하는 클래스나 객체를 만들어 사용하면 클라이언트 코드가 예외 상황을 직접 처리할 필요가 없어진다.
곧바로 우리쪽 코드를 작성해 외부 코드를 호출하는 대신 먼저 간단한 테스트 케이스를 작성해 외부 코드를 익히면 어떨까? 짐 뉴커크(Jim Newkirk)는 이를 학습 테스트라 부른다. (147p)
소프트웨어 설계가 우수하다면 변경하는데 많은 투자와 재작업이 필요하지 않다. ...통제하지 못하는 코드를 사용할 때는 너무 많은 투자를 하거나 향후 변경 비용이 지나치게 커지지 않도록 각별히 주의해야 한다.(151p)
다음 장에서 이어집니다.