8. 코딩스타일 1 2008 Software Engineering
옷을입는것에도스타일이있다. 빨간색을좋아하는사람 빨갱이인가? 진바지를좋아하는사람 청바지가잘어울리는사람 코딩스타일? 프로그램에도스타일이있다? 정수형은사용하지않는사람 모름지기수란모두실수여 ~ 다섯줄만넘으면함수로분리하는사람 모듈화안배웠어 ~ 나눠! 나눠! 나눠! 포인터를엄청많이사용하는사람 난포인터의황제다 어렵지 ~ 나만알면장땡 ~ 어떤스타일이가장좋은가? 원칙은없다. 다만권고 (recommendation) 가있을뿐
스타일 1: 명확하게작성하라. (1/3) 부제 : 너무똑똑한체하지말것 내가가장하기어려운 int i, j; float v[n][n];... for(i=1;i <= N;i++) for(j=1;j <= N;j++) int i, j; float v[n][n]; v[i-1][j-1] = (i/j)*(j/i); 10 0 01 0 00 1... for(i=0;i < N;i++) for(j=0;j < N;j++) if(i == j) v[i][j] = 1; else v[i][j] = 0;
스타일 1: 명확하게작성하라. (2/3) 일반적으로짧을수록명확해진다. power[1] = base; power[2] = base*base; power[3] = base*base*base; power[4] = base*base*base*base; power[5] = base*base*base*base*base; power[6] = base*base*base*base*base*base; power[7] = base*base*base*base*base*base*base; power[8] = base*base*base*base*base*base*base*base;... power[1] = base; for(i=2;i < N;i++) power[i] = power[i-1]*base;
스타일 1: 명확하게작성하라. (3/3) 짧으면항시명확하다? 꼭그렇지만은않다. int IntegerFromHex(char HexDigit) { if(hexdigit < 58) return(hexdigit 48); // 0 = 48 else return(hexdigit 55); // A = 65 } int IntegerFromHex(char HexDigit) { switch(hexdigit) { case 0 : return 0; break; case 1 : return 1; break;... case 9 : return 9; break; case A : return 10; break;... case F : return 15; break; } } Page 5
스타일 2: 간결하고직접적으로표현하라. (1/2) 최소값을구하는예제 (x = y, or y = x 인경우, 바른값을찾지못한다. if(x < y) { if(x < z) small = x; if(x > z) small = z; } if(x > y) { if(y < z) small = y; if(y > z) small = z; } small = x; if(y < small) small = y; if(z < small) small = z; Page 6
스타일 2: 간결하고직접적으로표현하라. (1/2) If-then-else 에서는짧은선택구조를먼저기술한다. if(in_user_code) { in_user_code = FALSE; r2 = r; reset_pharlap(); send_sig_segv(); } else revert(); if(!in_user_code) revert(); else { in_user_code = FALSE; r2 = r; reset_pharlap(); send_sig_segv(); }
스타일 3: 임시변수사용을피하라. 임시변수 (temporary variable) 의사용은가급적피한다. t1 = x1 (x2 + x2); t2 = 7 x2; Y = t1 + t1 + t2 + t2; y = 2*(x1 2*x2) + 2*(7 x2); y = 2 x 2x + 2 7 x ; ( ) ( ) 1 2 2
스타일 4: 혼돈을초래치않는변수명을사용하라. 혼돈하기쉬운글자들의예 1 과 l a1 al 0 과 O term0 termo 5 와 S TEXT5 TEXTS I 와 l Iist list m 과 n 의연속사용 mnnm mnmn u 와 v 의연속사용 vuvu uuvu 변수수정의예제 positionx, positiony xpos, ypos n, nn, nnn n, nsq, ncube nunit, nsqur, ncube
스타일 5: 일관성있는변수명을사용하라. Hungarian notation: 변수이름의처음몇자는변수의타입이나범위를나타내도록한다. 예 ) ptr_to_date_key ( 포인터 ) 일관성있는이름을사용한다. char buffer[500], mssge[80]; void read_instance(void), SaveCurrent(void); void get_line(void), write_line(void); int index1, index2; char buffer[500], message[80]; void read_instance(void), save_current(void); void read_line(void), write_line(void) int i, j;
스타일 6: 문장그룹이명확하도록 { } 와들여쓰기를사용하라. for(i=0;i < N;i++) { k = a[i]; if(k>100) a[i] = i*3; else if(j ==N)... } for(i=0;i < N;i++) { k = a[i]; if(k > 100) a[i] = i * 3; else if(j == N)... }
스타일 7: 한가지선택이면 if 만, 두가지이면 if-else if(swctl == 1 ) goto conti; else { dvictl += 10; swctl = 1 ; } conti; if(swctl!= 1 ) { dvictl += 10; swctl = 1 ; }
스타일 8: if 다음의 if 구조, null else 는피한다. if 다음의 if 나 null else 는가독성을크게떨어뜨리며, 오해의소지가있다. if(qty > 10) if(qty > 200) if(qty >= 500) bill_a += 1.00; else bill_a += 0.50; else; else bill_a = 0.0; // A // B // C // C // B // A if(qty >= 500.0) bill_a += 1.00; if(qty < 500 && qty > 200) bill_a += 0.5; if(qty <= 10) bill_a = 0.0;
스타일 9: 문장의반복은최소화한다. 반복되는문장은가급적반복문을사용하여제거한다. tkn = get_token(); if(tkn == T_END) return; If(tkn == T_START) start_proc(); while(ntokens < T_LIMIT) { process_token(); add_token(); tkn = get_token(); if(tkn == T_END) return; if(tkn == T_START) start_proc(); } for(;;) { tkn = get_token(); if(tkn == T_END) return; if(tkn == T_START) start_proc(); if(ntokens >= T_LIMIT) break; process_token(); add_token(); } Page 14
스타일 10: 모듈화하라. 서브루틴을사용하라. 같은역할을하는문장들인경우에는 Grouping 하여모듈화한다. 반복되는기능에대해서는함수로분리한다. Page 15
그밖의원칙들 (1/4) 수식표현 명료하게작성하라 - 효율성을위하여명료함을희생하지않도록한다. 번거로운일은기계가하도록만들라. 괄호를사용하여모호성을제거하라. 언어의좋은기능을이용하고불안한기능의사용은피하라. 제어구조 위에서아래로읽을수있도록프로그래밍하라. 중복구조를최소화하라. 맨처음작성한것으로끝나지말고, 계속해서리뷰하라.
그밖의원칙들 (2/4) 프로그램 각모듈은분명한한가지역할만수행하도록하라. 잘못작성된코드는짜맞추려하지하지말고다시작성하라. 차리리버리고, 처음부터다시 큰프로그램은작은단위로나누어따로작성하고따로검사하라. 입출력 자료가한계값을벗어나지않는지항상검사하라. 입력형식은사용자가쉽게준비할수있게하고출력형식은그모양이스스로드러나게구성하라. 입출력은따로모아서독립된서브루틴으로만들라.
그밖의원칙들 (3/4) 기타 발견된오류만고치지말고, 전체적으로보고수정가능한모든오류를고친다. 하나차이에의한오류 (off-by-one) 를주의하라. 프로그램을방어적으로작성하라. 빠른프로그램보다먼저바른프로그램을작성하라. 빠른프로그램보다먼저명료한프로그램을작성하라. 간결함을유지하면서빠른프로그램을만들라.
그밖의원칙들 (4/4) 기타 ( 계속 ) 주석과코드가일치하는지확인하라. 주석을달때코드를되풀이해서는않도록한다. 잘못된코드에는주석을달지않는다. -- 다시작성한다. 과다하게주석을달지않는다. 덕지덕지고쳐서사용하려고애쓰지않는다. -- 과감히버리고새로작성한다.
프로그램에관한몇가지격언 (1/2) The sooner you start to code, the longer the program will take. ( 코딩을일찍시작하면할수록, 프로그래밍에시간이많이걸린다.) If you can't write it down in English, you can't code it. ( 글로써표현할수없다면, 코딩도할수없다.) If the code and the comments disagree, then both are probably wrong. ( 코드와주석이맞지않으면, 둘다잘못되었을가능성이높다.) If you have too many special cases, you are doing it wrong. ( 너무많은예외케이스가있다면, 뭔가잘못하고있는것이다.) Get your data structures correct first, and the rest of the program will write itself. ( 먼저자료구조를잘잡는다면, 프로그램은저절로써지게될것이다.)
프로그램에관한몇가지격언 (1/2) Don't debug standing up. It cuts your patience in half. ( 서서디버깅하지말아라. 참을성을가지란이야기 ) Each new user of a new system uncovers a new class bugs. ( 새로운시스템에대한새로운사용자는항시새로운종류의버그를발견한다.) (Naïve user는유익한테스트결과를가져올것이고, 새롭게 porting하면항시문제점이생길것임을명심하란이야기 ) Whenever possible, steal code. ( 가능하다면코드를훔쳐라. 즉, 코드를재사용하라.) Always do the hard part first. If the hard part is impossible, why waste time on the easy part? ( 어려운부분을먼저하라. 어려운부분이불가 능하다면, 쉬운부분을해서뭣하나?)
코드의문서화 22 2008 Software Engineering
코드의문서화 소스코드의문서화는즉, 주석쓰는것을의미한다. 주석의종류 프로그램헤더 : 전체프로그램의기능을설명하는주석 모듈헤더 ( 함수헤더 ): 해당모듈의기능을설명하는주석 각줄에삽입된주석 : 해당줄을설명하는주석
프로그램헤더주석 프로그램의제목 제작자 작성일과버전번호 구조와설계 공유변수 사용되는파일 외부참조파일
프로그램헤더주석의예제 (1/2) /***************************************************************************** **** - EXAM SCORE SUMMARY PROGRAM - WRITTEN BY : HONG, KIL DONG - RELEASE DATE : April 1, 1994 - - PURPOSE : This program produces a variety of statistics on a - group of student's exam scores. For each score that is entered, - the score and a row of stars representing the magnitute of the - score is printed out. In addition, the number of scores, the - average score, the highest score and the lowest score are - printed out. - - DESIGN : The program is composed of the following modules: - Main module - The Main, controlling module - Validate Input - Gets and validates the user's input - Process Valid Score - Prints score and row of stars for one score - Update Statistics - Updates global statistics - Print Summary Report - Prints summary statistics
프로그램헤더주석의예제 (2/2) - MAJOR VARIABLES : - SumOfScore (subrange of integer, 0..2000) - - The sum of all score entered - NumOfStudents (subrange of integer, 0..100) - - The total number of score entered - LargestScore (subrange of integer, 0..20) - - The largest score in the set of scores - SmallestScore (subrange of integer, 0..20) - - The smallest score - FILES USED: - Input - contains integer scores, one to a line - Output - contains a one-line histogram for each score - read, followed on the next line by the number of - students and their average score, then on the next line - by the top score, and concluding on the next line with - the lowest score. - EXTERNAL REFERENCES: None ***********************************************************************/
코딩표준 (1/2) [ISO/IEC 9899] 27 2008 Software Engineering
코딩표준 (2/2) [JAVA] 28 2008 Software Engineering
연습문제 1. 소프트웨어개발방법론에서구현에대해설명하라.. 2. 코딩스타일 (Coding Style) 과코딩표준 (Coding Standard) 의차이점은무엇인가? 29 2008 Software Engineering