복잡한 조건문을 제거하는 3가지 강력한 코딩 기법
복잡한 조건 구조를 최적화하고 단순화하여 코드 품질과 유지보수성을 개선하는 세 가지 강력한 코딩 기법을 소개합니다.
소프트웨어 개발에서 우리는 여러 시나리오를 처리해야 하는 코드 로직을 자주 접하게 됩니다. 적절히 관리하지 않으면 이 로직은 쉽게 길어진 if-else 체인이나 거대한 switch 문으로 발전할 수 있습니다. 이 기사에서는 이러한 구조를 최적화하여 코드 품질과 유지보수성을 개선하는 몇 가지 효과적인 기술을 소개합니다.
1. 방어적 프로그래밍: 조기 반환
사용자 인증 시스템을 개발 중이며 여러 사용자 상태를 확인한 후 접근을 허용해야 한다고 가정해봅시다:
이 코드는 명백한 구조적 문제를 가지고 있습니다. 깊게 중첩된 if-else 구조를 사용하여 코드가 읽기 어렵고 유지보수가 어렵습니다. 조건 검사 수가 증가함에 따라 코드의 들여쓰기 수준이 깊어지고 소위 "화살표 모양"의 코드가 형성됩니다. 오류 처리 로직 이 여러 중첩 수준에 분산되어 있어 통일된 관리에 적합하지 않습니다. 더 중요한 것은 접근이 허용되는 경우의 핵심 로직이 여러 층의 조건 판단 속에 깊이 묻혀 있어 직관성이 부족합니다. 이 코딩 스타일은 코드 가독성을 떨어뜨릴 뿐만 아니라 오류 위험을 증가시키고 코드 확장이 어렵게 만듭니다.
"조기 반환" 접근 방식을 사용하여 이 코드를 최적화할 수 있습니다:
"조기 반환" 전략을 채택함으로써 원래 코드 구조를 성공적으로 최적화했습니다.
이 방법은 몇 가지 개선점을 제공합니다:
- 코드의 중첩 복잡성을 크게 줄입니다. 각 조건 검사가 독립적으로 처리되어 전체 로직이 더 명확하고 이해하기 쉬워집니다. 이러한 평탄화된 구조는 코드 가독성을 향상시키고 유지보수 난이도를 크게 줄입니다.
- 이 최적화 방법은 오류 처리 로직의 중앙 관리를 달성합니다. 각 조건 검사 후 즉시 결과를 반환함으로써 불필요한 코드 실행을 피하고 다양한 오류 시나리오 처리를 중앙화하여 전체 오류 처리 과정을 더 조직화된 상태로 만듭니다.
- 코드의 핵심 로직—접근이 허용될 조건—이 더 두드러지게 됩니다. 이 구조는 코드의 주요 목적을 즉시 파악할 수 있게 하여 코드의 표현력과 이해력을 크게 향상시킵니다.
2. 조회 테이블 방법
다른 입력에 따라 다른 결과를 반환해야 하는 시나리오를 자주 만나게 됩니다. 적절히 처리하지 않으면 이 논리들은 쉽게 길어진 if-else 체인이나 거대한 switch 문으로 발전할 수 있습니다. 예를 들어, 전자 상거래 플랫폼에서 우리는 다른 주문 상태에 따라 해당 상태 설명을 반환해야 합니다:
이는 다른 경우에 따라 다른 결과를 반환하는 전형적인 시나리오입니다. 경우의 수가 증가함에 따라 switch 문이나 if-else 판단은 길어지게 됩니다. 더욱이, 이 시나리오에서 사용자가 이러한 상태 내용을 다른 언어로 번역해야 하는 경우, 함수 본문을 수정하거나 새 함수를 추가해야 하며, 이는 상당한 유지보수 비용을 초래할 것입니다.
이 경우, 조회 테이블 방법을 사용하여 코드를 최적화할 수 있습니다:
먼저 Map 객체를 사용하여 상태와 설명 간의 매핑 관계를 저장함으로써 코드는 더 간결해집니다. 또한 상태 설명을 설정 파일로 쉽게 이동할 수 있게 하여 국제화 및 동적 업데이트에 편리함을 제공합니다. 새 상태가 추가될 때, 핵심 로직 코드를 수정할 필요 없이 설정에 해당 키-값 쌍만 추가하면 됩니다.
3. 인터페이스 지향 프로그래밍
대규모 소프트웨어 시스템을 개발할 때 여러 서비스 제공자 또는 기능 모듈을 지원해야 하는 경우가 종종 있습니다. 소프트웨어 설계 단계에서 인터페이스 지향 프로그래밍을 사용하여 향후 확장을 용이하게 하고 복잡한 시스템에서 하드 코드된 여러 조건 판단으로 인한 복잡성을 제거할 수 있습니다.
다국어 번역 시스템을 개발하고 있으며 다양한 번역 서비스 제공자를 지원해야 한다고 가정해봅시다. 설계 단계에서 인터페이스 지향 프로그래밍을 고려하지 않으면 향후 확장이 매우 어려워질 것입니다:
이 구현은 번역 제공자를 선택하기 위해 단순하고 조잡한 if-else 구조를 사용하여 코드 유지보수와 확장을 어렵게 만듭니다. 향후 새 번역 제공자를 추가할 때 기존 코드를 수정해야 하며, 더 많은 번역 제공자를 지원해야 할수록 코드는 복잡해지고 유지보수가 어려워질 것입니다. 동시에, 이 복잡한 방법은 여러 번역 제공자를 시뮬레이션하기 어렵기 때문에 단위 테스트하기도 어렵습니다.
이 문제를 해결하기 위해 인터페이스 지향 프로그래밍을 사용하여 코드를 최적화할 수 있습니다. 인터페이스 지향 프로그래밍은 폴리모피즘을 구현하는 중요한 방법으로, 서로 다른 객체가 동일한 메시지에 다르게 응답할 수 있게 합니다.
구현 과정:
- 번역 전략 인터페이스 정의:
- 각각의 번역 제공자에 대해 이 인터페이스를 구현:
- TranslationService 클래스를 리팩터링하여 전략을 매개변수로 전달:
- 최적화된 코드를 사용:
TranslationStrategy
인터페이스를 정의하고 인터페이스 지향 프로그래밍을 도입하여 다음과 같은 이점을 얻었습니다:
TranslationService
는 각 호출마다 다른 번역 전략을 사용할 수 있습니다.