본문 바로가기
독서에서 한걸음

Clean Code .Part 2

by oncerun 2022. 4. 6.
반응형

 

2장의 제목은 의미 있는 이름이다. 

 

이 장에서는 프로그래머가 이름을 명명하는 여러 노하우를 전달해주고 있다.  코드를 읽는 독자는 개발자이다. 다른 사람의 코드를 읽는 개발자에게 의미를 쉽게 전달할 수 있는 여러 방법을 알려준다. 

 

쉽게 받아들여지는 부분이 있는 반면 다소 어려운 부분도 존재한다. 

 

쉽게 받아들여지는 부분이라 하면 다음과 같다.

 

  • 의도를 밝히는 이름
  • 특수한 의미를 가진 단어를 피하여 그릇된 정보를 전달하는 것을 피하라
  • 불용어를 붙이거나 연속된 숫자를 덧붙여 명명하지 말 것
  • 추상적인 개념 하나에 단어 하나를 선택해 고수하라.
  • 같은 맥락이 아닌데 일관성이라는 틀에 박혀 동일한 단어를 사용하지 말자.
  • 기술 개념에는 기술 이름이 가장 적합한 선택일 수 있다.
  • 적절한 프로그래머 용어가 없다면 도메인 영역에서 이름을 가져와라

 

나는 읽으면서 내가 이러한 규칙을 암암리에 따르고 있다는 것을 알았고 지향하는 것으로 느껴졌다. 

그리고 이러한 규칙을 지키지 않은 코드를 많이 봐왔는데 (내가 작성하지 않은 코드) 이를 상대방에게 권유? 하는 좋은 방법에 대해서는 고민을 해보아야 할 것 같다. 

 

그리고 난해한 부분이 있어  해당 단락을 천천히 읽어보려 한다. 

 

"의미 있는 맥락을 추가해라"

 

소개하길 의미가 분명한 단어는 있을 수도 없을 수도 있다. 그래서 클래스, 함수, name space에 단어를 넣어 맥락을 부여한다. 모든 방법이 실패한다면 마지막 수단으로 접두어를 붙인다.

 

우선 맥락이란 단어의 의미를 알아보자 현재 책이 번역본이어서 그런데 아마 단어는 context가 아닐까 싶다.  문맥, 맥락은 해당 프레임 내에서 자원을 이용하여 전체의 관계를 이해하는 것을 말한다고 생각한다.

 

이번 파트의 제목은 의미 있는 이름이다.

이름을 토대로 맥락을 이해할 수 있어야 한다고 외치는 것인가?

 

예시로 메서드를 살펴볼 것이다. 변수에 좀 더 의미 있는 맥락이 필요할까? 함수 이름은 맥락 일부만 제공하며, 알고리즘이 나머지 맥락을 제공한다.

private void printGuessStatistics(char candidate, int count){
    String number;
    String verb;
    String pluralModifier;
    
    if (count = 0) {
    	number = "no";
        verb = "are";
        pluralModifier = "s";
    }else if (count == 1){
        number = "1";
        verb = "is";
        pluralModifier = "";
    }else{
    	number = Integer.toString(count);
        verb = "are";
        pluralModifier = "s";
    }
    
    String guessMessage = String.format(
    	"There %s %s %s%s", verb, number, candidate, pluralModifier
    );
    
    print(guessMessage);

}

독자 관점에서 해당 메서드를 읽어보자. 

메서드명은 추측 통계의 출력이다.

매개변수로 후보자와 카운트를 받고 지역 변수로는 숫자, 동사, 복수형 수식어가 있다. 

 

이 예시의 문제점을 발견해야 한다. 여기서 문제는 저자가 지적한 문제이다.

1. 메서드를 끝까지 읽고 나서야 변수의 사용 용도가 드러난다. 이는 독자가 맥락을 유추해야만 한다.

2. 함수가 길다. 

 

저자가 제시한 방법으로 예제를 수정해보자.

 

GuessStaticMessage라는 클래스를 만든다. 

 - 클래스 안에 세 변수를 클래스에 넣는다. 이러면 세 변수는 맥락이 분명해진다.

public class GuessStatisticsMessage {

    private String number;
    private String verb;
    private String pluralModifier;

    public String make(char candidate, int count) {
        createPluralDependentMessageParts(count);
        return String.format(
                "There %s %s %s%s",
                verb, number, candidate, pluralModifier);
    }

    private void createPluralDependentMessageParts(int count) {
        if (count == 0) {
            thereAreNoLetters();
        }else if (count == 1){
            thereIsOneLetter();
        }else{
            thereAreManyLetters(count);
        }
    }

    private void thereAreManyLetters(int count) {
        number = Integer.toString(count);
        verb = "are";
        pluralModifier = "s";
    }

    private void thereIsOneLetter() {
        number = "1";
        verb = "is";
        pluralModifier = "";
    }

    private void thereAreNoLetters() {
        number = "no";
        verb = "are";
        pluralModifier = "s";
    }
}

 

세 변수는 GuessStatisticsMessage에 속한다. 따라서 연관성이 명료해졌다. 이렇게 맥락을 개선하면 함수를 쪼개기가 쉬워지므로 알고리즘도 좀 더 명확해진다.

 

내가 이해한 것이 맞다면 의미있는 맥락을 추가하라는 것은 변수명을 통해 코드의 맥락을 더 잘 보이게 들어내라는 말로 생각이 된다. 기존 예시의 세 변수보다는 그 내용을 추상적으로 표현하는 GuessStatisticsMessage로 맥락을 쉽게 이해하도록 돕고 그 내부에는 세 변수의 의미를 부여함으로써 세 변수의 맥락이 분명해질 수 있다는 것으로 생각된다.

 

 

 좋은 이름을 고르기 위해선 설명 능력과 문화적인 배경이 같아야 독자가 가독성이 좋다고 말할 수 있는 것이 아닐까?

듣기론 다른 개발자가 작성한 코드에서 변수명을 변경하는 것은 매우 실례라는 생각이 든다고 하는 인터뷰를 본 적이 있다.

하지만 저자의 팀은 그렇게 생각하지 않는다고 한다.

오히려 좋은 이름으로 변경해주면 고맙다고 한다.

코드 개선으로 인해 누군가가 질책할지도 모르지만 그렇다고 코드를 개선하려는 노력을 중단해서는 안된다고 한다. 

 

우리나라에서 욕먹고도 그 자세를 유지하는 사람이 얼마나 될까. 아마 MZ세대이지 않을까ㅋㅋ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

'독서에서 한걸음' 카테고리의 다른 글

Clean Code .Part4  (0) 2022.04.09
Clean Code .Part3  (0) 2022.04.07
도메인  (0) 2022.04.01
메시지  (0) 2022.03.31
자율적인 책임  (0) 2022.03.29

댓글