clean code & refactoring
클린 코드 (2)
허원철
2017. 3. 26. 18:21
이번 글은 '클린 코드 시작하기'에 이은 글입니다.
의미 있는 이름 짓기
1) 이름을 명명할 때 명확하게 의도가 드러나도록 합니다.
ex) 학생 이름
1 2 | String studentName; ------------------- (O) String nm; ---------------------------- (X) | cs |
2) 흡사한 이름을 사용하거나 유사한 개념을 다르게 표기하는 행위는 피하도록 합니다.
1 | Map<String, Student> studentList; ------------------------ (X) | cs |
3) 의미가 있게 구분합니다.
4) 검색하기 쉬운 이름을 사용합니다.
1 2 3 4 5 | if ( getDayOfWeek() == 1 ) --------------- (X) private static final MONDAY = 1; ... if ( getDayOfWeek() == MONDAY ) ---------- (O) | cs |
5) 클래스명은 명사나 명사구, 메소드는 동사나 동사구로 시작하도록 합니다.
1 2 | Class : Cutomer, Account, ... Method : getXXX(), setXXX(), isXXX(), ... | cs |
6) 개념 하나에 단어 하나를 사용합니다.
- fetch, retrieve, get... 등등 섞어 쓰지 않습니다.
함수 만들기
- 제어문 단위로 적절하게, 한 함수에서 한가지 일만 하게 만듭니다.
1) 최대한 작게 만듭니다.
1 2 3 | private boolean isEmpty(String value) { return value == null || "".equals(value); } | cs |
2) 제어문 단위로 적절하게 함수를 만듭니다.
3) 함수 하나당 하나의 일만 수행합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | private void method() { for() { ... } for() { ... } } ----------------------------- ( X ) private void method() { for1(); for2(); } ----------------------------- ( O ) | cs |
4) 한 함수에서 추상화수준(깊이)을 하나로 합니다.
- 꼬리에 꼬리를 무는 메소드는 되도록이면 쓰지 않습니다.
5) switch 문을 드러내지 않도록 합니다.
- 디자인 패턴인 팩토리 패턴을 활용하는 것을 추천합니다.
6) 서술적인 함수명을 사용합니다.
- findStudentByStudentId(), findStudentByStudentNumber() 등등
7) 어규먼트는 최대한 적게 사용합니다.
- 플래그 어규먼트 사용하지 않는다.
- 어규먼트들을 클래스화 할 수 있는지 확인합니다.
1 2 3 | private List<Area> findAreaByPointXAndPointY(double pointX, double pointY) --- (X) private List<Area> findAreaByPoint(Point point) ------------------------------ (O) | cs |
8) 함수 안에 부수 기능을 숨기지 않습니다.
1 2 3 4 | private List<Student> findById(Long id) { deleteStudentById(id); return ... } ------------------------------------- (X) | cs |
9) 명령과 조회를 구분합니다.
1 2 3 | if ( setPoint(127.000000, 37.000000) ) { } ------------------------------------- (X) | cs |
10) 복잡한 구조에서는 예외처리를 이용합니다.
11) 반복 코드를 사용하지 않습니다.
12) 큰 구조에서는 두개이상의 return 문을 넣지 않도록 합니다.