2011-04-19 62 views
3

我有如下實現的方法類:我們可以重構這些方法嗎?

void methodOne() { 
    try { 
     getHelper().doActionOne(); 
    } catch (Exception ex) { 
     throw new CustomException(ex); 
    } 
} 

void methodTwo() { 
    try { 
     getHelper().doActionTwo(); 
    } catch (Exception ex) { 
     throw new CustomException(ex); 
    } 
} 

void methodThree() { 
    try { 
     getHelper().doActionThree(); 
    } catch (Exception ex) { 
     throw new CustomException(ex); 
    } 
} 


void methodFour; 
void methodFive; 
... 

有沒有更好的方式來做到這一點?這些代碼讓我感到不舒服。

編輯: 對不起,不清楚的例子。我執行與Hibernate GenericDao類,真正的代碼是這樣的:

class GenericDaoImpl<T, PK> { 

    PK create(T object) { 
     try { 
      getSession().save(object); 
     } catch(Exception ex) { 
      throw new DataAccessLayerException(ex);// wrap any exception to my exception 
     } 
    } 

    T read(PK id) { 
     try { 
      getSession().get(T.class, id); 
     } catch (Exception ex) { 
      throw new DataAccessLayerException(ex); 
     } 

    } 

    void update(T object); 
    void delete(T object); 

} 
+3

能否請您解釋一下在這些方法被稱爲上下文? – Ammu 2011-04-19 03:16:38

+0

爲什麼代碼會讓你感到不舒服?我沒有看到你的代碼有什麼特別的錯誤。 – 2011-04-19 03:22:08

+0

目前還不清楚你想要完成什麼,所以很難推薦更好的方法。你爲什麼捕獲所有異常並用自定義異常包裝它們?它看起來像你試圖避免所有檢查異常與未經檢查的異常。 – WhiteFang34 2011-04-19 03:22:28

回答

6

只是一個基本的建議,但你可以重構弄成像這樣的「命令模式」。該模式允許您將一些功能封裝到實現單一方法的類中。這個類可以被實例化並傳遞到另一個類執行,而執行者類不知道或關心它在做什麼,它只是需要調用execute()。如果這些動作需要參數,則實現Command的類可以包含可以在構造函數中設置的字段/屬性或由標準屬性設置器設置。

作出這樣的接口(我的Java是生疏了,所以這可能不是100%有效的語法):

public interface Command 
{ 
    public void execute(); 
} 

public class ActionOne implements Command 
{ 
    public void execute() 
    { 
     // do actionOne... 
    } 
} 

public class ActionTwo implements Command 
{ 
    public void execute() 
    { 
     // do actionTwo... 
    } 
} 

// etc. for more actions 

然後創建一個執行該操作的類,並且調用代碼只需要通過在正確的Command實現類中。

public class Executor 
{ 

    public void executeCommand(Command command) 
    { 
     try 
     { 
      // Put any boilerplate code here (logging, auditing, etc.) 
      command.execute(); 
     } 
     catch (Exception ex) 
     { 
      // Put general error handling code here. If you're just catching and rethrowing, consider not catching the Exception at this level. If it's a checked exception, add a throws clause to the method. 
      throw new CustomException(); 
     } 
    } 
} 
+0

我appriciate你的建議,但使用命令模式似乎增加我的班的人數。我正在考慮使用類Method來動態調用。 – Genzer 2011-04-19 04:23:24

+2

你爲什麼在乎增加班級數量? 10個小型集中班比一個大班要好10個不同的東西。除非你絕對必須走這條路線,否則我也會避開反思。使用一些基本的接口和類可以更簡潔地表達您的代碼。 – 2011-04-19 04:26:44

+0

我試圖重構類與類似的問題。 如果我的課程有100個方法,還有什麼建議嗎?我唯一能想到的是爲Action類創建一個新的包。 – TheAmpersand 2012-12-17 17:10:12

1

是的,你總是可以重構代碼。唯一的問題是你是否要重構使其更好或更糟。這個代碼很奇怪的提示是一個很好的暗示,它可以變得更好。

這看起來像一個很好的候選人polymorphisim。使用一種共享方法嘗試五個不同的類,而不是五種不同的方法。界面將把它們結合在一起。

public interface DoIt { 
    public void doIt(); 
} 

public class One implements DoIt { 
    public void doIt() { 
    // code which was previously in getHelper.doActionOne(); 
    } 
} 

public class Two implements DoIt { 
    public void doIt() { 
    // code which was previously in getHelper.doActionTwo(); 
    } 
} 

... 

public class Five implements DoIt { 
    public void doIt() { 
    // code which was previously in getHelper.doActionFive(); 
    } 
} 

現在唯一要做的就是創建情況的正確的類,並調用其doIt()方法。

0

這家工廠是由Spring Framework與許多人一起提供。首先,它有一個特定的HibernateTemplate,它將每個Hibernate特定的異常映射到未經檢查的相關Spring異常。其次,它提供AOP服務來在方法級別轉換異常,因此您可以指定一次映射並將它們統一應用於多個服務。

雖然我不會用Spring爲僅這一項功能,它用於構建應用程序巨大的好處,我已經使用了很多年持續。