단정적 프로그래밍
링크 복사
링크가 복사되었습니다
단정적 프로그래밍이란, 흔히 사용되는 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;
}
좀 더 괜찮은것 같다.
찝찝한 경우, 꼭 그 이유를 한번 되짚어 보는것은 꽤나 도움이 된다.
안정적인 쓰임새
실용적인 것도 꽤 도움이 되지만, 안정적인 프로그램을 구축하는 데에도 도움이 꽤 된다.
생각보다 '불가능'하다고 생각했던 많은 일들이 실제로 가능하고, 프로그래밍에서는 더욱 그렇다.
다음은 [실용주의 프로그래머]에 나오는 연습문제이다.
다음 '불가능한'것들 중 무엇이 실제로 일어날 수 있는가?
- 한 달이 28일보다 적은 것
- 시스템 콜의 오류 메시지: 현재 디렉터리에 접근할 수 없음
- C++ 에서, a=2; b=3; 하지만 (a+b)는 5가 아님
- 내각의 합이 180도가 아닌 삼각형
- 1분이 60초가 아님
- (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을 설정할 필요는 없다.