2010-11-01 24 views
1

我有一些存儲在測試集合對象中的一系列測試運行的測量對象實例。我也有一些邏輯可以比較兩個測試結果對象實例,並告訴我它們是否「足夠接近」。面向對象設計:在哪裏把對象特定的「比較」方法?

這個邏輯放在哪裏?

  1. 關於作爲方法的對象?像:instance.approximately_equal(other)
  2. 作爲一個類/靜態方法的對象的類? class.approximately_equal(a,b)
  3. 關於作爲方法的集合對象? collection.approximately_equal(a,b)

什麼是正確的面向對象設計? (我問,雖然#1似乎是正確的解決方案,但我絕不會問有沒有一個實例近似等於不同的實例,只有當「某些對象組」相等時纔會這樣。它讓我想起...)

感謝

+1

'approx_equal'可能比「compare」更好。 – 2010-11-01 21:38:44

+0

已注意。謝謝。 – nonot1 2010-11-01 21:49:00

回答

1

我讀過的面向對象設計書籍建議將跨類功能放入服務提供者對象中。這將使這兩個對象分離並降低複雜性,但是如果項目很小,可能會過度。

+0

十字課?所有記錄都是同一類。 – nonot1 2010-11-01 21:42:38

+1

類似於DistanceConverter/DistanceComparer和WeightConverter/WeightComparer,它將包含用於轉換/比較不同類型對象的方法。 – ulty4life 2010-11-02 00:15:21

+0

啊哈......我明白了。但就我而言,我只有一種測量記錄對象。只是一大堆實例。 (坦率地說,我甚至可以使它們成爲結構類型的東西..但是它們是對象。) – nonot1 2010-11-02 00:22:10

1

,因爲它使您能夠細化派生類的比較邏輯(如果需要的話我會使用選項1(實例方法))。

+0

我會去實現IComparable這條路線。 IComparable的問題在於,您未來可能還希望支持執行精確的比較。 – NotMe 2010-11-01 21:44:53

+0

對,IComparable肯定不是我想要的。我確實需要精確的平等測試。爲此,我將使用IComparable。 – nonot1 2010-11-02 00:19:16

0

我發現#3是最不引人注目的,並且導致代碼更少,因爲它往往會迫使您儘可能靈活/可重用這些方法。例如,在C++中,你可能只是使用運算符重載來處理它;如果你有一個工具類(或者,如果你打算擴展一個本地數據類型),那麼淨效果是相同的,只是使用不同的表示。