Refactoring 중첩`If` Hell : 깨끗한 조건부 논리를위한 전략
- 가드 조항을 사용하여 조기 및 평평한 구조를 돌려주십시오. 2. 명확성과 재사용을 위해 복잡한 조건을 설명 기능 또는 변수로 추출하십시오. 3. 여러 조건 조합을 조회 테이블 또는 전략 패턴으로 교체하여 논리를 중앙 집중화하십시오. 4. 다형성을 적용하여 행동을 클래스에 위임하여 타입 또는 상태 조건부를 제거하십시오. 5. 지나치게 긴 표현을 피하면서 부울 대수를 사용하여 중첩 조건을 단순화합니다. 각 전략은인지 부하를 줄이고, 유지 관리 가능성을 향상 시키며, 조건부 논리의 의도를 명확하게합니다.
중첩 된 if
진술 (종종 "IF HELL"이라고 불리는 것은 논리를 따르고 테스트하고 유지하기가 어려운 일반적인 코드 냄새입니다. 깊게 중첩 된 조건부는 의도를 가리고인지 부하를 증가 시키며 리팩토링을 위험에 빠뜨립니다. 좋은 소식? 조건부 논리를 평평하게하고 명확하게하기위한 입증 된 전략이 있습니다. 지옥 if
깨끗하고 읽을 수있는 코드로 둥지를 끄는 방법은 다음과 같습니다.

1. 가드 조항 사용 (조기 반환)
둥지를 줄이는 가장 효과적인 방법 중 하나는 조건이 나머지 기능을 관련이없는 경우 일찍 돌아 오는 것 입니다.
대신 :

def process_user (사용자) : 사용자 인 경우 : user.is_active 인 경우 : user.has_permission : # 주요 논리 "처리 ..."반환 또 다른: "허가 없음"반환 또 다른: "비활성 사용자"반환 또 다른: "잘못된 사용자"반환
조기 반환과 함께 리팩터 :
def process_user (사용자) : 사용자가 아닌 경우 : "잘못된 사용자"반환 user.is_active가 아닌 경우 : "비활성 사용자"반환 user.has_permission이 아닌 경우 : "허가 없음"반환 # 주요 논리 "처리 ..."반환
✅ 혜택 :

- 구조를 평평하게합니다
- 들여 쓰기를 줄입니다
- 실패 경로를 분명하게 만듭니다
- 주요 논리를 맨 아래에 유지합니다 ( "행복한 길")
2. 조건을 설명 기능 또는 변수로 추출합니다
복잡하거나 반복되는 조건은 가독성을 향상시키기 위해 잘 알려진 기능 또는 변수로 추출되어야합니다.
대신 :
if user.age> = 18이고 user.country == "us"및 user.subscription_active and user.is_blocked : grant_access ()
리팩터 :
def is_eligible_for_access (사용자) : 반품 ( user.age> = 18 그리고 user.country == "우리" 및 user.subscription_active 그리고 user.is_blocked가 아닙니다 )) # 그런 다음 사용하십시오 : if is_eligible_for_access (사용자) : grant_access ()
또는 변수가있는 인라인 :
is_eligible = ( user.age> = 18 그리고 user.country == "우리" 및 user.subscription_active 그리고 user.is_blocked가 아닙니다 )) IS_ELIGIBLE : grant_access ()
✅ 혜택 :
- 논리를 캡슐화합니다
- 의도를 명확하게 만듭니다
- 테스트하고 재사용하기 쉽습니다
3. 중첩 조건을 전략 패턴 또는 조회 테이블로 교체
다른 결과로 이어지는 조건의 여러 조합이있는 경우 사전 기반 파견 또는 전략 패턴을 사용하는 것을 고려하십시오.
예를 들어 : 대신 :
user.role == "admin"인 경우 : user.tier == "premium"인 경우 : apply_full_access () elif user.tier == "기본": apply_limited_admin () elif user.role == "user": user.tier == "premium"인 경우 : apply_premium_features () elif user.tier == "기본": apply_basic_features ()
조회 테이블 사용 :
행동 = { ( "admin", "premium") : apply_full_access, ( "admin", "기본") : apply_limited_admin, ( "사용자", "프리미엄") : apply_premium_features, ( "사용자", "기본") : apply_basic_features, } action = action.get ((user.role, user.tier)) 동작 인 경우 : 행동()
✅ 혜택 :
- 분기 복잡성을 제거합니다
- 매핑 로직을 중앙 집중화합니다
- 쉽게 확장하거나 구성 할 수 있습니다
참고 : 조건이 개별적이고 예측 가능할 때 가장 잘 작동합니다.
4. 유형 또는 상태에 따른 행동에 다형성 사용
IF if
이 객체 유형 또는 상태를 기반으로하는 경우 다형성이 조건부를 완전히 제거 할 수 있습니다.
대신 :
if accound.type == "저축": 이자 = 금액 * 0.03 elif account.type == "확인": 이자 = 금액 * 0.01 elif account.type == "투자": 이자 = 금액 * 0.05
클래스 정의 :
수업 계정 : def calculate_interest (자기, 금액) : NotimplementedError를 높이십시오 Class SavingSaccount (계정) : def calculate_interest (자기, 금액) : 반품 금액 * 0.03 클래스 checkingAccount (계정) : def calculate_interest (자기, 금액) : 반품 금액 * 0.01 클래스 InvestmentAccount (계정) : def calculate_interest (자기, 금액) : 반품 금액 * 0.05
그런 다음 간단히 전화하십시오.
관심 = 계정 .calculate_interest (금액)
✅ 혜택 :
- 오픈/폐쇄 원칙 준수
- 통화 코드에는 조건부 논리가 없습니다
- 새로운 유형을 더 쉽게 추가 할 수 있습니다
5. 조건을 부울 대수와 결합하십시오
때로는 조건을 논리적으로 결합하여 S를 평평하게 할 수있는 if
중첩됩니다.
대신 :
user.is_authenticated 인 경우 : user.is_verified 인 경우 : user.has_subscription 인 경우 : show_premium_content ()
당신은 쓸 수 있습니다 :
user.is_authenticated and user.is_verified 및 user.has_subscription 인 경우 : show_premium_content ()
또는 더 나은 :
is_ready = ( user.is_authenticated 그리고 user.is_verified 및 user.has_subscription )) IS_READY : show_premium_content ()
지나치게 긴 조건을 만들지 않도록주의하십시오. 필요할 때 추출하십시오.
보너스 : 혼합 문제를 조심하십시오
함수가 너무 많이 수행되어 있기 때문에 종종 if
이 발생합니다. 스스로에게 물어보세요 :
- 이 기능 처리 유효성 검사, 비즈니스 로직 및 부작용입니까?
- 작은 조각으로 나눌 수 있습니까?
우려의 분리는 자연스럽게 중첩을 줄입니다.
중첩 조건부를 리팩토링하는 것은 미학에 관한 것이 아니라 정확성, 테스트 가능성 및 유지 관리를 향상시킵니다. 가드 조항 및 추출 된 기능으로 시작하십시오. 논리가 자라면 다형성 또는 디스패치 테이블로 진화합니다. 목표는 진술을 if
하는 것이 아니라 명백하고 고립되고 관리 가능한 진술을 제거하는 것입니다.
기본적으로 논리가 피라미드처럼 보이면 평평하게 할 때입니다.
위 내용은 Refactoring 중첩`If` Hell : 깨끗한 조건부 논리를위한 전략의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undress AI Tool
무료로 이미지를 벗다

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

whenUllCoalescingOperator (??)는 공유 hondlorUndefined.1.ItreturnsTheleftOperAndifitisnOtnullORundefined; 그렇지 않으면, itreturnsTherightOperand.2.unlikethelogicalor (||) 운영자,?

피하기 외부인들의 regluceReadibility; useif-elsechainsinstead.2.don'tuseternariesforsideffects likefunctscalls; useif-elseforcontrolflow.3.skipternieswithcomplexpessionsinvollingLongStringsorlogic; breakthemintovariables.4.avoid

경기 표현은 PHP8에서보다 간결하고 안전한 대안을 제공합니다. IF-ELSEIF 및 스위치와 비교하여 느슨한 유형 비교의 오차를 피하기 위해 엄격한 비교 (===)를 자동으로 수행합니다. 2. 일치는 할당 및 함수 반환에 적합한 값을 직접 반환 할 수있는 표현식이며, 코드 단순성을 향상시킵니다. 3. 일치는 항상 엄격한 유형 확인을 사용하여 정수, 부울 및 문자열 사이의 예기치 않은 경기를 방지합니다. 4. 단일 암 다중 값 매칭 (예 : 0, false, '')을 지원하지만 복잡한 조건 (예 : 범위 판단)은 여전히 if-elseif가 필요합니다. 따라서 단일 변수의 정확한 값을 매핑 할 때는 일치를 먼저 사용해야하며 복잡한 로직은 if-elseif를 유지합니다.

== 대신 === 사용은 PHP 유형 변환 오류를 피하는 핵심입니다. == == 예상치 못한 결과를 초래하고 === 값과 유형을 동시에 비교하여 정확한 판단을 보장합니다. 예를 들어, 0 == "false"는 true이지만 0 === "false"는 false이므로 0 일 수있는 반환 값, 빈 문자열 또는 거짓을 처리 할 때는 논리적 오류를 방지하는 데 사용해야합니다.

PHP의 대안 제어 구조는 곱슬 곱슬 괄호 대신 endif 및 endfor와 같은 콜론 및 키워드를 사용하여 혼합 HTML의 가독성을 향상시킬 수 있습니다. 1. if-elseif-else는 결장으로 시작하여 endif로 끝나서 조건 블록이 더 깨끗합니다. 2. Foreach는 템플릿 루프에서 식별하기가 더 쉽고 Endforeach는 루프의 끝을 명확하게 나타냅니다. 3. 거의 사용되지 않는 동안, 그들은 또한 지원됩니다. 이 구문은보기 파일에서 명백한 장점이 있습니다. 구문 오류 감소, 가독성 향상 및 HTML 태그 구조와 유사합니다. 그러나 혼란을 피하기 위해 Curly Braces는 순수한 PHP 파일에 계속 사용되어야합니다. 따라서 PHP와 HTML을 혼합하여 코드 유지 관리 가능성을 향상시키는 템플릿에서 대체 구문이 권장됩니다.

때로는 언어, 컴파일러 최적화 및 논리 구조에 따라 성능에 영향을 미칩니다. 1. 진술이 순서대로 실행되고 최악의 경우 복잡성이 O (n)이면 가장 가능성있는 조건을 먼저 배치해야합니다. 2. 스위치 명령문은 컴파일러에 의해 O (1) 조건이 연속 정수 인 경우 많은 분기 및 값이 상수를 컴파일 된 경우 O (1)의 점프 테이블로 최적화 될 수 있습니다. 3. 단일 변수가 여러 상수 정수와 비교되고 많은 분기와 스위치가 더 빠릅니다. 4. 범위 판단, 복잡한 조건, 비 integer 유형 또는 더 적은 지점이 포함될 때, 더 적합하거나 유사한 성능이있는 경우; 5. 다른 언어 (예 : C/C, Java, JavaScript, C#)는 스위치의 최적화 정도가 다르므로 실제 테스트와 함께 테스트해야합니다. SWI는 먼저 사용해야합니다

useGuardClaUsestorEturnearlylylyly 및 flattenstructure.2. ExtractComplexConditionScriptiveFunctionSorvariblesforClarityandReus.3

&& 및 PHP에서 동일한 논리적 기능이지만 우선 순위는 다르므로 실행 순서가 다릅니다. && 우선 순위는 및 우선 순위가 과제 연산자보다 낮습니다 =; 따라서 $ success = trueandfalse는 실제로 ($ success = true) 및 false로 구문 분석되므로 $ 성공은 여전히 사실입니다. 1. 사용 && || 조건부 판단에서; 2. 제어 흐름에서만 사용 및 또는 또는 또는 또는 또는 또는 또는 $ file = fopen () Ordie ()); 3. 복잡한 표현은 괄호를 사용하여 우선 순위를 명확히해야합니다. 4. 명시 적으로 의도하지 않는 한 혼합 및/또는 과제를 피하십시오.
