변수명, 함수명, 메서드명, 클래스명 등 - 프로그래밍에서 naming 중요하다는 것은 늘 알고 있었지만,
어떤 이름이 좋은 이름인지, 안 좋은 이름은 왜 안 좋은 이름인지, 좋은 이름을 짓기 위한 어떤 방법이 존재하는 지에 대해서는 잘 알지 못했다. 클린코드 2장을 읽으며 알게 된 내용에 대해 잘 정리해보고, 내가 매일 쓰는 코드들에 적용해보려 한다!
1. 분명한 의도
코드에 쓰이는 이름들은 분명한 의도를 나타내야 한다.
분명한 의도를 나타낸다는 것은 이 함수/변수/클래스가 왜 존재해야 하는지, 어떤 기능을 수행하는지, 어떻게 사용해야 하는지에 대해 대답할 수 있는 이름이어야 한다는 것이다.
예를 들어 '경과한 시간(단위: 날짜)' 라는 나타내는 아래의 변수가 있다고 해보자.
let time;
time 이라는 변수명은 경과한 시간이나 날짜라는 의미나 의도가 드러나지 않는다. 이를 드러내기 위해서는 측정하려는 값과 단위가 분명하게 표현되어야 한다.
아래의 변수들은 측정하려는 시간(=경과한 시간)과 단위(=일)이 분명하게 드러난 이름을 갖고 있다.
let elapsedTimeInDays;
let daysSinceCreation;
let daysSinceModification;
let filAgeIndays;
이와 같이 변수의 의도를 정확하게 나타낼 수 있는 이름을 사용해야 한다.
책에 있는 또 다른 예제를 확인해보자.
//코드 1
function getThem() {
const list1 = [];
theList.forEach((item) => item[0] === 4 && list1.push(item));
return list1;
}
물론 위의 예제는 theList.filter(item => item[0] === 4); 와 같이 사용하는게 더 좋겠지만, 책의 예제를 잘 나타내두기 위해 위와 같이 작성해보자.
위의 코드는 복잡한 코드가 아니다. 그럼에도 불구하고 좋은 코드는 아니다. 그 이유는 코드가 함축하고 있는 것들이 많기 때문이다.
예를 들어, getThem 이라는 이름에서 them이 무엇인지, theList는 어떤 정보가 잇는 리스트인지, theList의 아이템 0번째 값이 왜 중요한 것인지, 4라는 값은 무슨 의미인지, 함수가 반환하는 list1는 어떻게 사용되는 것인지... 이러한 정보들에 대한 정보가 함축되어 있다.
즉, 이 코드를 읽는 사람들이 위의 질문들에 대한 답을 이미 알고 있을 것이라고 가정한 것이다.
그렇다면 위의 코드에서 함축하고 있는 것들을 분명한 의도가 나타나게끔 바꿔보면 어떨까?
//코드 2 (refactored)
function getFlaggedCells() {
const flaggedCells = [];
gameBoard.forEach((cell) => cell[STATUS_VALUE] === FLAGGED && flaggedCells.push(cell));
return flaggedCells;
}
이렇게 함수명, 변수명에 의도를 정확히 드러내고, [0], 4라는 개념들에 이름만 붙여서 상수로 표현해도 이 함수가 지뢰찾기 함수라는 것을 금방 파악할 수 있게 된다.
2. 그릇된 정보를 피할 것
코드에는 그릇된 정보가 담겨서는 안된다.
그릇된 정보라는 것은 진짜로 틀린, 잘못된 정보를 의미할 뿐 아니라, 오해의 소지가 있는 정보를 포함한다.
예를 들어, accountList 라는 변수명을 사용한다고 할 때, 해당 변수의 자료구조가 진짜로 List가 아니라면 accountList는 해당 변수가 List 자료구조라는 오해를 불러일으킬 소지가 있으므로 그릇된 정보이다.
또한, 한 모듈에서 서로 흡사한 이름이 사용되는 것도 그릇된 정보가 될 수 있다. 내가 쓴 코드에도 이에 해당하는 것들이 꽤나 있는 것 같다 (반성)
유사한 개념에 상이한 표기법을 사용하는 것 또한 그릇된 정보이다. 정확하게 이름을 파악하기 어려운 이름도 그릇된 정보이다. 아래와 같이 소문자 l와 숫자1, 대문자 O와 숫자 0 이 혼용되는 경우 끔찍한 결과를 낳을 수 있다. (클린코드 저자는 아래와 같은 코드를 실제로 도처에서 보았다고 한다.. 🤮)
const a = l;
if (O == l) {
a = O1;
} else {
1= 01
}
3. 의미있는 구분
이름이 달라야한다면 의미로 달라져야 한다.
단순히 컴파일러나 트랜스파일러, 인터프리터를 통과하려는 생각으로 이름을 지어서는 안 된다. 중복된 이름을 피하기 위해 변수 뒤에 숫자를 붙이거나 (뜨끔..) 의미없는 단어나, 변수 타입 등을 붙이는 것 또한 변수에 아무 의미를 더하지 않는다.
product 이라는 변수 이름과, productInfo, productData라는 변수 이름은 다른 의미를 가질까? product 뒤에 붙인 Info, Data는 어떠한 의미도 더하지 않는다. (뜨끔..!)
새로운 개발자가 프로젝트에 참여했을 때 제품 정보를 보려고할 때 product, productInfo, productData 중 어떤 변수를 확인해야 할지 정확히 알 수 있을까? 읽는 사람이 차이를 알 수 있도록 이름을 지어야 한다.
다음 포스팅에서는 발음하기 쉬운 이름을 사용 / 검색하기 쉬운 이름 / 인코딩 피하기 / 기억력 자랑 피하기 에 대한 내용을 담아보려고 한다!
출처: 로버트 C. 마틴, 『Clean Code』 인사이트, 2022, p22-26
댓글