kok202
[2019.02.14] 클린 코드 (정리 : 냄새와 휴리스틱)

2019. 2. 14. 23:20[공부] 독서/클린 코드

클린 코드를 위한 


주석

 이름

 안좋은 예시

비고

 부적절한 정보

 변경 이력

 시스템이 저장해주는 정보는 더이상 저장할 필요없다.

 쓸모없는 정보

 

 

 성의없는 주석

 

 
 주석 처리된 코드 

 맘놓고 그냥 지워라. Git에서 복구하면 된다.

 코드로 충분한 정보

 add(3, 5) // 3+5

 




환경

 이름

안좋은 예시

비고

 한번에 build 가능해야한다

  

 한번에 test 가능해야한다

  




함수

 이름

안좋은 예시

비고

 매개변수는 적을 수록 좋다

  
 매개변수에 boolean을 넣지마라 

 사용자는 true 또는 false 로 호출하면 결과가 어떻게 달라지는지 짐작이 안간다. 애초에 이것이 존재한다는 것은 함수를 쪼갤수 있다는 증거다.

 출력인수는 사용하지 마라

 int num;
 scanf("%d", &num);

 scanf에 num을 넣는건 입력이 아니라 scanf 를 통해 값을 받아오려 하는것

 죽은 함수

 

 호출되지 않는 함수는 지워라

 static 함수를 남발하지 마라  
 이름을 잘 붙여라 Date.add(3)

 3년 추가인지 3달 추가인지 3일 추가인지 모른다.

 함수는 하나만 해라  

 함수는 추상화 level 을 하나씩만 내려가라

  




일반

 이름

안좋은 예시

비고

 하나의 파일은 하나의 언어

 JSP

 JSP에 HTML, java, javascript, css 다 쓰면 조잡하다.

 당연한 동작은 구현해라

 

 경계 처리는 똑바로 해라

 

 경계는 열심히 테스트 돌려봐라

 경계 조건을 캡슐화 해라

  

 안전 절차를 지켜라

  컴파일러 경고를 줄이려고 해라

 중복 없애라

  코드 중복은 추상화가 필요하다는 신호다.
 추상화 수준을 올바르게해라  

 부모가 자식 class를 의존하지마라

 

 부모클래스와 자식클래스는 다른 jar 파일로 배포해라

 과도한 정보 

 인터페이스가 너무 많은걸 제공하면 결합도만 오른다.

 죽은 코드

  호출되지 않는 코드는 지워라
 호출되지 않는 생성자는 지워라

 수직 분리

 

 지역 변수는 호출되는 시점 전에 생성해라

 함수는 호출된 순서로 가깝게 위치 시켜라

 일관성을 지켜라

  

 인위적으로 결합하지마라

 public class MyClass{

    enum MyType{...}

 }

 enum을 특정 클래스 안에 속하게 하지마라

 기능 욕심

  클래스가 다른 객체의 값을 변경하지마라

 본인만 아는 형태로  작성하지마라

  

 제대로 된 곳에 제대로 넣어라

 

 PI 상수값은 삼각함수 클래스에 있는게 맞다.

 서술적으로 변수를 작성하라

 

 계산이 복잡하다면 계산을 여러 단계로 나누고 중간값에 서술적인 변수 이름을 붙여라

 의존성은 물리적으로 드러내라 

 예를들어 어떤 클래스는 어떤 하드 코딩 된 값에대해 어떻게 처리할줄 알아야한다. = 논리적 의존성이 존재하는 상황이다. 

 시간 결합은 숨겨져선 안된다

 

 숨겨진 시간 결합을 없애는 테크닉

 다형성을 활용해라

 

 if/else문을 줄이고 switch문을 줄여라

 switch 문을 쓰지마라

 

 다형성 객체를 new 할 때만 switch문을 사용해라

 상수 값을 사용해라

 매직 넘버 본인만 아는 숫자, 문자열로 하드 코딩하지마라

 정확히 해라

 

 부동소수점으로 화폐 표시하는건 미친 짓이다.

 관례보다 구조를 사용해라

 

 구조는 강제한다.

 조건문이 복잡하면 함수로 빼라

 

 
 부정 조건문은 피해라  이해하기 힘들다.

 public class는 파일로 분리해라

 

 public class in public class 는 피하는게 맞다.

 설정 정보는 최상위에 둬라  

 디미터 법칙을 생각하라

 

 디미터 법칙 : A->B->C 를 사용하더라도 A가 C를 알 필요없는것이 좋다.




자바

 이름

안좋은 예시

비고

 긴 import 목록을 피해라 

 

 * 와일드카드를 사용해라. import java.util.*;

 상수 상속은 하지마라

 

 import static 테크닉을써라

 enum을 적극 사용하라

 

 public static final int 이건 옛날 기교다. enum 이 훨씬 유연하고 서술적이다. 심지어 enum은 abstract 메서드도 사용할 수 있다. 참고




명명법

 이름

안좋은 예시

비고

 서술적인 이름을 사용해라

 


 추상화된 클래스의 level 에 맞춰 이름을 지어라

  

 표준 명명법을 사용하라

  
 명확한 이름을 써라  
 이름 길이는 함수의 범위 길이에 비례해라  함수가 짧으면 count 보다 n이 나을 수 있다.

 인코딩을 피해라

 

 이제 m_, m 붙이지마라

 이름으로 부수효과를 설명하라 

 객체를 받아오는 함수가 초기화 지연 함수라면 get 만으로는 부족할 수 있다. createOrReturn 과 같이 서술하라




테스트

 이름

 안좋은 예시

비고

 불충분한 테스트

  

 커버리지 도구 사용해라

 

 테스트 되는 행, 테스트 되지 않은 if 블록을 볼 수 있다.

 사소한 테스트도 눈여겨봐라

  

 무시한 테스트는 모호함을 뜻한다

 

 @Ignore : 컴파일이 가능한지 불가능하지에 사용 가능

 경계 조건을 테스트하라 
 버그 주변을 테스트하라  버그는 서로 모이는 경향이 있다.
 실패 패턴을 살펴라  
 테스트는 빨라야한다.