두 개 이상의 조건을 기반으로 일부 코드를 실행하려면 if 문을 형식화하는 가장 좋은 방법은 무엇입니까?
첫 번째 예 :-
if(ConditionOne && ConditionTwo && ConditionThree)
{
Code to execute
}
두 번째 예 :-
if(ConditionOne)
{
if(ConditionTwo )
{
if(ConditionThree)
{
Code to execute
}
}
}
각 조건이 긴 함수 이름이나 그 밖의 것일 수 있다는 점을 염두에두고 이해하고 읽는 것이 가장 쉽습니다.
답변
나는 옵션 A를 선호한다
bool a, b, c;
if( a && b && c )
{
//This is neat & readable
}
특히 긴 변수 / 방법 조건이있는 경우 줄 바꿈 만하면됩니다.
if( VeryLongConditionMethod(a) &&
VeryLongConditionMethod(b) &&
VeryLongConditionMethod(c))
{
//This is still readable
}
더 복잡한 경우 if 문 외부에서 조건 메서드를 별도로 수행하는 것이 좋습니다.
bool aa = FirstVeryLongConditionMethod(a) && SecondVeryLongConditionMethod(a);
bool bb = FirstVeryLongConditionMethod(b) && SecondVeryLongConditionMethod(b);
bool cc = FirstVeryLongConditionMethod(c) && SecondVeryLongConditionMethod(c);
if( aa && bb && cc)
{
//This is again neat & readable
//although you probably need to sanity check your method names ;)
}
IMHO 옵션 ‘B’의 유일한 이유 else
는 각 조건에 대해 실행할 별도의 기능 이있는 경우 입니다.
예 :
if( a )
{
if( b )
{
}
else
{
//Do Something Else B
}
}
else
{
//Do Something Else A
}
답변
다른 답변은 첫 번째 옵션이 일반적으로 가장 좋은 이유를 설명합니다. 그러나 여러 조건이있는 경우 옵션 1에서 조건 검사를 수행하는 별도의 함수 (또는 속성)를 만드는 것이 좋습니다. 이렇게하면 최소한 좋은 메서드 이름을 사용할 때 코드를 훨씬 쉽게 읽을 수 있습니다.
if(MyChecksAreOk()) { Code to execute }
...
private bool MyChecksAreOk()
{
return ConditionOne && ConditionTwo && ConditionThree;
}
조건은 지역 범위 변수에만 의존하므로 새 함수를 정적으로 만들고 필요한 모든 것을 전달할 수 있습니다. 믹스가 있으면 현지 물건을 전달하십시오.
답변
첫 번째 예는 “읽기 쉬움”입니다.
사실, 제 생각에는 “else logic”을 추가해야 할 때마다 두 번째 것을 사용해야하지만 간단한 Conditional의 경우 첫 번째 맛을 사용하십시오. 조건의 길이가 걱정된다면 항상 다음 구문을 사용할 수 있습니다.
if(ConditionOneThatIsTooLongAndProbablyWillUseAlmostOneLine
&& ConditionTwoThatIsLongAsWell
&& ConditionThreeThatAlsoIsLong) {
//Code to execute
}
행운을 빕니다!
답변
이 질문에 대한 답변은 지금까지 순전히 “구문 적”근거로 결정을 내려야하는 것처럼 답변되었습니다.
if 내에서 여러 조건을 배치하는 방법에 대한 정답은 “의미론”에도 의존 해야 합니다. 따라서 조건은 “개념적으로”결합되는 것에 따라 분류되고 그룹화되어야합니다.
두 테스트가 실제로 동일한 동전의 양면 인 경우 예. (x> 0) && (x <= 100)이면 같은 줄에 함께 넣으십시오. 다른 조건이 개념적으로 훨씬 더 먼 경우 예. user.hasPermission (Admin ()) 그런 다음 자체 줄에 넣으십시오.
예 :
if user.hasPermission(Admin()) {
if (x >= 0) && (x < 100) {
// do something
}
}
답변
if ( ( single conditional expression A )
&& ( single conditional expression B )
&& ( single conditional expression C )
)
{
opAllABC();
}
else
{
opNoneABC();
}
다음과 같이 if-else 문에서 여러 조건식 형식을 지정합니다.
- 가독성 향상 :
a. 먼저 표시된 표현식의 모든 이진 논리 연산 {&&, ||}
b. 각 이진 연산의 두 조건부 피연산자는 수직으로 정렬되기 때문에 분명
합니다. c. 중첩 된 논리 표현식 연산은 절 내부의 중첩 문과 마찬가지로 들여 쓰기를 사용하여 명확 해집니다. - 명시적인 괄호가 필요합니다 (연산자 우선 순위 규칙에 의존하지 않음)
. 이것은 일반적인 정적 분석 오류를 방지합니다. - 쉽게 디버깅 할 수 있습니다
. //
b로 개별 단일 조건부 테스트를 비활성화 합니다. 개별 테스트
ceg 직전 또는 후에 중단 점 설정 …
// disable any single conditional test with just a pre-pended '//'
// set a break point before any individual test
// syntax '(1 &&' and '(0 ||' usually never creates any real code
if ( 1
&& ( single conditional expression A )
&& ( single conditional expression B )
&& ( 0
|| ( single conditional expression C )
|| ( single conditional expression D )
)
)
{
... ;
}
else
{
... ;
}
답변
두 번째는 Arrow Anti-pattern 의 고전적인 예 이므로 피하고 싶습니다.
조건이 너무 길면 메서드 / 속성으로 추출하십시오.
답변
첫 번째는 더 쉽습니다. 왜냐하면 왼쪽에서 오른쪽으로 읽으면 “If something AND somethingelse AND somethingelse THEN”, 이것은 이해하기 쉬운 문장입니다. 두 번째 예는 “If something THEN if something else, THEN if something else THEN”로, 어색합니다.
또한 절에 일부 OR를 사용하고 싶은지 고려하십시오. 두 번째 스타일에서는 어떻게 수행 하시겠습니까?