2011-04-20 79 views
4

我正在讀這本書重構:改進Fowler的現有代碼的設計,它說用相同名稱類替換函數調用,並調用該類的構造函數來代替原始函數調用。將所有函數轉換爲類

我的問題是將所有函數(或多或少,除了非常小的函數)轉換爲對象以便代碼更加模塊化是一個好主意?

謝謝,

+5

對於沒有閱讀過本書的人(比如我),請給予更多的背景知識。現在,這個聲明聽起來完全沒有道理。但知道馬丁福勒和肯特貝克的聲譽,我懷疑還有更多。 – 2011-04-20 08:56:55

+3

約翰卡馬克曾經說過「有時候,優雅的實現只是一個功能,不是一種方法,不是一個類,不是一個框架,只是一個功能。」除非你確定它會使它更好,否則不要在代碼中做任何事情。 – 2011-04-20 08:58:54

+4

我想我誤解了作者想在那裏說些什麼。這是像下面的東西。將方法替換爲方法對象 您有一個很長的方法,它使用局部變量的方式無法應用「提取方法」。 將該方法轉換爲其自己的對象,以便所有局部變量都成爲該對象上的字段。然後,您可以將該方法分解到同一對象上的其他方法。 – PTS 2011-04-20 09:11:10

回答

2

不,爲什麼呢?如果你的功能在邏輯上是一個函數(無狀態計算),並且沒有強制性的理由將它作爲一個類來實現,那麼就把它作爲一個函數來實現。

到的意見「替代函數名稱相同的類和替代原有的函數調用這個類的調用構造函數調用」是完全錯誤的:你怎麼能由class f和一個調用替換

int y = f(x); 

它的構造函數?構造函數沒有返回值!得到這個工作的唯一方法是重載operator()class f所以你可以使用的

int y = f(x)(); 
int y = f()(x); 

這兩者都是毫無意義的。 (另外,您必須記住您定義的每個功能對象所需的這些中的哪一個。)

必須有一些您沒有告訴我們的東西。

1

在我看來,將函數轉換爲類是毫無意義的。你爲什麼想這麼做?

當你將你的函數轉換爲對象時,你沒有獲得任何東西。方法調用實際上是相同的普通函數調用,只有一個隱藏的參數,this。在你的情況下,這個論點將是多餘的,因爲你的對象沒有任何狀態。

我可以考慮將函數轉換爲對象的唯一原因是將函數作爲對象傳遞給其他函數,但爲此我們有函數指針或boost :: function或C++ 0x lambdas。

0

絕對不是! 將的任何函數轉換爲類是沒有意義的。

類即將管理一些對象的狀態和隱藏信息,功能是全球性的,大多是無狀態的。許多失敗課程使軟件效率低下,無法維護。

5

擴大在我先前的評論了一下:

在C++中是絕對沒有理由把所有功能成類,某種處理的對象。當你只需計算並返回一個值時,函數就可以很好地工作。

然而,如果你有一個創建一個內部狀態和它的加工過程中使用,在一些地方,或(哇!)在全局變量中存儲一些狀態的一大功能,該功能可能是一種變相的類。在這種情況下,將狀態存儲在一個類對象中可能是一個好主意,其中有幾個較小的成員函數正在處理該公共狀態。

在另一方面,僅其參數計算出一個值的函數是它放入一類改進。

+0

「方法對象」是一個非常有用的重構模式,我曾多次應用於長方法。從數據中分離操作和算法也是一個很好的策略。我不一定同意「僅從其參數計算值的功能沒有得到改善」。如果函數/方法很長並且有很多自動變量(即內部臨時狀態),應用方法對象將極大地改進代碼的結構和可維護性 - 即使結果類不是「僞裝類」(「class 「理解爲一種對象),而是一個模塊。 – mdr 2017-04-05 11:12:24