2011-05-17 58 views
2

我的應用程序與靜態方法這是負責顯示通知和可選發送電子郵件時,事情已經發生了一個工具類:實用工具類的靜態方法和繼承

public static void sendEvent(final String description, final String name) { 
    .... 
    SmtpParms smtpParams = readSmtpParms(); 
    .... 
} 

private static SmtpParms readSmtpParms() { 
    // read from properties file 
    .... 
} 

我們的代碼庫的兩個應用程序之間共享。應用程序A從屬性文件中讀取SMTP參數。我主要工作在應用程序B上。應用程序B並未使用此電子郵件功能,但仍然撥打電話在我們的GUI上顯示事件通知。現在應用程序B需要從數據庫中讀取SMTP參數。

我想重複使用現有的代碼,但由於這些方法是靜態的,我不能僅僅繼承這個實用類並將所有的應用程序B代碼指向子類。該實用程序在多個JAR中引用,我傾向於儘可能少地改變代碼的解決方案。

我認爲如果我可以將readSmtpParms分隔成一個單獨的類,這可能會有所幫助。但我想不出一種方法來將源(屬性文件與數據庫)傳遞給實用程序類實例,而不更改sendEvent的方法簽名。我想另一種方法是創建另一種方法sendEventUsingDatabase,但是我仍然需要更新應用程序B代碼中所有對sendEvent的引用。

有沒有解決方案不會改變原來的代碼,但也不會重複代碼?此代碼是否符合設計模式或反模式?謝謝。

回答

5

靜態工具方法不適合「發送電子郵件」的情況。

我建議你將代碼重構爲一個可以正確實例化並將電子郵件配置參數作爲輸入的類。

爲了確保不破壞現有代碼,您然後重命名該類,並將其與用於從屬性文件讀取配置的代碼一起包裝在具有原始名稱的類中。

現在,您可以使用一個類,並使用從數據庫retreived的配置文件進行加載,並使用一個符合用於遺留代碼的靜態實用程序方法簽名的包裝器。

10

您引用了兩種截然不同的行爲(.properties與數據庫),這使我認爲這些不應該是靜態方法。您需要一個接口,應用程序A和B可以插入自己的自定義行爲。

+0

即使只有「一種行爲」,仍然會有這些方法在其他參數上運行的數據,因此它們不應該是靜態的。 – 2011-05-17 20:16:30

1

當你試圖創建面向對象的應用程序時,助手類是萬惡之源。所有這些都是幫助你從函數式編程入手(這個類不過是一個函數容器)。

儘量少用盡可能。

所以答案是你需要切換到另一種方法。

1

只要你在類中有靜態方法,測試就會變得困難。你不會嘲笑。這是重構代碼並擺脫靜態方法的另一個原因。