i-no.log
로그인
i-no.log
로그인
[클린 코드 읽고 정리해두고 다시 보기] 함수
inho ha
·
2024년 9월 12일
팔로우
0
클린 코드
0
클린 코드 읽고 정리해두고 다시 보기
목록 보기
2/16
작게 만들어라
함수는 작게, 더 작게 만들어라, 작을수록 더 좋다.
if / else / while 에는 한 줄만 들어가고, 거기서 함수를 호출하라
한 가지만 해라!
여러 작업을 하는 함수는 분리
단순히 다른 표현이 아니라 의미 있는 이름으로 다른 함수를 추출할 수 있다면 여러 작업을 하는 함수이니까 분리하라
함수당 추상화 수준은 하나로
함수 내 모든 문장의 추상화 수준이 동일해야 한다.
getHtml() 은 추상화 수준 높음
PathParser.render(pagepath) 는 추상화 수준 중간
.append("\n") 은 추상화 수준 낮음
Switch 문
switch 문은 추상 팩토리에 숨기고, 팩토리는 switch 문을 사용해 적절한 파생 클래스의 인스턴스를 생성하라
서술적인 이름을 사용하라
여러 단어가 쉽게 읽히는 명명법을 사용하고, 여러 단어를 사용해 함수 기능을 잘 표현하는 이름을 선택한다.
모듈 내에서 함수 이름은 같은 문구, 명사, 동사를 사용한다. (일관성)
함수 인수
인수는 적을 수록 좋다. 3개 이상은 피하고, 4개 이상은 금지
인수가 적으면 테스트 코드 작성도 편하다.
출력 인수는 피하고, 반환값으로 출력하라
이벤트 함수는 이벤트라는 사실이 코드에 명확히 드러나야 한다.
인수에 질문을 던지거나, 인수를 변환해 결과를 반환하는 경우에만 인수 1개 사용
플래그 인수 금지
인수가 2개인 경우는 인수 하나의 클래스 메서드로 변경하여 단항으로 변경
인수가 많은 경우에 일부를 클래스로 묶어라
인수를 설명하는 키워드를 포함한 이름 사용
write(name) -> writeField(name)
부수 효과를 일으키지 마라
인수나 시스템 전역 변수를 수정하는 부수 효과는 함수에서 한 가지 이상의 일을 하게 만든다.
이는 temporal coupling, order dependency 를 초래한다.
temporal coupling이 필요하다면 이것이 함수의 이름에서 파악가능 하도록 해야한다.
출력 인수를 피하고, 함수가 속한 객체 상태를 변경하는 방식을 택한다.
명령과 조회를 분리하라
함수는 뭔가를 수행하거나 뭔가에 답하거나 둘 중 하나만 해야한다.
객체 상태를 변경하거나 아니면 객체 정보를 반환하거나 둘 중 하나다.
set 함수에서 성공 여부를 boolean 으로 반환하면 if(set(attr, value)) 으로 사용되고, 이는 기존 attr이 value값으로 설정 되어 있다면 으로 읽힌다.
오류 코드보다 예외를 사용하라
명령 함수에서 오류 코드를 반환하는 방식은 명령/조회 분리 규칙을 위반한다.
오류 코드를 반환하면 이를 곧바로 처리해야하기 때문에 여러 단계로 중첩되는 코드를 야기한다.
try/catch 블록은 별도 오류 처리 함수로 뽑아낸다.
오류 처리 함수도 오류 처리라는 한 가지 작업만 해야 한다.
반복하지 마라
중복된 코드가 있다면 알고리즘이 변할 때 수정할 대상이 많고, 누락으로 오류가 발생할 확률이 높아진다.
구조적 프로그래밍
구조적 프로그래밍은 return은 한개만 break, continue는 사용 금지라고 말하는데 이는 좋지 않다.
함수를 작게 만들면 return, break, continue를 여러 차례 사용해도 좋다.
함수를 어떻게 짜죠?
일단 동작하도록 작성하고, 테스트 코드를 작성한다.
이후 코드를 다듬고, 함수를 만들고, 이름을 바꾸고, 중복을 제거하고, 메서드를 줄이고, 순서를 바꾸고, 전체 클래스를 쪼개고... 항상 테스트 코드가 통과하는 것을 확인하면서 리팩토링한다.
inho ha
inho ha / ian(swatchon) / iha(42seoul)
팔로우
이전 포스트
[클린 코드 읽고 정리해두고 다시 보기] 의미 있는 이름
다음 포스트
[클린 코드 읽고 정리해두고 다시 보기] 주석
0개의 댓글
댓글 작성