본문 바로가기

책읽기/클린코드

(21)
냄새와 휴리스틱 - 테스트 T1 : 불충분한 테스트 테스트는 잠재적으로 깨질 만한 부분을 모두 테스트해야 한다. T2 : 커버리지 도구를 사용하라! 커버리지 도구는 테스트가 빠뜨리는 공백을 알려준다. T3 : 사소한 테스트를 건너뛰지 마라 사소한 테스트는 짜기 쉽다. 사소한 테스트가 제공하는 문서적 가치는 구현에 드는 비용을 넘어선다. T4 : 무시한 테스트는 모호함을 뜻한다 T5 : 경계 조건을 테스트하라 경계 조건은 신경써서 테스트한다. 중앙 조건은 올바로 짜놓고, 경계 조건에서 실수하는 경우가 흔하다. T6 : 버그 주변은 철저히 테스트하라 테스트는 모이는 경향이 있다. 버그가 발생했다면 주변을 철저히 테스트하라. T7 : 실패 패턴을 살펴라 입력이 5자를 넘는 테스트 케이스가 모두 실패한다면? 둘째 인수로 음수를 넘기는 테..
냄새와 휴리스틱 - 이름 N1 : 서술적인 이름을 사용하라 이름을 신중하게 선정한다. 소트프웨어가 진화하면 의미도 변하므로 이름이 적합한지 자주 되돌아본다. N2 : 적절한 추상화 수준에서 이름을 선택하라 구현을 드러내는 이름은 피해야 한다. 작업 대상 클래스나 함수가 위치하는 추상화 수준을 반영하는 이름을 선택한다. Modem 클래스는 전화번호로만 등록되지 않는다. getConnectedPhoneNumber() 보다는 getConnectedLocator() 로 이름을 짓고, 아래 메서드에서 추상화를 진행하여 전화번호, USB 등 여러 연결 방식에도 사용 가능하도록 한다. N3 : 가능하다면 표준 명명법을 사용하라 Decorator 패턴을 활용한다면, 장식하는 클래스 이름에 Decorator 라는 단어를 사용해야 한다. toSt..
냄새와 휴리스틱 - 자바 J1 : 긴 import 목록을 피하고 와일드카드를 사용하라 패키지에서 클래스 둘 이상을 사용한다면 와일드카드를 이용해서 전체를 가져오라. 이 항목은 Google Style Gudie 의 와일드카드를 사용하지 말라는 항목과 대치된다. 팀에 맞는 컨벤션을 지키면 될 듯 하다. 명시적인 import 문은 해당 클래스가 있어야 하기에 강한 의존성을 만든다. 하지만 와일드카드는 검색 경로에만 추가하는 것이므로 의존성이 낮아진다. J2 : 상수는 상속하지 않는다. 상수를 공통으로 사용하기 위해 인터페이스에 선언하는 것은 좋지 않다. 대신 상수를 모아놓은 클래스를 정의하고, imort static 을 사용하라. J3 : 상수 대 Enum Enum 은 생성자, 메서드, 필드의 기능을 제공한다. 상수보다 훨씬 좋은 기..
냄새와 휴리스틱 - 일반 G1 : 한 소스 파일에 여러 언어를 사용한다. 현실적으로는 힘들긴 하다. 각별한 노력을 기울여 소스파일에서 언어 수와 범위를 최대한 줄여야 한다. G2 : 당연한 동작을 구현하지 않는다 최소 놀람의 원칙에 따라, 함수나 클래스는 다른 프로그래머가 당연하게 여길만한 기능을 제공해야 한다. 요일 문자열을 Enum으로 변환하는 다음 코드를 보자. Day day = DayDate.StringToDay(String dayName); 독자는 StringToDay() 가 Day.MONDAY 로 변환해줄 것을 기대한다. 대소문자는 당연히 구분하지 않을 것이라 기대한다. 이런 당연한 기능을 구현하지 않으면 코드를 읽거나 사용하는 사람이 더 이상 함수 이름만으로 함수 기능을 예상하기 어렵다. G3 : 경계를 올바로 처리..
냄새와 휴리스틱 - 함수 F1 : 너무 많은 인수 함수에서 인수는 적을수록 좋다. 없는 것이 제일 좋다. 넷 이상은 죽기직전까지 피한다. F2 : 출력 인수 출력 인수는 직관적이지 않다. 보통 함수에서 인수는 입력으로 인식된다. 함수에서 뭔가의 상태를 변경해야 한다면, 함수가 속한 객체의 상태를 변경한다. F3 : 플래그 인수 플래그 인수는 함수가 열여러 기능을 수행한다는 증거다. if 분기에 따라 여러 일을 하기 때문. 객체지향 원칙에 어긋난다. F4 : 죽은 함수 아무도 호출하지 않는 함수는 삭제한다. 논리상 필요하다 싶어도 삭제한다. 기억은 소스 코드 관리 시스템이 하니 걱정말자.
냄새와 휴리스틱 - 환경 E1 : 여러 단계로 빌드해야 한다. 빌드는 간단히 한 단계로 끝나야 한다. 빌드를 하기 위해 컴퓨터 여기저기의 JAR, XML 등을 찾아 헤메는 일이 없어야 한다. E2 : 여러 단계로 테스트해야 한다. 모든 단위 테스트는 한 명령으로 돌릴 수 있어야 한다. IDE 에서 버튼 하나로 모든 테스트를 돌릴 수 있는 것이 이상적. 어떤 환경에서라도 한 명령으로 모든 테스트를 돌릴 수 있어야 한다.
냄새와 휴리스틱 - 주석 휴리스틱 : 불충분한 시간이나 정보로 인하여 합리적인 판단을 할 수 없거나, 체계적이면서 합리적인 판단이 굳이 필요하지 않은 상황에서 사람들이 빠르게 사용할 수 있게 보다 용이하게 구성된 간편추론의 방법이다. C1 : 부적절한 정보 소스 코드 관리 시스템, 버그 추적 시스템, 이슈 추적 시스템, 기타 기록관리 시스템에 저장할 정보는 주석으로 넣지 않는다. 작성자, 최종 수정일, SPR 번호 등 메타 정보 이외에는 보통 불필요. 주석은 코드와 설계에 기술적인 설명을 부연하는 수단. C2 : 쓸모없는 주석 오래된 주석, 엉뚱한 주석, 잘못된 주석은 쓸모없다. C3 : 중복된 주석 코드만으로 충분한 내용을 중복해서 설명하는 주석. 서명 (signature) 만 달랑 있는 Javadoc C4 : 성의 없는 주석..
Junit 들여다보기, SerialDate 리펙터링 이 두 단원은 Junit, SerialDate 두 코드를 저자가 리펙토링하는 과정을 담는다. 그 기준은 17장 냄세와 휴라스틱에 나열된 냄새들로 리펙토링을 진행한다. 세세한 내용은 냄새와 휴라스틱 정리에서 같이 작성예정입니다. 보충 공부해야 할 개념 : 추상 팩터리 패턴 데코레이션 패턴 코드 커버리지, 코드 커버리지 도구 Jacoco