私が見ることができることから、本当に2つの問題があります:
- 一部の操作と決定を他の何か(たとえば、UIを介したユーザー)に延期したいアルゴリズム(ロジック)があります。
- アルゴリズムと他の何かとの間の緊密な結合を避けたいと思います。
オブジェクト指向言語を使用する場合、これら2つの特定の問題に対処するいくつかの設計パターンがあります。
- テンプレートメソッドパターンは#1を解決できます。典型的な実装は継承によるものであるため、#2はあまりうまく解決されません。
- オブザーバーパターンも有望に見えます。
つまり、実際には、ニーズに合わせて最も単純で、言語に最も適したものを選択して混合することです。
実際には、たとえばC#について話す場合、次のようにテンプレートメソッドとオブザーバーのハイブリッドを実装できます。
// This will handle extensions to the FileCopy algorithm
abstract class FileCopyExtention
{
public abstract Response WhatToDoWhenFileExists();
}
// the copy function, pure logic
public static void Copy(string source, string destination, FileCopyExtention extension)
{
if (File.Exists(destination))
{
var response = _extension.WhatToDoWhenFileExists();
if (response == overwrite)
// overwrite the file
else
// error
}
}
// This is our user-interactive UI extension
class FileCopyUI : FileCopyExtention
{
public override Response WhatToDoWhenFileExists()
{
// show some UI, return user's response to the caller
}
}
// the program itself
void Main()
{
Copy("/tmp/foo", "/tmp/bar", new FileCopyUI());
}
テーマのバリエーションとして、イベント、デリゲート、または選択した言語が提供するものなら何でも使用できます。
Cでは、これは関数ポインタである可能性があり、C ++では、私が推測するクラスへの参照です。