클린 코드란? 본문

백앤드 개발일지

클린 코드란?

giron 2021. 6. 29. 20:27
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

 

 

개발 미션과 함께 읽는 클린 코드 | 우아한형제들 기술블로그

{{item.name}} 들어가며 안녕하세요, 미래사업부문의 오지산이라고 합니다. 저는 작년 10월 우아한형제들에 신입 개발자로 입사하면서 처음으로 Spring 위에서 코드를 작성하는 경험을 했습니다. 0의

techblog.woowahan.com

 

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