2011-12-16 73 views
7

我正試圖重構一個項目,其中有遍佈各類的相同方法。爲了減少代碼重複,我應該將公共代碼移動到抽象超類還是應該將它放在實用類中的靜態方法中?我應該創建靜態方法還是抽象超類

編輯 一些方法是用於通用的東西,我相信可以做成靜態的。雖然還有其他的指稱類的屬性,在這種情況下,我認爲將它作爲一個抽象的超類是更有意義的。

+2

無法回答沒有上下文;很大程度上取決於現有類的密切相關程度,類和方法的使用方式等。 – 2011-12-16 05:26:20

+1

您必須告訴我們更多關於這些方法的信息 - 如果它們共享相同的行爲並且可以獨立於任何類別執行操作,靜態方法的類將是有意義的。如果您正在考慮使用抽象類/基類/接口,則必須考慮該類層次結構是否合理,以及這些函數是否真的是這些類的固有行爲,或者如前所述,這些方法不關心關於他們所屬的課程。 – birryree 2011-12-16 05:27:00

+0

你能解釋一下這個方法是幹什麼的嗎?如果所有這些類都是相關的? – 2011-12-16 05:27:34

回答

0

如果它不使用任何班級成員,你可以做它靜態!

但是,你應該做一個抽象類或母親類

1

還有一點要考慮的可能是這些功能做的工作類型。如果這是分散的,你應該用靜態方法創建一個facade/helper/util類。

2

這取決於你的代碼在做什麼。他們是實用方法嗎?他們是具體/專門的類方法嗎?這是一個沉重的多線程應用程序?

請記住,如果你讓他們靜和你的多線程應用程序,你必須保護他們W¯¯鎖。這又降低了併發性。在這種情況下,根據多少個線程調用同一段代碼,你可能會考慮將它移動到一個超類。

5

嗯,我遵循一個規則:不要使用基類來刪除重複代碼,使用的工具類。

對於繼承,問問自己:是否 - 存在關係?

另一條規則,其中大部分時間是正確的,方法是:不想在成分使用靜態實用類繼承

是不正確的成分,但它可以被稱爲它的推導。

應用這些規則,你secenrios並作出決定牢記維護及可擴展性。不過,如果您可以在您的問題中添加更多詳細信息,那就太好了。

0

如果這些方法使用類的許多字段或方法,它們不應該是靜態的。 如果它們是子類可能想修改的東西,它們不應該是靜態的。 如果方法應該是接口的一部分,它們不能是靜態的。

否則,它是你的電話,你可能會以後改變主意。 :-)

1

正如其他人提到這個問題的答案取決於問題的背景和重複代碼。

有些事情要考慮

  • 是否複製代碼變異對象的實例。在這種情況下,在一個共同的抽象類
  • 而不是靜態實用工具類保護的方法考慮單,靜態方法可以儘管測試框架都做的更好是純粹的單元測試問題。
  • 繼承可能會很棘手,想想如果這些來自不同類的對象真的相關並且需要一些面向對象的重構?或者它們是發生在需要相似位代碼的領域邏輯的不相交部分。
0

乍一看,我會說在公共課堂中將公共代碼作爲公共靜態方法會更好。這將使方法有用的任何一類只使用

UtilityClassName.methodName(); 

這是更好,然後使其成爲一個抽象的超類的具體方法,因爲你總是需要在所有的類擴展這個超一流你想在哪裏使用這一種方法。

但是現在,正如你所說,該方法的行爲取決於一些變量。現在,如果它取決於不同類的實例變量,那麼最好在接口中添加此方法,並讓所有類都實現此接口並具有相同的實現。

但是,如果這些變量是恆定值,那麼在接口中使用這些常量值。在你的實用課程中實現這些接口。再次在該實用程序類中將其作爲一個靜態方法,它將直接使用這些常量。

例如,考慮一下。一個圓的返回區的通用代碼。

public interface TwoDimensional{ 
     double PI = 3.14; 
    } 

    public class MyUtility implements TwoDimensional{ 
     public static double getCircleArea(double radius){ 
      return PI*radius*radius; 
     } 
    } 

在這裏,你可以看到,方法getCircleArea()取決於這將是不同類不同的半徑,但是我就是這個值傳遞給myUtility類的靜態方法。

相關問題