レベル: 中級 Nathan A. Good, Senior Information Engineer, Freelance Developer
2009年 6月 30日 関心の分離はオブジェクト指向による (OO: Object-Oriented) ソフトウェア設計の概念です。関心を分離すると、よりモジュール化されたアプリケーションを作成することができます。モジュール化されたアプリケーションでは、保守や新しい機能の追加を容易に行うことができます。PHP の OO 言語としての特徴を利用すると、設計コンセプトを適用することができるため、より堅牢で管理しやすいアプリケーションを作成することができます。
オブジェクト指向の (OO: Object-Oriented) アプリケーションを作成する上で、関心の分離を維持することは重要な要素です。関心を分離することで、よりモジュール化されたアプリケーションを作成することができます。またアプリケーションがモジュール化されると、アプリケーションの管理も容易になります。
PHP はクラスやインターフェースなど、OO 言語の特徴をサポートしていますが、OO の特徴をまったく利用せずに PHP アプリケーションを作成することも可能です。場合によると OO 設計をするのは困難なことがあり、またプロジェクトによっては、簡単で小さなアプリケーションを OO 設計によって作成しても、それに見合うほどの効果が得られないこともあります。
OO 設計をすると、そのアプリケーションの存続期間中にアプリケーションを容易に変更することができる上、再利用性が高まるという利点もあります。そのため、私は OO 手法でアプリケーションを作成した方がよいかどうかを判断するために、以下の簡単なテストを行うことにしています。そのアプリケーションがこのテストにパスしない場合でも、可能な限りモジュール化した関数を作成するのに適した手法を取り入れ、なるべく関数を使うようにしています。
- そのアプリケーションの一部が他の場所で再利用できるかどうか。他にもアプリケーションを作成する予定がある場合には、現在作成中のアプリケーションの一部を再利用できないかどうかを考えてみます。
- そのアプリケーションに後で変更が必要になる可能性があるかどうか。そのアプリケーションにビジネス・ロジックやビジネス・ルールが含まれている場合には、そのビジネス・ロジックが変更されると、おそらくアプリケーションにも変更が必要になります。
関心を特定する
アプリケーションを作成している時には、関心を分離する必要があると意識することは適切なことです。しかし関心を適切に分離する前に、関心とは何かを知る必要があります。アプリケーションを作成する際の「関心」とは「コンピューター・プログラムに必要な特定の一連の動作であり、概念的なまとまりです」(「参考文献」を参照)。
関心を適切に定義するためには、典型的なアプリケーションを考えてみることです。大まかに言って、大部分のアプリケーションは、どこかでデータを取得し (入力)、そのデータをどこかに格納し (永続化)、そして後ほど、そのデータを再度取得します (表示)。アプリケーションは、ユーザーからの入力を取得する際に、入力されたデータを検証してから格納するかもしれません。あるいは、アプリケーションがそのデータをユーザーに対して表示する際には、アプリケーションはデータを読みやすい形にフォーマット設定するかもしれません。
こうしたこと、つまりデータの保持、データのフォーマット設定、そしてデータの検証は、すべて関心です。アプリケーションの関心同士が分離されている場合には、ある人に関するデータ要素を含む Person コンポーネントは、その人の名前のフォーマットを設定する方法について何も情報を持つ必要はありません。その人の名前は、フォーマットを設定する対象となるデータですが、フォーマットの設定はアプリケーションごとに異なります。アプリケーションによって、人の名前を「苗字/名前」のフォーマットで表すものもあれば、下の名前しか使わないものもあるかもしれません。フォーマット設定は、表示に関する関心であり、ある 1 つのコンポーネントに密結合すべきものではありません。ある 1 つのコンポーネントに密結合してしまうと、そのコンポーネントの再利用を制限することになります。
境界を特定する
関心を水平方向に分離するためにレイヤー (つまりプレゼンテーション・レイヤー、プロセス・ロジックまたはビジネス・ロジックのレイヤー、そしてデータ・レイヤー) を使用する場合、レイヤーの端部を定義するために引かれる線が境界線です。例えばプレゼンテーション・レイヤーとロジック・レイヤーとの間には境界線があります。MVC (Model-View-Controller) パターンをサポートするフレームワークを使用すると、そうした境界線を強制的に作成することができます。
しかしそうした支援をしてくれるフレームワークを使用していない場合には、関心を分離する作業として、さまざまな関心を特定し、次にそうした関心の間に境界線を引く、ということから始めなければなりません。そのように特定される境界の内部に PHP コードを収める必要があります。例えば、プレゼンテーション・レイヤーとデータ・レイヤーとを境界線によって分離する必要があります。これはつまり、プレゼンテーションに関する処理 (テキストの配置、値の連結、数字のフォーマット設定など) を行う PHP コードは、データに関する処理を行うレイヤーの中にあってはならないということです。また逆に、データベースに接続したり、クエリーを実行したりするための PHP コードは、テキストや数字の配置をするコードとは分離する必要があります。
依存関係を特定する
どうすれば関心を適切に分離できるかを判断する際には、依存関係を特定することも非常に重要です。人の名前のフォーマットを設定する例の場合、名前のフォーマットを設定するコンポーネントと、その人のデータとの間には依存関係があります。データのフォーマットを設定するには、そのデータが存在していなければなりませんが、フォーマッターがないとデータが存在できないということはありません。
関心を分離できるかどうか、また関心を分離すべきかどうかを判断する 1 つの方法は、2 つの関心の間に (循環的ではない) 片方向の依存関係を描けるかどうかを調べてみます。他方がなくても一方が存在できる場合には、両者を分離する必要があります。
コンポーネントを特定する
関心を分離できると、関心を処理するコンポーネントを作成することができます。例えば Person コンポーネントには、ある人に関するデータが含まれ、PersonFormatter コンポーネントには Person コンポーネントのフォーマットを適切に設定して表示するためのメソッドが含まれるようにします。さまざまなバリデーター (PersonNameValidator など) を作成することで、その人に関するデータを検証することができます。
また、ドメイン・オブジェクトを表現するコンポーネントを作成することもできます。例えば、Person コンポーネントによって表現されるのは、従業員、顧客、学生、あるいは連絡先かもしれません。アプリケーションによっては、その人はログインして仕事をするかもしれず、発注を行うかもしれず、授業を受けるかもしれず、あるいは個人情報を提供するかもしれません。これらを Order コンポーネントや Class コンポーネントといったコンポーネントにすることができます。
コンポーネントを作成する場合には、そのコンポーネントのデータを各コンポーネントの関心とみなすことが重要です。例えば、Person コンポーネントは Order の小計を計算したり Classes が一杯かどうかを判断したりすべきではありません。
ロジックを分離する
アプリケーションの中でロジックを分離することは重要です。ほとんどの場合、ロジックを他の領域から分離しておく必要があるからです。言い換えると、アプリケーションの中のロジック自体を関心とみなす必要があります。
ビジネス・アプリケーションでは、ユーザー入力 (プレゼンテーション) からストレージへの格納 (データ) までにデータをどう処理するかを指定するものがロジックです。例えば利率を計算する場合や、ある顧客の今年の合計注文額を計算する場合、あるいは、ある顧客の今年の合計注文額を基にその顧客が特定のボーナス・ポイントの対象になるかどうかを判断する場合には、ロジックを使って計算を行います。こうしたロジックは、単純にオブジェクトを表示するコードやオブジェクトをデータベースに保存するコード、データを検証するコードと混在させないようにするのが最善の設計です。この最善の設計では、代わりにそれらのロジックは別のクラスの中に入れ、他のオブジェクトはそのロジックの詳細を気にする必要がないようにします。
まとめ
モジュール化された、オブジェクト指向のアプリケーションを作成する上で、関心の特定と分離は重要なステップです。関心の特定方法、そして関心の境界の特定方法がわかるようになると、特定の処理を実行する PHP コードをどこに配置すればよいかを判断できるようになります。
参考文献 学ぶために
製品や技術を入手するために
- 皆さんの次期オープンソース開発プロジェクトを IBM ソフトウェアの試用版を使って革新してください。ダウンロード、あるいは DVD で入手することができます。
- IBM 製品の試用版をダウンロードするか、あるいはオンラインで IBM SOA Sandbox を試し、DB2®、Lotus®、Rational®、Tivoli®、WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品を試してみてください。
議論するために
著者について  | 
|  | Nathan A. Good はミネソタ州の Twin Cities エリアに住んでいます。彼はプロとしてソフトウェア開発やソフトウェア・アーキテクチャー、システム管理などを行っています。彼はソフトウェアを書いている時以外は、PC やサーバーを構築したり、新しい技術について資料を読んだり、そうした技術に取り組んだり、彼の友人達をオープソース・ソフトウェアに移行させようとしたりしています。彼は数多くの本や記事を執筆、あるいは共同で執筆しており、その中には『Professional Red Hat Enterprise Linux 3』や『Regular Expression Recipes: A Problem-Solution Approach』、『Foundations of PEAR: Rapid PHP Development』などがあります。 |
記事の評価
|