일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Level2
- JUnit5
- Spring Batch
- HTTP
- 레벨2
- 우테코
- REDIS
- 코드리뷰
- Paging
- AOP
- JPA
- 의존성
- 프리코스
- MSA
- 미션
- mock
- CircuitBreaker
- yml
- 서블릿
- 프로그래머스
- 스프링 부트
- AWS
- 자바
- 우아한테크코스
- 세션
- 백준
- 우아한세미나
- Docker
- 스프링부트
- 트랜잭션
Archives
- Today
- Total
늘
클린 코드란? 본문
728x90
- 클린 코드란?
- 한마디로는 가독성 좋은 코드, 코드를 작성하는 의도나 목적이 명확해야 하고 다른 사람이 쉽게 읽을 수 있는 코드를 말한다.
1. 의미있는 이름 & 네이밍(Naming)과 주석달기
- 범용적으로 사용되는 단어는 사용하지 않는게 좋다.
- 연속된 숫자는 피하는게 좋다.
- 의도를 분명히 밝혀라
- 주석은 반드시 필요한 경우에만 작성하는것이 좋다. (설명을 위한 설명은 달지 않는다.)
getActiveAccount();
getActiveAccounts();
getActiveAccountInfo();
//3가지 모두 getAccount()와 구별이 어렵다
//다른 예시로
customerInfo는 customer와 차이가 없으므로 더 명확하게 이름을 짓자
- 발음하기 쉬운 이름을 사용하라 & 검색하기 쉬운 이름을 사용하라
- 함수가 길어지더라도 찾기 쉬운 이름이 좋다. WORK_DAYS_PER_WEEK와 같이 설정하자
- 맴버 변수의 접두어는 옛날 스타일이다. 요즘은 접두어를 보지않고 IDE의 기능을 이용하는게 훨씬 좋다.
- 접두어보단 '프로그래머 용어'를 사용하고 그게 안되면 '문제 영역'에서 이름을 가져와야한다.
- 이 두가지 모두 불가능하면 그 때 접두어를 사용하자
- 클래스 이름: 명사나 명사구가 적합(Customer, WikiPage) - 부적절 예시(Manager, Data, Info 등) 동사 사용X
- 메서드 이름: 동사나 동사구가 적합(postPayment, deletePage, save)
- 생성자를 overload할 때는 정적 팩토리 메서드를 사용하자
Complex fulcrumPoint = Complex.FromRealNumber(23.0); //Best
Complex fulcrumPoint = new Complex(23.0); //Worst
//생성자 사용을 제한하려면 private으로 선언하자!
- 불필요한 맥락을 없애자: GasStationDeluxe(고급 휘발유 충전소) 애플리케이션을 만들때, 모든 클래스 이름에 GSD로 시작할 필요가 전혀 없다는 것이다. 뜻이 명확하면 이름은 짧을수록 좋다
2. 규칙성
- 일관성있고 간결한 들여쓰기와 줄바꿈으로 가독성을 향상 시키는 것이 좋다.
- 왼쪽에는 변수, 오른쪽에는 상수를 두고 비교하자
- 부정보다는 긍정을 다루자
- do/while루프는 피하자
3. 함수 하나로 한 가지 일만 하는 것
public Resource getResource(String filename) {
String key = resolveKey(filename);
S3Object s3Object = getS3Object(key);
return makeResource(s3Object);
}
private String resolveKey(String filename) {
return rootLocation.resolve(filename).toString();
}
private S3Object getS3Object(String key) {
checkIfObjectExists(key);
return amazonS3.getObject(bucketName, key);
}
private void checkIfObjectExists(String key) {
if (!amazonS3.doesObjectExist(bucketName, key)) {
throw new FileNotFoundException();
}
}
위와 같이 한가지 일만 명확하게 함수에 두고, 함수의 호출 순서에 따라 아래로 나열한 것을 볼 수 있다.
함수의 추상화가 낮아지는 순서로 작성하자! 코드는 위에서 아래로 이야기처럼 읽혀야 좋다!
- 함수는 작게 작게 작게 만들수록 좋다!(ex) if/else/while문 등에 들어가는 블록은 한 줄이어야 한다.
- 즉, 함수에서 들여쓰기 수준은 1단이나 2단을 넘어서면 안 된다.
- 함수의 인수는 0개일 때가 Best이다. 적으면 적을수록 좋다.
4. 단위 테스트를 작성할 때 규칙
- 함수 하나가 개념 하나만 테스트하도록 한다.
- 개념 당 assert문의 수는 최소로 줄인다.
5.리팩토링
- 코드리뷰를 통해 레거시 코드를 클린 코드로 개선해나가는 것
- 리펙토리 대상
- 메소드 정리: 그룹으로 묶을 수 있는 코드, 수식을 메소드로 변경함
- 데이터 구성 : 캡슐화 기법을 적용해 데이터 접근 관리
- 조건문 단순화 : 조건 논리를 단순하고 명확하게 작성
- 클래스 및 메소드 일반화 : 동일 기능 메소드가 여러개 있으면 수퍼클래스로 이동
내용이 많고 나름 중요하고 금방 적용할수 있는 부분부터 작성했는데 아직은 전부 이해하기 어려운것 같다..ㅜㅜ
전부 읽어보고 더 자주 복습을 해야하겠다는 생각이 든다.
6. 응집도와 결합도
- 응집도는 높을수록 좋다 : 인스턴스 변수가 선언되면 클래스 내의 모든 매서드에서 사용될수록 응집도가 높다.
- 코드를 이해하기 쉬워진다.
- 재사용성이 좋아진다.
- 유지보수가 좋다.(한 곳에 모여있으므로 한 번에 수정)
- 결합도는 낮을수록 좋다 : 인터페이스와 추상 매서드를 사용하여 공통된 매서드는 최대한 추출한다.
- 변경에 유연해진다. (수정할 클래스만 수정하면 된다.)
- 재사용성이 좋아진다.
클린 코드 스터디 레포지토리
공부 자료: https://github.com/broooom/clean-code
- Refernce
728x90
'백앤드 개발일지' 카테고리의 다른 글
Swagger2 (0) | 2021.07.19 |
---|---|
GitLab 버전 관리와 협업 하면서 막혔던 부분 기록 일지 (0) | 2021.07.12 |
TDD, BDD, DDD (0) | 2021.07.04 |
CI와 CD 그리고 Jenkins? 어디서 들어는 봤는데... (0) | 2021.04.25 |
DTO? DAO? (0) | 2021.03.10 |
Comments