Discrete Mathematics

Download Report

Transcript Discrete Mathematics

소프트웨어 공학 (Software Engineering)
구현 (Implementation)
최미정
강원대학교 컴퓨터과학전공
In this chapter … (1/2)
구현 (Implementation)
구현, 즉 코딩(coding)은
 설계된 내용을 원시 코드(source code)로 변환시키는 작업
설계 사양
(design spec.)
목적코드
(object code)
코딩
원시코드
(source code)
컴파일
디버깅
코딩의 원칙
• 설계 내용을 철저히 반영시킨다. ( 어렵다고 빼고 진행하면 나중에 후회…)
• 원시코드는 간단 명료하도록 한다
• 디버깅이 쉽도록 한다.
• 시험이 용이해야 한다.
• 수정이 간편해야 한다.
Page 2
Software Engineering
In this chapter … (2/2)
구현 (Implementation)
We will cover …
• 프로그래밍 언어
• 4세대 프로그래밍 언어
• 비주얼 프로그래밍 언어
• 코딩 스타일
• 원시 코드의 문서화
Page 3
Software Engineering
프로그래밍 언어의 역할
구현 (Implementation)
컴퓨터를 제어(control)
• 소프트웨어의 구현 및 저장
• 프로그래머 사이의 의사소통
 논리흐름의 표현
 문서화(documentation)
언어의 기능 vs. 사용자들의 반응
소프트웨어의 구조와 알고리즘적인 특성을 크게 좌우
 적합한 프로그래밍 언어의 선택이 중요한 요소임
Page 4
Software Engineering
프로그래밍 언어의 발전 (1/5)
구현 (Implementation)
제1세대 언어: Machine language, assembly language
제2세대 언어: Fortran, Cobol, Algol60, Basic
제3세대 언어
• 범용: PL/1, Pascal, Modula-2, C, Ada, C++, SIMULA, Smalltalk, Java, …
• 특수: CHILL, RPG, Lisp, Prolog, APL, …
제4세대 언어(4GL, non-procedural language):
MANTIS, IDEAL, RAMIS II, SQL, …
Page 5
Software Engineering
프로그래밍 언어의 발전 (2/5)
구현 (Implementation)
Assembly language 예제
Intel Chip
(Linux)
Sparc Chip
(Solaris)
Page 6
Software Engineering
프로그래밍 언어의 발전 (3/5)
구현 (Implementation)
Fortran 프로그램 예제
Page 7
Software Engineering
프로그래밍 언어의 발전 (4/5)
구현 (Implementation)
Pascal 프로그램 예제
Page 8
Software Engineering
프로그래밍 언어의 발전 (5/5)
구현 (Implementation)
C 프로그램 예제
Page 9
Software Engineering
프로그래밍 언어 선택 시 고려 사항
구현 (Implementation)
프로젝트의 상황
프로그래밍 언어 자체의 특성
Page 10
Software Engineering
프로젝트의 상황 (1/2)
구현 (Implementation)
사용자의 요구
• 유지보수를 사용자가 직접 담당하는 경우 특정 언어를 요구할 수 있음
프로그래머의 지식
• (가장) 숙달된 언어
• 기능의 제한성이 파악된 언어
완성되었거나 현재 진행되는 프로젝트에 사용되고 있는 언어
• 익숙한 언어
• 두 개 이상의 프로젝트가 진행
 가능한 하나의 언어로 통일하는 것이 유리
Page 11
Software Engineering
프로젝트의 상황 (2/2)
구현 (Implementation)
컴파일러의 가용성과 품질
• 하드웨어
• 적당한 가격
• 목적 코드의 효율성, 품질, 오류 메시지의 분량
소프트웨어 개발 도구의 지원
• 에디터(editor)
• 디버거(debugger)
• 링커(linker)
• 추적기(tracer)
호환성
Page 12
Software Engineering
프로그래밍 언어 자체의 특성
구현 (Implementation)
표현력과 적합성
단순성, 명확성, 직교성
언어의 문형
제어 구조
자료형
상수
프로시저와 함수
프로시저 및 자료 추상화
재사용
Page 13
Software Engineering
표현력과 적합성
구현 (Implementation)
원하는 작업을 얼마나 효율적으로 충분히 표현할 수 있는가?
예제
•
COBOL
: 사무응용 분야
•
C 언어
: 시스템 프로그래밍, 임베디드 응용
•
Pascal
: 프로그래밍 교육(풍부한 자료구조)
•
Modula-2
: 시스템 프로그래밍에 적합
•
Ada
: 실시간 처리 응용
•
Lisp, Prolog
: 인공지능
•
ASP, PHP, JSP
: 웹 프로그래밍
•
Java
: 인터넷 프로그래밍
작업 자체를 실현하기에 가장 적합한 언어를 선택하는 것이 바람직함
Page 14
Software Engineering
단순성, 명확성, 직교성
구현 (Implementation)
단순성: 예약어(reserved word)의 개수가 적어야 함
 적을수록 쉽게 이해하고 익숙해 질 수 있음
•
COBOL-74: 300여개, Pascal: 74개, Modula-2: 64개, Fortran 48개
명확성: 언어가 의미를 잘 담고 있으며 모호하지 않아야 함
직교성: 언어의 기능들이 쉽게 결합될 수 있어야 함
예1) 함수의 리턴 값은 (일반적으로) 이미 정의된 타입이어야 함
예2) 동일한 용어가 여러 의미/기능으로 사용되어서는 안됨
Page 15
Software Engineering
언어의 문형(구문) (1/2)
구현 (Implementation)
일관적이고 원시 코드의 명료성을 증진시킬 수 있어야 함
① Pascal의 경우
if TotalSales > BonusLevel then
Bonus := Commission + (BonusPercent * TotalSales);
if TotalSales > BonusLevel then
begin
Bonus := Commission + (BonusPercent * TotalSales);
BonusMonths := BonusMonths + 1
end
② Ada에서 endif, endwhile의 사용  보다 일관적
if TotalSales > BonusLevel then
Bonus := Commission + (BonusPercent * TotalSales)
endif
if TotalSales > BonusLevel then
Bonus := Commission + (BonusPercent * TotalSales);
BonusMonths := BonusMonths + 1
endif
Page 16
Software Engineering
언어의 문형(구문) (2/2)
구현 (Implementation)
③ dangling else  else가 어디에 해당?
if conditionA then
if concitionB then
action1
else
action2
if conditionA then
if concitionB then
action1
endif
else
action2
endif
Page 17
Software Engineering
제어 구조 (Control Structure) (1/2)
구현 (Implementation)
기본적인 제어 구문: if-then-else
선택 구조(case 구조)
•
case 선택자의 타입은 가능하면 제한이 없어야
•
case 문장의 레이블은 범위를 표시할 수 있어야
•
선택자가 가질 수 있는 모든 값을 열거하도록 강요해서는 안 된다
case Person of
when Newborn | Infant => Infant_Seat;
when Toddler .. Child => Lap_Belt;
when Others => Shoulder_and_Lap_Belt;
end case;
Page 18
Software Engineering
제어 구조 (Control Structure) (2/2)
구현 (Implementation)
반복 구조
•
반복 횟수를 나타내는 타입이 정수로 제한되어서는 안됨
•
반복 횟수를 나타내는 변수, 초기값을 배정하는 수식, 점증 값을 반복되는 구조 안에
서 바꾸는 것은 바람직하지 않음
•
반복 횟수를 나타내는 변수의 정의 범위는 반복 문장 안으로 제한하는 것이 바람직함
반복 구조의 구문 예: for, while, repeat-until, loop, …
Page 19
Software Engineering
자료형 (Data Type)
구현 (Implementation)
Strong typed language
•
타입 검사가 매우 강한 특성을 가진다. (“정수 변수 := 실수”는 컴파일 시 에러 발생)
•
Ada, Modula-2, Pascal
Dynamic typed language
•
수행 중간에 변수의 형이 변할 수 있다.
•
Lisp, APL, PHP
단순 자료형
•
실수, 정수, 논리형, 문자형
•
포인터형(Ada, C, Modula-2, Pascal)
사용자 정의 타입
type Ages=(Infant, Toddler, Preschool, Child, Teenager, Adult);
var Person: Ages;
Page 20
Software Engineering
구조 자료형 (1/2)
구현 (Implementation)
(일반적으로) 배열(array)과 구조체(structure)를 의미함
정적 배열
•
프로그램 수행 초기(혹은 컴파일 타임)에 배열의 크기가 결정됨
•
Fortran, Pascal, Modula-2
동적 배열
•
프로그램 수행 중간에 (메모리 할당 등을 통하여) 배열의 크기가 결정됨
•
C, Ada
type Puzzle is array (integer range <>, integer range <>) of character;
subtype SundayPuzzle is Puzzle(1..50, 1..50);
Page 21
Software Engineering
구조 자료형 (2/2)
구현 (Implementation)
구조(Structure)
•
여러 개의 기본 타입으로 보다 복잡한 자료형을 생성하는 방법
•
생성된 구조체를 레코드라 부르기도 함
type SubscriberType =
record
Name: array[1..50] of char;
IDNumber: 10000..99999;
IssuesSent: 0..104;
IssuesRemaining: 0..104;
SubscriptionType: (New, Renewal, Free, Lifetime)
end;
Page 22
Software Engineering
추상 자료형 (Abstract Data Type)
구현 (Implementation)
자세한 내용이 encapsulation되어 있어, 프로그래머는 자료 값이나 오퍼
레이션이 어떻게 구현되어 있는지 자세히 알 필요가 없는 자료형
(일반적으로) Object-Oriented 언어에서 클래스 형태로 사용함
class BankAccount
{
public:
BankAccount(int won, double rate);
BankAccount();
void
update();
double get_balance();
double get_rate();
void
output();
private:
double balance;
interest_rate;
}
Page 23
Software Engineering
상수 (Constant)
구현 (Implementation)
상수란 프로그램이 수행되는 동안에 값이 바뀌지 않는 자료이다.
• Pascal/Modula-2: 단순 자료형(실수, 정수, 문자, 논리형)만 가능
• Ada: 사용자 정의 타입도 허용
• C/C++: #define 사용하여 정의
Page 24
Software Engineering
함수/프로시저 (1/3)
구현 (Implementation)
함수/프로시저에 전달되는 매개변수 종류: 입력, 출력, 입출력
매개변수의 전달 방식
• Call by value: 호출한 부분의 변수 값이 함수 내의 지역 변수에 복사됨
 함수 내에서 변경한 내용이 리턴 후에 반영되지 않음
• Call by reference: 호출한 변수의 주소 값이 함수 내에 전달됨
 함수 내에서 변경하면, 호출한 변수의 값이 직접 변경됨
• Call by value result: 지역 변수에 복사되나, 리턴 시 매개 변수에 복사됨
 지역 변수로 연산을 수행하나, 마지막에 매개 변수에 복사되는 형태임
Page 25
Software Engineering
함수/프로시저 (2/3)
구현 (Implementation)
An example of “call by value”
Page 26
Software Engineering
함수/프로시저 (3/3)
구현 (Implementation)
An example of “call by reference”
Page 27
Software Engineering
재사용 (Reuse)
구현 (Implementation)
특정 자료형이나 목적에 맞도록 구현하는 것이 아니라, 일반적 자료형 및
목적에 맞도록 구현  재사용 측면에서 유리
Ada example: 모든 자료형을 지원하는 스택의 구현
generic
type StackItem is private;
package Stack is
procedure Push(Element: in StackItem);
function Pop return StackItem;
.
.
end Stack;
package CharStack is new Stack(character);
package IntegerStack is new Stack(integer);
Page 28
Software Engineering
구조적 프로그래밍 (1/3)
구현 (Implementation)
프로그램을 계층적으로 중첩되게 작성하는 규율 (formulation) – N. Wirth
프로그램을 쉽게 이해하고 오류를 줄여, 프로그래밍의 생산성을 높이려
는 목적으로 프로그램 작성에 적용하는 철학
프로그램의 제어 흐름을 선형화시켜 논리 구조가 명백하게 하려는 코딩
규율
Page 29
Software Engineering
구조적 프로그래밍 (2/3)
구현 (Implementation)
Proper Program(의 정의)
• 단일입구, 단일 출구
• 모든 노드는 입구에서 도달할 수 있는 경로가 있어야
• 모든 노드는 출구까지 도달할 수 있는 경로가 있어야
구조적 프로그램(의 정의)
• 세 가지 제어구조(순차, 선택, 반복)로 무조건적 goto에 의한 복잡한 제어흐름을 방지
• 제어구조가 하향식
• Stepwise refinement를 이용한 프로그래밍
Structure Theorem
• Proper program은 구조적 프로그램으로 변환 가능
최신 프로그래밍 언어
• 구조적 언어 문형(if-then, if-then-else, case, while, for, repeat-until 등)
Page 30
Software Engineering
구조적 프로그래밍 (3/3)
구현 (Implementation)
Goto文은 구조적인 제어 흐름을 해치지 않는 범위에서 사용해야 함
 가능하면 마음 속에서, 머리 속에서 “goto”를 지우는 것이 바람직 함
50
60
70
80
DO 50 I=1, COUNT
.
IF (ERROR1) GO TO 60
.
IF (ERROR2) GO TO 70
.
CONTINUE
{Code for Error1 handling}
GO TO 80
{Code for Error handling}
CONTINUE
I=1
while I <= TableSize and
Table(I) <> Target do
I=I+1
if I > TableSize then
{code for target not found}
else { code for Target found}
(a) 구조적 코딩
for I = 1 to TableSize do
if Table(I) = Target then goto Found
NotFound: {code for Target not found}
Found:
{code for Target found}
(b) goto의 사용
Page 31
Software Engineering
We are now …
구현 (Implementation)
프로그래밍 언어
4세대 프로그래밍 언어
비주얼 프로그래밍 언어
코딩 스타일
원시 코드의 문서화
Page 32
Software Engineering
4세대 언어(4GL)
구현 (Implementation)
1970년대 후반부터 나온 개념임
“누구나 쉽게 프로그래밍을 할 수 있는 언어”를 기치로 내세움
 결국, (전문) 프로그래머의 설 자리는 없어질 것이라며…
절차적/순서적 언어가 아니고, 비절차(non-procedural)의 언어임
 즉, how가 나타나지 않고, what을 위주로 프로그램을 작성
실질적으로 “실패”했다고 보고 있음… 우리 주위에 4GL이 있는가?
4세대 언어 종류: Focus, RAMIS-II, SQL
 SQL의 경우 특수 목적(DBMS 처리)으로 널리 사용되고 있음
Page 33
Software Engineering
Focus 프로그램 예
구현 (Implementation)
TABLE FILE SALES
HEADING CENTER ‘SAMPLE SALES REPORT’
SUM SALES
BY REGION
ACROSS MONTH
BY YEAR
ON YEAR SUMMARIZE
ON YEAR PAGE-BREAK
END
어떤 의미인지 정확하지는 않지만… 아마도
SALES라는 파일에서 영역, 연도별로, 각 달에 걸쳐서 매출 평균을 구하는 …
Page 34
Software Engineering
SQL 프로그램 예
구현 (Implementation)
SELECT name, price FROM fruit WHERE color = ‘빨간색’;
INSERT INTO fruit VALUES (‘멜론’, 110, ‘초록색’, ‘한국’);
UPDATE fruit SET price=120, country=‘미국’ WHERE name=‘멜론’;
DELETE FROM fruit WHERE name=‘멜론’;
어떻게(how) 찾고, 넣고, 바꾸고, 지우고 하는지를 기술하는 것이 아니라,
무엇(what)을 찾고, 넣고, 바꾸고, 지우고 하는지를 기술한다.
 결국, “how”보다는 “what”에 중점을 둔 보다 지능적인 언어라 할 수 있음
 내부적으로 무엇인가(query processor, query optimizer)가 엄청 고생하겠죠?
Page 35
Software Engineering
We are now …
구현 (Implementation)
프로그래밍 언어
4세대 프로그래밍 언어
비주얼 프로그래밍 언어
코딩 스타일
원시 코드의 문서화
Page 36
Software Engineering
비주얼 프로그래밍 언어
구현 (Implementation)
C, Pascal, Java 등으로만 비주얼 프로그래밍을 한다면…
 코드가 너무 많아질 것이다. 버튼 하나 그리는데 30~40줄…
 시간이 너무 많이 걸릴 것이다.
비주얼 프로그래밍
• 주어진 도구(tool)를 사용하여 화면을 설계 및 구현하고,
• 각 객체에 대한 이벤트(event)에 대해서 액션(action)을 프로그래밍한다.
• 관련된 많은 API 라이브러리가 제공된다.
 얼마나 많은 API를 아느냐 하는 경험의 척도가 기술력이 된다.
종류: Visual C/C++, Visual Basic, J Builder, Delphi, …
Page 37
Software Engineering
비주얼 베이직 예제 (1/2)
구현 (Implementation)
Visual Basic의 경우
① 원하는 윈도우를 그린다
② 버튼, 텍스트 박스의 속성을(properties)를 설정
Page 38
Software Engineering
비주얼 베이직 예제 (2/2)
구현 (Implementation)
③ 연계(관련)된 이벤트에 대해서 코드를 작성한다.
Page 39
Software Engineering
We are now …
구현 (Implementation)
프로그래밍 언어
4세대 프로그래밍 언어
비주얼 프로그래밍 언어
코딩 스타일
원시 코드의 문서화
Page 40
Software Engineering
코딩 스타일?
구현 (Implementation)
옷을 입는 것에도 스타일이 있다.
• 빨간색을 좋아하는 사람  빨갱이인가?
• 진바지를 좋아하는 사람
• 청바지가 잘 어울리는 여자 …
프로그램에도 스타일이 있다?
• 정수형은 사용하지 않는 사람  모름지기 수란 모두 실수여~
• 다섯 줄만 넘으면 함수로 분리하는 사람  모듈화 안 배웠어~ 나눠! 나눠! 나눠!
• 포인터를 엄청 많이 사용하는 사람  난 포인터의 황제다… 어렵지~ 나만 알면 장땡~
 어떤 스타일이 가장 좋은가?
원칙은 없다. 다만 권고(recommendation)가 있을 뿐…
Page 41
Software Engineering
스타일 1: 명확하게 작성하라. (1/3)
구현 (Implementation)
부제: 너무 똑똑한 체 하지 말 것  내가 가장 하기 어려운 …
int i, j;
float v[N][N];
....
for(i=1;i <= N;i++)
for(j=1;j <= N;j++)
v[i-1][j-1] = (i/j)*(j/i);
int i, j;
float v[N][N];
....
for(i=0;i < N;i++)
for(j=0;j < N;j++)
if(i == j)
v[i][j] = 1;
else
v[i][j] = 0;
Page 42
1 0
0 1



0 0
0
0



1
Software Engineering
스타일 1: 명확하게 작성하라. (2/3)
구현 (Implementation)
일반적으로 짧을수록 명확해 진다.
power[1]
power[2]
power[3]
power[4]
power[5]
power[6]
power[7]
power[8]
...
=
=
=
=
=
=
=
=
base;
base*base;
base*base*base;
base*base*base*base;
base*base*base*base*base;
base*base*base*base*base*base;
base*base*base*base*base*base*base;
base*base*base*base*base*base*base*base;
power[1] = base;
for(i=2;i < N;i++)
power[i] = power[i-1]*base;
Page 43
Software Engineering
스타일 1: 명확하게 작성하라. (3/3)
구현 (Implementation)
짧으면 항시 명확하다?  꼭 그렇지만은 않다.
int IntegerFromHex(char HexDigit)
{
if(HexDigit < 58) return(HexDigit – 48);
else return(HexDigit – 55); // ‘A’ = 65
}
// ‘0’ = 48
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 44
Software Engineering
스타일 2: 간결하고 직접적으로 표현하라. (1/2)
구현 (Implementation)
최소값을 구하는 예제 (x = y, or y = x인 경우, 바른 값을 찾지 못한다.
if(x < y) {
if(x < z)
if(x > z)
}
if(x > y) {
if(y < z)
if(y > z)
}
small = x;
small = z;
small = y;
small = z;
small = x;
if(y < small) small = y;
if(z < small) small = z;
Page 45
Software Engineering
스타일 2: 간결하고 직접적으로 표현하라. (2/2)
구현 (Implementation)
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();
}
Page 46
Software Engineering
스타일 3: 임시 변수 사용을 피하라.
구현 (Implementation)
임시 변수(temporary variable)의 사용은 가급적 피한다.
t1 = x1 –(x2 + x2);
t2 = 7 – x2;
Y = t1 + t1 + t2 + t2;
y = 2*(x1 – 2*x2) + 2*(7 – x2);
y  2  x1  2x2   2  7  x2  ;
Page 47
Software Engineering
스타일 4: 혼돈을 초래치 않는 변수 명을 사용하라.
구현 (Implementation)
혼돈하기 쉬운 글자들의 예
• 1 과 l
• 0 과 O
a1
al
term0
termO
• 5 와 S
• I 와 l
TEXT5
TEXTS
Iist
list
• m 과 n 의 연속 사용
• u 와 v 의 연속 사용
mnnm
mnmn
vuvu
uuvu
변수 수정의 예제
• positionx, positiony  xpos, ypos
• n, nn, nnn  n, nsq, ncube  nunit, nsqur, ncube
Page 48
Software Engineering
스타일 5: 일관성 있는 변수 명을 사용하라.
구현 (Implementation)
Hungarian notation: 변수 이름의 처음 몇 자는 변수의 타입이나 범위를
나타내도록 한다.
예) ptr_to_date_key (포인터)
일관성 있는 이름을 사용한다.
char
void
void
int
buffer[500], mssge[80];
read_instance(void), SaveCurrent(void);
get_line(void), write_line(void);
index1, index2;
char
void
void
int
buffer[500], message[80];
read_instance(void), save_current(void);
read_line(void), write_line(void)
i, j;
Page 49
Software Engineering
스타일 6: 문장 그룹이 명확하도록 { }와 들여쓰기를 사용하라.
구현 (Implementation)
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)
...
}
Page 50
Software Engineering
스타일 7: 한 가지 선택이면 if 만, 두 가지이면 if-else
구현 (Implementation)
if(swctl == ‘1’) goto conti;
else {
dvictl += 10;
swctl = ‘1’;
}
conti;
if(swctl != ‘1’) {
dvictl += 10;
swctl = ‘1’;
}
Page 51
Software Engineering
스타일 8: if 다음의 if 구조, null else는 피한다.
구현 (Implementation)
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;
Page 52
Software Engineering
스타일 9: 문장의 반복은 최소화한다.
구현 (Implementation)
반복되는 문장은 가급적 반복문을 사용하여 제거한다.
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 53
Software Engineering
스타일 10: 모듈화하라. 서브루틴을 사용하라.
구현 (Implementation)
같은 역할을 하는 문장들인 경우에는 Grouping하여 모듈화한다.
반복되는 기능에 대해서는 함수로 분리한다.
Page 54
Software Engineering
그 밖의 원칙들 (1/4)
구현 (Implementation)
수식 표현
• 명료하게 작성하라 - 효율성을 위하여 명료함을 희생하지 않도록 한다.
• 번거로운 일은 기계가 하도록 만들라.
• 괄호를 사용하여 모호성을 제거하라.
• 언어의 좋은 기능을 이용하고 불안한 기능의 사용은 피하라.
제어 구조
• 위에서 아래로 읽을 수 있도록 프로그래밍하라.
• 중복 구조를 최소화하라.
• 맨 처음 작성한 것으로 끝나지 말고, 계속해서 리뷰하라.
Page 55
Software Engineering
그 밖의 원칙들 (2/4)
구현 (Implementation)
프로그램
• 각 모듈은 분명한 한 가지 역할만 수행하도록 하라.
• 잘못 작성된 코드는 짜 맞추려 하지 하지 말고 다시 작성하라.
 차리리 버리고, 처음부터 다시
• 큰 프로그램은 작은 단위로 나누어 따로 작성하고 따로 검사하라.
입출력
• 자료가 한계 값을 벗어나지 않는지 항상 검사하라.
• 입력형식은 사용자가 쉽게 준비할 수 있게 하고
출력형식은 그 모양이 스스로 드러나게 구성하라.
• 입출력은 따로 모아서 독립된 서브루틴으로 만들라.
Page 56
Software Engineering
그 밖의 원칙들 (3/4)
구현 (Implementation)
기타
• 발견된 오류만 고치지 말고, 전체적으로 보고 수정 가능한 모든 오류
를 고친다.
• 하나 차이에 의한 오류(off-by-one)를 주의하라.
• 프로그램을 방어적으로 작성하라.
• 빠른 프로그램보다 먼저 바른 프로그램을 작성하라.
• 빠른 프로그램보다 먼저 명료한 프로그램을 작성하라.
• 간결함을 유지하면서 빠른 프로그램을 만들라.
Page 57
Software Engineering
그 밖의 원칙들 (4/4)
구현 (Implementation)
기 타 (계속)
• 주석과 코드가 일치하는지 확인하라.
• 주석을 달 때 코드를 되풀이해서는 않도록 한다.
• 잘못된 코드에는 주석을 달지 않는다. -- 다시 작성한다.
• 과다하게 주석을 달지 않는다.
• 덕지덕지 고쳐서 사용하려고 애쓰지 않는다. -- 과감히 버리고 새로 작
성한다.
Page 58
Software Engineering
프로그램에 관한 몇 가지 격언 (1/2)
구현 (Implementation)
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.
(먼저 자료 구조를 잘 잡는다면, 프로그램은 저절로 써지게 될 것이다.)
Page 59
Software Engineering
프로그램에 관한 몇 가지 격언 (2/2)
구현 (Implementation)
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? (어려운 부분을 먼저 하라. 어려운 부분이 불가능하다
면, 쉬운 부분을 해서 뭣하나?)
…
Page 60
Software Engineering
We are now …
구현 (Implementation)
프로그래밍 언어
4세대 프로그래밍 언어
비주얼 프로그래밍 언어
코딩 스타일
원시 코드의 문서화
Page 61
Software Engineering
원시 코드의 문서화
구현 (Implementation)
소스 코드의 문서화는 즉, 주석 쓰는 것을 의미한다.
주석의 종류
• 프로그램 헤더: 전체 프로그램의 기능을 설명하는 주석
• 모듈 헤더(함수 헤더): 해당 모듈의 기능을 설명하는 주석
• 각 줄에 삽입된 주석: 해당 줄을 설명하는 주석
Page 62
Software Engineering
프로그램 헤더 주석
구현 (Implementation)
프로그램의 제목
제작자
작성일과 버전번호
구조와 설계
공유 변수
사용되는 파일
외부 참조 파일
Page 63
Software Engineering
프로그램 헤더 주석의 예제 (1/2)
구현 (Implementation)
/*****************************************************************************
****
- 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
Page 64
Software Engineering
프로그램 헤더 주석의 예제 (2/2)
구현 (Implementation)
- 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
***********************************************************************/
Page 65
Software Engineering