2015-04-28 113 views
5

我在Java中開發了一個應用程序,我正在重構它。我剛剛意識到,我必須執行幾乎同樣的動作幾種方法,它們具有相似的名稱,以及:Java中的重構方法:我應該應用哪種模式?

RestrictedPersonServiceImpl.canViewPersonDetails 

RestrictedPersonServiceImpl.isSubjectRestrictedToWorker 

RestrictedPersonServiceImpl.isAnySubjectRestricted 

RestrictedPersonServiceImpl.isSubjectRestricted 

RestrictedPersonServiceImpl.isAnySubjectOfSubgroupRestrictedToWorker 

我敢肯定,它必須是一種編程模式,適用於對付這種情況。我之前想到的解決方案是將所有這些方法合併爲一個,並通過參數確定行爲。

有沒有更好的選擇?

謝謝大家。

+1

也許這個問題是CodeReview站點的一個很好的候選人:http://codereview.stackexchange.com/? – JFPicard

+0

@JFPicard:這些只是方法名稱,而不是實際的代碼。整個問題似乎也是假設的。 – Jamal

+0

我不明白巨大的'if'語句和帶參數的單個方法是如何改進的。你仍然需要用通信方法名稱來包裝它。重構是否有意義取決於這些方法的實際*實現,這是我們看不到的。 –

回答

1

在大多數情況下,將幾種方法合併爲一種方法是不好的選擇。 這是一些原因。

  1. 代碼應該很簡單。 if/else或switch/case結構越少,你就越好。此代碼測量稱爲「分支因子」
  2. 刪除完整方法(如果需要)比移除部分特定方法更容易。
  3. 它在javadoc中更清晰和更容易解釋。而且在大多數情況下,不需要解釋任何事情,因爲方法名稱解釋了它自己。

其他情況是,如果您的所有方法執行的操作都可以通過參數控制,但沒有if/else結構。例如,有一系列方法,如addOne(),addTwo()等等,在這種情況下你應該定義方法add(int value)來完成這項工作。

有時,定義接受參數的私有方法會很有用,但會暴露一系列公共方法,而不使用正確參數調用此私有方法的參數。當這些方法之間的錯誤處理存在差異時,或者如果有多個參數並且並非所有組合都合法時,這通常很有用。

1

IMO,差不多不同於完全一樣。如果他們確實是差不多與他們的算法的行爲非常本地化的差異,結合Template Method PatternStrategy Pattern想到,您使用前者提供模板框架,而後者改變運行時的行爲。

現在,我假設你有一個名爲RestrictedPersonService的界面,你的RestrictedPersonServiceImpl實現。清潔,合適的接口設計是更重要的IMO,因爲這將暴露給用戶。看看Bob叔叔的Interface Segregation Pinciple。它的要點是不要讓讓你的界面知道太多。換句話說,不要將您的接口實現與系統中與其無關的其他實現耦合在一起。理想情況下,每個界面應該只有一個責任,即Single Responsibility Principle。因此,我個人不會將所有這些方法合併在一起,除非它們具有完全相同的責任。

相關問題