第3回 モデリングにおける「汎化」と「特化」【改訂版】初歩のUML

 今回もクラス図を中心に説明していきます。ユースケース図などの話が聞きたい方、もう少々お待ちくださいね。今回は、「汎化-特化」の関係(generalization-specialization)について説明をします。

» 2003年02月18日 12時00分 公開
[萩本順三株式会社豆蔵]

分析とは

 「汎化-特化」は、一言で「汎化(generalization)」といわれるモデリング技法です。「継承」といえばお分かりですよね。継承は汎化の実現手段の1つなのです

 さて、汎化ということを理解するために、ここで「物事を分析する」という行為について、じっくり考えてみることにしましょう。「分析」を広辞苑で検索すると以下のように説明されています。これを見ると、分析とは、対象を成立させている要素を細かに理解できる単位に分解して、それぞれの違いを識別し、分解された個々を理解することで、全体を理解しようとする一般的な行為、科学的な行為のことを指すということが分かります。

ぶんせき【分析】(analysis)

 ある物事を分解して、それを成立させている成分・要素・側面を明らかにすること。

 〔化〕物質の鑑識・検出、また化学的組成を定性的・定量的に識別すること。

 〔論〕

 概念の内容を構成する諸徴表を各個に分けて明らかにすること。

 証明すべき命題から、それを成立させる条件へ次々にさかのぼってゆく証明の仕方。



オブジェクト指向による分析とは

 同様にソフトウェア開発における分析についても、問題領域に存在する要求を「分解-識別」しながら要求全体の正確な理解をしようとします。また、要求の中に存在するキーとなる重要な概念について、その概念の構造を「もの」として分解し、ほかのクラスと識別し、その概念を整理していきます。

 このように、人が未知の物事を理解するためのプロセスとしては、「まず物事を分けてみる」ことが重要なのです。さて、分けるためには分ける対象が必要となりますよね。その最も自然な対象が「もの」なのです。もやもやとした整理されていない概念の塊の一部分を「もの」として分けてみて、それに名前を付けることで、概念の一部分が、人の頭の中で明確な対象として識別され認知されるようになります。

ALT 図1 お前がトロイから、俺が鋭いということが分かる

 次は分解された「もの」と「もの」の違いと関係を結びます。そうすることで、人は物事を「分かる」ようになるのです。例えば「男」に対して「女」があるから「男」という性質が理解できるのです。もし、この世に「男」しかいなければ「男」という概念を理解することはできないでしょう。つまり、対象となる「もの」をほかの「もの」と比較することで、対象の「もの」を理解できるのです。

 オブジェクト指向分析についても、概念的な塊から「もの」を仮想世界に創出し、そこに実世界の「もの」の名前を借用して名付けてあげることで、仮想世界にしか存在し得ない「もの」を、複数人で認知(分かる)するといった認知技術的側面を持っているのです。オブジェクト指向による分析とは「物事を分けることで解を出す」方法です。何らかの単位に分けて人が理解できるレベルまで分けぬくことがオブジェクト指向分析の基本なのです。

 さて、そうやって分けた「もの」がたくさん出てきたらどうしましょうか? やはり「もの」を体系的に整理しますよね。そこでオブジェクト指向では、まず「もの」の性質に着目し、同じ性質を持つ「もの」をまとめて、「クラス」という型として定義します。

ALT 図2 「もの」の特性を整理してクラスを作る

 このようにして作成されたクラスがどんどん増えた場合のことを想像してください。やはり似たようなクラスをグループ化したくなりますよね。

 そのような整理方法として汎化-特化というモデリング手法があるのです。

では、汎化-特化の話に移りましょう。

汎化-特化とは

 では、ここで「会社には技術員と営業員がいる」ということを分析してみましょう。まず、この文章から「もの」を分類してみましょう。分類された「もの」は以下のとおりです。

  • 会社
  • 技術員
  • 営業員

 次にその関係を関連によって表します。

ALT 図3 関連を使ったモデリング

 図3は「第2回 クラス図の詳細化とその目的」で取り上げた会社と社員のモデルに似てきましたが、もう少し情報の整理をします。会社は技術員と営業員を社員として雇用しているわけですので、できれば社員と会社の関係を含めてモデリングできないものでしょうか。そこで、汎化-特化を使って以下のようにモデリングします。

ALT 図4 汎化を使ったモデリング

 汎化-特化は、白抜きの矢印で表します。矢印の指している方を「スーパークラス」、その逆を「サブクラス」と呼びます。図の上下左右の位置関係は関連と同様に関係ありません。

 図4では、次のことをモデルにて表現しています。

  • 複数の社員は会社で働く
  • 社員には営業員と技術員がいる

 つまり、このモデリングでは、営業員と技術員をまとめた抽象的なクラスである社員を導入し、会社と社員という関係をシンプルに示すことが可能になります。このように抽象的なクラス(社員)をモデルに入れることで「営業員と技術員は社員という特性を共有する」という概念の整理がスムーズに行えていることに注目してください。

 このようにして作成された抽象的なクラスは、抽象クラスと呼ばれ、クラス名をイタリック体で書きます。抽象クラスは、概念を理解するうえで抽象的なクラスとして導入されるものです。つまり抽象クラスは実体を持つことはできません。抽象クラスからはインスタンスを生成できないという特性があり、実際にインスタンスが作成できるのはあくまでサブクラスです。このことを図4で説明すると、技術員の萩本は技術員クラスから生成されるが社員クラスから生成されるものではないということです。もちろんサブクラスも抽象クラスにすることも可能ですが、その説明は今回は割愛します。

インスタンスで考察する

 さて、ここで汎化-特化のモデルの性質を理解してもらうために、図4のモデルから技術員2名と営業員2名を作ってみましょう。図は「第1回 まずはUMLのクラス図を書いてみよう」で紹介したダイアグラムを使います。

 いかがですか、抽象クラスの「社員」はインスタンスとして存在せず、見事に消えているでしょう(図5)。

 社員は、技術者クラスと営業員クラスの構造に内包されているのです。そして会社「BeansStore」は、それぞれのインスタンスを社員として扱っていることを示しています。つまり、会社は、技術員も営業員も社員として操作しているわけです。そして操作される対象が、それぞれの操作に対する実現手段を知っているのです。

 このような抽象化メカニズムのことをオブジェクト指向では、ポリモルフィズム(多態性または多様性)といいます。

ALT 図5 オブジェクト図を使った考察

 ここで、実世界でポリモルフィズムを説明してみましょう。ポリモルフィズムは、携帯電話やPHSの新機種についてマニュアルを読まずに取りあえず電話をかけることができるということに似ています(図6)。

 人は、携帯電話やPHSの個々の特徴については気にせず、無意識的に電話の規格だけを意識します。そうすることで、初めて見た電話やさまざまな電話の機種に柔軟に対応できるのです。このように人間は抽象化を高度な認知技術としてうまく使いこなしています。オブジェクト指向は、この抽象化技術を汎化-特化というモデリング要素として採用することで、複雑な問題に対して、シンプルに本質的な概念を理解できるようになります。

ALT 図6 人による電話の抽象操作

「汎化アプローチ」と「特化アプローチ」

 図4のように、技術員クラスや営業員クラスの概念的な共通部分を抽象化して新たな社員クラスを作り出す方法を「汎化アプローチ」とここでは呼ぶことにします。このアプローチとは逆に、すでに存在するクラスを再利用して、新たなサブクラスを作り出すというアプローチを「特化アプローチ」と呼びましょう。

 汎化アプローチはオブジェクト指向分析において概念の理解を促進させるために利用されますが、特化アプローチは分析段階ではあまり必要とされません。というか推薦できるものではありません。例えば、図7のようにすでに存在する電話クラスの構造を再利用して、PHSと携帯電話を継承させるというものです。図7では電話は抽象クラスではなく、実際にインスタンスを生成できるクラスの構造を再利用してPHSと携帯電話を理解しようとするものです。このような分析は中途半端といえます。なぜなら、人は、PHS、携帯電話、電話を操作するうえで本質的に重要となる部分を見ているだけにすぎないのです、つまり電話の実装を見ているわけではなく、電話の規格を見ているわけです。よって、電話というクラスをスーパークラスにしてしまうと、電話の作りを再利用しているかのようにとられてしまい、電話の規格を利用するという意味があいまいになるのです。

ALT 図7 汎化アプローチによる電話の抽象操作

 特化アプローチは、オブジェクト指向設計・実装段階で利用されるものです。特化アプローチの例としては、ここで簡単な例を示しましょう。図8は、Window汎用クラスの特性を再利用するために、Windowクラスを継承してMyWindowクラスを定義しています。このような例は、設計・実装段階で多く見られますね。これは特化アプローチを使っています。

 汎化アプローチ、特化アプローチの両方とも最終的に作成されるモデルは、スーパークラスとサブクラスという関係となってしまいます。結局、モデリングの過程において抽象化(汎化)するのか具象化(特化)するのかというアプローチの方向が、汎化アプローチ、特化アプローチの違いになります。

ALT 図8 設計・実装段階に見られる特化アプローチ

 本連載を長々と更新していない日々が続いてしまって申し訳ありませんでした。次回からは予定どおり進めていきます。あくまで予定ですが(笑)。これからも初歩のUMLをどうぞよろしくお願いします。

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ