2016-08-08 6 views
0

実行時にコンポーネントを使用する必要があり、それ以外のときに使用する必要がある、ある種の論理プログラミングパターンまたは構造があるかどうか疑問に思っています。明白な単純な解決策はどこでもif-elseステートメントを使うことです。私はif-elseステートメントでコードを浪費することを避けようとしています。一度コンポーネントをオンにすると、しばらくの間それがオンになり、同じコンポーネントがすべてアクティブであるかどうか再確認する価値があるのだろうかと思います。チェックの間に答えが変わっていない可能性が高いときに配置します。実行時に切り替えることができるコンポーネントのプログラミングパターン

おかげ

私はあなたが機能トグルの方に向かっているよう

​​
+0

おそらく[プラグインシステムを作る](http://www.cplusplus.com/articles/48TbqMoL/)で始めることができます。 – Filburt

+0

このリンクはdllに関するもので、この簡単なケースでは過度のことと思われます(より詳細な情報が適切になるかもしれません) – ROX

+0

すべての目的と目的のために、トグル可能なコンポーネントを破損して閉じる可能性のあるファイル不定期にOpenでトグルしてCloseでトグルしますが、ランタイムの途中でファイルが消滅するシナリオもあり、Closeへの明示的な呼び出しがなくても閉じられます。あなたはどのようにして執筆をするのですか?ファイルが開いているかどうかを確認するために各書き込み呼び出しをラップしますか?あなたは黙って書くことに失敗しますか?あなたはエラーを投げますか?この予期せぬ閉鎖は、それに対してチェックされるべき別のタイプの状態であるべきですか? –

答えて

3

が見える避けるためにしようとしているかの簡単な例。これは、実行時にオンまたはオフに切り替える必要がある機能がある場合によく発生します。このアプローチの重要な洞察は、if/elseステートメントの代わりに多態性を使用し、オブジェクト指向のプラクティスを活用することです。

Martin Fowler氏は、ここでのアプローチの詳細を、だけでなく、彼の理論的根拠:http://martinfowler.com/articles/feature-toggles.html

しかし、迅速な答えを、代わりにそれはアクティブだかどうかのオブザーバーを告げるあなたのComponentClass状態を有していると、あなたがしたいですよ基本クラス、AbstractComponentClass、および2つの基本クラスActiveComponentClassおよびInactiveComponentClassです。 m_TogglableComponentは現在、自動メンバであることに注意してください。この新しいセットアップでは、ポインタをポインタにする必要があります。

AbstractComponentClassは、実装する必要がある純粋な仮想メソッドを定義します。 ActiveComponentClassでは、通常の機能を有効にしたかのように配置します。 InactiveComponentClassでは、MainClassに関する限り、コンポーネントを不可視にするためにできるだけ少なくします。 void関数は何もしませんし、関数の戻り値は中立値を返します。

最後の手順では、これら2つのクラスのいずれかのインスタンスを作成しています。これはあなたが依存性注入をもたらす場所です。 MainClassのコンストラクタで、AbstractComponentClass型のポインタを取得します。そこからは、アクティブか非アクティブかは気にしませんが、仮想関数を呼び出すだけです。 MainClassを所有または管理する人は、が有効であるか無効であるかを設定するか、それ以外の場合はシステムがいつ切り替えるかを決定する種類のものをに注入するものです。

実行時に動作を変更する必要がある場合は、別のAbstractComponentClassポインタを取り、そのコンストラクタのポインタを置き換えるセッタメソッドも必要です。

関連する問題