읽기 좋은 코드가 좋은 코드다/4 - 루프와 논리를 단순화하기

‘읽기 좋은 코드가 좋은 코드다’를 읽고 정리한 내용입니다. 문제가 될 시에는 삭제하겠습니다.

루프와 논리를 단순화하기

읽기 쉽게 흐름제어 만들기

아래의 예제를 보고 어느 쪽이 더 읽기 쉬운지 생각해보자.

1
2
3
4
5
// 1. 
if(length >= 10) {...}

// 2.
if(10 <= length) {...}

또 다른 예제를 보고 어느 쪽이 더 읽기 쉬운지 생각해보자.

1
2
3
4
5
// 1.
while( bytes_received < byteds_expected) {...}

// 2. 
while( byteds_expected > bytes_received) {...}

두 가지 경우 모두 첫 번째 코드가 더 읽기 쉽게 느껴질 것이다. 일반적으로 왼쪽에 유동적인 값이 오고, 오른쪽 비교대상에는 고정적인 값이 오면 사람은 조금 더 이해하기 쉽게 받아들인다. 여기서 대부분 왼쪽의 값은 우리가 주목하는, 변수라고 생각하면 된다.

또 다른 경우를 보자

1
2
3
4
5
6
7
8
9
10
11
12
13
// 1.
if(a==b) {
	...
} else {
	...
}

// 2.
if(a!=b) {
	...
} else {
	...
}

위의 두 가지 경우는 무엇이 크게 다른지 와닿지 않을 것이다. 그렇지만 이러한 경우에도 선호되는 방법이 존재한다.

  • 부정이 아닌 긍정을 다루어라.
  • 간단한 것을 먼저 처리해라. 그러면 동시에 두 가지의 경우를 볼 수 있어 한 눈에 들어올 수도 있다.
  • 더 확실한 것을 먼저 다루어라

또한 부정을 다루어야 하는 경우라면 ! 대신에 ==false를 작성해 한 눈에 더 잘 들어올 수 있도록 하자.

삼항 연산자?

(조건) ? a : b와 같이 조건을 만족하는 경우에는 a, 조건을 만족하지 않는 경우에는 b를 선택하게 하는, 삼항연산자라는 것이 있다. 삼항연산자는 물론 간단한 경우에는 한 눈에 보기 쉽고 한 줄에 들어오기 때문에 좋은 코드가 되기도 하지만 일반적으로 조건이 어렵거나 추가적인 연산을 하는 경우에는 디버깅하기가 어렵거나 보기가 어렵다는 내용이 있다.

1
return exponent >= 0 ? mantissa * (1 << exponent) : mantissa / (1 << -exponent);

… 굳이 사용해야 할 경우가 아니라면 삼항연산자는 사용하지 말자.