Clean Code - Naming

No Image

캠프장은 처음 왔을 때보다 더 깨긋하게 해놓고 떠나라. - 보이스카우트 규칙

의미 있는 이름.(Naming)

의도를 분명히 밝히기.

  • 의도를 명확하게 함으로써 코드의 가독성을 높힐 수 있다.

Bad Example

public List<int[]> getThem() {
    List<int[]> list1 = new ArrayList<int[]>(); // 어떤 정보를 담는 list인가?
    for (int[] x : theList) {
        if (x[0] == 4) { // list의 첫번째 값은 어떤의미를 가지며 4는 어떤값을 의미하는가?
            list1.add(x);
        }
    }
    return list1; // 반환하는 리스트 list1을 어떻게 사용하는가?
}

Good Example

public List<Cell> getFlaggedCells() {
    List<Cell> flaggedCells = new ArrayList<Cell>(); // flag된 Cell들을 담는 list
    for (Cell cell : gameBoard) {
        if (cell.isFlagged()) { // 표시된 cell인지 확인.
            flaggedCells.add(cell);
        }
    }
    return flaggedCells; // 표시된 Cell들의 list
}

그릇된 정보를 피하기.

  • 개발자에게는 특수한 의미를 가지는 단어(List 등)는 실제 컨테이너가 List가 아닌 이상 accountList와 같이 변수명에 붙이지 말자.
  • 차라리 accountGroup, bunchOfAccounts, accounts등으로 명명하자.
  • 내가 자주쓰는 Info, Dataaan, the와 마찬가지이며 의미를 구분하기 힘든 용어이다.
  • 불용어-noise word을 사용하지말자.

발음하기 쉬운 이름을 사용하기.

Bad Example

class DtaRcrd102 {
    private Date genymdhms;
    private Date modymdhms;
    private final String pszqint = "102";
};

Good Example

class Customer {
    private Date generationTimestamp;
    private Date modificationTimestamp;
    private final String recordId = "102";
};

인코딩을 피하기.

  • 추상화된 Class이름을 ShapeFactory로 정의하고 상속받아 구현하는 Class이름을 ShapeFactoryImp, CShapeFactory으로 정의한다.

클래스 이름

  • 명사 혹은 명사구를 사용하기.(Customer, WikiPage, Account, AddressParser)
  • Manager, Processor, Data, Info와 같은 단어는 피하자 => 불용어-noise word
  • 동사는 사용하지 않는다.

메서드 이름

  • 동사동사구가 적합하다. (postPayment, deletePage, save)
  • get, set, is
Complex fulcrumPoint = new Complex(23.0);
Complex fulcrumPoint = Complex.FromRealNumber(23.0); // better

한 개념에 한 단어를 사용하기.

  • 하나만 사용하여 통일성 얻기.
  • fetch, retrieve, get
  • controller, manager, driver

말장난을 하지 말기.

  • add의 역할은 A와 B를 더하는 의미이다.
  • 중간에 삽입하는 함수의 이름도 add라고 정의하면 add의 의미는 명확하지 못하다.
  • add대신 insert, append로 적당하다.

의미있는 맥락 추가하기.

Bad Example

  • 세 변수의 의미가 불분명하다.
private void printGuessStatistics(char candidate, int count) {
    String number;
    String verb;
    String pluralModifier;
    if (count == 0) {  
        number = "no";  
        verb = "are";  
        pluralModifier = "s";  
    }  else if (count == 1) {
        number = "1";  
        verb = "is";  
        pluralModifier = "";  
    }  else {
        number = Integer.toString(count);  
        verb = "are";  
        pluralModifier = "s";  
    }
    String guessMessage = String.format("There %s %s %s%s", verb, number, candidate, pluralModifier );

    print(guessMessage);
}

Good Example

  • 함수를 쪼개기가 쉬워지므로 알고리즘도 좀 더 명확해진다.
public class GuessStatisticsMessage {
    private String number;
    private String verb;
    private String pluralModifier;

    public String make(char candidate, int count) {
        createPluralDependentMessageParts(count);
        return String.format("There %s %s %s%s", verb, number, candidate, pluralModifier );
    }

    private void createPluralDependentMessageParts(int count) {
        if (count == 0) {
            thereAreNoLetters();
        } else if (count == 1) {
            thereIsOneLetter();
        } else {
            thereAreManyLetters(count);
        }
    }

    private void thereAreManyLetters(int count) {
        number = Integer.toString(count);
        verb = "are";
        pluralModifier = "s";
    }

    private void thereIsOneLetter() {
        number = "1";
        verb = "is";
        pluralModifier = "";
    }

    private void thereAreNoLetters() {
        number = "no";
        verb = "are";
        pluralModifier = "s";
    }
}
0%