본문 바로가기

개인공부/클린코드

[클린코드] 간결하고 안전한 함수 작성하기

반응형

로버트 C. 마틴의 클린 코드 도서를 정리한 내용입니다.

 

함수를 작성할 때는 무조건 간결하게 작성하는 것이 좋다.

당연히 짧은 함수가 더 이해하기 쉽기 때문이다. 이번 장에서는 함수를 간결하고 안전하게 작성하는 법에 대해 정리하였다.

 

 

좋은 함수를 만드는 규칙

  1. 함수는 무조건 작게 만들자
    • 함수의 들여쓰기 수준은 가능하면 1단이나 2단을 넘어가지 않게 하는 것이 좋다.
    • 그래야 함수를 읽고 이해하기 쉽다.
  2. 함수는 한 가지 일만 해야 한다.
    • 함수는 한 가지 일을 잘 해야 한다.
    • 만약 함수 내에서 다른 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 가지 일을 하는 것이다.
  3. 서술적인 이름을 사용하라!
    • 함수의 이름은 함수가 하는 일을 잘 표현할 수 있어야 한다.
    • testableHtml 이란 이름 보다는 SetupTeardownIncluder 라는 이름이 더 좋다.
    • 이름을 붙일 때는 일관성이 있어야 한다.
    • 이름이 길어저도 상관없고 이름을 정하느라 많은 시간을 들여도 괜찮다.
  4. 함수에서 이상적인 인수 개수는 0개이다.
    • 함수의 인수는 적은 것이 좋다. 
    • 1 ~ 2개 정도 사용하는 것이 좋고, 3개는 가능하면 피하고 4개 이상은 사용하면 안된다.
    • 어떻게 인수를 줄일까? 객체를 생성해서 줄 수 있다.
    • makeCircle(double x, double y, double radius);  makeCircle(Pointer center,, double radius);
  5. 함수 이름에 키워드를 추가하는 것도 좋다.
    • assertEquals(expected, actual) assertExceptedEqualsActual(expected, actual)
    • 이름에 인수의 순서까지 표현되어 있어 사용자에게 더욱 편리하다.
  6. 부수 효과를 일으키지 마라!
    • 함수 내에 예상하지 못할 부수적인 기능까지 하도록 하지 않는다.
    • 밑에서 코드를 통해 자세하게 알아보겠다.
  7. 명령과 조회를 분리해라!
    • 함수는 객체 상태를 변경하거나 아니면 객체 정보를 반환하거나 둘 중 하나만 해야 한다.
    • public boolean set(String attribute, String value);
    • 위 함수는 attribute 속성을 찾아 값을 value 로 설정하고 성공하면 true, 실패하면 false를 반환하는 함수이다.
    • if(set(”username”, “unclebob”))…
    • 독자 입장에서 위 코드를 해석할 때 어떻게 해석 되는가? 
    • username이 unclebob으로 설정되어 있는 지 확인 하는 코드로 오해할 수 있다.

 

[부수 효과를 일으키는 코드]

public class UserValidator{
	private Cryptographer crytographer;
    
    public boolean checkPassword(String userName, String password){
    	User user = UserGateway.findByName(userName);
        if(user != User.NULL){
            String codedPhrase = user.getPhraseEncodedByPassword();
            String phrase = cryptographer.decrypt(codedPhrase, password);
            if("Valid Password".equals(phrase)){
            	Session.initialize();
                return true;
            }
        }
        return false;
    }
}

 

6번의 부수 효과를 일으키는 코드의 예시이다. checkPassword() 함수는 부수 효과를 이르킨다. Session.initialize() 가 부수 효과이다.

checkPassword() 함수는 이름 그대로 암호를 확인하는 함수인데 이름만 봐서는 세션을 초기화 한다는 사실이 드러나지 않는다.

만약 다른 개발자가 이를 모르고 사용한다면 의도치 않게 세션을 초기화하게 될 것이다.

차라리 함수는 한 가지 일만 한다는 규칙을 위배 하더라도 checkPassowrdAndInitializeSession 이렇게 확실하게 이름을 짓는 것이 낫다.

 

간결하고 안전한 함수 작성하는 방법 (함수 리팩터링)

함수를 작성하는 것은 마치 글짓기와 비슷하다. 먼저 생각을 기록하고 읽기 좋게 다듬는 과정을 거친다. 함수를 작성할 때 역시 처음에는 복잡하고 중복된 코드들을 작성하고 이를 정리한다.

 

 

  1. 기능을 구현한 서투른 함수를 작성한다.
    • 이때는 기능 구현에 초점을 맞춰 함수가 길고, 복잡하고, 중복도 많을 것이다.
  2. 테스트 코드를 작성한다.
    • 구현한 기능을 빠짐없이 테스트할 수 있는 테스트 코드를 작성한다.
  3. 리팩터링한다.
    • 좋은 함수 규칙에 맞춰 코드를 다듬는다.
    • 이때 리팩터링한 함수가 잘 작동하는 지 검증하기 위해 반드시 테스트 코드가 필요하다.
반응형