Clean Code - (1) : 의미있는 이름

­이승환·2021년 10월 22일
0

Clean Code

목록 보기
1/7

클린코드


사내에서 공부하는 스터디그룹들에서 공유한 내용을 바탕으로 개인적인 정리 기록들입니다. 최대한 깔금하게 이론 및 아이디어, 지식 위주로만 전달하겠습니다.

1. 의도를 분명히 밝히자

  • 변수 / 함수 / 클래스 이름에 고려해야 할 사항

    • 수행하는 기능을 고려하자
    • 따로 주석이 필요하다면 의도를 분명히 드러내지 못했다는 뜻이다
    • kebab case || camel Case || snake case 정하기
    • 변수, 함수, 클래스의 존재 이유 고려하자
// bad
int d; // 경과시간 (단위 : 날짜)

// good
int elapsedTimeIndays;
int daysSinceCreation;
int daysSinceModification;
int fileAgeIndays;
//bad
function amountFor(perf, play) {
	let result = 0;
    switch (play.type) {
     ...
    }
}

// good
function amountFor(performance, play) {
	let result = 0;
    switch (play.type) {
    	...
    }
}

2. 그릇된 정보를 피하자

  • accountList -> 집합을 의미하고자 하면, accountGroup 이 낫다
    • 여러 계정을 그룹으로 묶을 때, 실제 List가 아니라면 더욱 피하는게 맞다
    • List로 선언을 했더라도 이름을 넣지 않는 것이 낫다
  • 흡사한 이름은 사용하지 말자(특히 변수)
  • 유사한 개념은 유사한 표기법을 사용하는 것이 낫다
  • l, 0와 같이 오해가 생길 수 있는 변수명은 피하자
// 아이스크림 클래스
public class IceCream {
    private String name;
    ...
}

// 1급 컬렉션 선언
public class IceCreams { ... }

public class IceCreamList { ... }

public class IceCreamBunch { ... }

3. 의미 있게 구분하자

  • 연속적인 변수 a1, a2 등은 아무런 의미가 없다

    • (예시) Product, ProductInfo, ProductData 들은 3개의 클래스에서 서로 차이가 불 분명하다. 차라리 Product 클래스 내부에서 info와 data의 getter setter를 추가하는 것이 훨씬 현명하다
    • Name vs NameString : String이라는 것이 직관적으로 느껴지기 때문에 아무런 효과가 없다고 볼 수 있음
    • Customer vs CustomerObject : 위와 동일 내용
    • getActiveAccount vs getActiveAccounts() vs getActiveAccountInfo() : 각자 생각해보자
  • 의미 불분명한 말을 추가한 이름도 아무런 정보를 제공하지 못한다

    • 개인적으론 refactoring 책의 저자가 하는 것처럼 a, an은 임시변수에 곧잘 사용한다
    • 그치만 관사는 일반적으로 사용하지 않는 것이 낫다

4. 검색하기 쉬운 이름을 사용하자

  • e 를 변수로 사용할 경우 검색이 어렵다
  • 숫자대신 constant로 정의해서 상수를 사용하는 것이 좋다
    • (예시) MAX_CLASSES_PER_STUDENT와 같이 사용하자

5. 인코딩을 피하자

  • 헝가리식 표기법(변수 앞에 데이터 타입을 명시하는 코딩규칙) 은 사용하지 말자
  • 멤버변수 접두어는 과거에서처럼 m_ 과 같이 사용할 필요가 없음, IDE를 활용하자
  • 인터페이스 클래스와 구현 클래스 또한 접두어를 사용하지 말자

6. 자신의 기억력을 자랑하지 말자

  • loop에서 반복 횟수를 세는 i,j,k 를 제외하고는 사용하지 말자
  • loop 범위가 아주 적은 경우를 제외하고는 변수명을 남들이 이해할 수 있게 짓자

7. 클래스 / 메소드 이름

  • 클래스는 명사나 명사구가 적합하다
  • 메소드의 경우 동사나 동사구가 적합하다
  • Java 의 경우 get, set, is 등의 접두어를 사용하는 것이 좋다
  • 생성자의 중복 정의(overload)할때 정적 팩토리 메소드를 활용하자
// bad
Complex fulcrumPoint = new Complex(23.0);

// good
Complex fulcrumPoint = Complex.FromRealNumber(23.0);

8. 한 개념에 한 단어를 사용하자

  • 같은 기능을 하는 메소드를 클래스마다 fetch, retreive, get 혼용하지 말자
  • controller, manager, driver를 섞어서 쓰지말자

9. 말장난을 하지말자

  • 한 단어를 두가지 목적으로 사용해서는 절대 안된다

10. Solution 영역에서 가져온 이름을 사용하자

  • 코드를 읽을 사람도 프로그래머이므로 전산용어, 알고리즘 이름 등을 적극 활용해도 좋다

11. Problem 영역에서 가져온 이름을 사용하자

  • 적절한 프로그래머 용어가 없다면 문제 영역에서 이름을 가져오자
    • 코드를 유지 보수하는 프로그래머가 분야 전문가에게 의미를 물어볼 수 있음
    • 문제 영역 개념과 관련이 깊은 코드라면 문제 영역에서 이름을 가져오자
      => ethernet, zigbee 등

12. 의미있는 맥락을 추가하자

  • 클래스, 함수, 변수 이름에 의미를 넣어 맥락을 부여하자
    • 예를들여 firstName, lastName, street, houseNumber, city, state 에서 state는 주소의 영역의 변수임을 확인 할 수 있다
    • 접두어 addrState로 선언시 훨씬 정확하게 표현 할 수 있어진다

13. 불필요한 맥락을 없애자

  • 의미가 분명한 경우에는 짧은 이름이 긴 이름보다 좋음
  • 이름에 불필요한 맥락은 넣지 말자
profile
Mechanical & Computer Science

0개의 댓글