2017-06-22 38 views
0

私はデザイン・パターズを勉強していますが、私はより良い練習になるかどうかわかりません。ファクトリパターンまたは拡張メソッド?

私はクラス、名前、2種類のURL、関連のリストオブジェクト。基本的には、そのクラスのインスタンスからHTMLを生成するメソッド 'toHtml()'があります。

正確に同じフィールドを持つ 'カテゴリ'には4つの異なるタイプがありますが、 'toHtml()'メソッドはそれぞれ異なる結果を与える必要があります。

異なるHTMLを生成するためにパラメータ "タイプ"と一連のifs/switch文を渡す必要があるかどうかわからない場合や、カテゴリクラス抽象クラスを作成してtoHtml()メソッドをオーバーライドするいくつかのサブクラスを作成し、 CategoryFactoryクラスを使用してそれらを生成しますか?どちらの場合も、私は '型'パラメータを渡す必要があります。

私は「修正のために閉じる、拡張のために開く」OOPルールについて考えようとしました。しかし、この場合、もし私が5番目のカテゴリ型を追加したいのであれば、それは別のhtmlを生成する - 最初の解決策として、私はtoHtmlメソッド(ifをもう1つ追加する)を修正する必要がある。 CategoryFactoryクラスを変更します。

もっと良い方法はありますか?同じような種類のジレンマがある場合、私が従うべき余分な規則はありますか?

+0

カテゴリクラスを抽象クラスにし、各タイプごとに拡張し、各タイプに独自のtoHTML()を持たせます。あなたの抽象クラスでデフォルトのtoHTML()を作成することを控えて、クラスが独自に実装するようにすることをお勧めします。 –

+0

あなたのアドバイスは本当にありがとう@RAZ_Muh_Taz! – x1r15

答えて

0

最初に、ファクトリメソッドを指していると思いますが、ファクトリパターンは抽象ファクトリパターンではありません。

主な違いは、前者では単一の製品の共通テンプレートを定義し、後者では製品ファミリのテンプレートを定義する点です。詳細については、hereをご覧ください。

あなたの場合、Categoryのテンプレートを定義したいとします。この仮定すると、ここにクラスのあなたのグループは次のようになります。で

class Category { 
    public void toHtml(Integer param) { 
     if(param == 1) { // do something for Category1 
     } 
     else { // do something for Category2 
     } 
    } 

abstract class Category { 
    public void doSomething() { 
     Foo f = makeFoo(); 
     f.whatever(); 
    } 

    abstract void toHtml(); 
} 

class Category1 extends Category { 
    public override void toHtml() { 
     ... // do something here 
    } 
} 

class Category2 extends Category { 
    public override void toHtml() { 
     ... // do something else here 
    } 
} 

確かにこのコードの多くは、とは簡単にこのように表すことができることは事実でありますそれは本当にデザインの決定です。あなたが考えることができるいくつかの要因があります。これは絶えず変化するクラスになるのでしょうか?これは顧客が使用するためにグローバルに宣言される予定ですか?顧客はこれをどのように使用できるようにしたいですか?

この時点でより簡単なことは、最も抵抗の少ない経路を取ることです。 1つのクラスですべてのカテゴリにサービスを提供することは、結果的にコードが少なくてすみ、Salesforceでは常により少ないコードが良いことになります。しかし、これを考慮してください:あなたの機能を別々のクラスに抽象化することにより、よりメンテナンス可能なコードになりますifステートメントのクラスと壁を書く方が簡単かもしれませんが、明日はあなたがいないときに重大な失敗があり、コードを調べて問題の原因となったものを正確に把握しなければなりません。あなたのためにそれを呪う。

継承はすべてまたは何ものメカニズムではないことに注意してください。いくつかの共通の機能を持っている場合には、特に便利です。この場合、親クラスに抽象化して、子どもに詳細を処理させることができます。

+0

徹底的な回答ありがとうございました。あなたはとても助けになりました。 :) – x1r15

+0

@ x1r15:sfの背景から来て、前の同じ状況にあったので、あなたが何をしているのか分かっています。一日の終わりに、私は弾を噛んで、それらの余分な授業を書くことに決めました。それ以来私を傷つけていません。 :)乾杯。 –

0

カテゴリのサブクラスを作成してtoHtml()メソッドをオーバーライドすると、なぜファクトリパターンが必要になるのですか?実行時に解決されたクラスのtoHtml()メソッドは、参照を使用して呼び出す場合に呼び出されます。つまり、新しいCategoryサブクラスを追加すると、toHtml()メソッドがオーバーライドされ、正常に動作するはずです。

+0

異なるサブクラスはさまざまな場所でインスタンス化されます。そのため、私はオブジェクトを作成する必要があるすべての場所で「同じ決定」をすることを意味するので、それらを直接作成することは避けています。 – x1r15