輪講 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
© Copyright 2024 ExpyDoc