2014-09-11 115 views
0

考慮用靜態方法下面的類:靜態方法的類型間聲明可以嗎?

public class Vector2D {  
    /* ... */ 
    public static Vector2D sum(Vector2D first, Vector2D second) { 
     return new Vector2D(first.x + second.x, first.y + second.y); 
    } 
} 

這種方法可以在AspectJ中也添加爲一個類型間聲明:

public aspect Vector2DMath { 
    public static Vector2D Vector2D.sum(Vector2D first, Vector2D second) { 
     return new Vector2D(first.x + second.x, first.y + second.y); 
    } 
} 

哪一種方法是在方面 - 方面更加正確面向對象編程

就個人而言,我認爲第一種方法更好(更少的代碼),但如果是這樣,那麼當靜態方法的類型間聲明可能是有用的?

回答

1

它沒有意義的比較蘋果和梨。沒有「好」或「雪上加霜」在這裏,只有situative決定:

  • 只要你有訪問類,你要添加的方法的源代碼,實現了一個核心問題,使用OOP (編輯:修正錯字,早些時候我寫過「AOP」)
  • 如果您沒有訪問源代碼和繼承不是用於實現核心關注點的好,甚至可行的解決方案,使用AOP作爲一種解決方法。
  • 如果你想實現跨越許多類甚至在整個系統中的橫切關注點,始終使用AOP不管你是否擁有源代碼的訪問或沒有,因爲這是AOP可以幫助你寫出更好的和更清潔,更模塊化和更易維護的代碼。

說了這麼多,看着你的榜樣,似乎Vector2D.sum是相當多解決一個核心問題,因此,如果您不一定需要AOP解決了「沒有源代碼」的問題,使用OOP和公正編輯班級。在其他情況下,這個決定可能會不同。 (非)靜態方法的ITD是一個有用的AOP工具。

編輯:我忘了提及靜態方法通常是「壞」,因爲它很難模擬測試它們。並不總是,但他們往往有點老派的C式。在這個具體的例子中,爲什麼創建一個靜態方法來添加同一個類的兩個實例?爲什麼不是一個正規的sum方法採取一個參數?

1

IMO的靜態方法的ITD,實際上只用於代碼生成(彈簧袋鼠是一個例子)類似於C#局部類保持代碼發生器的代碼在從開發代碼單獨的文件是有用的。

而且是第一種方式的方法比第二種方法更好萬千。

相關問題