본문 바로가기
SW 이벤트

클린코드와 코드 컨벤션

by javapp 자바앱 2023. 4. 5.
728x90

 

1. 목적

 

고급 개발자가 되기 위해 그리고

혼자 개발하는 것이 아닌 여러 개발자와 함께 협업 프로젝트를 진행하기 때문에 다른 사람들도 나의 코드를 볼 수 있고, 유지보수 등을 위해 코드를 수정할 수도 있기 때문에 다른 사람이 나의 코드를 보고 잘 이해할 수 있도록 작성을 하는 것이 좋다

그렇기 때문에 이번 클린코드 세미나를 듣고 관련 내용을 정리하려고 한다.

 

 

 

 

2. 좋은 코드와 나쁜 코드는 뭘까?

 

좋은 코드 즉, 클린 코드는 가독성이 좋고 유지보수성이 좋은 코드라고 생각한다.

클린 코드는 팀의 협업 관점과 유지보수의 관점에서 많은 순기능을 발생시킵니다. 클린 코드는 장기적으로 읽고 유지 관리하기 쉬운 코드를 작성하는 것입니다.

 

 

 

3. 코드 작성 방법 정리

3.1. 변수명

 

'의도를 분명히 밝혀라!'

 

 

'축약어 지양'

다른 사람의 코드리뷰를 보면서 많이 느꼈다.

ResvBook, CMRespDto 등 한 눈에 들어 오지 않는 명칭들을 보게 되었는데 길 더라도 가독성이 좋은 명칭이 좋다고 생각했다.

but, 누구나 쉽게 유추할 수 있는 경우 사용해도 무관(idx, cnt 등)

 

 

'변수명에 대한 설명이 필요한다면 잘못된 변수명이라고 생각'
자문자답:
  변수가 필요한 이유?
  실제 기능?
  사용 방법?

 

 

'읽기 쉬운 변수명'

 

 

'일관성 있는 명칭'

예) 수정에 - update / modify 어느것을 쓸것인지 하나만 선택

 

 

'이름에 맞게 로직 구성'

 

 

'네이밍 규칙을 지키자'

카멜표기법 - UserService(클래스명), userName(변수명)

스네이크 - PRODUCT_SIZE(상수명)

 

 

'주석은 나쁜 코드를 보완하지 못한다'
코드로 의도를 표현

 


3.2. 함수명

'객체지향 설계 5원칙 SOLID도 적용됨'

SRP 란 단일 책임 원칙 

  • 단일 모듈은 변경의 이유가 하나, 오직 하나 뿐이어야 한다.
  • 하나의 모듈은 하나의 특정 작업만 수행 해야 한다.

함수의 이름이 and로 묶일 가능성이 높다고 하면 함수를 더 작게 분리할 수 있을 지 고민

 

 

'함수명은 동사로 시작'

조회 메서드에는 where절에 들어갈 파라미터명을 By뒤에 써주면 가독성이 올라간다.

 

 

 


4. 객체지향 원칙

'한 메서드에 오직 한 단계의 들여 쓰기만 한다.'

for (int i = 0; i < 10; i++) { // 선호
	buf.append(data[i]);
}
// 자바 코드 컨벤션에서는 해당 코드는 지양
for (int i = 0; i < 10; i++) buf.append(data[i]);

 

 

'else 예약어를 쓰지 않는다.'

public String getAgeCategory(int age) {
    if (age < 5) {
        return "infant";
    } else {
        if (age < 12) {
            return "child";
        } else {
            if (age < 19) {
                return "teenager";
            } else {
                return "adult";
            }
        }
    }
}

else를 많이 쓰게 되면 피라미드 식으로 가독성이 떨어진다.

 

권장 표현

public String getAgeCategory(int age) {
    if (age < 5) {
        return "infant";
    }
    if (age < 12) {
        return "child";
    }
    if (age < 19) {
        return "teenager";
    }
    return "adult";
}

 

 

'한 줄에 점을 하나만 찍는다.'

점을 2개 이상 찍으면 결합도가 높아진다. 의존성을 추가로 갖게 되는 것이다.

if (person.getMoney().getValue() > 10000) {
    System.out.println("10000원 초과");
}

 

권장

if (person.hasMoneyMoreThan(10000)) {
    System.out.println("10000원 초과");
}

 

 

'일급 컬렉션을 쓴다.'

List<Item> daisoItems = new ArrayList<>();
if (item.isPriceHigherThan(5000)) {
    throw new IllegalArgumentException("5000원이 넘는 물건은 진열할 수 없습니다.");
}

비즈니스 로직이 흩어지고, 중복 코드가 발생한다.

 

이와 관련된 클래스를 작성

public class DaisoItems {
    private final List<Item> items;

    public DaisoItems() {
        this.items = new ArrayList<>();
    }

    public void addItem(final Item item) {
        if (item.isPriceHigherThan(5000)) {
            throw new IllegalArgumentException("5000원이 넘는 물건은 진열할 수 없습니다.");
        }
        items.add(item);
    }
}

 

사용

DaisoItems daisoItems = new DaisoItems();
daisoItems.addItem(item);

하나의 서비스 로직으로 탄생

 

 

'Getter, Setter, Property를 사용하지 않는다.'

객체에게 책임이 있는 작업은 객체에게 직접 시켜야한다.

Distance distance = new Distance(10);
int cm = distance.getMeter() * 100;

기존 코드는 비즈니스 로직이 코드 베이스 전반으로 흩어지고 중복 코드가 발생한다.

 

이를 객체가 책임지고 함수를 작성

public class Distance {

    // ...

    public int toCentimeter() {
        return meter * 100;
    }

    // ...
}

Getter/Setter/Property를 남발하면, 

불필요한 객체 내부 구현의 노출

->

응집도 하락과, 캡슐화의 위반

객체의 자율성을 보장하고 능동적으로 행동할 수 있도록 설계하자.

 

 


5. 코드 컨벤션

코드를 작성할 때 프로그래머 사이에서 어떻게 작성할 것인지 약속한 것

[JAVA] 자바 코드 컨벤션 (tistory.com)

 

내가 개선해야할 코드 컨벤션에 대해 정리

 

콤마(,)를 사용할 때는 앞 단어에 붙여쓰며, 뒤에 한 칸을 띄어쓰기 해야 한다.

String[] numberArray = {1, 2, 3, 4, 5}; //(O)

 

중괄호의 위치 (예전에는 후자를 썼었다)

public class saveCourse() {  //(O) 중괄호의 양 옆은 한칸 띄어쓰기
	...
}

public class saveCourse()    //(X)
{
	...
}

 

 

 

 

 

 

 

그 밖의 클린코드 참고

댓글