백앤드 개발일지

클린 코드란?

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