- システム開発の流れ
私たちの周りにはコンピュータによって提供される様々なサービスがあります。それらのシステムは複数のソフトウェアやハードウェアが複雑に絡み合うことで成り立っています。ソフトウェアの中で中心的な役割を果たすのはプログラムですが、他のシステムと協調して動作するためには、様々な約束事や影響範囲などを決めておく必要があります。 そのためにはいきなりプログラムを作成するのではなく、プログラムがどのような構成なのかという設計が必要になってきます。開発対象は様々ですのでそれに合わせて複数の開発、設計技法が用意されています。
- システム開発モデル
- ウォータフォールモデル(滝)
(類似開発)
開発の流れを複数の工程に分割
上流から下流に向けて順次行う
(※後戻りしない、自由度が低い)
上流
↓ |
基本計画 |
|
運用・保守 |
↑
下流
↑ |
外部設計 |
導入・移行 |
内部設計 |
システムテスト |
下流 ↓ |
プログラム設計 |
結合テスト |
プログラミング |
→ |
単体テスト |
※各フェーズ終了時
レビュー:成果物(仕様書・設計書):進捗管理
(工程内作業)
基本計画 |
要求分析、プロジェクト計画 |
外部 |
画面、帳票、コード、論理データ |
内部 |
機能分割、物理データ |
プログラム設計 |
プログラム分割、インタフェース |
プログラミング |
コーディング、サブルーチン |
テスト |
単体、結合、システム |
移行 |
旧→新システム切替 |
保守 |
バグ修正、改良 |
- プロトタイプモデル
(新規開発)
試作品
(※要求把握、画面設計、実現性、工数見積)
RADツール
(画面インタフェース、仮想端末エミュレータ:携帯、汎用機)
- スパイラルモデル
(リスク低下)
システム(プロジェクト)
↓
機能分割
↓
必要部分(順次開発)
- 設計、開発支援ツール
CASEツール
上流 |
システム分析、ファイル設計、ダイアグラム作成 |
下流 |
プログラミング支援、ソース解析、テスト支援 |
保守 |
リエンジニアリング
既存システムの再構築
・リバースエンジニアリング
稼動システムから仕様解析(仕様書)
・フォワードエンジニアリング
仕様書から新システムを開発(仕様改善、機能追加) |
共通 |
文書、進捗、コスト管理 |
↓
リポジトリ(格納庫:一種のDB)で管理
- 外部設計
利用者側の仕様(ハード制約なし:論理的)
機能分割 |
システム→サブシステム
DFD:システム対象業務の分析
・データフロー:情報の流れ
・処理:作業内容
・データストア:保管情報
・外部:外部発生源、行き先 |
コード設計 |
情報のコード化(※外部コード)
規定コード利用(JIS、各種団体)
(論理データ設計)
・順番:一連の番号(都道府県コード)
・区分:ブロック毎に連番(大学、高校学校コード)
・桁別:各桁に意味(産業分類コード)
・10進分類:0〜9組合せ(図書管理コード)
・表示:ニーモニック:文字、略語(製品コード)
|
データ設計 |
必要データ項目、ファイル、DB形式
(数値、文字、桁数)
E-R図:データの関連性
・実体:エンティティ
・関連:リレーションシップ
・属性:アトリビュート |
入出力設計 |
画面フロー、画面・帳票レイアウト
(※様式、ハード非依存) |
↓
外部設計書
- 内部設計
システム側の仕様(ハード制約あり:物理理的)
機能分割 |
サブシステム→プログラム |
コード設計 |
システムコード(※内部コード)
(エラー、内部メッセージ) |
データ設計 |
ファイル編成(順、直接編成)
レコード形式(※物理データ)
(固定・可変、データ型、パック10進、CSV)
|
入出力設計 |
画面・帳票配置(ピクセル)、
GUI(イベントドリブン、コントロール)、
入力検査(チェック)
・カウント:データ件数(入力=処理)
・ニューメリック:数字(0〜9)
・リミット:上下限値
・レンジ:指定範囲
・シーケンス:順番(キーの昇・降順)
・チェックディジット:検査数字付加
・バランス:ペア項目(クロスフィッティング)
・アンマッチ:照合(入力=コード一覧)
(※ハード制約) |
↓
内部設計書
- プログラム設計
モジュール分割
プログラム→モジュール※機能の階層化
コンパイル単位(オブジェクトモジュール)
※再利用、並行作業、単独実行不可
(分割技法)
データの
流れ |
STS |
入力、処理、出力の3分類 |
TR |
機能(トランザクション)ごとに分類 |
共通機能 |
共通モジュールの統合 |
データ
構造 |
ジャクソン法 |
入出力データの構造から
基本、連続、選択、繰返しに分類 |
ワーニエ法 |
入力データの構造から
順次、選択、繰返しに分類
※構造化分析 |
(モジュールの独立性)
・モジュール強度
(モジュール内の関連:凝集性:ぎょうしゅう)※強いほど良い
強い |
機能的 |
1つの機能を提供(入口1つ、出口1つ) |
↑
↓ |
情報的 |
特定のデータ構造を扱う(出入り口1つが複数)
(※追加、更新、削除など) |
連絡的 |
順次機能を実行(同一データ)
(※データフォーマット変換:DB→ログ) |
手順的 |
順次機能を実行(データの関連性なし)
(※アルゴリズムの一部) |
時間的 |
同時期に実行する機能(順番は無関係)
(※初期化、終了処理) |
論理的 |
パラメータで機能選択(入り口1つ出口複数)
(※引数で処理を選択) |
弱い |
暗号的 |
関連のない機能を含む
(※再度モジュール分割が必要) |
モジュール結合度
(モジュール間の関連)※弱いほど良い
弱い |
データ |
単純データ(一般的なデータ型)
(※値・データ渡し) |
ローカル |
↑
↓ |
スタンプ |
複雑データ(構造体などデータ型依存)
(※参照・アドレス渡し) |
制御 |
制御データ(相手は論理的強度) |
外部 |
外部宣言領域(又は単純データ)
※あるモジュール間固有 |
グロー
バル |
共通 |
共通領域(又は複雑データ)
※全モジュール専用の共有領域 |
強い |
内容 |
他モジュール内参照
※同一モジュールに統合
オブジェクト指向ではカプセル化で予防 |
ローカル |
- プログラミング
構造化プログラミング
1 |
入り口と出口が1つ |
2 |
GOTO文なし |
3 |
基本制御構造(3つで構成)
1.連続
2.選択
3.反復
※多分岐、後判定反復を含める場合もある |
モジュール設計
(図式表現法)
フローチャート |
プログラムの流れを図式化 |
NSチャート |
基本制御構造の図式化 |
HIPO |
図式目次、総括ダイアグラム、詳細ダイアグラム |
デバッグ(デバッガ)
バグ(プログラムエラー)の排除
ダンプ |
メモリ、ファイルの内容表示 |
トレーサ |
実行中の変数値を表示 |
ブレークポイント |
実行の一時停止→レジスタ・変数参照 |
オープンソース
ソースコード無償提供、改良、再配布
LINUXなど
- オブジェクト指向
システム化の対象→オブジェクトの集合体
オブジェクト:名称付けして区別できるもの
物、目的、対象(概念)をモデル化
(性質)
・属性(状態、データ)
・処理(機能、メソッド)
↓(集合:まとめる)
現実世界では同じ性質のものはまとめられると便利
※配列なども同じ理由
クラス:それぞれ役割を持ち区別される
(カプセル化)
・情報の隠蔽
・アクセス制限※独立性、安全性、再利用
(プログラム上での実現:表現)
クラス(ひな型)
一種のデータ型(同じデータで共通)
↓(オブジェクト生成)
インスタンス
一種の変数(個々のデータを保持)
(例)
Aクラス→インスタンスa,b,c(全て同じ性質を持つ)
(再利用)
新しいオブジェクト(クラス)
・必要機能のみ
・不足部分(※これまではソースコードをコピー)
↓継承(インヘリタンス):(単一、多重継承)
スーパークラス
A |
↓ |
↓ |
サブクラス
B |
サブクラス
C |
※それぞれAを含む
(クラス間の関係)
「is a」の関係(a kind of)
汎化 |
(スーパークラス)
自動車 |
|
↓ |
↓ |
特化 |
(サブクラス)
バス |
(サブクラス)
トラック |
※サブはスーパークラスでもある
(オブジェクト間の関係)
「has a」の関係(part of)
集約 |
(上位)
自動車 |
(包含) |
↓ |
↓ |
分解 |
(下位)
エンジン |
(下位)
ハンドル |
※上位は下位を持つ(含む)
(プログラムの特徴)
メッセージパッシング |
オブジェクト間のやり取り
(メソッド呼び出し、データ受け渡し) |
ポリモルフィズム
ポリモーフィズム
(多態・多様性) |
インスタンスによって反応が異なる
(メソッド内の実装処理) |
(標準化)
OMG(オブジェクト指向技術の標準非営利団体)
UML |
オブジェクト分析、設計技法
※スリーアミーゴ(ラショナル社の3名)
Ver2.0(13種類の図)
構造図
(6) |
クラス、オブジェクト など |
振舞図
(7) |
ユースケース、シーケンス など |
|
デザインパターン |
クラス設計のサンプル(カタログ化:再利用)
GoFの23パターン
オブジェクト生成
(5) |
Factory Method
(工場メソッド)
生成インスタンス切替
※DI:依存性注入
Singleton(一人っ子)
単一インスタンス
|
プログラムの構造
(7)
|
Composite(合成物)
既存クラスの再利用 |
オブジェクトの振舞い
(11) |
Iterator(繰り返し)
集合データの参照 (配列、コレクション) |
|
CORBA |
分散オブジェクト通信(言語非依存) |
- プログラムテスト
基本計画(システム) |
←
→ |
運用テスト |
外部設計(サブシステム) |
システムテスト |
内部設計(プログラム) |
結合テスト |
プログラム設計(複数モジュール) |
プログラミング(モジュール) |
単体テスト |
単体テスト(モジュール)
単一モジュール
ブラック
ボックス |
モジュール仕様書(外部)
機能テスト
インタフェース
(テストケース作成手法)
同値分割 |
有効、無効データ |
限界値分析 |
境界データ |
原因結果グラフ
(因果グラフ) |
入出力が複雑な場合
(原因と結果を整理)
※決定表に引き継ぐ |
決定表
(デシジョンテーブル) |
判定条件、
対応処理の整理 |
|
ホワイト
ボックス |
ソースコード(内部)
構造テスト
コード内容
※プログラムの実行割合
(例)
|
|
(組合せの例)
|
1 |
2 |
3 |
4 |
a |
1 |
1 |
0 |
0 |
b |
1 |
0 |
1 |
0 |
|
(網羅基準:テストケース作成法)
1 |
命令網羅 |
全ての命令を1回行う |
1 |
2 |
判定条件網羅 |
全ての分岐を1回行う |
1,2 |
3 |
条件網羅 |
各条件要素で真偽を行う |
1,4 |
4 |
判定条件
/条件網羅 |
2,3を満たす |
1,4 |
5 |
複数条件網羅 |
全ての条件の組合せ |
1,2,3,4 |
※判定と条件は間違いやすい
|
結合テスト(プログラム)
ボトムアップ |
下位モジュールから
(ドライバ:ダミープログラム) |
トップダウン |
上位モジュールから
(スタブ:ダミープログラム) |
サンドウィッチ |
トップダウンとボトムアップを並行 |
ビッグバンテスト |
モジュール一斉結合 |
システムテスト
ユーザ要求:機能、性能、負荷
運用テスト
ユーザ主体、並行導入
- 保守(メンテナンス)作業
(修復作業)
修正 |
バグ修正 |
変更 |
外部要因への対応(※法改正など) |
改良 |
機能追加、変更 |
レグレッションテスト
修正、改良→変更対象外も含めテスト
(点検作業)
事後 |
障害発生後の対処 |
定期 |
定期的にシステム診断 |
予防 |
監視、部品交換 |
遠隔 |
ネットワーク経由 |
バスタブ曲線
ハードウェア故障頻度と経過時間
ゴンベルツ曲線
プログラムテストの進捗状況とシステムの信頼度
|