1.     If

-       일반적인 경우에 대한 코드를 먼저 작성한 다음 특별한 경우를 작성한다.

-       동치에 대해서 정확하게 이동하도록 한다.

-       정상적인 경우를 else가 아니라 if문 다음에 입력한다.

 

수많은 오류를 아무렇게나 처리하는 비주얼 베이직 예제

OpenFile( inputFile, status )

If (status = Status_Error) Then

           errorType = FileOpenError

Else

           ReadFile( inputfile, fileData, status )

           If( status = Status_Success ) Then

                     SummarizeFileData( fileData, summaryData, status)

                     If( status = Status_Error ) Then

                                errorType = ErrorType_DataSummaryError

                     Else

                                PrintSummary(summaryData)

                                SaveSummaryData(summaryData, status)

                                If(status = status_Error) Then

                                          errorType = ErrorType_SummarySaveError

                                Else

                                          UpdateAllAccounts()

                                          EraseUndoFile()

                                End If

                     End If

           Else

                     ErrorType = ErrorType_FileReadError

           End If

End If

 

수많은 오류를 조직적으로 처리하는 비주얼 베이직 예제

OpenFile( inputFile, status )

If (status = Status_Success) Then

           ReadFile( inputfile, fileData, status )

           If( status = Status_Success ) Then

                     SummarizeFileData( fileData, summaryData, status)

                     If( status = Status_Success ) Then

                                PrintSummary(summaryData)

                                SaveSummaryData(summaryData, status)

                                If(status = status_Success) Then

                                          UpdateAllAccounts()

                                          EraseUndoFile()

                                errorType = ErrorType_None

                     Else

                                errorType = ErrorType_dataSummaryError

                     End If

           Else

                     errorType = ErrorType_FileReadError

           End If

Else

           errorType = ErrorType_FileOpenError

End If

 

-       If 절 다음에 의미 있는 명령문을 작성한다.

If 절이 null인 자바 예제

If( someTest)

           ;

else{

           // 작업 처리

          

}

Null if 절이 변환된 자바 예제

If( !someTest){

           // 작업 처리

          

}

주석이 작성되어 유용한 else 절이 포함된 자바 예제

// 만약 Color 가 타당하다면

If((COLOR_MIN <= color && color <= COLOR_MAX){

           // 작업 처리

          

}else{

           // color가 타당하지 않다면

           // 화면에 쓰이지 않는다. – 명령을 무시한다.

연속적인 if-then-else

문자를 분류하기 위해서 일련의 if-then-else를 사용하는 C++예제

if( inputCharacter < SPACE ){

           characterType = CharacterType_ControlCharacter;

}

else if (

           inputCharacter == ‘ ‘ ||

           inputCharacter == ‘,‘ ||

           inputCharacter == ‘.‘ ||

           inputCharacter == ‘!‘ ||

           inputCharacter == ‘(‘ ||

           inputCharacter == ‘)‘ ||

           inputCharacter == ‘:‘ ||

           inputCharacter == ‘;‘ ||

           inputCharacter == ‘?‘ ||

           inputCharacter == ‘-‘

){

           characterType = CharacterType_Punctuation;

}

else if( ‘0’ <= inputCharacter && inputcharacter <= ‘9’ ){

           characterType = CharacterType_Digit;

}

else if(

           (‘a’ <= inputCharacter && inputCharacter <= ‘z’ ) ||

           (‘A’ <= inputCharacter && inputCharacter <= ‘z’)

           ){

           characterType = CharacterType_Letter;

}

복잡한 테스트를 불린 테스트 호출로 단순화 시킨다.

불린 함수 호출을 사용한 일련의 if-then-else C++예제

if( IsControl(inputCharacter)){

           characterType = CharacterType_ControlCharacter;

}

else if( IsPunctuation( inputCharacter)){

           characterType = CharacterType_Punctuation;

}

else if( IsDigit( inputCharacter)){

           characterType = CharacterType_Digit;

}

else if( IsLetter(inputcharacter)){

           characterType = CharacterType_Letter;

}

가장 흔한 경우를 앞에 놓는다.

가장 흔한 경우를 제일 먼저 테스트 하는 C++ 예제

if( IsLetter(inputcharacter)){

           characterType = CharacterType_Letter;

}

else if( IsPunctuation( inputCharacter)){

           characterType = CharacterType_Punctuation;

}

else if( IsDigit( inputCharacter)){

           characterType = CharacterType_Digit;

}

else if( IsControl(inputCharacter)){

           characterType = CharacterType_ControlCharacter;

}

모든 경우를 다루었는지 확인한다.

오류를 잡기 위해서 기본(Default)경우를 사용한 C++예제

if( IsLetter(inputcharacter)){

           characterType = CharacterType_Letter;

}

else if( IsPunctuation( inputCharacter)){

           characterType = CharacterType_Punctuation;

}

else if( IsDigit( inputCharacter)){

           characterType = CharacterType_Digit;

}

else if( IsControl(inputCharacter)){

           characterType = CharacterType_ControlCharacter;

}

else{

           DisplayInternalError(“예상치 못한 문자가 발견되었습니다.”);

}

만약 언어가 지원한다면, if-then-else 체인 대신 다른 구조를 사용한다.

if-then-else 체인 대신 case문을 사용한 비주얼 베이직 예제

Select Case inputCharacter

           Case “a” To “z”

                     characterType = CharacterType_Letter

           Case “ “, “,”, “.”, “!”, “(“, “)”, “:”, “;”, “?”, “-“

                     characterType = CharacterType_Punctuation

Case “0” To “9”

                     characterType = CharacterType_Digit

 

Case FIRST_CONTROL_CHARACTER To LAST_CONTROL_CHARACTER

                     characterType = CharacterType_Control

End Select

 

 

2.     Case

가장 효율적인 case 순서의 선택

알파벳 순으로 또는 숫자 순으로 case를 나열한다.

가장 정상적인 경우를 앞에 놓는다.

빈도에 따라서 case를 나열한다.

Case 문 사용 팁

case문이 하는 일을 간단하게 유지한다.

Case문에서 사용하기 위해서 포니(phony)변수를 채우지 않는다.

포니 case 변수를 생성한 자바 예제 나쁜 습관

action = usercommand[0];

switch( action ){

           case ‘c’:

                     Copy();

                     Break;

           Case ‘d’:

                     DeleCharacter();

                     Break;

           Case ‘f’:

                     Format();

                     Break;

           Case ‘h’:

                     Help();

                     Break;

          

           Default:

                     HandleUserInputError( Errortype.InvalidUserCommand);

}

 

포니 case변수 대신 if-then-else를 사용한 자바 예제 좋은 습관

if( userCommand.equals( COMMAND_STRING_COPY)){

           Copy();

}else if(userCommand.equals( COMMAND_STRING_DELETE)){

           DeleteCharacter();

}else if(userCommand.equals( COMMAND_STRING_FORMAT)){

           Format();

}else if(userCommand.equals( COMMAND_STRING_HELP)){

           Help();

}

else{

           HandleUserInputError(ErrorType_InvalidcommandInput);

}

 

          

 

 

타당한 기본 값을 찾고자 하는 경우에만 default 절을 사용한다.

오류를 검출하기 위해서 default절을 사용한다.

오류를 검출하기 위해서 default 절을 사용하는 자바 예제 좋은 습관

switch( commandShortcutLetter ){

           case ‘a’:

                     PrintAnnualReport();

                     Break;

           Case ‘p’:

                     // 아무것도 수행할 필요가 없지만, 이 경우도 고려하였다.

                     Break;

           Case ‘q’:

                     PrintQuarterlyReport();

                     Break;

           Case ‘s’:

                     PrintSummaryReport();    

                     Break;

           Default:

                     DisplayInternalError(“내부 오류 905: 고객 지원실에 …”);

}

 

 

C++과 자바에서는 case문의 끝에서 아래로 내려가는 경우를 피한다.

Case 문을 악용한 C++예제

switch( InputVar){

           case ‘A’: if(test){

                     // 명령문1

                     // 명령문2

           Case ‘B’: // 명령문3

                     // 명령문4

                    

                     }

          

                     Break;

          

}

 

C++에서는 case 문의 끝에서 분명하고 확실하게 아래로 떨어지는 것(flow-through)을 확인해야 한다.

Case 문 끝에서 아래로 떨어지는 코드를 문서로 설명한 C++예제

sitch( errorDocumentationLevel){

           case DocumentationLevel_Full:

                      DisplayErrorDetails(errorNumber);

                     // FALLTHROUGH – 완전한 문서는 요약된 문서도 출력

 

           Case DocumentationLevel_Summary:

                     DisplayErrorSummary(errorNumber);

                     // FALLTHROUGH – 요약된 문서는 요류 번호도 출력한다.

           Case DocumentationLevel_NumberOnly:

                      DisplayErrorNumber(errorNumber);

                     Break;

           Default:

                     DisplayInternalError(“내부 오류 905: 고객 지원실에…”);

}