개발공부/C#

[Effective C#] 아이템 40 : 지연 수행과 즉시 수행을 구분하라

개발자 찐빵이 2021. 12. 15. 22:20
728x90

선언적 코드와 명령형 코드

선언적 코드: 해설적이며 무슨 작업을 해야 하는지 정의한다.
명령형 코드: 어떻게 작업을 수행해야 하는지 단계별로 세분화해서 기술한다. 필요한 매개변수를 모두 계산한 다음, 메서드를 호출한다.

명령형 코드에서 작업 진행 순서

var answer = DoStuff(Method1(),
    Method2(),
    Method3());
  1. DoStuff()의 첫 번째 매개변수를 생성하기 위해 Method1()을 호출한다.
  2. DoStuff()의 두 번째 매개변수를 생성하기 위해 Method2()을 호출한다.
  3. DoStuff()의 세 번째 매개변수를 생성하기 위해 Method3()을 호출한다.
  4. 앞서 계산된 매개변수를 이용하여 DoStuff()를 호출한다.

3개의 메서드를 모두 호출한다.

선언적 코드 작업 진행 순서

var answer = DoStuff(() => Method1(),
    () => Method2(),
    () => Method3());
  1. Method1(), Method2(), Method3()을 호출하는 람다 표현식을 매개변수로 DoStuff()를 호출한다.
  2. DoStuff 내에서 Method1()의 수행 결과가 필요한 경우 Method1()을 호출한다.
  3. DoStuff 내에서 Method2()의 수행 결과가 필요한 경우 Method2()을 호출한다.
  4. DoStuff 내에서 Method3()의 수행 결과가 필요한 경우 Method3()을 호출한다.
  5. Method1(), Method2(), Method3()은 어떤 순서로도 수행될 수 있으며 필요한 경우 여러 번 수행되거나 혹은 전혀 수행되지 않을 수도 있다.

3개의 메서드가 호출될 수도 있고 호출되지 않을수도 있다.

결론

명령형 모델은 메서드를 호출하고 그 결과를 다른 메서드에 전달한다.
선언적 모델은 메서드를 호출할 수 있는 델리게이트를 매개변수로 전달한다는 점에서 큰 차이가 있다.

프로그램이 다르게 수행되기 때문에 메서드가 어떤 작업을 수행하느냐에 따라 서로 다른 결과를 얻게 된다.

지연 수행과 즉시 수행의 차이를 최소화하는 방법

  1. 순수 변경 불가 타입
    값을 수정할 수 없고, 프로그램 내 다른 상태를 변경하지도 않는다.
    따라서 부수효과가 전혀 없다.
반응형