yoda conditions(요다 표현식)

새로운 프로그래밍 은어라는 글을 보고 yoda conditions라는 것을 처음 알았습니다.

yoda conditions에 관한 설명은 링크에 아주 자세히 설명되어있으니 그것을 보시는것이 좋을 듯합니다.


yoda conditions이 좋은건지, 안좋은건지를 떠나서 그런게 있다는것만 알고있었는데, 최근 회사 동료분이 yoda conditions을 사용하는것에 대해서 어떻게 생각하느냐 하는 말을 했을때 자세히 알고 있는 지식이 없어서 아무런 말도 할 수 없었습니다.


그분이 사용한 yoda conditions은 if - true에 대한것으로 

if( true == is_player ) 와 같은 식입니다.


yoda conditions이 그렇듯 is_player에 true를 assign하는 경우를 방지할 수 있을것입니다.

좀더 명확하게 알아서 설명해주고자 구글님께 요청하니 역시나 많이 문서들이 나왔습니다.


결론은 yoda conditions이 괜찮다는 글도 있고, 안좋다는 글도 있었습니다.


http://www.thesatya.com/blog/2012/08/

http://pushinginertia.com/2011/05/why-yoda-conditions-are-bad-and-usage-of-javas-final-keyword-is-good/


상황에 따라, 취향에 따라 다른가보다라며 넘어갔었지만, 좀더 적절한 근거가 있는것같습니다.

우선, 언어와 ide에 따라서 다양하겠지만 최근 대부분의 IDE는 

if( is_player = 6 ) 구문에서 컴파일 오류를 뱉어내게 됩니다. 


visual studio 2008에서는 경고수준 4(/W4)로 설정하게 되면 다음과 같은 warning이 납니다.

warning C4706: 조건식 내에 할당이 있습니다


warning을 컴파일 실패로 설정을 해놓으면 컴파일이 실패하겠지만, 

대부분의 경우 warning을 신경쓰지 않는다면 찾기 힘든 로직 버그를 만들어 내게 됩니다. 

이런경우라면 yoda conditions이 좋을 수도 있겠다는 생각을 했습니다.


다른 언어에서도 테스트를 하고자 visual studio c#에서 동일한 테스트를 진행했습니다.

c#에서는 if( is_player = 5 )에 대해서 컴파일 에러를 뱉어내게 됩니다.

error CS0029: 암시적으로 'int' 형식을 'bool' 형식으로 변환할 수 없습니다.


visual studio의 경우라면 비교를 할당으로 잘못입력한 구문은 충분히 컴파일 시점에서 

걸러질수있으니 yoda conditions을 사용하지 않아도 될것 같습니다.


yoda condition을 사용하지 말자는 블로그에서 가장 큰 문제점으로 들었던 것이 

어순 배열이 달라진다는 점이었는데 그것은 공감할 수 있었습니다. 


왼쪽에서 오른쪽으로 코드를 읽는다고 할때,

if( true == is_player)는 "만일 true인가 is_player는?" 처럼 이상한 해석을 하게됩니다. 


반면에 if( is_player == true)는 "만일 is_player가 true이면"과같이 

일반적인 영어의 해석을 따르게 되어 자연스럽게 느껴집니다.