본문 바로가기

Book Review/Clean Code

클린 코드 2장 정리 #2

  1. 인코딩을 피하라
    • 헝가리식 표기법을 피하라
    • 멤버 변수 접두어를 피하라
    public class Part{
    	private String m_dsc; // 설명 문자열
    	void setName(String name){
    		m_dsc = name;
    	}
    }
    
    public class Part{
    	String description; // 설명 문자열
    	void setDescription(String description){
    		this.description = description;
    	}
    }
    
    접두어를 사용한 코드는 옛날에 작성한 구닥다리 코드라는 징표가 되어버린다.
    1. 인터페이스 클래스와 구현 클래스
      • 인터페이스 클래스 이름과 구현 클래스 이름 중 하나를 인코딩 해야 한다면, 구현 클래스 이름을 택하는게 좋다. ShapeFactoryImpl나 CShapeFactory가 IShapeFactory보다 좋다.
    2. 자신의 기억력을 자랑하지 마라
    3. 독자가 코드를 읽으면서 변수 이름을 자신이 아는 이름으로 변환해야 한다면 변수 이름은 바람직하지 못하다.
    4. 클래스 이름
      • 클래스 이름과 객체 이름은 명사나 명사구가 적합하다. Customer, WikiPage, Account, AddressParser 등이 좋은 예이다. Manager, Processor, Data, Info 등과 같은 단어는 피하고, 동사는 사용하지 않는다.
    5. 메서드 이름
      • 메서드 이름은 동사나 동사구가 적합하다. postPayment, deletePage, save 등이 좋은 예이다.
      • 접근자, 변경자, 조건자는 자바빈 표준에 따라 값 앞에 get, set, is를 붙인다.
      String name = employee.getName();
      customer.setName("mike");
      if (paycheck.isPosted())....
      
      • 생성자를 중복 정의 할 때는 정적 팩토리 메서드를 사용한다. 메서드는 인수를 설명하는 이름을 사용한다.
      Complex fulcrumPoint = Complex.FromRealNumber(23.0);
      
      Complex fulcrumPoint = new Complex(23.0);
      
      위 코드가 아래 코드보다 좋다. 생성자 사용을 제한할려면 해당 생성자를 private로 선언한다.
    6. 발한 이름은 피하라
      • 재미난 이름보다 명료한 이름을 선택하라
    7. 한 개념에 한 단어를 사용하라
      • 똑같은 메서드를 클래스마다 fetch, retrieve, get으로 제각각 부르면 혼란스러워서 추상적인 개념 하나에 단어 하나를 선택해 이를 고수해야 한다.
      • 일관성 있는 어휘를 사용해야 한다.
    8. 말장난을 하지마라
      • 한 단어를 두 가지 목적으로 사용하지 마라
      • 만약 지금까지 사용한 add 메서드가 2개의 값을 더하는 메서드였는데, 새로 작성하는 메서드는 집합에 값을 하나 추가한다고 가정하면 이 메서드는 add 메서드와 맥락이 다르기 때문에 add 메서드라고 부르면 안된다. insert나 append라는 이름이 적당하다.
    9. 해법 영역에서 가져온 이름을 사용하라
      • 코드를 읽을 사람도 프로그래머라는 사실을 명심한다.
    10. 문제 영역으로 가져온 이름을 사용하라
      • 적절한 ‘프로그래머 용어’가 없다면 문제 영역에서 이름을 가져온다.
    11. 의미 있는 맥락을 추가하라
      • 스스로 의미가 분명한 이름이 없지 않지만, 대다수 이름은 그렇지 못하다. 그래서 클래스, 함수, 이름 공간에 넣어 맥락을 부여한다.
      • addr라는 접두어를 추가해 addrFirstName, addrLastName, addrState라 쓰면 맥락이 더 분명해진다. 물론 Address라는 클래스를 생성하면 더 좋다.
      private void printGuessStatistics(char candidate, int count){
      	String number;
      	String verb;
      	String pluraModifier;
      	if (count == 0){
      		number = "no";
      		verb = "are";
      		pluraModifier = "s";
      	} else if (count == 1){
      		number = "1";
      		verb = "is";
      		pluraModifier = "";
      	} else{
      		number = Integer.toString(count);
      		verb = "are";
      		pluraModifier = "s";
      	}
      	String guessMessage = String.format(
      		"There %s %s %s%s", verb, number, candidate, pluraModifier);
      	print(guessMessage);
      }
      
      위 코드는 함수가 길고, 세 변수를 함수 전반에서 사용한다. 함수를 작은 조각으로 쪼개는 클래스를 만든 후에, 세 
private void printGuessStatistics(char candidate, int count){
	String number;
	String verb;
	String pluraModifier;
	if (count == 0){
		number = "no";
		verb = "are";
		pluraModifier = "s";
	} else if (count == 1){
		number = "1";
		verb = "is";
		pluraModifier = "";
	} else{
		number = Integer.toString(count);
		verb = "are";
		pluraModifier = "s";
	}
	String guessMessage = String.format(
		"There %s %s %s%s", verb, number, candidate, pluraModifier);
	print(guessMessage);
}

변수를 클래스에 넣으면 간단하게 사용할 수 있다.

 

12. 불필요한 맥락을 없애라

  • 일반적으로는 짧은 이름이 긴 이름보다 좋다. 단, 의미가 분명한 경우에 한해서다. 이름에 불필요한 맥락을 추가하지 않도록 주의해야 한다.
  • accountAddress와 customerAddress는 Address 클래스 인스턴스로는 좋은 이름이나 클래스 이름으로는 적합하지 못하다. Address는 클래스 이름으로 적합하다.

'Book Review > Clean Code' 카테고리의 다른 글

클린코드 5장_형식 맞추기  (0) 2022.09.06
클린코드 4장_주석  (0) 2022.08.30
클린 코드 3장 정리 #1  (0) 2022.07.30
클린 코드 2장 정리 #1  (0) 2022.07.28
클린 코드 1장 정리  (0) 2022.07.28