2019. 2. 14. 23:20ㆍ[공부] 독서/클린 코드
클린 코드를 위한
주석
이름 | 안좋은 예시 | 비고 |
부적절한 정보 |
변경 이력 |
시스템이 저장해주는 정보는 더이상 저장할 필요없다. |
쓸모없는 정보 |
|
|
성의없는 주석 |
| |
주석 처리된 코드 | 맘놓고 그냥 지워라. Git에서 복구하면 된다. | |
코드로 충분한 정보 | add(3, 5) // 3+5 |
환경
이름 | 안좋은 예시 | 비고 |
한번에 build 가능해야한다 | ||
한번에 test 가능해야한다 |
함수
이름 | 안좋은 예시 | 비고 |
매개변수는 적을 수록 좋다 | ||
매개변수에 boolean을 넣지마라 | 사용자는 true 또는 false 로 호출하면 결과가 어떻게 달라지는지 짐작이 안간다. 애초에 이것이 존재한다는 것은 함수를 쪼갤수 있다는 증거다. | |
출력인수는 사용하지 마라 | int 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 : 컴파일이 가능한지 불가능하지에 사용 가능 |
경계 조건을 테스트하라 | ||
버그 주변을 테스트하라 | 버그는 서로 모이는 경향이 있다. | |
실패 패턴을 살펴라 | ||
테스트는 빨라야한다. |
'[공부] 독서 > 클린 코드' 카테고리의 다른 글
[2019.03.01] 클린 코드 (점진적 개선) (0) | 2019.03.01 |
---|---|
[2019.02.14] 클린 코드 (SerialDate 리팩토링 사례 분석) (0) | 2019.02.14 |
[2019.02.09] 클린 코드 (JUnit 리팩토링 사례 분석) (0) | 2019.02.09 |
[2019.02.09] 클린 코드 (동시성1) (0) | 2019.02.09 |
[2019.02.09] 클린 코드 (시스템, 창발성) (0) | 2019.02.09 |