boolean f(boolean A, boolean B, boolean C, boolean D, boolean E)
{
if (A)
{
k();
if (B)
{
m();
if (C)
{
n();
if (D)
{
p();
if (E)
{
q();
return true;
}
else
{
r();
return false;
}
}
else
{
s();
return false;
}
}
else
{
t();
return false;
}
}
else
{
v();
return false;
}
}
else
{
w();
return false;
}
}
3
A
답변
3
최근 취업 인터뷰에서이 코드를 최적화하도록 요청 받았다.
boolean f(boolean A, boolean B, boolean C, boolean D, boolean E)
{
boolean success = false;
// I use "==false" because it's more readable than "if !A"
if(A == false)
{
w();
} else {
if(B == false)
{
v();
} else {
m();
if(C == false)
{
n();
if(D == false)
{
s();
} else {
if(E == false)
{
r();
} else {
q();
success = true;
}
}
}
}
}
// this will be "false" in all cases except one
return (success);
}
그리고 내 대답 뒤에 내 논리는 "반환"의 수를 줄이고 가독성을 유지하려고했다 :
는 여기에 내가 생각 해낸 코드의 버전입니다. 여기
는 고용 사람은 정말에 대한 답을 찾고 있었다된다 이boolean f(Boolean A, Boolean B, Boolean C, Boolean D, Boolean E)
{
boolean result = false;
do
{
if (!A)
{
w();
break;
}
k();
if (!B)
{
v();
break;
}
m();
if (!C)
{
t();
break;
}
n();
if (!D)
{
s();
break;
}
p();
if (!E)
{
r();
break;
}
// All conditions satisfied
result = true;
} while (false);
return result;
}
이 교활한 DO-번과 전용-일단의 아이디어와 루프, "break
는"밖으로 -ing 때 일부를 사용 조건이 실패합니다.
3
당신이 해결하는 문제에 대한 자세한 내용을 모른 채, 나는 그것이 다소 쉽게 시나리오를 수행 할 수 있습니다, 내 의견으로는,
boolean f(boolean A, boolean B, boolean C, boolean D, boolean E)
{
if (A) k();
if (A && B) m();
if (A && B && C) n();
if (A && B && C && D) p();
if (A && B && C && D && E) { q(); return true; }
if (A && B && C && D && !E) { r(); return false; }
if (A && B && C && !D) { s(); return false; }
if (A && B && !C) { t(); return false; }
if (A && !B) { v(); return false; }
if (!A) { w(); return false; }
}
이로 다시 것입니다.
그러나 이것은 여전히 절대적으로 끔찍합니다. 가장 가능성있는 것은 다른 인터페이스가 동일한 인터페이스를 구현하는 다른 클래스로 다른 동작이 적용되는 일종의 알고리즘 패턴이며, 다형성에 기반한 동작을 선택하거나 알고리즘이 객체 생성 중에 주입되는 알고리즘 패턴입니다.
기본적으로 하나 이상의 부울 인수를 사용하는 모든 메소드는 코드 냄새입니다. 메소드가 호출되는 순서는 다음,하지 않는 것이 중요 경우
if (A) k(); else w();
if (A && B) m(); else if(A && !B) v();
if (A && B && C) n(); else if (A && B && !C) t();
if (A && B && C && D) p(); else if (A && B && C && !D) s();
if (A && B && C && D && E) q(); else if (A && B && C && D && !E) r();
return (A && B && C && D && E);
0
:
failedOnce = false
for ar as Array in [
(A, K, W)
(B, M, V)
(C, N, T)
(D, P, S)
(E, Q, R)
]:
if ar[0]:
ar[1].Invoke()
else:
ar[2].Invoke()
break
failedOnce = false
return not failedOnce
0
나는 단지 한 번 이상 조건을 평가하여 if
의 평탄화에 의해 아마
관련 문제
- 1. 이 쿼리는 어떻게 단순화합니까?
- 2. 이 jQuery 코드는 어떻게 megamenu를 단순화합니까?
- 3. SQL -이 쉬운 쿼리를 어떻게 단순화합니까?
- 4. 어떻게이 자바 스크립트를 단순화합니까?
- 5. 이 코드를 어떻게 리팩토링합니까?
- 6. 이 코드를 어떻게 대체해야합니까?
- 7. 변수를 사용하여 vim 단축키를 어떻게 단순화합니까?
- 8. 어떻게 LINQ를 사용하여 2 foreach를 단순화합니까?
- 9. MySQL이 쿼리를 단순화합니까?
- 10. 이 LINQ 코드를 어떻게 리팩토링합니까?
- 11. if else 문은 못생긴 중첩 된 방법을 어떻게 단순화합니까?
- 12. 객체가 null 인 경우 Groovy에서 객체의 속성을 설정하는이 코드를 어떻게 단순화합니까?
- 13. 이 경우 내 코드를 어떻게 리팩터링해야합니까?
- 14. 이 간단한 코드를 어떻게 강화할 수 있습니까?
- 15. 이 코드를 어떻게 최적화 할 수 있습니까?
- 16. 이 코드를 내 코드에 어떻게 구현합니까?
- 17. 이 코드를 어떻게 최적화 할 수 있습니까?
- 18. 이 VB 코드를 어떻게 C#으로 변환합니까?
- 19. 이 코드를 어떻게 향상시킬 수 있습니까?
- 20. 이 코드를 어떻게 최적화 할 수 있습니까?
- 21. 이 코드를 어떻게 최적화 할 수 있습니까?
- 22. 이 코드를 어떻게 압축 할 수 있습니까?
- 23. 이 코드를 표현식 트리로 어떻게 변환합니까?
- 24. 이 코드를 어떻게 최적화 할 수 있습니까?
- 25. 이 코드를 어떻게 리팩토링 할 수 있습니까?
- 26. 이 코드를 IE에서 어떻게 작동시킬 수 있습니까?
- 27. 이 코드를 Processing에서 C++로 어떻게 변환합니까?
- 28. 이 코드를 어떻게 인스턴스 변수의 값으로 설정합니까?
- 29. 이 코드를
- 30. 이 코드를
단순화 기준은 무엇입니까? 더 &&를 사용하여 ?? –
어떤 방식으로 "단순화"합니까? 이것은 아마도 http://codereview.stackexchange.com –