2016-04-27 47 views
0

我必須實現一種完全符合程序設計方法的算法。它與某些數據結構沒有關係,只需要幾個對象,一堆控制參數並對它們執行復雜的操作,包括創建和修改中間時態數據,子例程調用以及許多CPU密集型數據轉換。該算法過於具體,不能包含在任何參數對象中作爲方法。如何在OOP語言中包裝過程算法

什麼是用OOP語言包裝這種算法的慣用方法?使用執行計算的靜態方法定義靜態對象?定義將所有算法參數作爲構造函數參數並使用result方法返回結果的類?任何其他方式?

如果您需要更多細節,我正在寫scala。但是任何一般的面向對象方法也是適用的。

+0

特別是在scala中,使用實現過程算法的函數定義來創建一個'object'是微不足道的。是的,它基本上是靜態的,在需要算法或輔助類的類上。 – Bergi

+0

靜態對象也很容易在其他語言中聲明。但我很好奇的是,組織算法的方式適合於OOP語言。我很好奇,如果有這種情況下的常見設計模式,我不知道 – ayvango

+0

當然,爲什麼你認爲它不適合? – Bergi

回答

3

靜態方法(或Scala情況下的單例對象上的方法 - 我只是要調用靜態方法,因爲這是最常用的術語)可以很好地工作,並且可能是最常用的方法對此。

有一些原因使用其他方法,但它們並非嚴格必要,我會避免它們,除非你真的需要他們給的優勢。這是因爲靜態方法是最簡單的(如果最不靈活的)方法。

使用非靜態方法可能很有用,因爲您可以使用設計模式,如工廠模式。例如,您可能有Operator類和方法evaluate。現在您可以讓不同的工廠創建不同的Operator s,以便您可以即時更換您的算法。也許一個計算器可能有AddOperatorFactory,MultiplyOperatorFactory等等。顯然這需要你能夠實例化一個代表算法的對象。當然,你可以直接傳遞一個函數,就像Scala和許多其他語言允許的那樣。儘管如此,類允許繼承,這爲某些設計模式打開了大門,而且,您正在問關於OOP的問題,而不是專門針對Scala。

同樣有用的是具有對象狀態的能力。使用靜態方法,您唯一的保留狀態選項是具有全局狀態(ew)或使靜態方法的用戶跟蹤此狀態(爲用戶提供更多工作)。通過一個對象的實例,您可以將該狀態保留在實例中。例如,如果您的算法是圖搜索,也許您希望在找到第一個匹配項後重新開始搜索(顯然需要存儲狀態)。

要做new MyAlgorithm().doStuff()而不是MyAlgorithm.doStuff()並不困難,所以如果有疑問,如果您認爲您需要實例提供的功能,那麼我會避免使用靜態方法。

+0

我在想奇怪的事情。像收集某些POD類中的參數一樣。並應用這個論點。其他代碼看起來更像OOP – ayvango