본문 바로가기

클린한 코드/Clean Code

[클린 코드] 3장. 함수

728x90

1. 작게 만들어라!

  • 블록과 들여쓰기
    • if문, else문, while 문 등에 들어가는 블록은 한 줄이어야 한다!

 

2. 한 가지만 해라!

  • 함수 당 추상화 수준은 하나로 하자: 함수 내 모든 문장의 추상화 수준이 동일해야 한다.
    • 예를 들어 아래 코드에서 함수 내 추상화 수준이 다르다.
public String method(Page page){
    String testPage = page.getContent("content"); // 추상화 수준 높다.
    
    ...
    
    if(testPage) { String pagePathName = PathParser.render("path"); } // 추상화 수준 낮다. 
    
    ...
    
    return page.getHtml(); // 추상화 수준 높다.
}

 

  • 추상화 수준이 다르면 코드를 읽는 사람이 혼란스럽다. 

내려가기 규칙

위에서 아래로 이야기처럼 읽혀야 좋은 코드인데, 위에서 아래로 갈수록 한 함수 다음에는 추상화 수준이 다른 한 단계 낮은 함수가 오도록 하자.

즉, 위에서 아래로 문단을 읽어내려가듯이 코드를 구현하면 추상화 수준을 일관되게 유지할 수 있다.

 

3. Switch  문

  • switch문은 '한 가지' 작업만 하기에 까다롭다. 최대한 사용하지 않는 편이 좋지만, 피할 수 없다면 switch 문을 저차원 클래스에 숨겨 다형성을 이용하는 것이 좋다.

 

4. 서술적인 이름을 사용하라!

  • 이름이 길어도, 길고 서술적인 이름이 길고 서술적인 주석보다 좋다.
  • 여러 단어가 쉽게 읽히는 명명법을 사용하여, 그 여러 단어를 사용해 함수 기능을 잘 표현하는 이름을 선택한다.
  • 이름을 붙일 때는 일관성이 있어야 한다.
    • 같은 문구, 명사, 동사를 사용하자
    • includeSetupPages, includeSuiteSetupPage, includeTeardownPages, includeSuiteTearDownPage 등

 

5. 함수 인수

  • 인수 개수는 0개가 이상적, 3개 이상은 피하자.
  • 테스트 관점에서도 인수가 있으면 어렵다. 인수마다 유용한 값으로 다양한 조합을 구성해 테스트하기가 부담스러워진다.
  • 인수가 2~3개 필요하다면, 독자적인 클래스 변수로 선언할 가능성을 짚어보자
Circle makeCircle(double x, double y, double radius);
Circle makeCircle(Point center, double radius);

 

  • 함수의 이름을 지을 때, 단항 함수는 인수가 동사/명사 쌍을 이루도록 하고, 인수가 여러 개일 경우는 함수 이름에 인수 이름을 넣어, 인수의 순서를 기억할 필요가 없도록 하자.
void writeField(String name); // 단항 함수 --> name이 필드라는 사실이 분명히 드러난다.
void assertExpectedEqualsActual(String expected, String actual); // 다항 함수

 

 

6. 명령과 조회를 분리하라!

  • 객체 상태를 변경하거나 객체 정보를 반환하거나 둘 중 하나만 해라!
if(set("username", "betty")) ... // username이 betty로 설정되어 있다면...?

 // 이렇게 명령과 조회를 분리하면 혼란이 없어진다!
if(attributeExists("username")){
  setAttribute("username", "betty"); // username을 betty로 설정하라!
}

 

 

7. 오류 코드보다는 예외를 사용하라!

  • 오류 코드 대신 예외를 사용함으로써, 오류 발생 시 곧바로 처리할 필요 없으므로 오류 처리 코드가 원래 코드에서 분리되어 코드가 깔끔해진다.
  • try/catch 블록은 뽑아내어 별도 함수로 추출하자
  • 오류 처리도 한 가지 작업이므로, 오류를 처리하는 함수는 오류만 처리하도록 하자. (함수가 try 문으로 시작했으면 catch/finally로 끝내라)

 

8. 반복하지 마라!

  • 소스 코드에서 중복을 제거하라

 

함수를 처음 짤 때는 길고 복잡할 수 있지만, 코드를 다 작성하고 Unit Test도 추가한 후, 코드를 다듬으며 별도 함수를 생성하고, 이름을 바꾸고, 중복을 제거하며, 함수의 순서를 바꾸는 등의 과정을 거치면서 여기에서 설명하는 규칙을 따르는 코드를 작성할 수 있을 것이다.

 

728x90
반응형