함수의 구조 (function Structure) - 2

함수의 구조

클린코더스 - 백명석님 강의를 보고 작성한 글입니다.


함수의 구조 - 1

—————————————————————————————————————

목차

———————————————————————————————————————————————–

CQS

  • 상태를 변경하는 함수는 값을 반환하면 안된다. 값을 반환하는 함수는 상태를 변경하면 안된다.

command

  • 시스템의 상태변경가능
  • side effect를 갖는다
  • 아무것도 반환하지않는다.

query

  • side effect가 없다.
  • 계산값이나 시스템의 상태를 반환
  • 신뢰의 문제

Example

1
User u = authorize.login(userName, password);
  • 위의 상황에서 User를 사용하기 위해서는 항상 login을 해야함. login을 하면 원치않아도 User정보를 읽어야만 한다.
1
2
authorize.login(userName, password);
User u = authorize.getUser(userName);
  • 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
2
3
4
5
6
7
// 예를 들어서 아래와 같은 코드가 있다면, 
o.getX()
.getY()
.getZ()
.doSomething();

// 함수가 시스템에 너무 많은 의존성을 가지게 된다.
  • 함수가 시스템의 전체를 알게 하면 안된다.
  • 개별 함수는 아주 제한된 지식만 가져야한다.
  • 이전 메소드 호출의 결과로 얻은 객체의 메소드를 호출하면 안된다.
  • Tell Don’t Ask나, Law of Demeter 모두 어떻게 의존도를 낮추고, Testable하게 만들고, 클린하게 만들건지에 대한 방법, 규칙들이다.

    ask대신 tell하면 surrounding과 decouple 된다.

early returns

1
2
3
4
if(...)
else if(...)
else if(...)
else (...){ return; }

위 코드처럼 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은 하나의 일이다.

지금은 이해할 수 있고, 다 이해한것 같아도 속지말고, 직접 내 코드에 적용해보고, 설계해보자


0%