私はたくさんのメソッドを持つクラスを持っていて、設定ファイルのフラグがオフになっていれば、それらのメソッドを本質的にノーオペレーションにしたいとします。 。どのようなデザインパターンが続くのだろうか?条件付きで実行する方法(例:Can I conditionally control method calls at runtime with attributes?)のようなハッキリものは考えました。クラスのインスタンスを「無効にする」正しいデザインパターンは何ですか?
答えて
その間にインターフェイスがあると仮定すると、その場合は実装をダミーに置き換えることができます。 Like
interface IFoo
void DoBla()
class DummyFoo : IFoo
void DoBla() {}
class RealFoo : IFoo
void DoBla() {
[some actual code]
}
簡単にしましょう。パターンはありません。 flagがoffの場合にメソッドが何かを実行しないようにするには、メソッド自体を呼び出すべきではありません。
IF Config.Flag = OFF
DoNothing();
ELSE
CallMethod();
対。
CallMethod() {
IF Config.Flag = OFF
DoNothing();
ELSE
DoSomething();
}
私が1番目に投票する理由は、コードの読者が何が起こっているのか、設定フラグの意義を知っているからです。後のケースでは、フラグについて知らない場合、何かが起こると予想し、何も起こらなければ混乱します。
2番目に投票します。これらのメソッドへの呼び出しが多数ある場合はコードの膨らみが少なくなり、予期しない場合にはメソッドの呼び出しが実際に必要に応じて確実に実行されます。 – ohmusama
あなたもポイントがあります。この場合は – niksofteng
のコメントが重要です。クラスは、混乱を避けるために十分に文書化されなければならない。 – ohmusama
このような機能を実装するのに比較的簡単な方法は、null条件付き演算子を使用してデリゲート呼び出しを使用することです。
は、与えられたメソッドのためにあなたのデリゲートを定義します。
private Action ConditionalSomeMethod;
private Action<string> ConditionalSomeMethod2;
private void SomeMethod() { }
private void SomeMethod2(String arg) {Console.WriteLine(arg);}
は、その後、あなたの条件に基づいてデリゲートを割り当てます。
private void SetupConditionalMethods()
{
bool runConditionals = true;
if (runConditionals)
{
ConditionalSomeMethod = SomeMethod;
ConditionalSomeMethod2 = SomeMethod2;
}
else
{
ConditionalSomeMethod = null;
ConditionalSomeMethod2 = null;
}
}
null条件付き演算子を使用したサンプル使用例。
private void DemoIt()
{
ConditionalSomeMethod?.Invoke();
ConditionalSomeMethod2?.Invoke("hello");
}
デリゲートがnullの場合、このメソッドは呼び出されません。
- 1. ポインタの正しい無効な値は何でしょうか?
- 2. 無効にした後、ASP.NET LinkButtonを再度有効にする正しい方法は何ですか?
- 3. ImageShaderをインスタンス化する正しい方法は何ですか?
- 4. Redisインスタンスは正確に何ですか?
- 5. Pythonでは、変数からクラスをインスタンス化する正しい方法は何ですか?
- 6. 戦略デザインパターンの正確な定義は何ですか?
- 7. デザインパターン:デザインパターンの「スコープ」(クラス/オブジェクト)の意味は何ですか?クラス/オブジェクト分類の理由
- 8. Page_Loadの外でアクティブなクラスをインスタンス化するのは正しいですか?
- 9. スコープ外のクラスメソッドのインスタンスにアクセスする正しい方法は何ですか?
- 10. このデザインでは、どのデザインパターンが正しいですか?
- 11. これはデコレータのデザインパターンの良いインスタンスですか?
- 12. オブジェクトリテラルプロパティではなく、クラス/インスタンスを参照する正しい方法ですか?
- 13. OODのデザインパターンは何ですか?
- 14. オープンカートのmvclデザインパターンとは何ですか?
- 15. ステートフルEJBを破棄する際にインスタンス変数を無効にする理由は何ですか?
- 16. gVimでフォントを無効にする理由は何ですか?
- 17. blockWhenExhaustedを無効にするとCommonsPool2TargetSourceは何をしますか?
- 18. アプリをスキンするのに最適なデザインパターンは何ですか?
- 19. Macで新しいクラスでJava System Libraryを無効にする
- 20. オブジェクトをアロケータでインスタンス化する正しい方法は何ですか?
- 21. セッション無効化とは何ですか?
- 22. javaのクラスの正しい構造は何ですか?
- 23. 親クラスから正しいサブクラスをインスタンス化する
- 24. GoogleApiClientデザインパターンとは何ですか?
- 25. 内部クラスのオブジェクトを継承するクラスに「可視」にする正しい方法は何ですか
- 26. 私のユースケースに使用するデザインパターンは何ですか?
- 27. APIのクライアントに使用するデザインパターンは何ですか?
- 28. 複数のクラスでapplication.propertiesをロードする正しい方法は何ですか?
- 29. Webメソッドの戻り値に適したデザインパターンは何ですか?
「正しい」を定義します。複数の方法がありそうですが、あなたのための正しい方法は、あなたの特定の状況やあなたにとって重要なものによって異なります。 – hatchet
これはあなたのアプリケーションにとって興味深いかもしれません:[Null Object pattern](https://en.wikipedia.org/wiki/Null_Object_pattern) –