Rarestyleへようこそ
C#,デザインパターン,UML,オブジェクト指向,Webサービス,iPAQ(モバイル) アクセス数: Number_0Number_0Number_7Number_5Number_1Number_2Number_2Number_4
インデント OCPとデザインパターン
インデント サンプルコードについて
インデント デザインパターン ひとくちメモ
インデント FactoryMethodパターン
インデント AbstractFactoryパターン
インデント Builderパターン
インデント Prototypeパターン
インデント Adapterパターン
インデント Bridgeパターン
インデント Compositeパターン
インデント Decoratorパターン
インデント Facadeパターン
インデント Flyweightパターン
インデント Proxyパターン
インデント TemplateMethodパターン
インデント Chain of Responsibilityパターン
インデント Commandパターン
インデント Iteratorパターン
インデント Mediatorパターン
インデント Mementoパターン
インデント Observerパターン
インデント Stateパターン
インデント Strategyパターン
インデント Visitorパターン
インデント 速習!デザインパターン第一回
インデント 速習!デザインパターン第二回
インデント 速習!デザインパターン第三回
インデント UMLとは
インデント UML入門
インデント オブジェクト指向
インデント クラス図
インデント アクティビティ図
インデント インタラクション図
インデント ユースケース図
インデント Rarestyle証明書サービス
インデント QRコード発行WSDL
インデント QRコード発行サンプル
インデント J2EE覚書
インデント FreeMind実践レポート
インデント モバイル情報
インデント Homeページ
インデント イベント&デジタルファッション
インデント ごあいさつ・免責情報
インデント お問い合わせ
デザインパターンでキャリアアップ

デザインパターンとOCP

"Open-Closed Principle" (OCP)というもの

"Open-Closed Principle"と言葉を聞かれた方も多いと思います。簡単に説明すれば、プログラミング・設計について、「拡張に柔軟に対応すること、変更に対する修正は極力少なくする」ための 指針みたいなものです。Javaのパッケージ、.Microsotf社の.NetFrameworkの使用をしたことがあれば、そのクラス設計が、「拡張と修正に対する柔軟性」を十分考えられて設計されているのを感じます。 これら、パッケージ(フレームワーク)が存在する以前より、これらを研究しパターン化し、オブジェクト指向の利点を引き出すもののひとつに、デザインパターンがあります。
デザインパターンは、拡張や修正柔軟に対応できるような設計ノウハウがあり、これを学習することは、意義のあることだと考えてます。
プログラミングを始めた方、あるいはオブジェクト指向について学習されている方などへ、ご参考になればと思っております。

オブジェクト指向に共通する考え方 ~ 開放・閉鎖原則 ~

再利用できるソフトウェア部品にとって重要な特性は閉じていること(closed):すなわち他の部品からはそのインタフェースが定義されているということによって利用可能であり、利用者はどうやってその部品を起動するか、その部品が何を果たすかを知っていればよい。そして同時に部品は拡張に関して開いていること(open):

OCP の提唱者である Bertrand Meyer 氏によれば,その定義とは次のようなものになっています。

ソフトウェアの構成要素(クラス,モジュール,関数,等々)は,拡張に対して開かれていながらも,
変更(修正)に対しては閉じられていなければならない。

「拡張に対して開かれている」状態とは,アプリケーションの要求に応じてモジュールの振る舞い(メソッド)を拡張することが可能である状態を指します。また,「変更に対して閉じられている」状態とは,ソースコード自体を変更することが不可能(不要)である状態です。

「モジュールのソースコードに変更を加えることなく,付け足しのみによって拡張が可能である状態」を表すもの であると言うことができます。

拡張と修正に柔軟に対応するためのJava計算機サンプル。

  • 計算機能クラスを拡張できる。(開かれている)
  • 計算機能クラスを追加することに対してソースコードを変更する必要がない。(閉じている)
    (※このサンプルでは 計算機クラスの追加(addOperation)、実行(execute)メソッドに対して)

実際のプログラミングは次のようになります。

  • 計算機能はクラスとして、計算機能(足し算、引き算)いう操作に注目しながら、抽象化します。
  • 実際の機能は、具象命令クラスで実装します。
  • 計算機は、各命令を実行するクラスを保持できるようにします。
  • 計算機能を実現するために、Javaにおける動的メソッドディスパッチメカニズムでもって、 ポリモーフィズム(多様性)という形で解決します。
    • 具象命令クラスのメソッドを個々に記述追加する事はありません。

クラスを拡張することができるのはもちろんのこと、なおかつメソッド実行するにあたり、ソースコードに修正する必要が起こらないことを確認します。

Javaによるサンプルコード

計算実装の抽象化

1: 
    package calculator;
 2: 3: 
    /**
 4: 
    * 計算機に実装する機能の抽象定義
 5: 
    */
 6: 
    public abstract class AbstractCalc {
 7: 8:     
    private int intX;
 9:     
    private int intY;
 10:     
    //属性値アクセサX
 11:     
    public void setParamX(int x){
 12:         
    this.intX =x;
 13:     }
14:     
    public int getParamX(){
 15:         
    return this.intX;
 16:     }
17:     
    //属性値アクセサY
 18:     
    public void setParamY(int y){
 19:         
    this.intY =y;
 20:     }
21:     
    public int getParamY(){
 22:         
    return this.intY;
 23:     }
24:     
    //機能を実行するメソッドの定義
 25:     
    public abstract int CalcExecute();
 26: }

計算機能の具象化

1: 
    package calculator;
 2: 3: 
    /**
 4: 
    * たし算の機能
 5: 
    */
 6: 
    public class CalcPuls extends AbstractCalc {
 7: 8:     
    public int CalcExecute(){
 9:         
    return (this.getParamX()+this.getParamY());
 10:     }
11: }
1: 
    package calculator;
 2: 3: 
    /**
 4: 
    * 引き算の機能
 5: 
    */
 6: 
    public class CalcMinus extends AbstractCalc {
 7: 8:     
    public int CalcExecute(){
 9:         
    return (this.getParamX()-this.getParamY());
 10:     }
11: }
1: 
    package calculator;
 2: 3: 
    import java.util.ArrayList;
 4: 
    /**
 5: 
    * 計算機クラス
 6: 
    */
 7: 
    public class Calclator {
 8: 9:     
    private ArrayList operations =new ArrayList();
 10: 11:     
    public int getCountIndex(){
 12:         
    return operations.size();
 13:     }
14:     
    //機能の保持
 15:     
    public void addOperation(AbstractCalc calc){
 16:         operations.add(calc);
17:     }
18: 19:     
    //メソッドの実行
 20:     
    public int execute(int index){
 21: 22:         return ((AbstractCalc)operations.get(index)).CalcExecute();
 23:     }
24: }

クライアントからの利用

1: 
    package calculator;
 2: 3: 
    /**
 4: 
    * 簡単 計算機の処理実行
 5: 
    */
 6: 
    public class ClientClass {
 7: 8:     
    public static void main(String[] args) {
 9: 10:         
    //***計算機能のインスタンス生成***/
 11:         CalcPuls puls =new CalcPuls();
 12:         
    //値をセット
 13:         puls.setParamX(5);
14:         puls.setParamY(6);
15:         CalcMinus minus =new CalcMinus();
 16:         minus.setParamX(8);
17:         minus.setParamY(4);
18: 19:         
    //計算機に機能を追加します。
 20:         Calclator calcuator =new Calclator();
 21:         calcuator.addOperation(puls);
22:         calcuator.addOperation(minus);
23: 24:         
    //保持した機能すべてを実行
 25:         
    for(int i=0;i<calcuator.getCountIndex();i++){
 26:             System.out.println(calcuator.execute(i));
27:         }
28:     }
29: }



コミュニティマーカーデザインパターン「ひとくちメモ」へ

コミュニティマーカーHomeへもどる

お天気情報
東京都 東京 - 今日の天気
晴時々曇 - リンク先
最高 最低
気温 36 28
湿度 96.8 82.4
取得日:2010/09/03 17:00:00  ST: True
東京都 東京 - 明日の天気
晴時々曇 - リンク先
最高 最低
気温 - -
湿度 - -
取得日:2010/09/03 17:00:00  ST: True
東京都 東京 - あさっての天気
曇時々晴 - リンク先
最高 最低
気温 34 27
湿度 93.2 80.6
取得日:2010/09/03 17:00:00  ST: True
大阪府 大阪 - 今日の天気
晴時々曇 - リンク先
最高 最低
気温 36 28
湿度 96.8 82.4
取得日:2010/09/03 17:00:00  ST: True
大阪府 大阪 - 明日の天気
晴時々曇 - リンク先
最高 最低
気温 36 28
湿度 96.8 82.4
取得日:2010/09/03 17:00:00  ST: True
大阪府 大阪 - あさっての天気
晴時々曇 - リンク先
最高 最低
気温 36 28
湿度 96.8 82.4
取得日:2010/09/03 17:00:00  ST: True
livedoorのWebサービスより提供
【工事中】お天気配信 ユーザー登録
Copyright 2006 Rarestyle このページへのリンクは確認不要です。
Programming by Xenon Project Team     postmaster@rarestyle.net
免責事項について
レアスタイルサイト内検索