[SW 이야기] EAFP vs LBYL 기술 이야기 2021. 1. 18. 22:22

로맨스 영화를 보면, 썸타던 남녀 주인공이 속시원하게 1일을 시작하지 않는다. 쭈뼛 쭈뼛, 뱅뱅 돌리고 돌리면서 애간장을 태우다가 꼭 무슨 사고가 발생한다. 사고를 간신히 무사히 넘긴 뒤에 남자 주인공과 여자 주인공은 한 숨 돌리며 서로의 존재에 안도한다. 눈빛을 교환하고, 점점 면상이 가까워 진다. 남주가 여주 입술에 입을 맞춘다. 여주는 남주를 밀친다. 당황한 남주의 싸다귀를 후려 갈긴다. 그리고 더 과격하게 키스를 때린다. 이 바보!...BGM 재생...영상미 풀 가동...

이 장면에서 EAFP를 떠올렸다면 당신은 SW 개발자다.

다음은 EAFP와 LBYL에 대한 내용을 설명한 파이썬 가이드 일부이다. 난 EAFP를 선호한다. 키스해도 되냐고 물어보는게 뭐야. 진짜 싫어.

EAFP

허락보다는 용서를 구하기가 쉽다 (Easier to ask for forgiveness than permission). 이 흔히 볼 수 있는 파이썬 코딩 스타일은, 올바른 키나 어트리뷰트의 존재를 가정하고, 그 가정이 틀리면 예외를 잡습니다. 이 깔끔하고 빠른 스타일은 많은 try와 except 문의 존재로 특징지어집니다. 이 테크닉은 C와 같은 다른 많은 언어에서 자주 사용되는 LBYL 스타일과 대비됩니다.

    try:
        start(tongue, french, 1500)
    except RejectError as reject:
        raise SystemError from reject

LBYL

뛰기 전에 보라 (Look before you leap). 이 코딩 스타일은 호출이나 조회를 하기 전에 명시적으로 사전 조건들을 검사합니다. 이 스타일은 EAFP 접근법과 대비되고, 많은 if 문의 존재로 특징지어집니다.

다중 스레드 환경에서, LBYL 접근법은 《보기》와 《뛰기》 간에 경쟁 조건을 만들게 될 위험이 있습니다. 예를 들어, 코드 if key in mapping: return mapping[key] 는 검사 후에, 하지만 조회 전에, 다른 스레드가 key를 mapping에서 제거하면 실패할 수 있습니다. 이런 이슈는 록이나 EAFP 접근법을 사용함으로써 해결될 수 있습니다.

    if (handle != null) {
        start(tongue, french, 1500);
    }

댓글