2016-03-03 80 views
0

在OOP中,我們不希望類耦合。如果我想在類a中使用類b的一個實例,我可以使用依賴注入。調用另一個類靜態方法導致耦合

但是,如果我想在類a中使用類b的靜態方法,我沒有看到任何選項,而是在類中「類」需要或「導入」類文件。這最終會導致類之間的耦合 - 違背OOP原則。但另一種方法是將類b的靜態方法重寫爲類a中的靜態方法 - 違背了DRY原則。什麼是正確的方式?

這個問題被標記爲How to use Dependency Injection with Static Methods?的可能重複,但我覺得我的問題是從更一般的角度要求使用另一個類的靜態方法。在可能的重複中,認爲該問題和接受的答案對於用例更具體,但不適用於例如外部類中僅僅實用的靜態方法。我的問題旨在從總體的問題角度尋求答案。

+0

[如何使用依賴注入與靜態方法?](http://stackoverflow.com/questions/6523463/how-to-use-dependency-injection-with-static-methods) – Moumit

回答

1

這裏有很多選項,具體用例在決定你想要做什麼時很重要。所以,三巨頭將是...

  • 遷移靜態方法關閉B類和到一個共享庫類,它是純粹的靜態方法架和從不實例化(在Java中,你會做構造函數private和類final)。然後,A類和B類都可以訪問該方法而不依賴彼此,並且不違反DRY原則,並且依賴於庫類不會比依賴於同一類中定義的靜態方法更好也更差。

  • 如果你正在談論的是一個靜態方法,它確實是最好的生存在類B上的東西,那麼你可以將該方法調用隱藏在某種依賴注入類A的提供者實例之後,簡單地調用B上的靜態方法。如果你想變得非常邪惡,那麼提供者也可以注入到B的實例中,但這可能是矯枉過正的。

  • 靜態方法可以更改爲一個新類的實例方法,該方法將依賴注入到A和B中。有時,這有一個副作用,允許您隱藏實例中的某個狀態,而不是將參數傳遞到另一個無狀態的方法。

注意的是,在OO方面一般引起問題的靜態方法,因此只有真正的第三個選項是「乾淨」的一個真正解耦類和正確允許編碼到接口。

+0

Im有點不確定第二點 - 「提供者實例」。這看起來像什麼?而不會導致提供者實例類和類B之間的緊密耦合? – joshweir

+0

是的,非常重要的是,提供者將與B類緊密耦合。例如,您可以用幾種不同的方式反映現實情況 - 例如,您可以將提供者隱藏在靜態工廠方法之後。關鍵是要記住,目標是將A和B分開,而不是將所有類別分開(這是根本不可能的)。某處某處確實需要知道您的實現涉及什麼 - 關鍵是將應用程序邏輯(對象使用)與配置(對象創建)分開。 – sisyphus

相關問題