[英]Should class constructors only be used for dependency injection?
類構造函數可以通過兩種主要方式填充其類的依賴項:
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.