chapter8

輪講 8章
フレームワークと再利用性:
インターフェイスと抽象クラスを使った設計
2003年7月11日
有近 雄史
1
目次
8.1 コードの再利用
8.2 フレームワーク
8.3 契約


抽象クラス
インターフェイス
8.4 eビジネスの例
8.5 まとめ
2
8.1 コードの再利用



コードの再利用ができれば、ソフトウェアの開発
が容易になる
コードの再利用性は設計と実装の良否による
オブジェクト指向では、再利用可能なコードを開
発に便利なメカニズムをいくつか提供している



フレームワーク
インターフェイス
抽象クラス
3
8.2 フレームワーク
フレームワークとは

特定のアーキテクチャに基づき実装された、半完成のシステム
新たなシステムを作るのに1から開発するのは大変
フレームワークに特定のソフトウェア部品をはめ込むことで
目的のソフトウェアを開発すると効率的
4
フレームワークのイメージ
フレームワーク
部品1
空
部品2
フレームワーク
フレームワーク
部品1
部品2
システム1
システム2
5
フレームワークの例
ウィンドウのフレームワーク
最小化ボタン、最大化ボタン、閉じるボタン
メニューバー

ワード
ペイント
6
8.3 契約
フレームワークを利用するためには、フレームワークが
提供する規則に従う必要がある
契約

フレームワークの規則への準拠を開発者に要求する
メカニズム
Javaにおける契約方法


抽象クラス
インターフェース
7
抽象クラス (1)




実装のないメソッドを1つ以上備えている
実装のあるメソッドを持つことができる
クラスは1つの抽象クラスしか継承できない
is-a関係に用いる
例 Mammalクラス
public abstract class Mammal{
public void generateHeat() {System.out.println(“Generate heat”);};
public abstract void makeNoise();
}
Mammal
+makeNoise:void
+generateHeat:void
8
抽象クラス (2)
例 Dog クラス
public class Dog extends Mammal {
public abstract void makeNoise(){System.out.println(“Bark”);};
}
Mammal
+makeNoise:void
+generateHeat:void


Dog
Cat
+makeNoise:void
+makeNoise:void
Dog,CatクラスともmakeNoiseメソッドの実装を持つ
Dog,CatクラスともgenerateHeatメソッドを引き継ぐ
9
インターフェース (1)




メソッドの名前を規定するためのもの
実装をもたない
クラスは複数のインタフェースを実現できる
関係のないクラスがもつ共通の振る舞いを規定する
例 名前の操作を規定するインタフェース
public interface Nameable{
String getName();
void setName(String aName);
}
<<interface>>
Nameable
+getName:String
+setName:void
10
インターフェース (2)
例 Dog クラス
public class Dog implements Nameable{
public void setName (String aName) {name = aName};
public String getName () {return (name);};
}
<<interface>>
Nameable
+getName:String
+setName:void
Dog
+getName:String
+setName:void

インタフェースの
実現は白抜き三角に
点線で記述
Car
+getName:String
+setName:void
犬、車がgetName, setNameメソッドを持つことを定める
11
抽象クラスとインタフェース

抽象クラス




実装のあるメソッドを持つことができる
クラスは1つの抽象クラスしか継承できない
is-a関係に用いる
インターフェース



実装のあるメソッドを持つことができない
クラスは複数のインタフェースを実現できる
関係のないクラスがもつ共通の振る舞いを規定する
Javaではこれらを使ってクラスを標準化できる
12
8.4 eビジネスの例
抽象クラス、インターフェースを使って有効なフレーム
ワークを作成する方法を示す
題材 ピザ屋とドーナツ屋のWebシステム


利用者はインターネットで商品の注文ができる
顧客を記録しておき、新商品の宣伝などを行う
13
フレームワークを用いないアプローチ (1)
testDountShop
+main:void
donutShop
menuItem:String[]
+getInventory:String[]
+buyInventory:void


testPizzaShop
+main:void
pizzaShop
foodOfferings:String[]
+getInventory:String[]
+buyInventory:void
独立したアプリケーションを作成する
それぞれに開発しなければならないので非効率的
14
フレームワークを用いたアプローチ (1)



pizzaShopやdonutShopの共通部分を抽出し、
抽象クラスShopを作成
名前の操作を統一するため、インターフェースNameable
を作成
客のリストを保持する必要がるので、クラスCustListを
作成
15
フレームワークを用いたアプローチ (2)
Shop
+CalculateSaleTax : void
+getInventory : String[]
+buyInventory : void
DonutShop
PizzaShop
menuItem : String[]
foodOfferings : String[]
+getInventory : String[]
+buyInventory : void
+getInventory : String[]
+buyInventory : void
pizzaShopやdonutShopの共通部分を抽出し、
抽象クラスShopを作成
16
フレームワークを用いたアプローチ (3)
Shop
<<interface>>
Nameable
+CalculateSaleTax : void
+getInventory : String[]
+buyInventory : void
+getName : String
+setName : void
DonutShop
companyName : String
menuItem : String[]
+getInventory : String[]
+buyInventory : void
+getName : String
+setName : void
PizzaShop
companyName : String
foodOfferings : String[]
+getInventory : String[]
+buyInventory : void
+getName : String
+setName : void
名前の操作を統一するため、
インターフェースNameableを作成
17
フレームワークを用いたアプローチ (4)
Nameable
CustList
Shop
<<interface>>
+name:String
+CalculateSaleTax : void
+getInventory : String[]
+buyInventory : void
+getName : String
+setName : void
DonutShop
companyName : String
menuItem : String[]
+getInventory : String[]
+buyInventory : void
+getName : String
+setName : void
+findCust:String
+addCust:void
PizzaShop
companyName : String
foodOfferings : String[]
+getInventory : String[]
+buyInventory : void
+getName : String
+setName : void
客のリストを保持する必要がるので、
クラスCustListを作成
18
フレームワークを用いたアプローチ (5)
Nameable
+getName : String
+setName : void
CustList
Shop
<<interface>>
+CalculateSaleTax : void
+getInventory : String[]
+buyInventory : void
DonutShop
companyName : String
menuItem : String[]
+getInventory : String[]
+buyInventory : void
+getName : String
+setName : void
+name:String
+findCust:String
+addCust:void
PizzaShop
companyName : String
foodOfferings : String[]
+getInventory : String[]
+buyInventory : void
+getName : String
+setName : void
•アプリケーションはShopクラスにのみ関連する
•新たな店を追加してもアプリケーションのコードを変更する必要はない
19
まとめ

コードの再利用化を行う方法


Javaにおけるフレームワークの実現方法



フレームワーク
抽象クラス
インタフェース
抽象クラス、インタフェースの適用例

ピザ屋とドーナツ屋のWebシステム
20