공부하는 Nar
article thumbnail
Published 2023. 10. 19. 16:58
클린코드 규칙 설명 우테코

한 함수(메서드)에 최소한의 들여쓰기(indent)만 허용했는가? (최대 depth : 2까지만 허용)

예시로, while문 안에 if문이 있으면 들여쓰기는 2다.


indent(들여쓰기) depth를 줄이는 가장 좋은 방법은 함수(또는 메서드)를 분리하는 것이다.

 

else 예약어를 사용하지 않았는가?

if와 else if 사용은 자유롭게 가능하다.

else와 같이 조건없이 모든 경우를 열어주는 코드는 큰 버그를 초래할 수 있기 때문에 지양하는 것이 좋다.


else 예약어를 사용하지 말라는 것을 조금 더 넓은 관점에서 생간한다면
분기문을 줄여 작성하라는 것으로 볼 수 있다.  더보기

 

모든 원시값과 문자열을 포장했는가?

변수를 선언하는 방법에는 두 가지가 있다.

int age = 20; //원시 타입의 변수
Age age = new Age(20); //원시 타입의 변수를 객체로 포장한 변수

원시 타입의 변수를 선언하는 방법과

원시 타입의 변수를 객체로 포장한 변수를 선언하는 방법이 있다.

Collection으로 선언한 변수도 포장한다. (이를 일급컬렉션이라 하며 추가 내용은 규칙 4번을 참고)


객체지향 생활 체조 원칙에도 언급된 원시 타입의 값을 객체로 포장하면 얻을 수 있는 이점에 대해서는 링크 참고

 

콜렉션에 대해 일급 컬렉션을 적용했는가?

먼저 일급 컬렉션을 간단하게 설명하자면, 아래의 코드를

Map<String, String> map = new HashMap<>();
map.put("1", "A");
map.put("2", "B");
map.put("3", "C");

아래와 같이 Wrapping 하는 것을 의미한다.

public class GameRanking {
    private Map<String, String> ranks;

    public GameRanking(Map<String, String> ranks) {
        this.ranks = ranks;
    }
}

정리하면 Collection을 Wrapping하면서,

그 외 다른 멤버변수가 없는 상태를 일급 컬렉션이라 한다.  더보기


Collection 객체는 여러 원소들을 담을 수 있는 자료구조를 뜻한다.
배열이 가장 기본적인 자료구조이며, DTO 또한 자료를 담는 하나의 방식이라 볼 수 있다.  더보기

 

3개 이상의 인스턴스 변수를 가진 클래스를 구현하지 않았는가?

인스턴스 변수가 많아질수록 클래스의 응집도는 낮아진다.

마틴 파울러는 대부분의 클래스가 인스턴스 변수 하나만으로 일을 하는 것이 적합하다고 말했다.

최대한 클래스를 많이 분리하게금 강제하여 높은 응집도를 유지할 수 있게 한다.

//기존 코드
public class Car {
    private String brand;
    private String model;
    private int year;
    private String color;
    private int currentSpeed;
    private int maxSpeed;
    private boolean engineStarted;
    private boolean lightsOn;
    private boolean wipersOn;
    private boolean parkingBrakeEngaged;
    // ...
}
//수정된 코드
public class Car {
    private String brand;
    private String model;

    public Car(String brand, String model) {
        this.brand = brand;
        this.model = model;
    }

    public String getBrand() {
        return brand;
    }

    public String getModel() {
        return model;
    }
}

public class Engine {};
public class Light {};
public class Wiper {};
public class Brake {};
// ..

CleanCode에서는 인스턴스 변수 뿐 아니라 메서드의 가장 이상적인 파라미터 개수는 0개라고 한다.

인스턴스 필드나 메서드 파라미터를 최대한 적게 유지해서 응집도를 높여야 한다.


JAVA 클래스/인스턴스/지역 변수의 설명  보기
결합도와 응집도의 개념과 특징  보기

 

핵심 로직을 구현하는 도메인 객체에 getter/setter를 사용하지 않고 구현했는가? 단, DTO는 허용한다.

객체의 상태가 변경되는 것은 객체 스스로의 행동에 의해야 한다.

자율적인 객체가 되고 외부의 영향을 받지 않음으로써 느슨한 결합과 유연한 협력을 이룰 수 있는 것이다.

이러한 관점에서 볼 때, getter와 setter는 자신의 상태 정보를 외부에 노출하는 격이 되고

이것은 외부의 영향으로 상태 정보가 변할 수 있는 가능성을 열어두게 한다.

 

DTO(Data Transfer Object)인 데이터 전달을 목적으로 설계되는 객체에 있어서는 적용하지 않는다.

데이터 전달을 위해서는 속성을 꺼내고 수정할 수 있는 getter와 setter가 필요하기 때문이다.  더보기


하나의 객체 변화로 인해 여러 객체에 영향이 미치는 코드는 유지보수에 어려움이 있다.  더보기

 

코드 한 줄에 점(.)을 하나만 허용했는가?

단순히 라인에 존재하는 점의 개수를 수치적으로 줄이라는 의미보다는

필드나 메서드를 통해 인스턴스에 접근하는 방식 자체를 재고해보라는 뜻으로 해석된다.

 

점의 개수가 많다는 것은 대상 객체의 내부에 깊이 접근하겠다는 의도를 나타낸다.

이는 일반적으로 호출자와 피호출자 사이의 강한 결합도를 바탕으로

메서드의 응집력을 떨어뜨리고 있을 확률이 높기 때문이다.  더보기


디미터의 법칙("친구하고만 대화하라")
자기 소유의 장난감, 자기가 만든 장난감, 그리고 누군가 자기에게 준 장난감하고만 놀 수 있다.
절대 장난감의 장난감과 놀면 안된다.
즉, 객체 간의 관계에서 이웃하지 않는 낯선 객체와 메세지를 보내는 설계는 피하라는 것이다.

 

메소드의 인자 수를 3개 이하로 제한했는가?
(3개를 초과하는 인자는 허용하지 않으며, 3개도 가능하면 줄이기 위해 노력해 본다.)

메서드에 많은 인자가 있다는 것은 해당 메서드의 역할이 많다는 것으로도 해석된다.

 

메서드가 한가지 일만 담당하도록 구현했는가?

하나의 메서드가 여러 책임을 담당한다면 코드의 길이가 늘어나게 되며,

다른 개발자가 해당 메서드의 역할을 이해하기 어렵게 된다. (메서드 이름도 애매해진다) 

 

클래스를 작게 유지하기 위해 노력했는가?
(메서드당 line을 10까지만 허용하며 길이가 길어지면 메서드로 분리시킨다.)

하나의 목적을 염두하고 설계하라는 의미이다.

50줄 이상의 객체는 한 가지 이상의 일을 하고 있을 확률이 높다. 그러니 작게 유지해야 한다.  더보기

 

매직 리터럴 / 매직 넘버 사용을 자제하고 상수 사용

프로그래밍에서 상수(static final)로 선언하지 않은 숫자를 매직 넘버, 문자열을 매직 리터럴이라 한다.

이를 정적(static)이고 변경 불가능(final)한 상수로 선언하여 사용하자.

 

코드에서 상수로 선언되어 있지 않은 숫자, 문자열은 무엇을 의미하는지 확신할 수 없다.

이를 상수로 선언하게 됨으로써 불분명한 값들은 이름을 가지게 된다.

이름을 가지게 된 값은 그 이름만으로도 어떠한 역할을 하는지 알 수 있게 된다.  더보기


숫자 1을 ONE으로 이름을 짓는 것과 같은 의미없는 상수 변환은 피하도록 하자.

참고 사이트

 

[우아한테크세미나] 리팩토링 정리 (by 자바지기 박재성님)

[우아한테크세미나] 190425 TDD 리팩토링 by 자바지기 박재성님 https://youtu.be/bIeqAlmNRrA 안...

blog.naver.com

 

else 예약어를 쓰지 않는다

이 글은 우아한테크코스 리뷰 페이지에 함께 게시된 글입니다. The ThoughtWorks Anthology의 더 나은 소프트웨어를 향한 9단계: 객체지향 생활 체조 중 규칙 2에 대한 내용이다.

velog.io

 

원시값과 문자열 포장

원시값과 문자열 포장

velog.io

 

일급 컬렉션 (First Class Collection)의 소개와 써야할 이유

최근 클린코드 & TDD 강의의 리뷰어로 참가하면서 많은 분들이 공통적으로 어려워 하는 개념 한가지를 발견하게 되었습니다. 바로 일급 컬렉션인데요. 왜 객체지향적으로, 리팩토링하기 쉬운 코

jojoldu.tistory.com

 

JS 클린코드-함수편(1)

🤔 이번 시간에는 자바스크립트 클린코드, 함수편 일부를 공부해보았다! -함수 인자는 이상적으로 2개 이하가 좋다. -하나의 함수에는 하나의 책임을 주자 -매개변수로 플래그를 사용하지 말자

mong-blog.tistory.com

profile

공부하는 Nar

@NarS2

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!