我開發需要的「階梯」的一些複雜的計算注入「策略」來確定(戰略格局類型的實現),我不知道步驟subcalculation類注入到主的最佳方式類。C++通過構造
我已經研究過基於策略的設計,但讀的政策設計是「編譯時多態」不是運行。另外,我不確定如何使用模板,因爲某些子計算類需要構造函數參數。
我已經開始實施虛擬「接口」類的每一個步驟和注射每一步在構造函數的unique_ptr但不知道這是否正確的「現代C++」的方式。
我最初開始實施主類中的所有功能,但發現這使得它很難甚至無法進行單元測試獨立的每一步。
的結構類似於如下:
class CalculationStepA
{
public:
// default constructor
StepAResult performStep(const input& requiredInput);
};
class CalculationStepBType1
{
public:
// default constructor
StepBResult performStepB(const stepBInput& requiredInput);
};
class CalculationStepBType2
{
public:
CalculationStepBType2(const inputIOnlyNeedForType2& parameters)
{
// initialize class members from input
// need for this calculation type
}
StepBResult performStepB(const stepBInput& requiredInput);
};
class CalculationStepCType1
{
public:
CalculationStepBType2(const inputIOnlyNeedForType1& parameters)
{
// initialize class members from input
// need for this calculation type
}
StepCResult performStepC(const stepCInput& requiredInput);
};
class CalculationStepCType2
{
public:
CalculationStepBType2(const inputIOnlyNeedForType2& parameters)
{
// initialize class members from input
// need for this calculation type
}
StepCResult performStepB(const stepCInput& requiredInput);
};
class ClassThatUsesAllTheCalculations
{
public:
ClassThatUsesAllTheCalculations(/* take required parameters that determine which step types I need */)
{}
// possible constructor?
ClassThatUsesAllTheCalculations(
std::unique_ptr<IStepACalculationStrategy> stepA,
std::unique_ptr<IStepBCalculationStrategy> stepB,
std::unique_ptr<IStepCCalculationStrategy> stepC)
{
}
FinalResult executeCalculation(const finalInputRequiredHere& input)
{
auto stepAresult = stepACalculator(somethingFromInput);
// logic to use stepA and determine if we should continue
auto stepBresult = stepBCalculator(somethingFromStepAResult);
// again, logic to use stepB and determine if we should continue
auto stepCresult = stepCCalculator(somethingFromStepBResult);
// assemble final result
return theFinalResult
}
// other method needed to setup calculation
private:
TypeForStepACalculation stepACalculator;
TypeForStepBCalculation stepBCalculator;
TypeForStepCCalculation stepCCalculator;
};
上確定最佳設計將是巨大的讚賞任何幫助。
我的想法是,試圖創建用來構成動作硬編碼號爲一類頂級類是過於嚴格。我覺得試圖做一些流暢的界面,其中的功能組成來執行他們的行動並返回結果,以便下一個可能使用它可能是一個更好的選擇。我沒有真正給它足夠的想法來制定一個具體的例子,鑑於你的例子是如此抽象,這也很困難。您可以從c#Linq或java流中獲取示例。 –
@PaulRooney有趣的建議。我熟悉Linq,因爲我主要在工作中使用C#。我會盡力把這些東西放在一起。 – RobertW