•
조건, 반복, 흐름을 통제하는 선언문이 코드에 없다면 매우 읽기 편할 것이다.
◦
일상의 문장에서도 ~한다면, ~이면 등은 글을 어렵게 만드는 원인이다.
•
이 장은 코드에 존재하는 흐름제어의 가독성을 높이는 방법을 의논한다.
•
흐름을 제어하는 조건과 루프 그리고 여타 요소를 최대한 자연스럽게 녹일 수 있도록 노력하라. 코드를 읽다가 다시 되돌아가서 코드를 읽지 않아도 되게끔 만들어야 한다.
조건문에서 인수의 순서
•
if (length >= 10)가 if (10 <= length)보다 읽기 쉽다고 느낄 것이다. 하지만 다음 경우는 어떨까?
•
while (bytesReceived < bytesExpected)가 while (bytesExpected > bytesReceived)보다 읽기 편하다. 왜일까?
•
일반적으로 우리는 주어를 왼쪽에 두는 경향이 있기 때문에 다음과 같은 규칙을 따르면 읽기 쉽게 느낀다.
•
왼쪽에는 값이 더 유동적인 질문을 받는 표현을 위치시키고 오른쪽에는 더 고정저긴 값으로 비교대상으로 사용되는 표현을 두자.
if/else 블록의 순서
•
if/else 문은 블록의 순서가 상관없다.
if (a == b) {
...
} else {
...
}
Java
복사
if (a != b) {
...
} else {
...
}
Java
복사
◦
위 두가지는 똑같다.
•
부정이 아닌 긍정을 다루는 것이 좋다. 즉 if(!debug)가 아닌 if(debug)를 선호하는 것이 낫다.
•
간단한 것을 먼저 처리하라. 이렇게하면 동시에 같은 화면에 if와 else 구문을 나타낼 수도 있다. 다양한 조건을 동시에 보는 것이 더 좋다.
•
더 흥미롭고, 확실한 것을 먼저 다루어라.
삼항연산자를 이용하는 조건문 표현
•
삼항 연산자가 가독성에 미치는 영향은 논쟁의 대상이다.
◦
옹호하는 사람들은 여러 줄에 걸쳐서 나타낼 표현을 한 줄에 담아 좋은 방법이라고 한다.
◦
반대하는 사람들은 이러한 표현이 오히려 읽기 혼란스럽고 디버깅이 어렵다고 한다.
◦
줄 수를 최소화하는 일보다 가독성을 향상시키는 것이 더 중요하다.
•
기본적으로 if/else를 사용하라 삼항 연산자는 매우 간단할 때만 사용한다.
do/while 루프를 피하라
•
에러와 혼동의 원인은 do문에 있다. 가급적이면 do문을 피하는 것이 좋다.
함수 중간에서 반환하기
•
early return에 대한 내용인 것 같다.
•
중첩된 조건문의 수를 줄임으로써 가독성을 향상시킬 수 있으나 적절한 리팩토링과 메소드 추출로 블록 내의 if 문을 줄이지 않으면 문제가 있을 것이다.
악명 높은 goto
•
goto는 쓰지 말자.
중첩을 최소화하기
•
깊이가 깊어질수록 코드는 이해하기 어려워지므로 깊이를 줄이는 방법에 대해서 알려준다.
•
함수 중간에서 반환하여 중첩을 중첩을 제거하라
◦
중첩은 실패한 경우들을 최대한 빠르게 처리한 후 반환하여 제거할 수 있다.
•
루프 내부에 있는 중첩 제거하기
◦
continue와 같은 제어문을 사용해서 중첩을 제어할 수 있다.
실행 흐름을 따라올 수 있는가?
•
지금까지 하위수준의 흐름제어를 논의했다. 비즈니스 로직이 아닌 상위수준의 스레딩 제어, 미들웨어 등의 수준들은 최대한 코드 수준에선 보이지 않는 것이 좋다.
요약
•
코드의 흐름제어를 읽기 쉽게하는 방법은 여러가지가 있다.
◦
비교 구문을 작성할 때는, 비교할 값을 왼쪽에 비교 대상을 오른쪽에 두는 것이 좋다.
◦
if/else 문의 순서를 바꾸는 것도 좋다. 일반적으로 긍정적이고 쉬우며 주요한 경우를 앞에 놓도록 하라.
◦
삼항 연산자는 매우 간단하지 않는한 가급적이면 피하는 것이 좋다.
◦
중첩된 코드 블록의 흐름은 가독성을 저하시키므로 Early Return 등의 패턴을 사용해서 선형적인 코드를 만들어라.
◦
함수 중간에 반환하면 중첩을 피하고 코드를 더 깔끔하게 작성할 수 있다. 다만 주의하는 것이 좋다.