3장 함수

작게 만들어라

if, else, while 등에 들어가는 블록은 한 줄 이어야 한다.

중첩 구조가 생길 만큼 함수가 커져서는 안된다.

함수 들여쓰기 수준 역시 2단을 넘어서면 안된다.

한 가지 만 해라

함수가 한 가지 작업을 수행한다는 것은, 추상화 수준이 하나인 단계만을 수행하는 것이다.

함수를 만드는 이유는 큰 념을 다음 추상화 수준에서 여러 단계로 나눠 수행하기 위해서다.

함수 당 추상화 수준은 하나로

한 함수 내에서 추상화 수준이 달라서 섞이게 되면 코드를 읽는 사람이 햇갈린다.

근본 개념, 세부 사항을 잘 구분하고 잘 나눠야한다.

내려가기 규칙

위에서 아래로 이야기처럼 읽히는것이 좋은 코드, 즉 한 함수 다음에는 추상화 수준이 한 단계 낮은 함수가 와야 한다.

서술적인 이름을 사용하라

간단하고 명료한 이름보다는 길고 서줄적인 이름이 이해하기 훨씬 좋다.

서술적이어야 머릿속에서 이해도 좋고 설계가 그려지므로 코드를 개선하기 쉬워진다.

거기다 일관성도 있다면 마치 이야기를 읽듯이 읽혀나갈수있다.

플래그 함수를 지양하자

파라미터를 불린값으로 쓰는 플래그 함수를 사용하는 것은 함수가 여러가지를 처리한다고 공표하는것과 같다. 필자는 이 책을 보기 전에는 오히려 플래그 함수가 유용하다고 생각했었는데다른 사람이 작성한 플래그 함수를 보니 확실히 이해도가 떨어지는걸 보고 생각을 바꿨다.

이상적인 파라미터 개수는 0개 이지만 실질적으로 쉽지않기에 차선은 1개 정도라고 한다.

만약 파라미터가 두개 이상이 필요하다면 Dto 같은 클래스 변수로 묶어서 사용해야 한다.

부수 효과를 일으키지 마라

public class UserValidator {
	private Cryptographer cryptographer;
	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; 
	}
}

위에 함수는 UserValidator 라는 이름을 가지고 있다. 함수명 만 봤을때는 유저 정보를 받아와 해당 유저의 ID, Password를 체크하는 함수 라고 생각되었다.

하지만 주석이 있는 부분을 보면Session.initialize() 라고 되어있다.

함수명만 보고 대충 코드를 읽고 넘어갔다면 사용자는 기존 세션의 정보를 지워버릴수있다.

명령과 조회를 분리하라

객체 상태 변경 or 객체 정보 반환 중 하나만 해야 한다.

오류 코드 보다 예외를 사용하라

명령 함수에서 오류코드를 반환한다면 명령/조회 분리 규칙을 위반한다.

ex. if( UpdateBoard(boardDto) == E.OK);

위 처럼 상태 변경 과 정보 반환이 분리가 안되있는걸 볼수있다.

또한 예외 를 사용하면 오류 처리 코드가 원래 코드에서 분리되므로 코드가 깔끔해진다.

try - catch 문을 사용할때에도 물론 정상 동작 코드와 오류 처리 동작이 분리되긴 하지만

try - catch 문을 따로 메서드화 시키면 더 이해, 수정이 쉬워진다.

수정 전

수정 후

Last updated