第
10回 コーディングと統合
コーディングと統合
algorithm プログラム コード プログラム コード プログラム コード情報
システム
詳細設計
コーディング
統合
・
・
・
・
・
・
機能
機能
機能
・
・
・
algorithm algorithm学習目標
n いくつかの統合の仕方について学ぶ。
n 構造化コーディング技法について学ぶ。
n コメントの書き方について学ぶ。
コーディングとテストは
並行して実施
n 個々のモジュールを正しくコーディングする
ためには,コーディングとテストを平行して実
施する必要がある。
n テストには,次の3つがある:
p 単体テスト(unit testing):各モジュールに対す
るテスト
p 統合テスト(integrated testing):統合された情
報システムに対するテスト
p 受理テスト(acceptance testing):最終製品とし
て納入する際のテスト
モジュール統合の
いくつかの代替的順序
n どのモジュールからコーディングすべきか?
p Big-Bang法:すべてのモジュールをコーディングしてか
ら,全体を統合する方法。単体テストはしばしば行われ
ない。
p 漸増的開発(incremental development):部分的に
コーディングしては統合してテストしていく方法。システ
ム構造図におけるどのモジュールを単位とするかに,以
下の3つの方法がある:
トップダウン式
ボトムアップ式
スレッド式:
ソースコードの質に
影響を与える要因
n ソースコードが最終製品なので,その質は
重要である。
n よい品質のソースコードを作成するために:
p 構造化コーディング技法を使う
p よいコーディングスタイル
p ローカルなデータ構造をうまく選ぶ
p 内部コメントをきちんと書く
p フォーマットや変数名は,読みやすく,整合的に。
構造化コーディング技法
n 構造化コーディング技法の特徴
p 無条件分岐(goto文)はなるべく使わない。
(あった方がよい場合もある)
p トップダウンで
p 入口と出口はひとつに
gotoや複数の出口を持つケース
DO 50 I=1,COUNT
IF (ERROR1) GO TO 60
IF (ERROR2) GO TO 60
50 CONTINUE
60 {Code for Error1 handling}
GO TO 80
70 {Code for Error2 handling}
80 CONTINUE
・ ・
・
・
・
・
・
・
・
与えられた値を表から
サーチするプログラム
構造化コーディングを使った場合
I = I
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}
構造化コーディングを使わない場合
for I=1 to TableSize do
if Table(i) = Target then goto Found
NotFound: {code for Target not found}
コーディングスタイル
n 短く。
n 分岐は少なく。
短く
Procedure FillPowersArray(var Base:integer;var Powers:array of integer); begin Powers[1]:=Base; Powers[2]:=Base*Base; Powers[3]:=Base*Base*Base; Powers[4]:=Base*Base*Base*Base; Powers[5]:=Base*Base*Base*Base*Base; Powers[6]:=Base*Base*Base*Base*Base*Base; Powers[7]:=Base*Base*Base*Base*Base*Base*Base; Powers[8]:=Base*Base*Base*Base*Base*Base*Base*Base; end{procedure FillPowerArray}:
Procedure FillPowersArray(var Base:integer;var Powers:array of integer); var Index:integer; begin Powers[1]:=Base; for Index :=2 to 8 do Powers[Index]:=Powers[Index-1]*Base; end{procedure FillPowerArray}:
長いからだめというわけではない
function IntegerFromHex(HexDigit:char):integer; var ASCIIValue:integer;
begin
ASCIIValue:=chr(HexDigit);
if ASCIIValue < 58 then IntegerFromHex := ASCIIValue – 48;
else IntegerFromHex := ASCIIValue – 55; end; {function IntegerFromHex}
function IntegerFromHex(HexDigit:char):integer; begin case HexDigit of ‘0’:IntegerFromHex := 0; ‘1’:IntegerFromHex := 1; ‘2’:IntegerFromHex := 2; ‘3’:IntegerFromHex := 3; ‘4’:IntegerFromHex := 4; ‘5’:IntegerFromHex := 5; ‘6’:IntegerFromHex := 6; ‘7’:IntegerFromHex := 7; ‘8’:IntegerFromHex := 8; ‘9’:IntegerFromHex := 9; ‘A’:IntegerFromHex := 10; ‘B’:IntegerFromHex := 11; ‘C’:IntegerFromHex := 12; ‘D’:IntegerFromHex := 13; ‘E’:IntegerFromHex := 14; ‘F’:IntegerFromHex := 15;
2 3 4 5 0 間隔 0 @ P 1 ! 1 A Q 2 ” 2 B R 3 # 3 C S 4 $ 4 D T 5 % 5 E U 6 & 6 F V 7 ’ 7 G W 8 ( 8 H X 9 ) 9 I Y A * : J Z B + ; K [ C , < L ¥ D − = M ] E . > N ^
JIS X0201ローマ字・
片仮名用
8単位符号
第1ニブル
第2ニブル
ソートされた配列から
最頻値と頻度を求める
(1)
procedure Mode1(A:array[1..N] of integer;N:integer;
var Mode,ModeFrequency:integer); var I,TempFreq:integer; begin Mode := A[1]; ModeFrequency := 1; TempFreq := 1; for I:= 2 to N do begin
if A[I] <> A[I-1] then TempFreq := 1
else TempFreq := TempFreq + 1; if TempFreq > ModeFrequency then
begin
ModeFrequency := TempFreq; Mode := A[I]
end end {for}
ソートされた配列から
最頻値と頻度を求める
(2)
procedure Mode2(A:array[1..N] of integer;N:integer;var Mode,ModeFrequency:integer); var I:integer; begin Mode := A[1]; ModeFrequence := 1; TempFreq := 1; for I:= 2 to N do begin
if A[I] = A[I-ModeFrequency] then begin Mode := A[I]; ModeFrequency := ModeFrequency + 1; end {if} end {for} end{procedure Mode2}
分岐は少なく
n 論理的にも心理的にも,分岐が多いと複雑
2つの距離の近さを判定(1)
DistanceRecord = record yards:integer; Feet:integer; Inches:integer end; function D1isLonger(Distance1,Distance2:DistanceRecord):boolean; begin D1isLonger := false;if (Distance1.Yards = Distance2.Yards) and (Distance1.Feet >Distance2.Feet)
then D1isLonger := true
else if (Distance1.Feet = Distance2.Feet) and (Distance1.Inches > Distance2.Inches) then D1isLonger := true