2

デザインのアドバイスを頂きたいです。温度を制御するオーブンがあり、温度に依存する測定を行っています。私は基本的に温度を設定し、いくつかのものを測定し、次に進みます.

もちろん簡略化した 2 つのデザインを思いついたので、以下に示します。最初のものは、コールバック ベースのアプローチを使用します。

class Oven(object):
    # ... some methods
    def step_temperature(start, stop, num, rate, callback):
        temperatures = np.linspace(start, stop, num)
        for t in temperatures:
            self.temperature = t, rate # sweep to temperature with given rate
            self._wait_for_stability() # wait until temperature is reached.
            callback(t)                # execute the measurement
# Use Case
oven = Oven()
oven.step_temperature(start=20, stop=200, num=10, rate=1, callback=measure_stuff)

2 番目の設計は、発電機ベースの設計です。

class Oven(object):
    # ... some methods

    def step_temperature(start, stop, num, rate):
        temperatures = np.linspace(start, stop, num)
        for t in temperatures:
            self.temperature = t, rate
            self._wait_for_stability()
            yield t
# Use Case
oven = Oven()
for t in oven.step_temperature(start=20, stop=200, num=10, rate=1):
    measure_stuff(t)

私は 2 番目のデザインの傾向がありますが、あなたの提案に興味があります。もっと良い方法があれば、遠慮なく教えてください。

4

2 に答える 2

1

@P3トラス。私は最近、StackExchange の CodeReview で非常によく似た Python の「yield vs callback」の質問に答えました。読みたい場合は、ここにリンクがありますが、要約します。

「フィードバックを報告する」要件を解決するために使用される 3 つの一般的なパターンがあります。

  1. yield
  2. コールバック関数
  3. インラインのハードコーディングされたフィードバック

と コールバックの両方yieldを使用すると、モデルまたは計算コードから UI/IO のプレゼンテーションの詳細を分離できます。これはいい。どちらもうまく機能します。

Pythonの. yield_ これについてのリファレンスがあります -- 微妙ですが、読む価値があります。基本的に、Python では、関数が生成されると、変数に有効に割り当てることができるジェネレーターを返し、その時点までの反復をキャプチャしますが、それを実行する場合としない場合があります。怖がらせないでください。いいね。yieldyieldyield

コールバックには、処理を一時停止または停止したり、モデルにメッセージを送信したりするために使用できる (モデルまたは計算コード内の) 呼び出し元への通信が可能になるという優れた利点があります。これは職務の適切な分離でありyield. またはそうでないかもしれません。方法が常にある。:)

たとえば、報告された温度を更新している間、コールバックはボタンやキーを監視し、呼び出し元に値を返すこともできます。これは、たとえば、ユーザーが処理を中止したいと考えていることを示し、特定の UI を認識してモデルを汚染することはありません。またはIO。

したがって、次の代わりに:

callback(t)

callback温度レポートの仕事を任せることができますが、次のようなユーザーから収集した可能性のあるものを聞くこともできます。

if callback(t) == ABORT_BUTTON_PRESSED:
    self.shutdown  # or whatever

お役に立てれば。

于 2013-11-07T19:56:57.697 に答える