1. 과거 방식

LBYL : Look before you leap.

Look before you leap. This coding style explicitly tests for pre-conditions before making calls or lookups. This style contrasts with the EAFP approach and is characterized by the presence of many if statements.

In a multi-threaded environment, the LBYL approach can risk introducing a race condition between “the looking” and “the leaping”. For example, the code, if key in mapping: return mapping[key] can fail if another thread removes key from mapping after the test, but before the lookup. This issue can be solved with locks or by using the EAFP approach.

let num1 = 3;
let num2 = 0;
let result;

result = (i, j) => {
    return (j != 0 ? i / j : '연산 불가');
};

console.log(result(num1, num2));


결과 :
'연산 불가'

원래 기존 문법상으로는 if ~ else 문을 사용해야하지만 여기서는 같은 로직이기 때문에 그냥 ternary operator를 사용했다.

 

2. 요즘 방식

EAFP : Easier to ask for forgiveness than permission.

Easier to ask for forgiveness than permission. This common Python coding style assumes the existence of valid keys or attributes and catches exceptions if the assumption proves false. This clean and fast style is characterized by the presence of many try and except statements. The technique contrasts with the LBYL style common to many other languages such as C.

let num1 = 3;
let num2 = 0;
let result;

result = (i, j) => {
    try {
        return i / j;
    } catch (e) {

    }
};

console.log(result(num1, num2));


결과 :
Infinity

 

 

LBYL(Java/C# : try ~ except, Python : try ~ except, Swift : do ~ catch) 방식은 많은 if문이 존재하고, 이 if를 이용해 거짓을 판별... 즉, "로직을 정상적으로 실행할 수 있는 조건이 되는가?" 를 검사한다. 이 방식은 C를 포함한 많은 언어에서 사용되는 방식이었고, 이 방식의 문제는 멀티 스레드 환경에서 여러개의 look, leap가 동시에 실행되면 특정 스레드의 실행으로 인해 예외 처리 로직이 실패할 수 있다고 한다.(C를 해본 적도, 저런 방식을 써본 적도 없어서 정확히는 모르겠다.)

아무튼, 그래서 새로 나온 EAFP 방식은 뭐든 다 try를 통해 실행시키고, 에러를 catch로 정상 로직과 분리시키는 것이다. 그리고 파이썬은 이 방식을 지향한다고 한다. ()

docs.python.org/3/glossary.html

 

Glossary — Python 3.9.1 documentation

The implicit conversion of an instance of one type to another during an operation which involves two arguments of the same type. For example, int(3.15) converts the floating point number to the integer 3, but in 3+4.5, each argument is of a different type

docs.python.org

 

 

참고 : Go에는 try ~ catch가 없다. Go는 아예 한 술 더 떠서 error를 항상 반환한다. 그리고 에러가 없다면 "nil"을 반환한다.
따라서 if ( 조건 != nil) { } 이런 로직을 사용할 수 있다. 하지만, Go에서 예외처리는 defer, panic, recover를 이용해 다룬다고 한다. Go는 해본적 없어서 자센한건 나중에...

'개발자 > 용어... 그 외의 것들...' 카테고리의 다른 글

맥 NVRAM(PRAM), SMC 재설정  (0) 2020.12.18
Logo (로고) 모음  (0) 2020.12.10
ODBC  (0) 2020.11.05
개발 문서 RFP, RFI, Project Charter, SRS, RTM, STD...  (0) 2020.11.05
BSC, MBO, KPI  (0) 2020.11.03

+ Recent posts