Search
moon
sun

[클린코드] 2장 의미 있는 이름

간단소개
네이밍 - 의미있는 이름짓기
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
Java
개발지식
개발방법론
Scrap
태그
Java
클린코드
설계
clean
9 more properties
1장 에서는 좋은 코드와 나쁜코드가 어떤것인지 이론적으로 알아보았습니다.
2장에서는 좋은 코드를 만들기 위한 첫 시작
네이밍부터 살펴보도록 하겠습니다.
예시코드들은 JAVA 기준으로 작성되었습니다.
목차

네이밍

1. 의미가 분명한 이름짓기

•
변수의 존재 이유, 기능, 사용법 등이 이름에 드러나야한다.
•
주석이 필요없을 정도로 명확해야한다.
안좋은 예
int a; String b; //in C // printf("Item Requested %s, Count = %d \n", b, a); System.out.println("Item Requested %s, Count = %d", b, a);
Java
복사
좋은 예
int itemCount; // c : char *itemName; String itemName; //in C //printf("Item Requested %s, Count = %d \n", itemName, itemCount); System.out.println("Item Requested %s, Count = %d \n", itemName, itemCount);
Java
복사
변수명에 구체적인 내용을 써주어야 가독성이 좋고 코드를 읽었을때 무엇인지 명확하게 알 수 있다.

2. 루프 속에서 i j k 사용하지 않기

Advanced for문 혹은 Lamda로 대체

*JAVA 및 Advanced for문을 사용하는 언어일 경우 해당한다.
일반적인 for문
for (int i = 0; i < word.length(); i++){ ... }
Java
복사
Advanced for 문 사용 예시
for (String str : word){ ... }
Java
복사
⇒ Index를 직접 사용할 일이 없다면 i 를 선언해서 사용하기보다, advanced for문으로 사용을 대체하는 것이 가독성이 좋다.
JAVA의 경우 다음과 같이 lamda를 사용해서 처리하기도 한다.
word.stream().forEach( str -> ... }
Java
복사
⇒ 현업에서는 직접 i 를 사용하는경우가 많지 않다고 한다. 직접 값으로 접근하게되는 경우는 많지만 i 로 익덱스 값을 찾아서 조작하는 방식의 코드는 잘 작성하지 않는다고 한다. for문을 사용할 일이 있다면 가급적 Advance for 문 혹은 lamda 방식을 이용하도록 하자

의미를 부여하기

i, j, k 를 사용한 곳에는 가능한 맥락에 맞는 이름을 사용한다.
좌표의 경우 x, y, z 혹은 너비 높이, 가로 세로 등등..
i,j,k -> row, col, depth i, j -> width, height
Java
복사

3. 한개념에 한 단어를 사용하라 (통일성)

같은 의미의 이름을 다양한 표현으로 사용하지 않고 통일성 있게 사용해야한다.
팀끼리 미리 컨벤션을 맞추고 들어가야 한다.
통일성 / 일관성 있게 코드를 사용하도록 하자.
fetch == retrive == get Member == User == Customer Service == Manager Repository == Dao controller == manager == driver
Java
복사

4. 타입이 들어간 변수명 사용하지 않기

변수명에 불필요한 타입명을 기재하지 않도록 한다.
int itemPriceAmount -> itemPrice String nameString -> name Member[] memberArray -> members
Java
복사
예외 Map, List
List 와 Map 같은경우 네이밍으로 타입을 유추할 수 있도록 하는경우는 많이 있다.
특히 Map 같은경우 대체할 말이 딱히 없기때문에, 변수명에 map을 많이 사용한다.
List<Member> memberList, members Map<Member> memberMap
Java
복사
예전 코드에서는 인터페이스의 경우 앞에 I를 사용해주었지만 최근에는 사용하지 않는 추세이다.
구현체의 경우 Impl 를 사용하고 현재 많이 사용하고 있지만 명확히 하기위해 구현체의 이름을 구체적으로 명시해주는것이 더 좋다.
public interface IShapeFactory -> shapeFactory public class ShapeFactoryImpl -> RectagleFactory
Java
복사

Google Java Naming Guide

책에서 제시하는 내용은 JAVA 이기때문에 JAVA 기준으로 작성하였다.
다음은 구글에서 제시하는 네이밍 가이드이다. ( JAVA )
C++ 버전도 있습니다.

Package Naming

•
소문자만 사용
•
_ (언더바) 사용 X
//안좋은 예시 com.example.deepSpace com.example.deep_space //옳바른 예시 com.example.deepspace
Java
복사

Class Naming

•
대문자로 시작 UpperCamelCase
•
클래스는 명사, 명사구를 사용하라
◦
ImmutableList, Character, Customer, Account, AddressParser
•
인터페이스는 명사, 명사구 (형용사)를 사용
◦
List, Readable
•
테스트 클래스는 Test로 끝내기
◦
MapTest, MapIntegrationTest

Method Naming

•
소문자로 시작 LowerCamelCase
•
메서드는 동사, 동사구로 시작하라.
◦
sendMessage, postPayment, deletePayment
•
접근자, 변경자, 조건자는 get, set, is로 시작하라.
•
JUnit 테스트에는 “_”를 사용하기도 한다
◦
<methodUnderTest>_<state>패턴
▪
dequeue_emptyQueue
두려워하지 말고 서로의 명명을 지적하고 고치자. 그렇게 하면 이름을 외우는 것에 시간을 빼앗기지 않고 "자연스럽게 읽히는 코드"를 짜는 데에 더 집중할 수 있다.