Clean Code 2장"의미 있는 이름"

Yi suho·2023년 6월 24일
0
post-thumbnail

이전에는 주로 나만 알아보면 되는 것 아닌가? 하며 함께 작업하는 사람들을 고려하지 않고,
항상 모든 이름을 짧고 간결하게 지으려고 했던 기억이 있다.
알아보면 되는 것 아닌가? 하며 지었던 이름들을 내가 보고도 이해하지 못한 적이 많았다.
하지만 최근에는 이름 짓기의 중요성을 깨달았고, 함께 작업하는 사람들을 고려하여 이름을 지어야 한다는 것을 알게 되었다.
이번 기회에 어떻게 하면 이름을 잘 지을 수 있는지에 대해 알아보려고 한다.

Clean Code 2장"의미 있는 이름"

"의도를 분명히 밝혀라"

변수, 함수, 클래스 이름은 주석 없이도 의도를 분명하게 드러내야 한다.
이름 자체가 의도를 잘 표현하지 못한다면, 코드의 의도가 명확하게 전달되지 않았다는 것을 의미한다.
변수, 함수, 클래스의 목적, 기능, 사용 방법 등을 명확하게 표현하는 것이 중요하며 이렇게 함으로써 코드 자체에서도 명시적으로 코드 맥락을 드러낼 수 있게 되고 이해하기 쉬운 코드로 만들 수 있다.

"그릇된 정보를 피하라"

프로그래머는 코드에 그릇된 단서를 남기지 않아야 한다.
그릇된 단서는 코드의 의미를 혼란스럽게 만들 수 있다.
또, 널리 알려진 의미가 있는 단어를 다른 의미로 사용해서는 안 된다.
예를 들어, "hp", "aix", "sco"는 변수 이름으로 적합하지 않다.
이는 유닉스 플랫폼이나 유닉스 변종을 가리키는 이름이기 때문입니다.
예를 들어 직각 삼각형의 빗변(hypotenuse)을 구현할 때 "hp"가 훌륭한 약어로 보일지라도
"hp"라는 변수는 독자에게 그릇된 정보를 전달하게 된다.

또한, 서로 유사한 이름을 사용하지 않도록 주의해야 하고 유사한 개념은 유사한 표기법을 사용하는 것이 정보를 제공하는 방법이다. 일관성이 없는 표기법은 그릇된 정보를 제공하므로 피해야 한다.

"의미 있게 구분하라"

코드를 구현할 때, 컴파일러나 인터프리터를 통과하는 것만을 생각하는 프로그래머는 스스로 문제를 야기할 수 있다.
예를 들어, 동일한 범위 내에서는 다른 두 개념에 동일한 이름을 사용하지 못하여 연속된 숫자를 덧붙이거나 불용어를 추가하는 방식은 적절하지 않다.
이름이 다르다면 의미도 달라져야 한다.연속적인 숫자를 덧붙인 이름은 의도적인 이름과는 정반대로 작용한다. 이러한 이름은 그릇된 정보를 제공하는 것도 아니며, 아무런 정보를 전달하지 못하는 이름이다.
저자의 의도가 전혀 드러나지 않는다.
이름을 지을 때는 읽는 사람이 차이를 알 수 있도록 의도가 명확하게 드러나도록 해야 한다.

"발음하기 쉬운 이름을 사용하라"

단어는 일반적으로 발음 가능하도록 정의되어 있다.
발음하기 어려운 이름은 토론하기도 어렵고 부적절하게 들릴 수 있다.
프로그래밍은 사회적인 활동이기 때문에 함께 작업하는 동료들이나 코드를 처음 보는 사람에게
"이 이름은 이렇게 발음하고 읽으면 되고, 이렇게 동작해요"라고 설명해야 하는 이름은 좋지 않다.
즉, 이름은 발음이 쉽고 이해하기 쉬워야 한다.

"검색하기 쉬운 이름을 사용하라"

검색하기 쉬운 이름을 사용하는 것이 중요하다.
문자 하나만 사용하는 이름이나 상수는 텍스트 코드에서 쉽게 눈에 띄지 않을 수 있는 문제가 있다.
예를 들어 숫자 "7"은 파일 이름이나 수식에서도 검색되기 때문에 의도와 상관없이 다른 결과가 검색될 수 있다. 또 상수가 여러 자리 숫자로 이루어져 있고 누군가 상수 내의 숫자 위치를 변경한다면 버그를 찾기 어려워진다.

마찬가지로, "e"라는 문자도 변수 이름으로는 적합하지 않다.
검색이 어려운 이유로써 영어에서 가장 흔히 사용되는 문자이며, 거의 모든 프로그램과 문장에 등장하기 때문이다.

따라서, 검색하기 쉬운 이름이 상수보다 우선되어야 하며, 이름의 길이는 해당 범위의 크기에 비례해야 한다. 변수나 상수가 코드 여러 곳에서 사용된다면, 검색하기 쉬운 이름을 선택하는 것이 바람직하다.

"인코딩을 피하라"

  • 멤버 변수 접두어

현재는 멤버 변수에 접두어로 "m_"을 붙일 필요가 없다.
클래스와 함수는 충분히 작아야 하며, 멤버 변수는 IDE를 사용하여 다른 색상으로 표시하거나 눈에 띄게 표현해야 한다.
사람들은 접두어를 무시하고 이름을 해독하는 방식을 빠르게 익힌다.
코드를 계속 읽으면서 접두어는 더 이상의 관심사가 아니게 된다.
결국 접두어는 오래된, 구닥다리 코드를 나타내는 징표로 여겨질 수 있다.

  • 인터페이스 클래스와 구현 클래스

인터페이스 클래스와 구현 클래스의 이름을 결정할 때에는 몇 가지 고려사항이 있다.
예를 들어 도형을 생성하는 ABSTRACTFACTORY를 구현한다고 가정한다면
이 경우 팩토리는 인터페이스 클래스(interface class)로 정의되며, 실제로 구현은 구체 클래스(concrete class)에서 이루어진다.

이 두 클래스의 이름을 결정할 때 다음 사항을 고려하는 것이 좋다

인터페이스 이름에는 접두어를 붙이지 않는 것이 일반적으로 좋다.
오래된 코드에서 많이 사용되던 "I"와 같은 접두어는 주의를 흐트리고 과도한 정보를 제공하는 경향이 있다. 따라서, 인터페이스 이름은 해당 개념을 명확하게 나타내는 이름으로 선택하는 것이 좋다.

구현 클래스의 이름은 해당 클래스의 구체적인 역할과 책임을 잘 표현할 수 있도록 지어야 한다.
도형 팩토리의 구현 클래스 이름은 도형을 생성하고 구체적인 구현을 담당하는 역할을 잘 반영해야 한다.

따라서, 인터페이스 클래스와 구현 클래스의 이름을 선택할 때는 각 클래스의 책임과 역할을 명확하게 이해하고, 이름이 그 역할을 잘 표현하도록 지어야 한다.

"자신의 기억력을 자랑하지 마라"

코드를 읽는 사람이 변수 이름을 자신이 아는 이름으로 변환해야 한다면, 그 변수 이름은 적절하지 못한 선택다. 이는 주로 문제 영역이나 해법 영역에서 사용하지 않는 이름을 선택하여 생기는 문제이다.

문자 하나만 사용하는 변수 이름도 문제가 있다.
루프에서 반복 횟수를 세는 변수 i, j, k는 일반적으로 사용되는 관례이며 작은 루프 범위에서 충돌하지 않을 때에는 괜찮다. 하지만 그 외의 경우에는 대부분 적절하지 않다.
코드를 읽는 사람은 실제 개념으로 변수를 해석해야 하기 때문에, 가능한한 명확하고 의미 있는 변수 이름을 선택해야 한다.

예를 들어 "r"이라는 변수가 호스트와 프로토콜을 제외한 소문자 URL을 나타낸다는 사실을 항상 기억한다면 그 사람은 똑똑한 프로그래머이다. 하지만 전문가 프로그래머와의 차이점 중 하나는 명료함의 가치를 이해한다는 점이다.
전문가 프로그래머는 자신의 능력을 활용하여 다른 사람이 이해할 수 있는 코드를 작성하는 것을 지향한다.

따라서, 코드를 읽는 사람이 이해하기 쉽고 명확한 변수 이름을 선택하도록 노력하는 것이 좋고 이는 전문가 프로그래머와 일반적인 프로그래머 사이의 차이를 나타내는 중요한 요소 중 하나다.

"클래스 이름"

클래스 이름과 객체 이름은 명사나 명사구가 적합하다.
Manager,Processor,Data,Info 등과 같은 단어는 피하고 동사는 사용하지 않는다.

"메서드 이름"

메서드 이름은 동사나 동사구가 적합하다.
접근자,변경자,조건자 는 javabean 표준에 따라 값 앞에 get,set,is를 붙인다.

"한 개념에 한 단어를 사용하라"

추상적인 개념 하나에는 동일한 단어를 선택하고 이를 일관적으로 사용하는 것이 좋다.
같은 기능을 수행하는 메서드가 각각 다른 이름을 가지면 혼란스럽게 된다.
어느 클래스에서 어느 이름을 사용했는지 기억하기 어려워지며, 메서드 이름은 독자적이고 일관적이어야 한다. 이렇게 하면 프로그래머가 주석을 참조하지 않고도 올바른 메서드를 선택할 수 있게 된다.
따라서, 메서드 이름을 일관성 있게 선택하여 코드를 명확하고 읽기 쉽게 만들어야 한다.

"말장난을 하지 마라"

한 개념에는 한 단어를 사용하고, 다른 개념에는 다른 단어를 사용해야 한다.
같은 이름의 메서드를 여러 클래스에 사용하는 것은 잘못된 접근이다.
모든 메서드의 매개변수와 반환값이 의미적으로 동일하면 문제가 없지만 프로그래머가 다른 맥락에서 동일한 이름의 메서드를 사용한다면 문제가 발생할 수 있다.
프로그래머는 코드를 최대한 이해하기 쉽게 작성해야 한다.
코드를 대충 훑어봐도 이해할 수 있는 가독성 좋은 코드를 작성하는 것이 목표다.
따라서, 각각의 개념에 맞는 명확하고 일관된 메서드 이름을 선택해야 한다.

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

변수 이름에는 의미가 분명하게 드러나야 한다.
일부 변수는 자체적으로 명확한 의미를 가질 수 있지만, 대다수의 변수는 그렇지 않다.
따라서 클래스, 함수, 이름 공간에 넣어서 맥락을 부여하는 것이 중요하다.
그럼에도 불구하고 모든 방법이 실패한다면, 접두어를 사용하여 마지막 수단으로 의미를 명시할 수 있다.

예를 들어, firstName, lastName, street, houseNumber, city, state, zipcode라는 변수가 있다고 가정해보면 이 변수들을 훑어보면 주소에 관련된 내용임을 쉽게 알 수 있다.
그러나 만약 어떤 메서드에서 state 변수만 사용된다면, state가 주소의 일부라는 사실을 파악하기 어려울 수 있다.
이럴 때는 addr과 같은 접두어를 사용하여 addrFirstName, addrLastName, addrState와 같이 변수를 명명하면 맥락이 더욱 분명해질 수 있다.

하지만 최상의 방법은 Address라는 클래스를 생성하는 것이다.
이렇게 하면 변수가 보다 큰 개념에 속한다는 사실이 명확해지며, 컴파일러도 해당 변수들이 주소에 관련된 정보임을 알 수 있게 된다.

0개의 댓글