03. 함수

가장 기본적인 단위 함수, 깔끔한 함수를 만들기 위한 지침들 소개

작게 만들기#

  • ~4 줄 이하로 작성 권장...
  • 들여쓰기 수준은 3단 이상 X

한 가지만 수행#

  • 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그함 수는 여러작업을 하는 것이다
  • 지정된 함수 이름 추상화 수준이 하나인 단계만 수행

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

  • 함수 내 코드는 같은 추상화 수준을 유지
  • 위에서 아래로 코드 읽기: 내려가기 규칙
    • 위에서 아래로 이야기처럼 읽혀야 좋음

Switch 문#

  • Switch 문은 추상 팩토리 패턴으로 꼭꼭 숨기기
    • 다시 말해, interface 구현체로 숨겨 사용자가 파악할 필요 없게 하기
  • 한번 정돈 참자~

서술적인 이름 사용#

  • 함수가 작고 단순할 수록 서술적인 이름을 고르기 쉬워짐
  • 길고 서술적인 이름이 짧고 어려운 이름보다 나음

함수 인수#

  • 적을 수록 좋음!
  • 인수가 만다면 어떤 개념을 추상화할 수 있는지 보자
    • 클래스화 하여 인수객체로 넘길 수 있음
  • 테스트 관점에서도 인수가 많을 수록, 다양한 케이스를 검사해봐야 해 힘듦
  • 출력 인수 XXXXXXXXXXX
    • 여기서 출력인수는 레퍼런스 타입이라 인수로 받았는데 해당 인수를 수정하는 것

단항 형식 유형#

  • 인수로 뭔가 변환해 결과를 반환하는 경우
  • 이벤트 형식: 입력 인수로 시스템 상태를 바꿈

플래그 인수#

  • 사용안하는 것을 권장
    • 플래그 인수로 분기친다는 의도니 역할이 두개 이상일 가능성이 높음

인수 목록#

  • String.format 은 가변 인수를 사용하는데 이 가변인수는 하나의 인수라도 봐도 무방
// 아래는 인수가 2개인 것으로 간주
public String format(String format, Object... args)

동사와 키워드#

  • 함수는 행위를 나타내므로, 동사로 시작해서 명사와 쌍을 이루도록 구성
  • 함수 이름에 키워드를 추가하면 인수의 순서를 기억할 필요가 없음
    • 물론 요즘 IDE가 좋아서 바로 파악 가능하긴 함

부수효과 X#

  • 함수의 이름과는 다른 짓 X
    • 이는 시간적 결합이나 순서 종속성을 야기함
  • checkPassword() 라는 함수에서 Sessions.initialize() 의 코드가 들어있다면
    • 세션을 초기화해도 괜찮은 경우에만 호출이 가능하기 때문에 시간적 결합을 야기함
  • 출력 인수도 부수효과의 예
    • 정말 어쩔 수 없는 경우가 아니라면 사용 X

명령/조회 분리#

  • 뭔가를 수행(명령) 하거나 답하거나(조회) 둘중 하나만 해야함
// 명령/조회 가 같이 있는 경우
if (set("username", "unclebob")) ...
// 명령/조회 분리
if (attributeExists("username")) {
setAttribute("username", "unclebob");
}

오류 코드를 정의하기 보단 예외 사용#

  • 오류 코드로 작성하면 무수한 if 분기가 탄생하고 중첩됨
  • 예외를 사용해서 중첩을 줄이자
// 한가지 작업으로 각 메소드를 분리하고, 예외 사용한 모습
public void delete(Page page) {
try {
deletePageAndAllReferences(page);
}
catch (Exception e) {
logError(e);
}
}
private void deletePageAndAllReferences(Page page) thrwos Exception {
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}
// 로깅 처리도 한가지 작업이므로 분리
private void logError(Exception e) {
logger.err(e.getMessage());
}

반복 X#

DRY: Don't Reapeat Yourself

  • 많은 원칙과 기법이 중복을 없애거나 제어할 목적으로 나옴
    • RDB, OOP, AOP, 구조적 프로그래밍, COP 등

구조적 프로그래밍#

  • OOP에선 함수를 작게 만든다면 구조적 프로그래밍에서 권장하지 않는 return, break, continue 를 여러차례 사용해도 됨

그래서 어떻게 함수를 짬?#

코드짜는게 글쓰기와 비슷하 보통 다음과 같은 과정을 거치게 되더라

  1. 초안 코드 작성
  2. 테스트 코드 작성 (TDD 는 테스트 코드부터 짜겠죵?)
  3. 코드 리팩토링

결론#

  • 마스터 프로그래머는 시스템을 구현할 프로그램이 아니라 풀어갈 이야기로 보더라~
  • 해당 장은 함수를 잘 만드는 가이드라인들을 배움
Last updated on