12 coding(2010).ppt [호환 모드] - dongguk...요구분석서, 아키텍처설계서참조...

49
LECTURE 12 12 이해할 없는 것은 프로그래밍 수도 없다 이해할 없는 것은 프로그래밍 수도 없다. 최은만, CSE 4039 소프트웨어 공학

Upload: others

Post on 25-Feb-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

LECTURE

1212코 딩코 딩

이해할 수 없는 것은 프로그래밍 할 수도 없다이해할 수 없는 것은 프로그래밍 할 수도 없다.

최은만, CSE 4039 소프트웨어 공학

Page 2: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

학습 목표

좋은 프로그램을 작성하기 위한 원리와 목표는 무엇인가?

코딩 단계의 과정과 흔히 일어나는 오류는 무엇인가?

코딩 스타일이란 무엇이며 좋은 코드가 되기 위한 가이드

리팩토링이란 무엇이며 코드 스멜의 사례와 리팩토링 방법

코드 품질을 높이는 방법에는 무엇이 있는가?

최은만, CSE 4039 소프트웨어 공학 2

Page 3: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

코딩코딩 단계단계

코딩 작업각 모듈에 대한 원시코드를 작성하고

모듈 안에 포함된 오류를 검출하는 단계

설계사양 목적코드코딩

컴파일디버깅

모듈테스트

코딩 원칙

원시코드 디버깅 테스트

설계를 철저히 반영시킨다

원시코드는 간단 명료하도록 한다

디버깅이 쉽게디버깅이 쉽게

시험이 용이

수정이 간편

최은만, CSE 4039 소프트웨어 공학 3

Page 4: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

Weinberg Weinberg 의의 실험실험gg

상반되는 원칙을 잘 조화시켜야 함상반되는 원칙을 잘 조화시켜야 함

결과(1 = 최적)

O1 O2 O3 O4 O5

코딩 작성에 드는 노력의 최소화(O1) 1 4 4 5 3코딩 작성에 드는 노력의 최소화(O1) 1 4 4 5 3

문장 수의 최소화(O2) 2-3 1 2 3 5

소요 메모리 최소화(O3) 5 2 1 4 4

프로그램 명확성의 극대화(O4) 4 3 3 2 2

출력 명확성의 극대화(O5) 2-3 5 5 1 1

최은만, CSE 4039 소프트웨어 공학 4

Page 5: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

프로그래밍프로그래밍 원리원리

코딩 정의코딩 정의분리하여 구현할 수 있는 작은 단위를 프로그래밍 하는 작업

절차적 방법: 모듈 안의 함수 작성

객체지향 방법: 개별 메소드의 프로그래밍

코딩의 목표설계 명세에 나타낸 요구를 만족하는 프로그램을 작성

요구분석서, 아키텍처 설계서 참조

오류가 적은 품질 좋은 프로그램 작성오류가 적은 품질 좋은 프로그램 작성

원리와 가이드 준수

최은만, CSE 4039 소프트웨어 공학 5

Page 6: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

코딩코딩 과정과정

1. 코딩표준을정의 아키텍처

각프레임워크패키지또는애플리케이션패키지에대하여

요구사항애플리케이션패키지에대하여 ...

모든클래스에대하여 ...

요구사항

래 에대하여

2. 메소드를구현 5. 통합을위하여

상세설계

-의사코드

위하여릴리스

-의사코드-흐름도 4. 단위

테스트3. 클래스인스펙션

최은만, CSE 4039 소프트웨어 공학 6

Page 7: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

코딩코딩 작업작업 순서순서

1 원시코드를 같은 스타일로 만들기 위한 코딩 표준 작성1. 원시코드를 같은 스타일로 만들기 위한 코딩 표준 작성

2. 아키텍처 설계 결과를 근거로 프레임워크 패키지와 응용 패키지를

구분. 요구사항과 상세설계를 반영하여 메소드 코딩

3. 인스펙션

4. 클래스 단위로 테스트

5 통합을 위하여 릴리스5. 통합을 위하여 릴리스

최은만, CSE 4039 소프트웨어 공학 7

Page 8: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

코딩코딩 오류오류(1)(1)

오류를 피하기 위하여 오류 타입을 잘 알고 있어야 함

메모리 누수

메 리가 리되지 않는 현 램에 계속 할당되는 현상메모리가 프리되지 않는 현고 프로그램에 계속 할당되는 현상

char * foo(int s)char * foo(int s) {

char *output; if ( s > 0 )if ( s > 0 )

output = (char *) malloc (size); if ( s == 1 )

return NULL; /* if s == 1 then memory leaked */ yreturn(output);

}

최은만, CSE 4039 소프트웨어 공학 8

Page 9: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

코딩코딩 오류오류(2)(2)

중복된 프리 선언

이미 프리로 소멸된 자원을 또 다시 프리로 선언하는 경우

main() {{

char *str; str = ( char * ) malloc (10); if ( global == 0 )if ( global == 0 )

free(str); free(str); /* str is already freed

}

NULL의 사용

NULL를 포인트하고 있는 곳의 콘텐트를 접근하려 하면 오류

}

Alias를 사용하는 경우 유의

최은만, CSE 4039 소프트웨어 공학 9

Page 10: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

코딩코딩 오류오류(3)(3)

char *ch = NULL; if ( x > 0 )if ( x > 0 ) {

ch = 'c'; }} printf("₩%c", *ch); // ch may be NULL *ch = malloc(size); ch = 'c'; // ch will be NULL if malloc returns NULL

별칭의 남용

서로 다른 주소값을 예상하고 사용한 두 변수가 Ali 로 선언된 경우

ch c ; // ch will be NULL if malloc returns NULL

서로 다른 주소값을 예상하고 사용한 두 변수가 Alias로 선언된 경우

예) strcat(src, destn)

src와 destn이 alias로 선언된 경우와 이 선언된 경우

최은만, CSE 4039 소프트웨어 공학 10

Page 11: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

코딩코딩 오류오류(4)(4)

배열 인덱스 오류

인덱스 한도를 벗어난 배열

dataArray[80]; for ( i=0; i <= 80; i++ )

dataArray[i] = 0;

수식 예외 오류

0으로 나누는 오류, 변동 소수점 예외 오류

하나 차이에 의한 오류

예) < N <= 오류

if( number = SSN ) { == 의 오류

최은만, CSE 4039 소프트웨어 공학 11

Page 12: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

코딩코딩 오류오류(5)(5)

사용자 정의 자료형 오류

typedef enum {A, B, C, D} grade; void foo(grade x) {{

int l, m; l = GLOBAL_ARRAY[x - 1]; // Underflow possiblem = GLOBAL ARRAY[x + 1]; // Overflow possible

스트링 처리 오류

m = GLOBAL_ARRAY[x + 1]; // Overflow possible }

strcpy, sprintf 등 많은 스트링 처리 함수

매개 변수가 NULL이거나 스트링이 ‘\0’이 아니거나

최은만, CSE 4039 소프트웨어 공학 12

Page 13: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

코딩코딩 오류오류(6)(6)

버퍼 오류

버퍼 오류시 리턴 주소가 반환되는 것을 이용하여 해킹에 이용될 수있음

id t ( h t ) {void mygets(char *str) { int ch; while ( ch = getchar() != '₩n' && ch != '₩0' )

*(str++) = ch;*(str++) = ch; *str = '₩0';

} main () {main () {

char s2[4]; mygets( s2 );

}}

최은만, CSE 4039 소프트웨어 공학 13

Page 14: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

코딩코딩 오류오류(7)(7)

동기화 오류

다수의 스레드가 있는 병렬 프로그램에서의 오류

데드락데드락

다수의 스레드가 서로 자원을 점유하고 릴리스 하지 않는 상태

레이스 컨디션

두 개의 스레드가 같은 자원을 접근하려 하여 수행 결과가 스레드들의 실행 순서에 따라 다르게 되는 경우의 실행 순서에 따라 다르게 되는 경우

모순 있는 동기화

공유하는 변수를 접근 할 때 로킹과 언로킹을 번갈아 할 때 일어나는오류

최은만, CSE 4039 소프트웨어 공학 14

Page 15: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

구조적구조적 프로그래밍프로그래밍

정의

프로그램의 제어흐름을 선형화시켜 논리구조가 명백하게 하려는 코딩 규율

구조적 프로그램

세가지 제어구조(순차, 선택, 반복)로 무조건적 goto에 의한 복잡한제어흐름을 방지제어흐름을 방지

제어구조가 하향식

stepwise refinement를 이용한 프로그래밍

Proper Program

단일입구 단일 출구단일입구, 단일 출구

모든 노드는 입구에서 도달할 수 있는 경로가 있어야

모든 노드는 출구까지 도달할 수 있는 경로가 있어야

최은만, CSE 4039 소프트웨어 공학 15

Page 16: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

Go To Go To 문의문의 사용사용

구조적인 제어흐름을 해치지 않는 범위에서 사용DO 50 I=1, COUNT

.

IF (ERROR1) GO TO 60

..

IF (ERROR2) GO TO 70

.

50 CONTINUE

60 {Code for Error1 handling}60 {Code for Error1 handling}

GO TO 80

70 {Code for Error handling}

80 CONTINUE

I = 1 for I = 1 to TableSize do

while I <= TableSize and if Table(I) = Target then goto Found

Table(I) <> Target do

I I 1 N tF d: { d f T t t f d}I = I + 1 NotFound: {code for Target not found}

if I > TableSize then Found: {code for Target found}

{code for target not found}

else { code for Target found}

(a) 구조적 코딩 (b) goto의 사용

최은만, CSE 4039 소프트웨어 공학 16

(a) 구조적 코딩 (b) goto의 사용

Page 17: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

정보정보 은닉은닉

일반적으로 어떤 정보에 대하여 제한된 방법으로만 사용됨

예: 회계 원장(차변, 대변, 잔고확인)

모든 차변을 더하여 대변의 합으로 나누는 것과 같은

오퍼레이션은 적용되지 않음오퍼레이션은 적용되지 않음

자료구조 정의

내부의 정의가 시스템의 다른 부분으로부터 감추어져 있어야

장점장점

결합도를 줄이고 시스템의 유지보수를 쉽게 만듦

데이터를 관리하는 관점과 데이터를 사용하는 관점을 분리할 수 있음

언어자체의 메커니즘

최은만, CSE 4039 소프트웨어 공학 17

Page 18: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

코딩코딩 스타일스타일

스타일타일어떤 작업이나 선택에서 일관된 유형

예) 패션 스타일

프로그래밍 스타일간결하고 읽기 쉬운 코드

문형 구조, 원시 코드의 편집 상태 등에 의하여 가독성이 달라짐짐

설계에 의하여 좌우됨

• 모듈화 – 높은 응집력, 낮은 결합도

최은만, CSE 4039 소프트웨어 공학 18

Page 19: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

명명명명 규칙규칙

명명 원칙 - 의미 있게<잘못된 예>

if (a < 65) { // What property does 'a' describe?

y = 65 - a; // What is being calculated here? y g

}

else {

y = 0;y 0;

}

<수정 후>

if (age < RETIREMENT AGE) {if (age < RETIREMENT_AGE) {

yearToRetirement = RETIREMENT_AGE - age;

}

l {else {

yearToRetirement = 0;

}

이 만 아 엇인지( 래 멤버함수 상수 ) 알 수 있게

최은만, CSE 4039 소프트웨어 공학 19

이름만 보아도 무엇인지(클래스, 멤버함수, 상수 등) 알 수 있게

Page 20: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

이름 붙이기

단어 붙이기

예) cylinderLength클래스 이름은 대문자로 시작

변수 이름은 소문자로 시작변수 이름은 소문자로 시작

상수 이름은 모두 대문자로

예) MAX NAME LENGTH예) _ _ Gstatic final을 사용

• 예) static final String XML_DOCUMENT = ‘text/XML”;

데이터의 이름은 underline데이터의 이름은 underline예) _timeOfDay

최은만, CSE 4039 소프트웨어 공학 20

Page 21: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

이름 붙이기

임시변수

문자형 c, d, e

좌표 x, y, z

예외 e예외 e

그래픽 g

객체 o

스트림 in, out, inout

스트링 s

약자의 사용약자의 사용SetDSTOffst() setDstOffset()

loadXMLDocument() loadXmlDocument()

최은만, CSE 4039 소프트웨어 공학 21

Page 22: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

타입 이름

클래스와 인터페이스. 이름의 첫 글자는 대문자

public class PrintStream

extends FilterOutputStream {

...

}

public interface ActionListener

extends EventListener {

...

}}

클래스 이름은 명사

인터페이스의 이름은 명사나 형용사

능력을 나타내는 인터페이스의 이름은 형용사

“able”, “ible”

최은만, CSE 4039 소프트웨어 공학 22

Page 23: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

메소드 이름

첫 단어는 소문자, 연속되는 단어의 첫 글자는 대문자

class MyImage extends Image {public MyImage() {

...}

public void flush() {...

}}

public Image getScaledInstance() {...

}}

최은만, CSE 4039 소프트웨어 공학 23

Page 24: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

메소드 이름

메소드와 오퍼레이션은 일반적으로 동작을 나타냄메소드와 오퍼레이션은 일반적으로 동작을 나타냄

동사로 표현

class Account {private int balance;...public void withdraw(int amount) {public void withdraw(int amount) {

deposit(-1 * amount);}

public void deposit(int amount) {this.balance += amount;this.balance amount;

}}

최은만, CSE 4039 소프트웨어 공학 24

Page 25: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

메소드 이름

boolean isValid() {return this.isValid;

}String getName() {

return this.name;}String getAlias(int index) {g g ( ) {

return this.aliases[index];}void setValid(boolean isValid)void setValid(boolean isValid)

this.isValid = is.Valid;}void setName(String name) {void setName(String name) {

this.name = name;}

최은만, CSE 4039 소프트웨어 공학 25

Page 26: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

변수 이름

첫 문자는 소문자, 연속되는 단어의 첫 문자는 대문자

class Customer {class Customer {...private Address address;private Phone daytimePhone;private Phone daytimePhone;...public Address setAddress(Address address) {

Address oldAddress = this.address;;this.address = address;return oldAddress;

}...public void setDaytimePhone(Phone daytimePhone);

...}...

}

최은만, CSE 4039 소프트웨어 공학 26

Page 27: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

상수이름

대문자로 하되 단어 사이에는 밑줄로 연결

class Byte {bli t ti fi l b t MAX VALUE 255public static final byte MAX_VALUE = 255;

public static final byte MIN_VALUE = 0;public static final Class TYPE = Byte.class;

}

최은만, CSE 4039 소프트웨어 공학 27

Page 28: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

포인터와포인터와 레퍼런스레퍼런스

C++에서는 매개변수를 레퍼런스 타입으로 사용

swap(int &x, int &y) {int t; t=x;t=x;x= y; y=t;

}

new()의 사용을 피하고 메모리 관리 루틴 getNewCObject()와 같은new()의 사용을 피하고 메모리 관리 루틴 getNewCObject()와 같은팩토리 멤버함수 사용

최은만, CSE 4039 소프트웨어 공학 28

Page 29: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

자료형자료형

객체 타입을 리턴하는 클래스는 캐스트를 사용bli l Q {public class Queue { public void enque(Object object) { ... }; public Object dequeue() { ... };

}} public class OrderQueue {

private Queue queue; public OrderQueue() {public OrderQueue() {

this.queue = new Queue(); } public void enqueue(Order order) {public void enqueue(Order order) {

this.queue.enqueue(order); } public Order dequeue() {public Order dequeue() {

return (Order)this.queue.dequeue(); }

}

최은만, CSE 4039 소프트웨어 공학 29

}

Page 30: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

문장과문장과 수식수식

되풀이 되는 문장

메소드나 클래스로 패키지화

블록 문장의 사용으로 dangling else 문제 해결블록 문장의 사용 g g 문제 해결

if (x >= 0) if (x > 0) positiveX();

else // Oops! Actually matches most recent if!else // Oops! Actually matches most recent if! negativeX()

if (x >= 0) { if (x > 0) positiveX();

}} else {

negativeX(); // This is what we really wanted!

최은만, CSE 4039 소프트웨어 공학 30

}

Page 31: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

문장과문장과 수식수식

괄호를 이용 오퍼레이션의 순서 명확히// E t b t f l th// Extraneous but useful parentheses. int width = (( buffer * offset ) / pixelWidth ) + gap;

객체 동일성 체크객체 동일성 체크Date today = new Date(); while (date != today) { Date today = new Date();

while (!date equal(today)) {... }

while (!date.equal(today)) { ...

} String name;

String name; ... if (name == "Bob") {

String name; ... if ("Bob".equals(name)) {

hiBob();( ) {hiBob();

}

hiBob(); }

최은만, CSE 4039 소프트웨어 공학 31

Page 32: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

오류오류 처리처리

잘못된 데이터를 어떻게 처리할 것인가?

예) 은행 구좌가 없는 구좌번호

체계적인 접근 방법이 필수체계적인 접근 방법이 필수

SpecializedVehicle createACar() p ()SpecializedVehicle createATruck() SpecializedVehicle createABus()

evaluate( String vehicleP ) // problem with illegal string

evaluate( SpecializedVehicle vehicleP ) // parameter value cannot be illegal

최은만, CSE 4039 소프트웨어 공학 32

Page 33: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

코드코드 문서화문서화

코드 안의 커멘트

공개 인터페이스 – 사용을 위하여 정확히 문서화 되어야

비공개 인터페이스 – 유지보수 할 수 있도록 문서화

원시코드에 대하여 잘 모르는 것으로 가정하고 문서화

코드와 문서는 항상 일치시켜야

불필요한 것 생략하고 명확하고 간결하게 기술

클래스, 인터페이스, 메소드, 생성자, 필드 정의 앞에 문서화 주석

클라이언트와 서비스 제공자 사이에 프로그래밍 계약관계(programming contract)를 정의

최은만, CSE 4039 소프트웨어 공학 33

Page 34: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

문서화의문서화의 사례사례/** * The <code>Rectangle2D</code> class describes * a rectangle defined by location (x y) and dimensions (w h) a rectangle defined by location (x, y) and dimensions (w, h). * ... */ public abstract class Rectangle2D extends RectangularShape {

/**/ * The <code>Double</code> class defines a */ static class Double extends Rectangle2D { . . . } /**/ * The bitmask that indicates that a point lies below this Rectangle2D... */ static int OUT_BOTTOM;

... /** * Adds a Rectangle2D to this Rectangle2D... */ p blic oid add(Rectangle2D r) { }public void add(Rectangle2D r) { . . . } /** * This is an abstract class that cannot be instantiated directly . . . */

t t d R t l 2D() { }

최은만, CSE 4039 소프트웨어 공학 34

protected Rectangle2D() { . . . } . . .

}

Page 35: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

문서화의문서화의 사례사례잘못된 사례

public int occurrencesOf(Object item) {

잘된 사례

public int occurrencesOf(Object item) {public int occurrencesOf(Object item) { // This turned out to be much simpler // than I expected. Let's Go Lions!!! return (find(item) != null) ? 1 : 0;

}

public int occurrencesOf(Object item) { // This works because no duplicates are

allowed: return (find(item) != null) ? 1 : 0;}

// Apply a 5% discount to all invoices

return (find(item) != null) ? 1 : 0; }

if (this invoiceTotal > 100000) {// Apply a 5% discount to all invoices // over a thousand dollars: if (this.invoiceTotal > 100000) {

this.invoiceTotal = this.invoiceTotal * 0.95;

if (this.invoiceTotal > 100000) { this.invoiceTotal = this.invoiceTotal * 0.95;

// This term corrects for the effects of Jupiter, // Venus, and the flattening of the earch: sigma += (c1 * Angle.sin(a1)

int cur = 0; // Index of current pattern element int prev = 0; // Index of previous pattern

elementsigma (c1 Angle.sin(a1) + c2 * Angle.sin(Angle.minus(L1, F)) + c3 * Angle.sin(a2) );

element

최은만, CSE 4039 소프트웨어 공학 35

Page 36: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

리팩토링리팩토링

리팩토링

소프트웨어를 보다 쉽게 이해할 수 있고 적은 비용으로 수정할 수 있도록 겉으로 보이는 동작의 변화 없이 내부구조를 변경하는 것

프로그래밍의 가치

당장 수행되어 작업에 도움이 되는 가치

향후 변경이나 필요에 대비한 가치

코드 스멜(smell)코드 스멜(smell)

읽기 어려운 프로그램

중복된 로직을 가진 프로그램

실행 인 변경해야 하는 별 작 하는 램실행 중인 코드를 변경해야 하는 특별 동작을 요구하는 프로그램

복잡한 조건이 포함된 프로그램

최은만, CSE 4039 소프트웨어 공학 36

Page 37: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

두두 개개 모자의모자의 비유비유

리팩토링: 두 개의 모자리팩토링: 두 개의 모자

기능 추가 작업

• 리팩토링은 신경 쓰지 않고 기능 구현을 위하여 코딩하고 테스트하여 잘 동• 리팩토링은 신경 쓰지 않고 기능 구현을 위하여 코딩하고 테스트하여 잘 동

작하는지 확인

리팩토링리팩토링

• 기능추가에 신경 쓰지 않고 리팩토링, 즉 코드의 구조에만 관심을 기울임

목표에 맞는 작업만 하는 것이 효율적목표에 맞는 작업만 하는 것이 효율적

최은만, CSE 4039 소프트웨어 공학 37

Page 38: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

리팩토링의리팩토링의 목적목적

소프트웨어의 디자인을 개선시킴소프트웨어의 디자인을 개선시킴

소프트웨어를 이해하기 쉽게 만듦

버그를 찾는 데 도움을 줌

프로그램을 빨리 작성할 수 있게 도와 줌

최은만, CSE 4039 소프트웨어 공학 38

Page 39: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

리팩토링리팩토링 사례사례

리팩토링 하기 전리팩토링 한 후

void foo(char c) {int i,count,len

void foo(char c) {int i,count,lenchar str[MAX];

char str[MAX];cin>>strlen=strlen(str);

cin>>strlen=strlen(str);newfun(count,len,str,c);( );

count=0;for(i=0;i<=len;i++)

if(str[i]==c) {

cout<<str<<" "<<count<<"\n";}newfun(int& count,int len, char* str,char c) {if(str[i] c) {

count++;str[i]='\n';

}

( ) {int i;

count=0;for(i=0;i<=leni++)}

cout<<str<<" "<<count<<"\n";}

( ; )if(str[i]==c) {count++;str[i]='\n';

최은만, CSE 4039 소프트웨어 공학 39

str[i] \n ;}

}

Page 40: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

리팩토링리팩토링 프로세스프로세스

1. 소규모의 변경 – 단일 리팩토링

2. 코드가 전부 잘 작동하는지 테스트

3. 전체가 잘 작동하면 다음 리팩토링 단계로 전진.

4. 작동하지 않으면 문제를 해결하고 리팩토링 한 것을 undo하여 시스템이 작동되도록 유지.

최은만, CSE 4039 소프트웨어 공학 40

Page 41: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

코드코드 스멜스멜

최은만, CSE 4039 소프트웨어 공학 41

Page 42: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

코드코드 품질품질 향상향상 방법방법

테스트 이 외에도 더욱 효과적인 방법이 많이 있음

코드 인스펙션

램뿐만 아니라 설계 분석 등의 문서에서 류를 찾아내기 위프로그램뿐만 아니라 설계, 분석 등의 문서에서도 오류를 찾아내기 위

하여 사용할 수 있는 좋은 검사 방법

정적 분석 방법

프로그램을 실행시키지 않고 텍스트를 조직적으로 분석하여결함을 찾아내는 방법결함을 찾아내는 방법

증명증명증명증명

수학수학 정리처럼정리처럼 증명증명

최은만, CSE 4039 소프트웨어 공학 42

Page 43: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

코드코드 인스펙션인스펙션

최은만, CSE 4039 소프트웨어 공학 43

Page 44: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

정적정적 분석분석 방법방법

대부분의 컴파일러는 제한된 기능이지만 정적 분석을 실행

코드에 존재하는 결함으로 나타날 비정상적인 패턴이나 원하지 않는 패턴을 찾는 방법는 패턴을 찾는 방법

자료 흐름이나 논리 흐름을 분석하는 것

자료 흐름: 자료가 어디서 정의되고 사용되었는지 나타내는 그래프

최은만, CSE 4039 소프트웨어 공학 44

Page 45: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

정적정적 분석분석 방법방법

정의 변칙(define anomaly)

정의되지 않고 사용된 변수

사용 변칙(use anomaly)

정의 되고 사용되지 않는변수

최은만, CSE 4039 소프트웨어 공학 45

Page 46: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

증명증명

프로그램을 위한 요구와 코드 자체에 기초하여 이루어짐

소프트웨어 품질이 아주 중요한 경우 증명을 사용

결함이 없다는 것을 증명할 정 중 한 시스템결함이 없다는 것을 증명할 정도로 중요한 시스템

• 항공기 탑재 시스템

• 원전 제어 시스템

요구 사항에 기초하여 프로그램의 전제조건과 사후 결과를 논리식으로 표현하여 증명현하여 증명

최은만, CSE 4039 소프트웨어 공학 46

Page 47: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

증명 사례

// Define I: j <= n-1 < 100 & r = max{g[0], g[1], …, g[j]}

// After the following two commands, I is true:

int r = g[0];

int j = 0;

// This block keeps I true// This block keeps I true

while( j < n-1 )

{ if( g[ j+1 ] > r ) r = g[ j+1 ];

++j;

}}

최은만, CSE 4039 소프트웨어 공학 47

Page 48: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

증명 사례

불변조건 I 가 참이다. 루프가 종료된다고 가정하면 종료 시점에는조건 j < n-1 가 더 이상 참이 아니고 j >=n-1이다.

이상을 종합하면이상을 종합하면

j >=n-1, AND

j <= n-1 (from statement I) AND k = max{ a[0], a[1], …, a[j] } (from statement I)

. . . . .

최은만, CSE 4039 소프트웨어 공학 48

Page 49: 12 Coding(2010).ppt [호환 모드] - Dongguk...요구분석서, 아키텍처설계서참조 오류가적은품질좋은프로그램작성 원리와가이드준수 최은만, CSE 4039

증명 사례

루프가 종료된다고 가정하면 종료 시점에 j < n-1 조건은 더 이상참이 아니다. 그러나 불변조건 I는 항상 참이므로 이를 종합하면,

j < n-1 is false, AND

j <= n-1 (from of statement I) ANDj <= n 1 (from of statement I), AND

r = max{ g[0], g[1], …, g[j] } (from statement I)

따라서 j = n-1 AND r = max{ g[0], g[1], …, g[n-1] }

-- 바로 이것이 이 프로그램의 목표.

루프가 종료되는지를 증명하는 것이 남아 있음. 불변조건 I 가 참 이므로 n-j 는 항상 양수이다. 또한 n-j 는 반복되면서 1 씩 감소된다. 따라서 루프는 언젠가는 종료된다.

최은만, CSE 4039 소프트웨어 공학 49