[CS] 클린코드

히수·2023년 5월 17일
1

CS

목록 보기
13/13

클린코드


클린코드란 , 유지보수가 쉬운 코드를 말한다.

유지보수가 어려우면 새로운 코드에 투자할 시간이 줄어들고, 간단한 문제가 반복적으로 발생하게 된다.

즉, 다른 사람이 고치기 쉬운 코드를 클린코드라고 할 수 있다.


클린코드 작성 기본 원칙


논리가 간단해야 한다.

효율적이지만 논리가 복잡하다면 다른 사람이 이해하기 힘들다

의존성을 최소화해야한다.

객체간의 의존성이 최소화되어야 이해하기 쉽고 부품화 되어 유지보수에 좋다.

원칙있는 명백한 전략으로 처리해야한다.

추측이 아닌 사실에 기반하여 성능의 최적화를 목표로 코드를 설계해야한다.

큰 코드보다 작은 코드에 가치를 둔다.

한가지 모듈에 한가지 기능만을 부여하는것이 적절하다.

중복을 제거하고 표현력에 신경쓴다.

반복되는 표현을 제거하고 누구나 읽을 수 있는 코드를 작성해야한다.


보이스카우트 규칙


언제나 처음 왔을 때보다 조금이라도 더 깨끗이 하고 떠날 것

어떤 하나의 장소를 사용하면서 조금씩만 더 깨끗해진 상태로 떠난다면 그 장소는 조금씩 더 나은 상태로 바뀌게 된다.

이렇듯 코드도 시간이 지날수록 좋아지는 코드가 좋은 코드라고 할 수 있다.

조금씩이라도 코드를 개선시키려는 노력이 클린코드를 만든다.


클린코드를 만들기 위한 규칙


1. 네이밍(Naming)

변수, 클래스, 메소드에 의도가 분명한 이름을 사용한다.

int elapsedTimeInDays;
int daysSinceCreation;
int fileAgeInDays;

잘못된 정보를 전달할 수 있는 이름을 사용하지 않는다.

범용적으로 사용되는 단어를 사용하지 않는다.

연속된 숫자나 불용어를 덧붙이는 방식은 피해야한다.


2. 주석달기(Comment)

코드를 읽는 사람이 코드를 작성한 사람만큼 잘 이해할 수 있도록 도와야 한다.

// trim() 처리 중요
// 문자열에 시작 공백이 있으면 다른 문자열로 인식됨
String listItemContent = match.group(3).trim()

주석은 반드시 달아야 할 이유가 있는 경우에만 작성하도록 한다.

즉, 코드를 빠르게 유추할 수 있는 내용에는 주석을 사용하지 않는 것이 좋다.

설명을 위한 설명은 달지 않는다.


3. 꾸미기(Aesthetics)

보기좋게 배치하고 꾸민다. 보기 좋은 코드가 읽기도 좋다.

규칙적인 들여쓰기와 줄바꿈으로 가독성을 향상시키자

일관성있고 간결한 패턴을 적용해 줄바꿈한다.

메소드를 이용해 불규칙한 중복 코드를 제거한다.


4. 흐름제어 만들기(Making control flow easy to read)

흐름제어에 통일성을 주어 읽기 편하도록

  • 왼쪽에는 변수를, 오른쪽에는 상수를 두고 비교
if(length >= 10)
  • 부정이 아닌 긍정을 다루자
if( a == b ) { // a!=b는 부정
	// same
} else {
	// different
}
  • if/else를 사용하며, 삼항 연산자는 매우 간단한 경우만 사용

  • do/while 루프는 피하자


5. 착한 함수 (Function)

함수는 가급적 작게, 한번에 하나의 작업만 수행하도록 작성

public class VoteChanged {
    
    public void voteChanged(String oldVote, String newVote) {
        int score = getScore();
        
        if (!newVote.equals(oldVote)) {
            if (newVote.equals("Up")) {
                score += (oldVote.equals("Down") ? 2 : 1);
            } else if (newVote.equals("Down")) {
                score -= (oldVote.equals("Up") ? 2 : 1);
            } else if (newVote.equals("")) {
                score += (oldVote.equals("Up") ? -1 : 1);
            }
        }
        
        setScore(score);
    }

예시 코드에서는 사용자가 추천을 하거나 추천을 변경하기 위해 버튼을 누르면 vote_change함수를 호출한다고 가정한다.

위 코드에서는 두가지 일을 하고있다.

  • old_vote와 new_vote의 상태에 따른 score 계산
  • 총점을 계산

이것을 별도의 함수로 분리하여 가독성을 향상시킨다.

public class VoteChanged {
    
    public int voteValue(String vote) {
        if (vote.equals("Up")) {
            return 1;
        } else if (vote.equals("Down")) {
            return -1;
        }
        return 0;
    }
    
    public void voteChanged(String oldVote, String newVote) {
        int score = getScore();
        
        score -= voteValue(oldVote); // 이전 값 제거
        score += voteValue(newVote); // 새로운 값 더함
        setScore(score);
    }
 }

전문가들이 표현한 클린코드


사실 클린코드의 표준이나 엄격한 정의는 존재하지 않는다. 하지만 콜린코드에 대한 공통적인 의견은 아래와 같다.

한 가지를 제대로 한다.

단순하고 직접적이다.

특정 목적을 달성하는 방법은 하나만 제공한다.

중복 줄이기, 표현력 높이기, 초반부터 간단한 추상화 고려하기 이 세가지가 비결

코드를 읽으면서 짐작했던 기능을 각 루틴이 그대로 수행하는 것

기준이 개인마다 다를 수 있고, 환경이 변화하면서 더 이상 최선이 아닐 수 있다. 하지만 Bed smell은 업무 생산성을 저하시킨다. 그렇기에 꾸준히 리팩토링을 하는것이 좋다.

profile
🔥

0개의 댓글