2013-12-20 6 views
7

:こここれは1つのメソッドでクラスを作成するのに適していますか?私はそれがこのように使われているコードを生成することをお勧めしますか思ったんだけど

new TemplateProcessor(inputStream).processTemplate("output-path.xhtml"); 

を、テンプレートエンジンはつのパブリックメソッドが含まれています。上記のコードは静的メソッドで表現することができますが、私はそれを避けたいと思います。理由は簡単です。オブジェクトにはカプセル化された状態が含まれている可能性があります(おそらく、おそらく将来的に)。この場合、あなたは何を好むでしょうか?

+3

オブジェクトは状態を運ぶ場合、:

その分離がさらに顕著にするために、あなたは非インスタンス化ユーティリティクラスである、TemplateProcessorFacadeのように、兄弟クラスに静的メソッドを追加することができますがクラスは行く方法のようです。ユーティリティの静的メソッドは、状態が持ち運ばれていないときのみ良い方法に見えます。 – skiwi

+1

将来の証明コードは良いコード – Bathsheba

+1

@skiwi私はDI/IoCを使い始めて以来、静的メソッドはうまくいかなかったようです。:> – user2864740

答えて

2

それは、静的な輸入品で、非常に使いやすいとなり、静的メソッド内のコードをカプセル化するのが妥当です:

processTemplate(inputStream, "output-path.xhtml"); 

上記の静的メソッドは、単に可能にするファサード、便利なメソッドだろうその具体的なのユースケースに使用されています。あなたのクラスが解決していると思われます。クラスが進化するのを妨げるものではなく、状態を追加することさえありません。より特殊化されたユースケースの場合、コンシューマは引き続きクラスのインスタンスを作成し、通常どおりそのメソッドを使用できます。その後、

public final class TemplateProcessorFacade { 
    private TemplateProcessorFacade() {} 
    public static void processTemplate(...) { 
    ... 
    } 
} 
0

クラスは、プログラムで重要な役割または機能を果たすオブジェクトまたはモジュールと見なす必要があります。他のクラスやモジュールが果たさない役割。たとえば、関数sleep()run()を提供するクラスAnimalを持つことができます。しかし、kill(),hunt()などAnimalから拡張することによってクラスを実装すると、タイプAnimalのすべての変数が何をするのかだけでなく、さらに殺して狩りをすることもできます。

あなたのクラスにはパブリックメソッドが1つしかありませんが、デザインに別のモジュールとしてそれを持たせることが重要な場合は、クラスを持つことが良いです。必要に応じて後で拡張することができます。

また、あなたは、すべてのAnimal年代があること、などあなただけの別のインスタンスを作成することなく、Animal.sleep()と、このような操作を行うことができません、静的および公共sleep()run()の機能を維持することができます。しかし、roar()のような機能は許されません。

更新: 私が言った理由、sleep()run()は静的であることが可能で、また眠ると実行クラスManがあることができます。

尋ねる質問:

それは、そのクラスのオブジェクトを初期化せずにsleep()run()またはクラスの任意の関数を呼び出すために理にかなっていますか?はいの場合は、静的にするのが理にかなっています。

+0

申し訳ありませんが、最後の文は私には少し不明です。なぜ静的メソッドを作成するのですか?すべての 'Animal's' sleep() 'と' run() 'は、すべてAnimal'を継承しています。 – dazu

+0

@ dazu私は更新された答えでそれを説明しました。 –

関連する問題

 関連する問題