システム開発プロジェクトで要件定義が終わったら設計という工程に入ります。
設計はプログラム作成に必要なことを決めます。
設計の目的と実施内容
設計は一般的に、基本設計(外部設計)、プログラム設計(内部設計 または 詳細設計)の順番で進めます。
それぞれの目的と実施内容(作成するドキュメント)を説明します。
工程 | 目的 | 作成物の内容 |
---|---|---|
基本設計(外部設計) | ユーザの立場からみた設計をする。 | ・システム全体構成図 ・機能一覧 ・画面設計 ・帳票設計 ・データベース設計 ・バッチ処理内容 |
プログラム設計(内部設計 または 詳細設計) | プログラム開発者の立場からみた設計をする。 | ・クラス図 ・シーケンス図 ・フローチャートや処理フロー ・処理内容記述書 |
基本設計(外部設計)
基本設計フェーズでは基本設計書を作成して、ユーザへ説明を行います。
基本設計書に記述するべき内容を詳しく説明します。
システム全体構成
システムの全体像を理解できるシステム構成を作成します。
ポイントとしては次のことを記載します。
- サーバーが設置されてる物理的な場所(社内のデータセンター、クラウド)
- アプリケーションやデータベースがどのサーバに配置されるのか
- 使用しているOSやミドルウエア(図に書ききれない場合は別表にする。)
- 開発環境/テスト環境/本番環境の切り分け
- 今回開発・構築する部分をハッチングして分かりやすくする
<サンプル>

機能一覧
機能の一覧を作成します。
開発する機能を一覧にしておき、漏れがないことを確認できます。
<サンプル>

画面設計
開発する画面のレイアウトやボタンをクリックした場合の処理内容などを記述します。
各画面に対して設計書を作成しますが、まずは全画面共通の内容がれば、それを記述した設計書を作成します。
全画面共通の内容は次のようなものがあります。
- スタイル(フォントの種類、フォントサイズ、見出しのスタイル、色など)
- 全ての画面に表示する共通メニュー
- 各画面のアクセス権
- 画面遷移図(各画面でどのボタンをクリックするとどの画面へ遷移するかを記述)
共通の画面設計書(スタイル、共通メニュー、アクセス権、画面遷移図)
<サンプル>


各画面の設計書
1画面の設計書は、画面レイアウトや画面に配置されている項目(テキストボックス、ボタン、表など)の説明を記述します。
記述すべき内容は次の通りです。
- 画面レイアウト(吹き出しなどで短い説明を入れると良い)
- 画面項目(テキストボックス、ボタン、表など)の説明
- イベント(起動時、ボタンクリック時の発動) ※処理の詳細は次の「処理内容」に記述
- 処理内容(検索処理や、画面からの入力内容をデータとして保存する場合などの説明)
<サンプル>


帳票設計
帳票設計はPDFやCSVなどで出力される帳票について記述します。
- 帳票名
- 作成(出力)タイミング
- 形式(CSV、PDF、Excel、プリンタ出力等)
- ファイル名
<サンプル>

PDFの場合は次の記述も書くとよいです。
- フォントの種類やサイズ
- 改行するタイミング
データベース設計
データベース設計は、主に概念モデル、論理設計(ER図)、テーブルレイアウトの作成をします。
データベース設計はキー項目を決めたり、正規化したり、やることがたくさんありますが、ここでは概要だけ説明になります。
概念モデル
まずは、業務出てくる「もの」と「イベント」を洗い出して結びます。
<サンプル>

論理モデル
概念モデルで洗い出した「もの」や「イベント」に必要な属性を洗い出します。
<サンプル>

詳細設計(内部設計)
詳細設計はプログラマ向けの設計書です。
詳細設計者とプログラマが同じ人である場合は、プログラムを作成しながらまたは、プログラム作成後に設計書を作成するのが良いです。
クラス図(クラス設計)
オブジェクト指向に従った設計をする場合はクラス図を作成します。
クラス図は、クラス間の構造や関係を視覚的に表現するためのモデルです。
下のサンプルのようにクラス名とそのクラスが持つプロパティやメソッドを記述しますが、プロパティやメソッドは省略することもあります。
<クラス図のサンプル>

汎化-特化
上のサンプルのように「社員」は「正社員」と「派遣社員」に分けられる、それぞれで異なるプロパティ(「入社日」などの属性)やメソッド(処理などの手続き)が異なる場合は、「社員」に共通のプロパティやメソッドを定義して、「正社員」と「派遣社員」には独自のプロパティやメソッドを定義します。
複数の具体的なクラスから共通するプロパティやメソッド(機能)を1つの親クラスにまとめることを汎化と言います。
逆に、一般的な親クラスから、より具体的なクラスを作り出すことを特化と言います。

単純な足し算と引き算の計算をするクラスを例に説明します。
・「計算」クラスは「数値1」と「数値2」のプロパティを使って足し算または引き算の計算をします。
・足し算をするのか、引き算をするのかは「計算方法」プロパティで指示します。
・計算は「計算」メソッドで実行され、計算結果を「計算結果」プロパティに格納されます。

仮に、計算には次の制約があるとします。
・引き算の「計算結果」は0以上であること(計算結果が負の数の場合は計算しない)

このようにサブクラスが、スーパークラスのプロパティやメソッドを使用可能であることを継承と言います。(この例ではスーパークラスにメソッドは無いですが。)
集約とコンポジション(合成)
他のクラスの機能を使って機能を実現する場合は、集約やコンポジションを使います。
先ずは集約の例を提示します。
次の例は、先ほどの計算クラスに、既存の出力クラスを用いて画面やログへの出力機能を実装したいとします。
クラス図では白抜きのひし形を使って接続します。

集約は出力を自クラス(計算クラス)で生成せずに外部から受け取ります。
次の例のように、メソッドの引数で受け取ります。

次にコンポジションの例を提示します。
コンポジションは出力を自クラスで生成します。
コンポジションは、クラス図で黒塗りのひし形で接続します。

シーケンス図
クラス間の処理の流れやメッセージを表すシーケンス図を作成します。
<手順>
・オブジェクト(クラス、画面など)を上に並べます
・処理開始(メソッド)を矢印で繋ぎます。
・応答があれば破線の矢印で繋げます。
<サンプル>

コメント