서술적인 이름을 사용하라
이름은 길어도 된다. 길고 서술적인 이름이 짧고 어려운 이름보다 좋다
이름을 정하느라 시간을 들여도 괜찮다.
서술적인 이름을 사용하면 개발자 머릿속에서도 설계가 뚜렷해지므로 코드를 개선하기 쉬워진다.
함수 인수
함수에서 이상적인 인수 개수는 0개다.
테스트 관점에서 보면 인수는 더 어렵다. 인수가 없는 함수와 있는 함수들을 검증하는 것을 상상해봐도 인수가 없는 것이 더 간단하다.
최선은 인수가 0개이며, 차선은 1개 이다.
많이 쓰는 단항 형식
인수를 1개 넘기는 이유로 가장 흔한 경우는 2가지이다.
- 인수에 질문을 던지는 경우다.
ex) boolean fileExists("MyFile") - 인수를 뭔가로 변환해 결과를 반환하는 경우다.
ex) InputStream fileOpen("MyFile") 은 String 형의 파일 이름을 InputStream으로 변환한다.
아주 유용한 단항 함수 형식은 이벤트 이다.
이벤트 함수는 입력 인수만 있다.
플래그 인수
함수로 부울값을 넘기면 그 함수가 여러 가지를 처리한다는 의미이므로 별로다.
인수 목록
String.format 메서드가 가장 좋은 예
동사와 키워드
함수와 인수는 동사/명사 쌍을 이뤄야 한다.
ex) write(name:) or writeField(name: )
부수 효과를 일으키지 마라
부수 효과는 거짓말이다. 함수에서 한 가지를 하겠다고 약속하고선 다른 짓도 하니까!
때로는 예상치 못하게 클래스 변수를 수정한다. 때로는 함수로 넘어온 인수나 시스템 전역변수를 수정한다.
출력 인수
일반적으로 우리는 인수를 함수 입력으로 해석한다.
public void appendFooter(StringBuffer report)
appendFooter(s); -> report.appendFooter(); 로 수정
명령과 조회를 분리하라
함수는 뭔가를 수행하거나 뭔가에 답하거나 둘 중 하나만 해야 한다.
객체 상태를 변경하거나, 객체 정보를 반환하거나 둘 중 하나다.
ex) public boolean set(String attribute, String value);
attribute인 속성값을 찾아 value로 설정 후, true/false를 반환한다.
-> 사용 시 if(set("username", "unclebob"))...
호출 코드만 봐서는 어떤 동작을 하는지 모호하다.
-> 변경
if (attributeExists("username")){
setAttribute("username", "unclebob");
}
오류 코드보다 예외를 사용하라
명령 함수에서 오류 코드를 반환하는 방식은 명령/조회 분리 규칙을 미묘하게 위반한다.
try/catch 블록 뽑아내기
코드 구조에 혼란을 일으키며, 정상 동작과 오류 처리 동작을 뒤섰는다.
따로 뽑는게 좋다.
try{
deletePageAndAllReferences(page);
}catch(Exception e){
logError(e);
}
...
private void deletePageAndAllReferences(Page page) throws Exception{
ddeletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}
오류 처리도 한가지 작업이다.
'스터디 > 클린코드' 카테고리의 다른 글
[Clean Code] 클린 코드(주석) - 9 (0) | 2021.03.09 |
---|---|
[Clean Code] 클린 코드 (함수) - 8 (0) | 2021.03.08 |
[Clean Code] 클린 코드(함수) - 6 (0) | 2021.03.08 |
[Clean Code] 클린 코드 - 5 (0) | 2021.03.08 |
[Clean Code] 클린 코드 - 4 (0) | 2021.03.08 |