簡體   English   中英

類構造函數應該只用於依賴注入嗎?

[英]Should class constructors only be used for dependency injection?

類構造函數可以通過兩種主要方式填充其類的依賴項:

  1. 通過構造函數依賴注入填充類依賴。
  2. 通過使用構造函數參數在構造函數中運行一些計算來填充類依賴項。 根據計算結果實例化依賴關系。 這可能涉及使用new

我想知道第二種方法是否遵循單一職責原則等良好的編碼實踐,以及這種功能是否真的屬於類構造函數。 看起來很方便,但我不確定這是否是個好主意。

這是我的意思的一個例子:

public class VectorSpace
{
    // This class depends on an array of Vectors.
    Vector[] spanningSet;

    // 1. Populate the class dependencies by constructor dependency injection.
    public VectorSpace(Vector[] spanningSet)
    {
        this.spanningSet = spanningSet;
    }

    // 2. Populate the class dependencies by running some calculations in the constructor.
    public VectorSpace(Rect rectangle, int numberOfCellsX, int numberOfCellsY)
    {
        // Construct this class to make sure the resulting vector space fits the given rectangle, forming a grid.
        // Some calculations that ultimately populate the class dependencies go here...
    }

    // Public methods for performing calculations using the Vectors go here...
}

感覺很奇怪,因為讓向量空間填充網格感覺就像是在這個類的范圍之外的工作,但我不知道我還能在哪里定義第二個構造函數。

第二個構造函數的功能是否適合在這個類中? 如果沒有,我會將這個構造函數體移到哪里? 我應該使用靜態工廠方法嗎? 我應該讓這個構造函數成為不同類的構造函數嗎? 也許我可以在某處有一個類似的方法來返回一個向量數組,我可以將它傳遞給依賴注入構造函數,但是我應該在哪里定義該方法?

VectorSpace類取決於數據(向量集),但可以通過多種方式提供/計算數據。
如果您將更改矢量的計算/檢索方式, VectorSpace邏輯會發生變化嗎? 我認為不是 - 所以它不應該是VectorSpace類的一部分。

我們可以創建專門的類來負責計算所需的數據。

public class SpanningSetFactory
{
    public Vector[] Create(Rect rectangle, int numberOfCellsX, int numberOfCellsY)
    {
        // Calculate and return set of vectors
    }
}

現在 VectorSpace 可以明確地“告訴”其他開發人員/讀者它只依賴於向量集

public class VectorSpace
{
    public VectorSpace(Vector[] spanningSet) => _spanningSet = spanningSet
}

現在,“計算生成集”和“使用生成集”這兩個邏輯都將位於它們自己的位置而不相互依賴 - 只有它們彼此之間的依賴鏈接將是Vector數組

我建議避免在構造函數中放置一些計算(尤其是繁重的計算)。
當關鍵邏輯(計算、數據檢索)以方法或其他類型的形式顯式可見時,對其他開發人員有很好的幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM