我有具有3個函數ExtractData
,Validate
和FinishForms
的類DataManipulation
。
所有的方法都需要訪問該類的私有變量(還有更多,爲了可讀性而縮短的例子)。重構出具有許多共享變量的類方法的設計模式
實際的班級非常長,我想將它分成3個班級,每個班級都有一個班級,每個班級都有一個班級。
我使用依賴注入來實例化類,並簡單地將3個方法分成3個類將意味着通過相當多的變量,我認爲這不利於可讀性。
TL; DR。我有一個非常長的類,其中方法操縱很多內部變量。方法可以分爲3個不同的責任區域,但將類別劃分爲3將意味着傳遞許多內部變量。
我正在尋找適合我的問題的正確設計模式。
public class DataManipulation
{
private readonly IUnityContainer unity,
private ImportModel VarUsedEverywhere;
//VarUsedEverywhere1 to 10 also defined here
private List<string> _errorMessages = new List<string>();
public DataManipulation(IUnityContainer unity)
{
_unity = unity;
}
public async Task<ImportLogModel> Process(Stream importFile)
{
ExtractData(importFile);
await Validate();
await FinishForms();
return VarUsedEverywhere1;
}
}
。
private bool ExtractData(Stream importFile)
{
for (var row = 1; row <= importFile.MaxDataRow; row++)
{
foreach (var header in importFile.headerMap)
{
var value = importFile.Cells[row, header.Value.Item1].GetUnmergedValue();
VarUsedEverywhere1.rows[row].add(value);
}
}
//Extract more data into VarUsedEverywhere
//Add to _errorMessages if operations do not succeed.
}
。
private bool Validate()
{
if (!VarUsedEverywhere1.Headers.Contains(VarUsedEverywhere2.sourceHeaderKey))
{
_errorMessages.Add(string.Format("Could not find header in Excel file: [{0}]", importMap.sourceHeaderKey));
success = false;
}
//validate data in VarUsedEverywhere1 to 10
//Add to _errorMessages if operations do not succeed.
}
。
private bool FinishForms()
{
foreach (var importMap in VarUsedEverywhere1.importMap.Where(m => m.sort != 0).OrderByDescending(m => Math.Abs(m.sort)))
{
if (importMap.sort > 0)
{
rows = rows.OrderBy(r => r[importMap.sourceHeaderKey]);
}
}
//Order all the values in VarUsedEverywhere
//Add to _errorMessages if operations do not succeed.
}
編輯添加一些代碼的方法的要求。
您顯示的代碼只有三個成員。如果我們無法看到完整的代碼,那麼理解什麼建議會有點困難。你可以請張貼[mcve]嗎? – Enigmativity
這是一個設計問題,我不清楚爲什麼它會影響我的代碼的實際外觀? 我試圖從方法中包含一些實際的代碼。 – Jeppe
這就是爲什麼我想看完整的代碼,因爲我不知道直到我看到它是如何重要的。 – Enigmativity