Yoda Condition
코드를 작성하다 보면 수를 변수가 특정 숫자 범위에 있는지를 검사하는 경우가 있다. 예를 들어 변수 a가 0부터 10 사이에 있는지를 검사하려면 다음과 같이…
a := 5
a > 0 && a < 10
뭐 이런 식으로 할 수 있다. 사람마다 스타일은 다르겠지만 파이썬에서는 이런 비교가 0 < a < 10
과 같이 rich comparions가 가능하기 떄문에 코드를 읽기도 쉽지만 다른 언어에서는 이런 식으로 편리하게 되진 않으므로 나는 주로 이런 식으로 코드를 작성하고 있다.
0 < a && a < 10
이렇게 하면 훨씬 직관적인데, go에서 이렇게 코드를 작성하면 linter에서 다음과 같은 경고가 뜬다.
yodaStyleExpr: consider to change order in expression to v >= 0 (gocritic)
보통 if
문을 사용할 때 if (a == 4)
와 같은 형태로 변수와 상수를 비교하는데, 만약 a = 4
와 같은 형태로 작성하면 문제를 알아차리기 어려우므로 상수와 변수의 자리를 바꿔서 4 == a
와 같은 형태로 작성하면 좋다고 대학교 때 들은 적이 있다. 이게 그냥 팁 정도로만 생각했는데 이런 스타일이 yoda condition이라고 불리는 이름이 따로 있다는 것을 처음 알았다. 그래서 위 경고의 의미는 논리 연산자 기준으로 왼쪽 비교가 yoda스럽기 때문에 저렇게 고려해보라고 알려주는 것.
이름이 왜 yoda인가 하면 나는 스타워즈를 안봐서 잘 모르겠지만 저 yoda라는 캐릭터가 어순에 맞지 않는 영어를 쓰는 캐릭터인가 보다.
아무튼 이런, 순서를 반대로 해서 비교하는 케이스의 장점으로는 단순히 ==
를 =
로 실수할 수 있는 것을 막는다는 것에 의미가 있는 것은 아니다. 작게는 이런 실수를 했을 때, 이것이 런타임으로 넘어가서 에러가 발생하는 것이 아니라 컴파일 타임의 에러로 바꿀 수 있다는 것. 그리고 크게 봐서는 어떤 문장의 순서를 바꾸는 것이 바꾸지 않는 것보다 더 유리할 수 있다는 것이다.
String myString = null;
if (myString.equals("foobar")) { /* ... */ }
// This causes a NullPointerException in Java
이런 코드가 있을 경우 myString
은 null
이므로, null 오브젝트의 메소드에 접근하기 때문에 NullPointerException
이 발생한다. 그러나 이 순서가 변경되는 경우 그러나 이 순서가 변경되면,
String myString = null;
if ("foobar".equals(myString)) { /* ... */ }
// This is false, as expected
이와 같은 케이스에서도 NullPointerException
을 막을 수 있다는 것. 코드를 작성할 때 순서를 뒤집어 더 간단하게 해결할 수 있는지도 확인해봐야 하겠다.
일단 신기하게 php 프로젝트인 WordPress에서는 이런 방식을 Coding Standards로 소개하고 있으니까 한번 읽어보는 것도 나쁘진 않겠다.