0

ルーチンを呼び出すときにルーチンの前提条件をチェックする方法を知りたいので、ルーチンを実行したり、実行できないことを通知したりできます。言語はC#です。

Controller オブジェクト、DataContainer オブジェクト、およびいくつかの Task オブジェクトを使用してPipeline デザイン パターンを実装しています。コントローラがタスクの実行を要求するとき、各タスクはその適用可能性をチェックする必要があります。具体的には、DataContainer オブジェクトで使用可能なデータを確認する必要があります。

Pythonでそれを行ういくつかの方法を想像できました:

# 
if Task.can_run():
    Task.run()
else:
    Task.notify_controller()

# 
if Controller.check_runnability(Task):
    Task.run()
else:
    Controller.do_something_else()

# Task.can_run() throws exception instead of returning boolean:
try:
    Task.can_run();
except:
    Controller.do_something_else()  # or maybe Task.notify_controller()
else:
    Task.run()

# not sure about syntax for the following assertion, but you get the idea
assert (Task.can_run(), Task.notify_controller())
Task.run()

私が知りたい (そして Google で見つけられなかった) のは、前提条件が満たされた場合にのみルーチンを開始するための「標準的」/最も一般的/「正しい」C# イディオムです。

4

1 に答える 1

1

最初の例は、最も一般的なパターンです。私にとって 2 番目は、セマンティックな命名規則が少ない最初のバリエーションです。

私が避ける3番目の例。通常のフロー制御を指示するために例外を使用しないでください。http://msdn.microsoft.com/en-us/library/vstudio/ms229030(v=vs.100).aspx

編集:私はそれを取り戻します。2 番目の例は似ていますが、代わりにコントローラーにタスクを実行できるかどうかを判断するように求めます。「実行可能性」がタスク オブジェクトのコンテンツのみに基づいており、コントローラーの状態に基づいていない場合、コントローラーにチェックを入れて複雑にする必要はないと思います。ロジックが十分に類似している場合は、基本タスク クラスを使用して物事を DRY に保ちます。

編集:私はあなたの正確なユースケースについて明確ではありませんが、これは完全にオフベースである可能性がありますが、コントローラーはタスクを実行する準備ができているかどうかを尋ね、そうでない場合はタスクを実行するようです他のことをします。

if (task.CanRun)
{
    controller.Run(task);
}

else
{
    //Do whatver.
}

さらに、タスクを実行できない場合に何をすべきかに関するロジックがコントローラー内にカプセル化されている場合、おそらく実行メソッドはブール値を返して、呼び出し元が必要に応じて追加の操作を実行できるようにする必要があります。そのシナリオでは、呼び出し元はタスクをコントローラーの run メソッドに渡すだけで、その中でコントローラーはタスクが実行できるかどうかを確認し、それに応じて動作します。

于 2013-02-22T16:56:01.800 に答える