코딩관계론

[Clean Code] 코드에는 의미가 있어야 한다. 본문

Clean code

[Clean Code] 코드에는 의미가 있어야 한다.

개발자_티모 2023. 1. 3. 00:45
반응형

의도를 밝혀라

public List<int[]> getThem()
{
  List<int[]> list1 = new ArrayList<int[]
  for(int[] x: theList)
  {
      if(x[0] == 4)
        list1.add(x)
  }
  return list
}
  • 코드의 문제점은 함축성이다
    • list1이 무슨 기능을 가졌는지 알 수 없다
    • 왜 x[0]번지의 값이 중요한지 알 수 없다.
    • 상수 4가 의미하는 내용을 알 수 없다
public List<int[]> getThem()
{
  List<int[]> flaggedcell = new ArrayList<int[]
  for(int[] cell: gameBoard)
  {
      if(cell[STATE_VALUE] == FLAGGED)
        flaggedcell.add(cell)
  }
}
  • 지뢰 찾기 게임이라고 가정한다
    • 단순한 숫자를 의미있는 이름을 가진 상수로 변경해주면서 코드를 이해하기 더 쉽게 됐다.(STATE_VALUE, FLAGGED)
    • 단순한 이름이 아닌 사용용도를 풀어줌으로써 이득이 생감
      • list1 → flaggedcell
  • 최종적으로 int형이 아니라 Cell 객체를 만들어도 됨
public List<int[]> getThem()
{
  List<Cell> flaggedcell = new ArrayList<int[]
  for(Cell cell: gameBoard)
  {
      if(cell.isFlaged())
        flaggedcell.add(cell)
  }
}
  • Cell 객체화 하여 관리하기 더 쉽게 만들었다.
  • isFlaged라는 명시적인 함수를 만들어 상수를 감춰주었다.
# # Create the launch description and populate
ld = LaunchDescription()

ld는 의미가 없다고 생각한다.

ld → launchDescription가 의미를 풍부하게 만든다고 생각한다

Clober/navi/bringup.launch 발췌

그릇된 정보를 피하라

  • 특수성을 가진 단어를 피하라
    • 여러명의 계정을 묶을 때 실제 List가 아니라면 accountList라고 명명하지 말자.
      • List는 프로그래머에게 특수성을 준다
    • accountList → accountGroup, accounts
  • 유사한 개념은 유사한 표기법을 사용하자
    • 일관성이 떨어지는 표기법은 그릇된 정보이기 때문이다.
  • 의미있게 구분하라
    • 단순한 a1, a2가 아니라 source , destination이었다면 의미가 더 느껴졌을 것이다
public stsatic void copyChars(char a1[], chara2[])
{
  for(int i = 0; i < a1.length; ++i)
  {
      a2[i] = a1[i];
  }
}

 

public stsatic void copyChars(char source[], chara2 destination[])
{
  for(int i = 0; i < a1.length; ++i)
  {
      destination[i] = source[i];
  }
}
  • 불용어를 추가하지 말자 → 개념이 달라지지 않고 이름만 달라지는 경우
    • ProductInfo, ProudctData → 모르는 사람이 본다면 둘의 차이점을 알 수 없다. 개념을 구분해서 사용하자
    • getActiveAccount(), getActiveAccounts(), getActiveAccounInfo() → 차이를 알기 힘들다. 차이를 알 수 있도록 작성하
  • 클래스 이름
    • 클래스 이름과 객체 이름 명사나 명사구가 적합하다
  • 메서드 이름
    • 메서드는 클래스의 동작을 수행함으로 동사나 동사구가 적합하다.
  • 한 개념에 한 단어를 사용하자
    • get, fetch, retrieve 제 각각 부르면 혼란스럽다.
  • 말장난을 하지 말자
    • add라는 함수는 기존값에 + 새로운 값 = 새로운 값을 나타내는 함수로 사용됐다. 하지만 다른 집합에 다른 내용을 추가할 때 add를 사용할 수 있는가? → no insert나 다른 개념을 사용하자
  • 의미 있는 맥락을 추가하라 (이해가 잘 안됨)
    • 변수의 대부분은 의미 있는 맥락을 제공하지 못한다.
  • 클래스, 함수, namespace등으로 맥락(Context)을 표현해라
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);
}

함수는 맥락의 일부만 제공하고, 알고리즘이 나머지 맥락을 제공한다.

위의 변수가 어느 맥락에서 사용되는지 알 수 없다. 함수를 다 읽고야 메세지를 보내는 맥락에서 사용된다는 것을 알 수 있다.

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";
    }
}

세가지 변수를 클래스에 넣어줌으로써 맥락이 분명해졌다.

변수들이 확실하게 Message 클래스에 속하게 된다.

반응형

'Clean code' 카테고리의 다른 글

파이썬 데코레이터(Decorator)  (0) 2023.02.26
[Clean code] 클래스  (0) 2023.01.11
[Clean code] 형식 맞추기  (0) 2023.01.09
[Clean code] 자료추상화  (1) 2023.01.06
[Clean code] 함수  (0) 2023.01.04