Blog: usual
단정적 프로그래밍

단정적 프로그래밍

링크 복사
링크가 복사되었습니다

단정적 프로그래밍이란, 흔히 사용되는 Assertion을 사용한 프로그래밍이다

assert(myFaith === true, '내 신념이 틀렸다니');

이 assert 문은 때로는 무의미하게 보일 수도 있다. 당연하게 '참'인 상황을 확인하는 문장을 중간에 넣는다니, 이 얼마나 무쓸모한 것인가.

하지만 꽤나 유용하다.

실용적인 쓰임새

특히나 typescript에서 사용될 때가 많다.

function getUser(id: string) {
  const user = users.find((u) => u.id === id);
  // user가 undefined일 수 있지만 강제로 타입 단언
  return user!.name;
}

위 예시에서, 느낌표(!) 를 사용하여 타입 오류를 방지했다. 아마 id가 반드시 존재하는 경우라고 생각했을 것이다.

하지만 뭔가 찝찝하다. 이를 assertion으로 바꿔보자

function getUser(id: string) {
  const user = users.find((u) => u.id === id);
  assert(user !== undefined, `User with id ${id} not found`);
  return user.name;
}

좀 더 괜찮은것 같다.

찝찝한 경우, 꼭 그 이유를 한번 되짚어 보는것은 꽤나 도움이 된다.

안정적인 쓰임새

실용적인 것도 꽤 도움이 되지만, 안정적인 프로그램을 구축하는 데에도 도움이 꽤 된다.

생각보다 '불가능'하다고 생각했던 많은 일들이 실제로 가능하고, 프로그래밍에서는 더욱 그렇다.

다음은 [실용주의 프로그래머]에 나오는 연습문제이다.

다음 '불가능한'것들 중 무엇이 실제로 일어날 수 있는가?

  1. 한 달이 28일보다 적은 것
  2. 시스템 콜의 오류 메시지: 현재 디렉터리에 접근할 수 없음
  3. C++ 에서, a=2; b=3; 하지만 (a+b)는 5가 아님
  4. 내각의 합이 180도가 아닌 삼각형
  5. 1분이 60초가 아님
  6. (a + 1) <= a

놀랍게도 모두 가능하다

즉, 자신이 구축하고 있는 시스템에서 도달할 수 없다고 생각하는 것들은 assertion으로 제한구역을 설정해두자.

얼마 안가 assertion이 실패하는 일이 분명히 발생할 것이다.

class Example {
    ...

    get deletable() {
        return this.permission.delete
    }

    delete(){
        assert(this.deletable === true, 'You do not have permission to delete');

        ...
    }

}

물론 모든 것들에 assertion을 설정할 필요는 없다.