////
Search
Duplicate
🤿

7. 읽기 쉽게 흐름제어 만들기

조건, 반복, 흐름을 통제하는 선언문이 코드에 없다면 매우 읽기 편할 것이다.
일상의 문장에서도 ~한다면, ~이면 등은 글을 어렵게 만드는 원인이다.
이 장은 코드에 존재하는 흐름제어의 가독성을 높이는 방법을 의논한다.
흐름을 제어하는 조건과 루프 그리고 여타 요소를 최대한 자연스럽게 녹일 수 있도록 노력하라. 코드를 읽다가 다시 되돌아가서 코드를 읽지 않아도 되게끔 만들어야 한다.

조건문에서 인수의 순서

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)를 선호하는 것이 낫다.
간단한 것을 먼저 처리하라. 이렇게하면 동시에 같은 화면에 ifelse 구문을 나타낼 수도 있다. 다양한 조건을 동시에 보는 것이 더 좋다.
더 흥미롭고, 확실한 것을 먼저 다루어라.

삼항연산자를 이용하는 조건문 표현

삼항 연산자가 가독성에 미치는 영향은 논쟁의 대상이다.
옹호하는 사람들은 여러 줄에 걸쳐서 나타낼 표현을 한 줄에 담아 좋은 방법이라고 한다.
반대하는 사람들은 이러한 표현이 오히려 읽기 혼란스럽고 디버깅이 어렵다고 한다.
줄 수를 최소화하는 일보다 가독성을 향상시키는 것이 더 중요하다.
기본적으로 if/else를 사용하라 삼항 연산자는 매우 간단할 때만 사용한다.

do/while 루프를 피하라

에러와 혼동의 원인은 do문에 있다. 가급적이면 do문을 피하는 것이 좋다.

함수 중간에서 반환하기

early return에 대한 내용인 것 같다.
중첩된 조건문의 수를 줄임으로써 가독성을 향상시킬 수 있으나 적절한 리팩토링과 메소드 추출로 블록 내의 if 문을 줄이지 않으면 문제가 있을 것이다.

악명 높은 goto

goto는 쓰지 말자.

중첩을 최소화하기

깊이가 깊어질수록 코드는 이해하기 어려워지므로 깊이를 줄이는 방법에 대해서 알려준다.
함수 중간에서 반환하여 중첩을 중첩을 제거하라
중첩은 실패한 경우들을 최대한 빠르게 처리한 후 반환하여 제거할 수 있다.
루프 내부에 있는 중첩 제거하기
continue와 같은 제어문을 사용해서 중첩을 제어할 수 있다.

실행 흐름을 따라올 수 있는가?

지금까지 하위수준의 흐름제어를 논의했다. 비즈니스 로직이 아닌 상위수준의 스레딩 제어, 미들웨어 등의 수준들은 최대한 코드 수준에선 보이지 않는 것이 좋다.

요약

코드의 흐름제어를 읽기 쉽게하는 방법은 여러가지가 있다.
비교 구문을 작성할 때는, 비교할 값을 왼쪽에 비교 대상을 오른쪽에 두는 것이 좋다.
if/else 문의 순서를 바꾸는 것도 좋다. 일반적으로 긍정적이고 쉬우며 주요한 경우를 앞에 놓도록 하라.
삼항 연산자는 매우 간단하지 않는한 가급적이면 피하는 것이 좋다.
중첩된 코드 블록의 흐름은 가독성을 저하시키므로 Early Return 등의 패턴을 사용해서 선형적인 코드를 만들어라.
함수 중간에 반환하면 중첩을 피하고 코드를 더 깔끔하게 작성할 수 있다. 다만 주의하는 것이 좋다.