2011-09-15 70 views
4

好樣式(Clean Code book)表示方法的名稱應該描述方法的作用。因此,舉例來說,如果我有一個驗證地址的方法,將其存儲在數據庫中,併發送一封電子郵件,如果名稱是一些諸如verifyAddressAndStoreToDatabaseAndSendEmail(address);長方法的方法名稱

verifyAddress_StoreToDatabase_SendEmail(address);

雖然我可以把在3種方法中的功能,我仍然需要一種方法來調用這3種方法。所以一個大的方法名稱是不可避免的。

命名和命名方法當然可以描述該方法的作用,但IMO不太可讀,因爲名稱可能非常大。你會如何解決它?

編輯:也許我可以用流利式分解方法的名稱,如:

verifyAddress(address).storeToDatabase().sendEmail();

,但我需要一種方法來確保調用的順序。也許通過使用狀態模式,但這會導致代碼增長。

+3

你做了3件事,好吧,想一下通過調用這3個步驟來描述你正在做什麼的名字。它有名字嗎?好的,這是方法名稱 –

+0

我同意埃爾南。當我有多個步驟來做某件事時,總會有一個總體目標。如果它不夠具體,總會有一些通用目標,例如處理。 就你而言,processAddress(address)方法可以在它們各自的方法中調用3個獨立的步驟。 –

+0

但是'processAddress'是非常通用的,IMO並沒有向讀者說明該方法的推廣。 – ejaenv

回答

2

單一方法不應該做3件事情。因此,分工到3種方法:

  1. verifyAddress
  2. storeAddress
  3. sendEmail
+1

但正如我所說,在某些時候,您需要將這三件事情稱爲其他事情。 (順便說一下,單一責任原則所說的方法應該做一件事,但這一件事指的是抽象層次) – ejaenv

6

我如何處理這個是讓3種更小的方法,你在更高的方法提到的,然後是打電話給3個較小的,我在「爲什麼」我需要做這三件事情之後命名。

嘗試定義爲什麼需要執行這些步驟並將其用作方法名稱的基礎。

+0

爲了充實這個建議,我使用了一個公共方法'SaveAddress'來調用三個私有方法:'verifyAddress','insertAddress'和'sendEmail'。 –

+0

@Rick,但將其命名爲'SaveAdress'並沒有提到發送電子郵件的副作用。 – ejaenv

+1

@ejaenv看看它的一種方法是將它命名爲'HandleSaveAddressRequest'或類似的東西。如果爲什麼沒有道理,那麼有時會描述目的或行爲,就好像與事件一起工作可能是另一種解決方案。 – JamesEggers

2

我正在跟進我以前的評論,但我在這裏得到的比在評論中合理的位置更多,所以我正在回答。

該方法的細節屬於文檔而不是方法的名稱(在我看來)。通過這種方式考慮......通過將SendEmail放入方法的名稱中,即可將實現細節提交給方法名稱。如果決定是通過短信或推特或其他方式發送通知而不是通過電子郵件發送的?您是否更改方法的名稱並破壞您的API,或者您是否有方法名稱會誤導API的使用者?需要考慮的事情。

如果你堅持以名字保留方法的功能,我會敦促你找到更通用的方法。也許沿着VerifySaveAndNotify(Address address)的路線。這樣,方法名稱會告訴你它在做什麼,而不指定它如何執行Address的參數讓我們知道什麼正在驗證和保存。所有這些一起工作,使您的方法名稱信息豐富,靈活和簡潔。

0

編輯:也許我可以用流利式分解方法的名稱,如:

verifyAddress(地址).storeToDatabase()。發電子郵件();

但我需要一種方法來確保調用的順序。也許通過使用狀態模式,但這會導致代碼增長。

爲確保流暢式命令的排序,每個結果都只是一個只公開下一步所需功能的對象。例如:

public class Verifier 
{ 
    public DataStorer VerifyAddress(string address) 
    { 
     ... 
     return new DataStorer(address); 
    } 
} 

public class DataStorer 
{ 
    public Emailer StoreToDataBase() 
    { 
     ... 
     return new Emailer(...); 
    } 
} 

public class Emailer 
{ 
    public void SendEmail() 
    { 
     ... 
    } 
} 

這是方便,如果你需要創建一個非常精細的設計,希望優化類可重用性,但很可能是在大多數情況下設計矯枉過正。可能更好一些,正如其他人所說的那樣,選擇一個代表整個過程應該體現的名稱。您可以簡單地稱之爲「StoreAndEmail」,假定驗證是在將數據提交到任何目標之前經常進行的操作。如果你不介意名字太長,可以選擇簡單地描述它,並接受一個長名字是必要的。最後,它確實不會讓你花費任何東西,但是它肯定會使你的代碼更加具體化。