「変更に耐えるシステム構造とモデルの関係(上)」、「変更に耐えるシステム構造とモデルの関係(下)」では、概念モデリングとユースケースモデルによるオブジェクト指向の考え方をお話ししました。今回は、拡張性・保守性を考慮したクラスの整理整頓とコンポーネント化の方法についてお話ししたいと思います。まずは、コンポーネント化を考えるうえで重要な要素となるパッケージを手掛かりにします。
パッケージには次のような役割があります。
Javaでは必ずパッケージを利用してクラスを整理します。パッケージは、クラスを利用しやすいように分類し整理するための箱を提供します。例えば、ファイルアクセス関連のパッケージ、ネットワーク関連のパッケージなどです。
パッケージは内部にパッケージを定義することができ、これにより階層構造を持たせて名前空間を構成することが可能となります。名前空間とは、ある“もの”を特定するための名前の構造です。インターネットの世界で有名なドメイン名なども名前空間の一種であり、世界中にあるサーバの中から1つのサーバを特定することができます。
このドメイン構造をパッケージ構造に対応付けることにより、世界中で唯一のクラスとして特定することができます。例えば、@ITなら「jp.co.atmarkit. business」のようにドメイン名を逆さまにしてパッケージの階層構造を構築します。このようにすれば、businessパッケージをどこで再利用しても名前が重複することはありません。
パッケージは外部から内部のクラスへのアクセスを制御します。クラスや操作にアクセス指定子(public、private等)を指定することにより、パッケージの外からのアクセスを制限することができます。パッケージはどのように使われるのでしょうか。パッケージは主に、クラスライブラリやレイヤ化などで使用されます。
・レイヤ化
パッケージによりシステムの階層化構造を定義します。例えば、プレゼンテーション層、サービス層、ドメイン層、永続化層など役割のレベルが同じクラスを層として定義したものが階層構造で、これをレイヤ化するといいます。このようにパッケージを垂直方向に利用するとシステムを階層化することができ、これを階層化アーキテクチャといいます。
・ライブラリ化
互いに関連しているクラスなどをパッケージとしてまとめることにより、必要なクラスを簡単に探し出せるようにライブラリ化します。例えば、Javaの標準ライブラリでは、ファイルの読み書きなどのためのクラスはパッケージjava.ioに、ネットワーク関連のクラスはパッケージjava.netに、というように機能別に分かりやすくまとめています。
また、パッケージは、例えばユースケース単位でのサービスの分類などにも、利用することができます。固有な構造であるユースケースを実現するクラス群は、パッケージなどを利用してまとめます。
Copyright © ITmedia, Inc. All Rights Reserved.