|
Rarestyleへようこそ
|
|
|
|
|
|
デザインパターンでキャリアアップ
|
デザインパターンと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へもどる
|
|
| お天気情報 |
|
東京都 東京 - 今日の天気
|
晴れ
-
|
|
|
最高
|
最低
|
| 気温
|
14 |
4 |
| 湿度
|
57.2 |
39.2 |
|
|
|
|
取得日:2010/03/11 17:00:00
ST:
True |
|
|
東京都 東京 - 明日の天気
|
曇時々晴
-
|
|
|
|
|
取得日:2010/03/11 17:00:00
ST:
True |
|
|
東京都 東京 - あさっての天気
|
曇時々晴
-
|
|
|
最高
|
最低
|
| 気温
|
18 |
8 |
| 湿度
|
64.4 |
46.4 |
|
|
|
|
取得日:2010/03/11 17:00:00
ST:
True |
|
|
大阪府 大阪 - 今日の天気
|
晴れ
-
|
|
|
|
|
取得日:2010/03/11 17:00:00
ST:
True |
|
|
大阪府 大阪 - 明日の天気
|
曇り
-
|
|
|
|
|
取得日:2010/03/11 17:00:00
ST:
True |
|
|
大阪府 大阪 - あさっての天気
|
晴時々曇
-
|
|
|
最高
|
最低
|
| 気温
|
17 |
6 |
| 湿度
|
62.6 |
42.8 |
|
|
|
|
取得日:2010/03/11 17:00:00
ST:
True |
|
| livedoorのWebサービスより提供 |
|
【工事中】お天気配信 ユーザー登録 |
|
|
|
|
|
Internet Explorer5.0以上のご利用を推奨いたします。
|
 |
Copyright 2006 Rarestyle
このページへのリンクは確認不要です。
Programming by Xenon Project Team
postmaster@rarestyle.net
免責事項について
|