2009-06-18 8 views
1

私はABAP/BSPでコード化されたWeb Appを持っています。私は細かいコードを提供することに興味があるので、多分あなたは良いか悪いかを認識するのを助けることができます。実際に私は次のとおりです。基本クラスオブジェクトを宣言し、サブクラスを持ついくつかのパラメータに基づいて動的にインスタンス化します。基本クラスには、データを取得するためのいくつかのメソッドがあります()。サブクラスはこのデータを使用し、それを操作します。デザインに(反)パターンがありますか?どのようにパターンを認識するのですか?

ここではいくつかの高速基本的な画像(申し訳ありませんいけないのは、任意の標準や言語に準拠すると思いますが、あなたのアイデアを与える必要があります)

alt text http://img35.imageshack.us/img35/4351/designkdp.jpg

は、このOKのように気にいらないですか?既知のパターンが隠されているか、またはリファクタリングしてパターンを使用する必要がありますか?私はここにいくつかの提案が好きです。私はすでにウィキペディアの記事を読んだことがありますが、正確にパターンに合ったものは見当たりません。ガンマにより、ヘルム:

答えて

3

それはfactory method

+0

もう一度記事を読んでいただきありがとうございます。私はあなたが正しいと思います。 私の意見はこの部分(http://en.wikipedia。ORG /ウィキ/ Factory_method_pattern): パブリッククラスImageReaderFactory { パブリック静的するImageReader getImageReader(入力ストリームである) INTのimageType = figureOutImageType({です)。 スイッチ(のimageType){ 場合ImageReaderFactory.GIF: 新しいGifReader(である)を返します。 場合ImageReaderFactory.JPEG: 新しいJpegReader(ある)を返します。 //など }} } – Richard

1

これは、書籍「オブジェクト指向における再利用のためのデザインパターン」からFactoryパターンであると思われる(また、いくつかの本を注文したが、あなたたちは:)速い確信しています) 、JohnsonおよびVlissides。

+0

私は本をチェックアウトしますあなたの答えをいただき、ありがとうございます。 – Richard

1

BaseClassのとサブクラスは、使用するインスタンス化戦略がFactoryのように動作するように見える

interface IDataProvider{ 
    GetData(); 
} 

class SubClass1 implements IDataProvider{ 
    GetData(){ 
    ... 
    } 
} 

(擬似コード)として何かを持っているように私に思えます。 あなたができることは、HTMLRenderingEngineなどでレンダリングをレイアウトすることです(プレゼンテーションを残りのロジックから切り離すため)。

+0

あなたのご感謝ありがとうございます。残念ながら、いくつかの要件のためにMVCアプローチを使用することはできません。しかし、私はいくつかのhtmlレンダリングメソッドを実装して、データの取得とhtmlの構築を分離しています。 – Richard

+0

MVCのほうがいいでしょうが、別のクラスのHTMLRendererを作成して(必要に応じて呼び出すこともできます)。これはメソッドGetRenderedHTML()を提供するIHTMLRendererというインターフェースから継承します。このように、基本クラスにはインターフェイスへの依存関係だけが含まれており、レンダラーを変更したり、別のレンダラーを追加することさえできます。あなたは私の考えを理解している?これにより、同じクラス内に別個のメソッドを持つよりも保守性が向上します。 – Juri

0

継承は楽しいですが、最後の手段として使用する必要があります。私はあなたのやり方ではできないと言っているわけではありません。あなたの解決策は完全に有効ですが、代替案を提案するだけです...

processDataを設定できる "DataClass"オブジェクト(ないしは)。 processDataオブジェクトは、実際には単一のメソッド "processData"を持つインタフェースになります。その後、あなたは何もしない定義された「パススルー」PROCESSDATAオブジェクトを持っており、デフォルトの「processDataObject」としていることを使用する場合、ヘック

if(processDataObject == null) 
    return getInformation(); 
else 
    return processDataObject.processData(getInformation()); 

、:

あなたがたgetDataを呼び出すと、それはこのようになります全体getDataメソッドは次のようになります。

return processDataObject.processData(getInformation()); 

これは、あなたが望む処理のいずれかのタイプを行うには、クラスを動的に作成を可能にする - それは、あなたがこのデザインの上に構築物事を単純化します。

このスタイルのデザインでは、私はしばらく時間がかかりました。最初は継承を避けるというアイデアが気に入らないかもしれません。私の使用は非常に浅いツリーになっています。

+0

あなたは、私はインターフェイスを実装し、カスタムコーディングを持っている複数のprocessDataクラスを持っていることを意味します。そして、Process Data Objektを実装するDataClassがあります。これは、現在とほぼ同じように動的に捉えることができますか? – Richard

関連する問題