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: 고객 지원실에…”); } |