함수의 구조
클린코더스 - 백명석님 강의를 보고 작성한 글입니다.
—————————————————————————————————————
목차
- 함수의 구조
- 목차
- CQS
- Tell Don’t Ask
- Law of Demeter
- early returns
- Error handling
- Special Cases
- Null is a value
- try
———————————————————————————————————————————————–
CQS
- 상태를 변경하는 함수는 값을 반환하면 안된다. 값을 반환하는 함수는 상태를 변경하면 안된다.
command
- 시스템의 상태변경가능
- side effect를 갖는다
- 아무것도 반환하지않는다.
query
- side effect가 없다.
- 계산값이나 시스템의 상태를 반환
- 신뢰의 문제
Example
1 | User u = authorize.login(userName, password); |
- 위의 상황에서 User를 사용하기 위해서는 항상 login을 해야함. login을 하면 원치않아도 User정보를 읽어야만 한다.
1 | authorize.login(userName, password); |
- login Method의 리턴을 void로 변경하고, User 정보가 필요할때만 읽음.
값을 반환하는 함수는 상태를 변경하면 안된다.
상태를 변경하는 함수는 exception을 발생시킬 수는 있지만, 값을 반환할 수 없다.이것은 SideEffect를 관리하는 약속이다. 약속을 어겨서 혼란을 주지말자.
———————————————————————————————————————————————–
Tell Don’t Ask
- extream한 CQS는 C와 Q를 함께 사용하지 말도록
로그인 여부는 user객체에 속한다. Tell Don’t Ask 인데 isLoggedIn()은 이상함.
- Tell Don’t Ask 는 CQS를 강화하는 수단
- 이 규칙을 준수하다보면 Query메소드가 많이 필요없어진다. - 매우 좋은 현상(왜냐하면 Q는 Out of control되는 경향이 있기 때문)
Law of Demeter
1 | // 예를 들어서 아래와 같은 코드가 있다면, |
- 함수가 시스템의 전체를 알게 하면 안된다.
- 개별 함수는 아주 제한된 지식만 가져야한다.
- 이전 메소드 호출의 결과로 얻은 객체의 메소드를 호출하면 안된다.
- Tell Don’t Ask나, Law of Demeter 모두 어떻게 의존도를 낮추고, Testable하게 만들고, 클린하게 만들건지에 대한 방법, 규칙들이다.
ask대신 tell하면 surrounding과 decouple 된다.
early returns
1 | if(...) |
위 코드처럼 else에다가 리턴을 두지말고 return 되는 로직을 상단으로 올려서 코드를 끝까지 읽지않아도 될 수 있게하는 것
- 루프 중간에서 return 하는 것은 문제이다.
- 코드가 동작하도록 하는 것보다 이해할 수 있게하는 것이 더 중요하다.
Error handling
- Error처리를 위해 pop은 null을 반환하고, push는 false를 반환하는 것보다 Exception을 발생시키는 것이 좋다.
- Exception의 이름은 최대한 구체적이어야 한다.
- Inner클래스로 Exception을 정의하면 읽기 편할 수 있다. 고려해볼 것
- checked vs unchecked ?(찾아봐야함.) Checked Exception은 되도록 사용하지말자.
- unchecked는 throws를 말하는 것 같고, checked는 try~catch를 말하는 것 같다.
Exception은 어떤 메시지를 담아야 할까?
- 필요없는 것이 가장 좋다.
- Exception이름을 명확하게 지어서 이름으로 의미가 전달되도록 하자.
- 클래스 내부에 Message를 절대 두지말자.
Special Cases
Null is a value
- stack이 empty일 때 top함수는 무엇을 반환해야하나?
- Null 대신 Empty 객체를 발생시키는 것이 좋다.
try
- try가 있다면 함수내에서 변수선언을 제외하고 첫번째문장이여야한다.
- try 블럭 내에는 함수호출만 있어야한다.
- finally가 함수의 마지막 블럭이어야한다. 이후에 어떤라인도 없어야 한다.
- Error handling은 하나의 일이다.
지금은 이해할 수 있고, 다 이해한것 같아도 속지말고, 직접 내 코드에 적용해보고, 설계해보자