簡體   English   中英

封裝多步計算的最優雅方法是什么?

[英]What is the most elegant way of encapsulating a multi-step calculation?

作為更具體的示例-我有一個游戲循環,我想有一個處理動畫的方法。

就本示例而言,此動畫是對移動功能的調用。

有沒有一種方法可以調用此函數並使它執行...動畫自動完成時的某些操作?

更基本的實現是讓它在完成時返回一個值,並讓調用者不斷地對此進行檢查,但是我似乎還記得還有一些更巧妙的技巧。

我對協同例程或yield關鍵字一無所知。 它們在這里有用嗎?

答案很大程度上是: 這取決於

如您所說,如果代碼是一個簡單的方法調用(您無法控制),並且該方法調用是在循環中運行(而不是長時間運行),那么您就很容易陷入“檢查返回值”方法。

如果它只是一個函數 ,但可以長時間運行,則可以將其傳遞給回調函數 您的功能簽名變為:

public void foo MyFunc(Action callback)
{
   ...
   callback();
}

您可以使用Action委托來調用它(當然,只要更新函數簽名,任何其他委托都可以)。 操作完成后, foo將調用該回調。 這通常是在線程環境中完成的,因為您可以等待調用在單個線程上返回。

在線程環境中,如果線程終止與您的“完成”條件一致,您也可以等待線程Join

在最佳情況下,此功能被封裝到一個類中,該類管理循環方法調用之間的狀態。 在這種情況下,您只需在操作完成時引發使用類注冊的事件。

最后一個是最冗長的選項,但確實允許循環調用(如在游戲循環中)或線程化,並且可以在完成時調用多個函數。 如果在您的用例中有意義,我會選擇此選項。

如果您希望函數在完成時執行某些操作,請嘗試使用回調: http : //en.wikipedia.org/wiki/Callback_(computer_programming)

它看起來像:

public void Animate(Function foo)
{
    // Animate
    foo();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM