명령과 조회 명확히 분리하기
함수는 무엇인가를 수행하거나, 답하거나 둘 중 한가지만을 해야한다.
객체의 상태를 변경하거나, 객체의 정보를 반환하거나 둘 중 하나만 해야한다는 말이다.
예를 들어 다음 함수를 예를 들어 보자.
fun set(attr: String. value: String): Boolean {
...
}
위 set 함수는 이름이 attr인 속성을 찾아 값을 value로 바꾼 후 성공한다면 true를 실패한다면 false를 리턴한다.
문제는 이런 메소드를 사용하면 아래와같은 어색한 형태의 코드가 나온다.
if(set("name", "MJ")){
...
}
이런 형태의 메소드가 가지는 단점은 누군가가 이 코드를 볼때 "name"이 "Tom"으로 설정 되어있는지 체크하는 코드인지, 아니면 "name"을 "Tom"으로 설정하는 코드인지 한눈에 명확하게 이해하기 어려운게 사실이다.
왜냐하면 set이라는 네이밍은 동사인지 형용사인지 분간이 어렵기 때문이다.
이러한 문제점을 해결하기 위해 set을 setAndCheckIfExists와 같이 상세한 네이밍으로 변경하는 방법도 있지만, 명확하게 명령과 조회를 분리하여 혼란은 없애는 방법이 가장 깔끔하다.
if(attributeExists("name")){
setAttribute("name", "Tom")
...
}
'클린 코드' 카테고리의 다른 글
[클린 코드] 형식 맞추기(1) (0) | 2022.01.11 |
---|---|
[클린 코드] 주석(2) (0) | 2022.01.05 |
[클린 코드] 주석(1) (0) | 2022.01.04 |
[클린 코드] 함수(3) (0) | 2021.12.29 |
[클린 코드] 함수(2) (0) | 2021.12.27 |