프로그래밍에서 가장 중요하면서도 자주 무시되는 요소 중 하나는 코드 내의 변수, 함수, 클래스의 이름이다. 적절한 이름은 코드의 가독성을 높이고 이해를 돕는다.

< 검색 가능한 이름 사용하기 >

코드에서 이름을 검색하는 것은 개발자의 일상 중 하나다. 그러나 너무 일반적인 이름이나, 너무 짧은 이름은 검색이 어렵게 만든다.

예를 들어, 7이라는 숫자를 상수로 사용했다고 가정해보자. 이 숫자를 찾으려면 수많은 파일과 수식에서 7이 사용된 모든 곳을 검색해야 한다. 동일한 이유로 'e'와 같은 일반적인 문자도 변수 이름으로 적합하지 않다.

그렇다면 어떤 이름이 검색하기 쉬울까? 바로 "길고 구체적인 이름"이다. 이런 이름을 사용하면 코드의 의미가 더욱 명확해지며, 해당 이름을 찾기도 훨씬 쉬워진다.

int realDaysPerIdealDay = 4;
const int WORK_DAYS_PER_WEEK = 5;
int sum = 0;

for (int j=0; j < NUMBER_OF_TASKS; j++) {
    int realTaskDays = taskEstimate[j] * realDaysPerIdealDay;
    int realTaskWeeks = (realTaskDays / WORK_DAYS_PER_WEEK);
    sum += realTaskWeeks;
}

 

위 코드에서는 sum이 유용하진 않지만 최소한 검색이 가능하다. 이름을 의미있게 지으면 함수가 길어지지만, realDaysPerIdealDay, WORK_DAYS_PER_WEEK와 같이 상세한 이름을 사용함으로 검색하기 쉽고, 코드가 무엇을 하는지 이해하기도 쉽다.

< 불필요한 인코딩 피하기 >

다음으로, 이름에 불필요한 인코딩을 포함시키지 않는 것이 중요하다. 이름에 인코딩을 넣으면 그만큼 이름을 이해하기 어려워지며, 이름을 바꾸는 것도 복잡해진다.

예를 들어, 'm_' 접두사를 붙이는 관습은 이제는 필요 없어졌다. 변수명 앞에 이런 접두사를 붙이면 코드를 읽는 사람이 불필요한 정보에 신경 쓰게 되고, 결국 코드의 가독성을 저해하게 된다.

public class Part {
    String description;

    void setDescription(String description) {
        this.description = description;
    }
}

 

여기에서는 description이라는 명확한 이름만을 사용하여 Part의 설명을 표현하였다.

또한, 클래스가 인터페이스인지 아닌지를 나타내는 'I'와 같은 접두사도 피하는 것이 좋다. 이는 클래스를 사용하는 사람에게 불필요한 정보를 제공하며, 가독성을 해칠 수 있다. 만약 인터페이스와 구현 클래스를 명확히 구분해야 한다면, 인터페이스는 단순한 이름을 사용하고, 구현 클래스 이름에 인코딩을 하는 것이 더 좋다.

public interface ShapeFactory { ... }

public class ShapeFactoryImp implements ShapeFactory { ... }


이렇게 하면 사용자는 단순히 ShapeFactory라는 이름으로 클래스를 사용하며, 인터페이스와 구현 클래스를 쉽게 구분할 수 있다.

< 단일 문자 변수명: 좋은 선택일까? >

한 번씩 우리는 코드에서 단일 문자로 이루어진 변수명을 발견하곤 한다. 예를 들어, 루프에서 반복 횟수를 세는 변수로 'i', 'j', 'k'를 사용하는 것이 대표적인 경우다. 하지만 이런 단일 문자 변수명은 국한된 상황에서만 적절하다고 할 수 있다. 즉, 루프 범위가 작고, 다른 이름과의 충돌이 없을 때에 적용할 수 있다.

그럼에도 불구하고, 단일 문자 변수명의 남발은 피해야 한다. 이유는 단순하다. 코드를 읽는 사람이 'c'라는 변수가 무엇을 의미하는지 기억하고 있어야 한다면, 이는 그 사람에게 부담을 주는 것이기 때문이다.

['똑똑함'의 함정에서 벗어나기]
프로그래머들은 대체로 똑똑하다. 하지만 이 똑똑함이 가끔 함정이 될 수 있다.  'r'이라는 변수가 호스트와 프로토콜을 제외한 소문자 URL을 나타내는 것을 항상 기억할 수 있다고 자신할지라도, 이는 명확하지 않은 코드를 만들어낼 수 있다.

전문적인 프로그래머는 자신의 능력을 잘 활용하여 다른 사람들이 쉽게 이해할 수 있는 코드를 작성한다. 이들은 '명료함'이 가장 중요하다는 사실을 잘 이해하고 있다.

[클래스 이름과 메서드 이름 잘 짓기]
클래스 이름은 명사나 명사구를 사용한다. 이는 클래스가 어떤 '것(thing)'을 나타내기 때문이다. 예를 들면, 'Customer', 'WikiPage', 'Account', 'AddressParser' 등이 있다. 'Manager', 'Processor', 'Data', 'Info' 같은 모호한 단어는 피하도록 하자.

반면에 메서드 이름은 동사나 동사구를 사용한다. 메서드는 어떤 행동을 나타내므로, 이름도 그러한 행동을 잘 설명해야 한다. 'postPayment', 'deletePage', 'save' 등이 좋은 예이다.

생성자의 이름을 지을 때는 조금 다른 접근 방식이 필요하다. 여러 생성자를 만들 때는, 각각의 차이점을 설명하는 이름을 가진 정적 팩토리 메서드를 사용하는 것이 좋다. 예를 들어, 'Complex.FromRealNumber(23.0)'처럼 사용하면, 생성자가 하는 일이 명확히 보인다.

 

 

 

 

 

 

출처 : 출판사 인사이트북 / 클린 코드 / https://product.kyobobook.co.kr/detail/S000001032980

※저의 블로그에 있는 모든 참고 서적,강의 내용은 출판사,저자(혹은 편집자)에게 허락을 직접 맡고, 게시하는 글 입니다.

 

Clean Code(클린 코드) | 로버트 C. 마틴 - 교보문고

Clean Code(클린 코드) | 프로그래머, 소프트웨어 공학도, 프로젝트 관리자, 팀 리더, 시스템 분석가에게 추천하는더 나은 코드를 만드는 책『Clean Code(클린 코드)』은 오브젝트 멘토(Object Mentor)의 동

product.kyobobook.co.kr

 

+ Recent posts