2013-05-03 62 views
3

正如標題所述,爲什麼任何對象應該繼承ToString()方法(例如在C#或Java中)並以某種方式謹慎地將其轉換爲String?在某些情況下,這不是違反單一責任原則嗎?我的意思是,如果你的對象不需要轉換爲字符串,你將最終對你的對象有更多的責任。ToString()方法是否違反SRP?

+0

我不同意所有的類都應該定義'toString()'方法。就個人而言,在編寫公共API時,爲了其他開發人員的目的,我在所有類中定義了一個'toString()'方法,但是在開發內部時,我只在必要時定義它,因此遵循SRP。 – Vulcan 2013-05-03 15:34:05

+0

一個對象是否違反了SRP,通過定義它的*非常*特殊的方式在需要時被表示爲'String'?恕我直言,這不是關於SRP本身,而是關於對象的所需功能。 – Gamb 2013-05-03 15:34:18

+0

@Vulcan我並不是說任何對象都必須重新定義ToString(),但無論如何,即使某個特定的子類型不應具有將它的值「轉換」爲字符串的響應性,它們也必須具有該方法。 – Mones 2013-05-03 15:55:00

回答

9

從某種意義上說,ToString()的確違反了單一責任原則。轉換爲字符串表示不應該是必然是每個對象類型的要求。在C#中,GetHashCode()可能會更糟糕 - 並且再次在每種類型上定義。這很容易通過其他一些機制完成(即:可選接口,以及將任何對象轉換爲字符串的單一職責的類)等。

這是一個實用性與正確性的問題。在提供字符串表示的每個對象上有一個方法(可以說)使整體上更簡單一些,但是每個對象都要實現它。也就是說,如果對默認實現感到滿意,對象不需要承擔這個責任。

+0

任何類對象'X'都應該能夠確定它的任何成員是否可以與'Y'所引用的對象的行爲不同(任何使用引用相等實現'Equals'的類都將滿足該描述,因爲如果'X'和'Y'是不同的對象,在'X'和'Y'上調用'.Equals(X)'會產生不同的結果。 'Equals'提供的等價關係的有用性可以通過一個符合它的'GetHashCode()'方法來大大增強。 – supercat 2013-07-16 19:26:55

+0

即使在語義上讓想要比較對象的代碼在提供一個對象時使用比較方法,並且在其中一個不是時測試引用相等,則無條件地調用已知存在的虛擬方法比測試對象具有它可能具有或可能不具有的虛擬方法]。 – supercat 2013-07-16 19:32:15

+0

當你說'可選接口'時,你是什麼意思? - 你的意思是標記接口?如果沒有,那麼這個接口簽名中有什麼方法? – BornToCode 2015-12-24 10:28:03