連載
» 2005年12月16日 12時00分 公開

保守性・拡張性に優れたシステムを作る:ソフトウェアにおける保守性と拡張性の定義 (1/2)

本連載は、オブジェクト指向言語(Java言語など)の経験がある方に、オブジェクト指向における分析設計の流れ・考え方を理解していただくことにより、少しでも現状の改善に役立てられることを目標としています。

[野村佳弘, 玉川憲,日立ソフトウェアエンジニアリング/日本IBM]

この記事は会員限定です。会員登録すると全てご覧いただけます。

 一般的に、オブジェクト指向を使うと、保守性・拡張性に優れたシステムが作れるといわれています。しかし、実際には、「オブジェクト指向を使った開発手法のどの部分が保守性・拡張性に貢献するのか分かりにくい」というのが実情ではないでしょうか。この連載では、システム開発における分析から実装の中でも、特に保守性・拡張性の視点から重要なポイントをピックアップして、説明していきたいと思います。

 連載第1回は、まず、現状のシステム開発(ビジネス・アプリケーション)における分析設計手法の問題点を整理し、変更性・拡張性の重要性と定義を説明したいと思います。

現状のシステム開発における問題点

  ビジネスアプリケーション開発といってもさまざまな開発手法があります。例えば、「機能分割」のような一般的な開発手法における問題点とは何でしょうか? 筆者はシステム開発に長く携ってきました。入社して最初にプログラムのコーディングをしていたときは、至る所に重複したロジックや条件文が存在してしまう複雑なプログラムを作ってしまったことが多くありました(俗にいうスパゲッティコードです)。また、システムエンジニアとして上流工程の業務分析や要求定義、機能設計などを行っていたときも、ユーザーと検討した業務要件は機能を中心に整理し機能設計してきましたが、どうしても似たような機能が散在し、すっきりした機能仕様書を作成することはできませんでした。

 これまでのシステム開発における問題は、ほかにもたくさん挙げられると思いますが、まずは下記の2点に着目したいと思います。

  1. 上流工程:機能仕様に似たような機能が散在
  2. 下流工程:プログラム中に重複したロジックや条件文が散在

 現状のシステム開発の大まかな流れを見ていきながら、これらの問題を理解していきましょう。

現状のシステム開発の流れ

ALT 図1 現状のシステム開発の流れ(クリックすると拡大)

 上記の図1は、機能分割、DB設計、プログラム設計での一般的な設計を示しています。

(1)上流工程

 まず、機能分割の手法においては、業務要件から「料金を計算する」という機能を洗い出します。これを機能分割し、「顧客をチェックする」「固定電話料金を計算する」「携帯電話料金を計算する」などのシステム化可能な機能に分割します。このように階層的に、機能を分割していくのが特徴です。

 しかし、この手法では、似たような機能をまとめるのが非常に難しいといえます。例えば、「固定電話料金を計算する」「携帯電話料金を計算する」において、ほとんど中で行うのは同じような処理でも、扱うデータが違うだけで違う機能として扱わねばなりません。これらの機能を抽象的に考えてまとめるための手法がないのです。

 また、一方で、データベースのデータに関しては、正規化することで、重複をなくし、保守性・拡張性を確保することができます。しかし、機能については、データのように正規化する手法があまりなく、機能の重複をなくすことが難しいといえます。

 まとめると、現状のシステム開発の上流工程においては、機能を効果的に抽象化する手法がなく、機能やデータの構造を併せて分析することができないといえます。

(2)下流工程

 プログラム設計に入ると、システム化可能な機能を、プログラムで実装していきます。基本的な構成としては、メインプログラムで「データ読み込み」「チェック処理」「業務処理」「データ更新」というようにデータを順番に処理する設計になっています。この中の業務処理では、順番にビジネスロジックが実行されます。「固定電話料金を計算する」「携帯電話料金を計算する」などのビジネスロジックはサブルーチンなどで実装され、共有データ領域(グローバル変数)などを参照しながら実行されます。共有データ領域には、データベースから入力したデータや、料金を合計するときの集計エリアなどのワーク領域が保持されます。そして、最後に処理した結果によりDB更新を行います。このように、複雑なプログラムであっても、基本的には「入力処理」「業務処理」「出力処理」の組み合わせで構成されています。

 上記のような流れでプログラムを作成すると、機能仕様書に出てくる似たような機能を、それぞれ別のビジネスロジックとして作らねばならず、プログラム中に重複したロジックがたくさん出てきます。また、ビジネスロジックを実装したサブルーチンと共有データ領域の対応付けは、利用するプログラム側が管理しなければならず、条件文がはんらんしプログラムを複雑にしてしまいます。

 このようなプログラム構造だと、変更が入ったときの対応は非常に大変なものになります。例えば、「衛星電話料金を計算する」などの似たような機能が追加された場合、どうなるでしょうか。まず、機能仕様で「衛星電話料金を計算する」機能を追加設計します。そして、プログラムでは、「衛星料金を計算する」サブルーチンを作成します。さらに、衛星電話料金データが増えたことで、業務処理のプログラムには、衛星電話料金の場合に「衛星電話料金を計算する」サブルーチンを呼び出す条件式も追加せねばなりません(図2)。

ALT 図2 複雑なプログラム構造の弊害(クリックすると拡大)

 このように、データが増えると、データを処理するビジネスロジックを作成するとともに、そのビジネスロジックを呼び出すプログラム側も入力したデータを判断して該当するビジネスロジックを呼び出す処理を追加する必要が出てきます。これが1カ所ならよいのですが、往々にして、このようなビジネスロジックを呼び出すプログラムは、至る所に存在することが多く、修正が大変になります。

 まとめると、現状のシステム開発の下流工程においては、重複した機能を持つ機能仕様書を実装するためにプログラム中に重複したロジックが出てきますし、サブルーチンを呼び出す側でデータとビジネスロジックの対応付けを取るために条件文がたくさん出てきてしまいます。そして、そのせいで、変更が入ったときに、修正必要個所の特定が難しく、修正個所が散在してしまう、ということができます。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ