1.6.2. ソフトウェアの機能仕様とそのインタフェースの仕様の識別

1. 概要

 ソフトウェア開発において、機能仕様とインタフェース仕様の識別は極めて重要なプロセスです。この活動は、システム要件定義およびソフトウェア要件定義の段階で行われ、開発するソフトウェアの範囲と機能を明確にします。

 本記事では、ソフトウェアの機能仕様とインタフェース仕様を識別するための一連の活動と、その過程で留意すべき点について解説します。これらの知識は、効率的なソフトウェア開発と高品質なシステムの実現に不可欠です。

2. 詳細説明

2.1. 機能仕様の識別

 機能仕様の識別とは、ソフトウェアが提供すべき機能を明確にする過程です。以下の手法を用いて行います。

2.1.1. ユースケース分析

 ユースケースは、システムと外部アクターとの相互作用を記述したものです。UMLのユースケース図を用いて視覚化することで、システムの機能を明確にします。

 この図は、オンライン書店システムの簡単なユースケース図です。以下に図の説明を記します:

  1. システム境界: 中央の大きな四角形は、オンライン書店システムの境界を表しています。この中にシステムの主要な機能(ユースケース)が含まれています。
  2. アクター:
    • 左側の人型のアイコンは「顧客」を表しています。
    • 右側の人型のアイコンは「管理者」を表しています。 これらのアクターは、システムと相互作用する外部エンティティです。
  3. ユースケース: 楕円形で表されているのが各ユースケースです。この例では以下の3つを示しています:
    • 「書籍を検索」:顧客が利用する基本的な機能です。
    • 「注文を行う」:顧客が商品を購入する際の主要な機能です。
    • 「在庫を管理」:管理者が使用する機能です。
  4. 関連線: アクターとユースケースを結ぶ線は、そのアクターがそのユースケースを実行できることを示しています。

 この図を用いることで、以下の点が視覚的に理解しやすくなります:

  • システムが提供する主要な機能(ユースケース)
  • システムと相互作用する外部エンティティ(アクター)
  • どのアクターがどの機能を利用するか

 ユースケース図は、システムの機能要件を高レベルで把握するのに役立ち、開発チームやステークホルダー間でのコミュニケーションツールとして有効です。また、この図を基に、各ユースケースの詳細なシナリオやフローを作成していくことで、より具体的な要件定義につながります。

2.1.2. ユーザーストーリーの作成

 アジャイル開発で用いられる手法で、「誰が」「何を」「なぜ」したいのかを簡潔に記述します。

 この図は、ユーザーストーリーの基本的な構造を視覚化しています。以下に、図の説明と実際の例を示します:

  1. 「誰が」(役割): ユーザーストーリーの主体となる人や役割を示します。
  2. 「何を」(行動や機能): その役割が実行したい行動や必要とする機能を示します。
  3. 「なぜ」(理由や利益): その行動や機能が必要な理由、または得られる利益を示します。

 実際のユーザーストーリーの例を挙げると:

  1. オンラインショッピングサイトの例: 「顧客として、商品をカートに追加したい。なぜなら、購入したい商品を一時的に保存しておきたいからだ。」
  2. タスク管理アプリの例: 「プロジェクトマネージャーとして、タスクに優先度を設定したい。なぜなら、チームメンバーが重要なタスクを先に処理できるようにしたいからだ。」
  3. 航空会社の予約システムの例: 「旅行者として、複数の航空便を比較したい。なぜなら、予算と日程に最適な選択肢を見つけたいからだ。」

 これらの例では、「誰が」「何を」「なぜ」の要素がそれぞれ含まれており、ユーザーのニーズと目的を簡潔に表現しています。

 このような構造化されたユーザーストーリーを使用することで、開発チームは顧客のニーズをより良く理解し、優先順位をつけやすくなります。また、この形式は非技術的なステークホルダーにも理解しやすく、コミュニケーションツールとしても有効です。

2.1.3. シナリオ分析

 具体的な利用状況を想定し、ユーザーの行動とシステムの応答を時系列で記述します。

 この図は、オンライン書店システムにおける「書籍注文」のシナリオを時系列で示しています。以下に図の説明を記します:

  1. 図の構造:
    • 左側の列がユーザーの行動を表しています。
    • 右側の列がシステムの応答を表しています。
    • 中央の矢印は、ユーザーの行動からシステムの応答への流れを示しています。
  2. シナリオの流れ:
    1. ユーザーがウェブサイトにアクセスする。
    2. システムがホームページを表示する。
    3. ユーザーが書籍を検索し、選択する。
    4. システムが選択された書籍の詳細情報を表示する。
    5. ユーザーが注文を確定する。

 この図を用いることで、以下の点が視覚的に理解しやすくなります:

  • ユーザーとシステムの相互作用の順序
  • 各ステップでのユーザーの行動とシステムの応答の対応関係
  • シナリオ全体の流れと主要なステップ

 シナリオ分析の利点:

  1. 具体的な利用状況を想定することで、より現実的な要件を抽出できます。
  2. ユーザーの視点からシステムの使用フローを確認できるため、ユーザビリティの問題を早期に発見できます。
  3. 開発チームとステークホルダーの間で、システムの動作に関する共通理解を形成しやすくなります。
  4. エッジケースや例外的な状況を特定しやすくなり、より堅牢なシステム設計につながります。

 この図を基に、各ステップの詳細な条件や例外処理なども追加していくことで、より完全なシナリオ分析が可能になります。また、複数のシナリオを作成・比較することで、システムの多様な使用パターンを網羅的に検討できます。

2.1.4. DFD(データフロー図)の作成

 システム内のデータの流れを図示することで、機能間の関係性を明確にします。以下に具体例を示します。

  • 例: Web予約システム
  • ユーザーから予約情報の入力を受け付け、データベースへ保存する。
  • 確認メールを送信する際のデータフローを図示します。
graph TD
    A[ユーザー] -->|予約情報| B((1. 予約情報
入力処理)) B -->|予約データ| C[(予約データベース)] C -->|予約詳細| D((2. 確認メール
送信処理)) D -.->|確認メール| A classDef process fill:#fff,stroke:#000,stroke-width:2px; classDef entity fill:#f0f0f0,stroke:#000,stroke-width:2px; classDef datastore fill:#fff,stroke:#000,stroke-width:2px; class B,D process; class A entity; class C datastore;

 この図は、Web予約システムのデータフロー図(DFD)を表しています。以下に図の説明を記します:

  1. 構成要素:
    • 四角形:外部エンティティ(ユーザー)
    • 円:プロセス(予約情報入力処理、確認メール送信処理)
    • 円柱形:データストア(予約データベース)
    • 矢印:データフロー
  2. データの流れ:
    a. ユーザーから予約情報入力処理へ:
     ユーザーが予約情報を入力します。
    b. 予約情報入力処理から予約データベースへ:
     入力された予約データがデータベースに保存されます。
    c. 予約データベースから確認メール送信処理へ:
     保存された予約詳細が確認メール送信処理に渡されます。
    d. 確認メール送信処理からユーザーへ:
     システムがユーザーに確認メールを送信します(点線の矢印で表現)。

 この図を用いることで、以下の点が視覚的に理解しやすくなります:

  • システム内でのデータの流れと処理の順序
  • 各プロセスの役割と相互関係
  • データの入力源と出力先
  • データストア(データベース)の位置づけ

DFD作成の利点:

  1. システムの全体像を俯瞰的に把握できます。
  2. データの流れに着目することで、システムの主要な機能と処理を明確化できます。
  3. 外部エンティティ(ここではユーザー)とシステムの相互作用を可視化できます。
  4. システムの設計や改善点の検討に役立ちます。
  5. 技術的・非技術的なステークホルダー間でのコミュニケーションツールとして有効です。

 この基本的なDFDを出発点として、必要に応じて詳細化したり、他のサブシステムとの関連を追加したりすることで、より包括的なシステム設計を行うことができます。

2.1.5. E-R図(実体関連図)の作成

 システムで扱うデータの構造を明確にし、機能とデータの関係を示します。たとえば、ユーザー、商品、注文の関係を視覚化することで、各機能がどのデータを操作するかが明確になります。

erDiagram
    USER ||--o{ ORDER : places
    USER {
        int user_id PK
        string username
        string email
        string password
        date registration_date
    }
    ORDER ||--|{ ORDER_ITEM : contains
    ORDER {
        int order_id PK
        int user_id FK
        date order_date
        string status
        float total_amount
    }
    PRODUCT ||--o{ ORDER_ITEM : "is part of"
    PRODUCT {
        int product_id PK
        string name
        string description
        float price
        int stock_quantity
    }
    ORDER_ITEM {
        int order_item_id PK
        int order_id FK
        int product_id FK
        int quantity
        float unit_price
    }

2.2. インタフェース仕様の識別

 インタフェース仕様の識別では、ソフトウェアと外部システムやユーザーとの相互作用を定義します。

2.2.1. UMLの活用

 UMLのクラス図やシーケンス図を用いて、システムの構造や振る舞いを表現します。以下にシーケンス図の具体例を示します。

  • 例: ホテル予約システム
  • ユーザーが予約を確定する際の一連の流れをシーケンス図で示します。
  • APIを用いた通信やデータベースとのやりとりも視覚化します。
sequenceDiagram
    actor User
    participant UI as 予約UI
    participant API as 予約API
    participant DB as データベース
    participant Email as メールサービス

    User->>UI: 予約情報入力
    UI->>API: 予約リクエスト送信
    API->>DB: 空室確認
    DB-->>API: 空室状況返答
    alt 空室あり
        API->>DB: 予約情報登録
        DB-->>API: 登録完了
        API->>Email: 確認メール送信要求
        Email-->>API: メール送信完了
        API-->>UI: 予約完了応答
        UI-->>User: 予約完了表示
    else 空室なし
        API-->>UI: 空室なし応答
        UI-->>User: 空室なし表示
    end

以下に図の説明を記します:

  1. 登場人物(オブジェクト):
    • User: システムを利用するユーザー
    • 予約UI: ユーザーが操作するインターフェース
    • 予約API: 予約処理を行うバックエンドAPI
    • データベース: 予約情報や空室情報を管理するDB
    • メールサービス: 確認メールを送信するサービス
  2. 予約確定の流れ:
    a. ユーザーが予約UIに予約情報を入力します。
    b. UIが予約APIにリクエストを送信します。
    c. APIがデータベースに空室を確認します。
    d. データベースがAPIに空室状況を返答します。
    e. 空室がある場合:

このシーケンス図を用いることで、以下の点が視覚的に理解しやすくなります:

  1. システムの構成要素(UI、API、データベース、メールサービス)とその役割
  2. 予約プロセスの時系列的な流れ
  3. 各コンポーネント間の通信の順序
  4. 条件分岐(空室ありの場合となしの場合)の処理の違い
  5. 非同期処理(メール送信)の位置づけ

UMLシーケンス図作成の利点:

  1. システムの動的な振る舞いを時系列で表現できます。
  2. 複雑な相互作用を視覚的に理解しやすくなります。
  3. システムの設計や改善点の検討に役立ちます。
  4. 開発者間でのコミュニケーションツールとして有効です。
  5. テスト計画の立案や、エラーハンドリングの検討に活用できます。

この基本的なシーケンス図を出発点として、必要に応じて詳細な処理や例外ケースを追加したり、他のユースケース(例:予約のキャンセル、予約の変更など)のシーケンス図を作成したりすることで、システムの振る舞いをより包括的に設計・理解することができます。

2.2.2. 運用の状態又はモードの定義

 システムの運用状態や動作モードを明確にし、各状態での振る舞いを定義します。たとえば、システムがメンテナンスモードにある際の動作を事前に定義しておくことが重要です。

2.2.3. サブシステム分割

 大規模なシステムを扱う場合、機能ごとにサブシステムに分割し、それぞれの仕様を定義します。

2.2.4. サブシステム機能仕様定義

 各サブシステムの機能を詳細に定義します。

2.2.5. サブシステムインタフェース定義

 サブシステム間のインタフェースを定義し、データの受け渡しや制御の流れを明確にします。

2.2.6. サブシステム関連図の作成

 サブシステム間の関係性を図示し、全体像を把握します。

2.3. その他の考慮事項

2.3.1. サービスの定義

 特にクラウドやマイクロサービスアーキテクチャを採用する場合、各サービスの機能と責務を明確に定義します。たとえば、データ収集サービスと分析サービスの役割を区別することが重要です。

2.3.2. 実装制約条件の明確化

 ハードウェアの制限や開発言語の選定など、実装に関する制約条件を明確にします。クラウドサービスの選定やAPIの利用上の制限も考慮します。

2.3.3. 品質特性の定義

 性能、セキュリティ、保守性などの非機能要件を定義し、機能仕様と合わせて考慮します。

2.3.4. IoTへの対応

 IoTデバイスとの連携が必要な場合、デバイスとの通信プロトコルやデータフォーマットを明確にします。例えば、以下のような点に注意が必要です。

  • 通信プロトコル:MQTT、CoAPなどを選定し、低遅延で信頼性のある通信を実現。
  • セキュリティ対策:デバイス認証やデータ暗号化の実施。
  • ネットワーク障害時の処理:オフラインでのデバイス制御を可能にする仕組みを用意。

3. 応用例

3.1. Web予約システムの開発

 ホテルの予約システムを例に、機能仕様とインタフェース仕様の識別プロセスを説明します。

  1. ユースケース分析:「予約の作成」「予約の変更」「予約のキャンセル」などのユースケースを識別
  2. ユーザーストーリー作成:「ユーザーとして、空室状況を確認し、希望の部屋を予約したい」
  3. DFD作成:予約情報の流れを図示
  4. サブシステム分割:「予約管理」「顧客管理」「在庫管理」などのサブシステムに分割
  5. インタフェース定義:Webフロントエンドと予約管理システム間のAPIを定義

3.2. IoTを活用した製造ラインモニタリングシステム

 工場の製造ラインにIoTセンサーを設置し、生産性を監視するシステムの開発例を示します。

  1. シナリオ分析:「異常検知時の警告発信」「生産性レポートの自動生成」などのシナリオを作成
  2. E-R図作成:センサーデータ、製品情報、警告履歴などのエンティティ関係を定義
  3. サービス定義:「データ収集サービス」「分析サービス」「レポート生成サービス」を定義
  4. IoT対応:センサーデバイスとの通信プロトコル(MQTT)を選定し、データフォーマットを定義

4. 例題

例題1

 オンライン書店システムの開発にあたり、「注文処理」サブシステムの機能仕様とインタフェース仕様を識別してください。主要なユースケース、必要なデータエンティティ、外部システムとのインタフェースを挙げてください。

【回答例】

  1. ユースケース:
  • 商品の検索と閲覧
  • カートへの商品追加
  • 注文の確定
  • 支払い処理
  • 注文のキャンセル
  1. データエンティティ:
  • 商品(書籍)
  • 顧客
  • 注文
  • カート
  1. 外部システムとのインタフェース:
  • 在庫管理システムとのAPI

連携(在庫確認)

  • 決済システムとのAPI連携(支払い処理)
  • 配送システムとのAPI連携(配送手配)

例題2

 スマートホームシステムにおいて、「温度制御」機能の仕様を識別するために、どのような手法を用いますか?また、IoTデバイスとの連携を考慮する際の留意点を挙げてください。

【回答例】

  1. 使用する手法:
  • ユースケース分析:「室温設定」「スケジュール設定」「遠隔操作」など
  • シナリオ分析:「帰宅時の自動温度調整」「エネルギー効率最適化」など
  • DFD:温度センサーからのデータフロー、制御命令の流れを図示
  • UML:温度制御システムのクラス図、シーケンス図の作成
  1. IoTデバイスとの連携における留意点:
  • 通信プロトコルの選定(例:MQTT、CoAP)
  • デバイスの認証とセキュリティ対策
  • データフォーマットの標準化
  • ネットワーク切断時の動作定義
  • デバイスのファームウェアアップデート方法

5. まとめ

 ソフトウェアの機能仕様とインタフェース仕様の識別は、以下の点に留意して行います:

  1. ユースケース、ユーザーストーリー、シナリオを用いて機能を明確化
  2. DFD、E-R図、UMLなどの図表を活用して仕様を視覚化
  3. サブシステム分割とインタフェース定義で全体構造を明確化
  4. 運用状態やモードを考慮した仕様定義
  5. 実装制約条件と品質特性を明確化
  6. IoTなど新技術への対応を考慮  これらの活動を通じて、開発するソフトウェアの範囲と機能を明確にし、効率的な開発と高品質なシステムの実現を目指します。