我的问题有点模糊,至少部分是故意的。我正在寻找有关接口设计,未来扩展和易于测试接口的早期建议,而不是太多关于确切的代码。虽然,如果它是一个特别适用于C ++(17)的解决方案/建议,那么这是完美的。
我的模拟解决了一个难以解决的组合问题。模拟逐步传播到解决方案。但有时候,一步就是死胡同(或者就是这样)。例如,在下面的伪代码中,while
循环通过向片段馈送来传播模拟。在那里可能存在不能使用“片段”来传播模拟的情况。例如。这是昂贵的,它是一个根本不适合或任何理由的作品。失败是一种正常行为,可能无法中止。
while(!allNotHandledPieced.empty())
{
auto nextPiece = allNotHandledPieces.back();
allNotHandledPieces.pop_back();
auto status = simulation.propagate(nextPiece);
if(status == 0)
next; // ok
else if (status == 1)
dropPieceDueToTooBadStatus();
}
实际上,对于'模拟'而言,它失败的原因并不重要。状态仍然有效,使用另一件没有问题,它可以继续。但后来,我可能会发现需要知道“传播”方法失败的原因。那么在失败时获得有意义的返回值可能是有意义的。
是否有返回'失败'的好方法?对于这样的情况,是否有最佳实践?
答案 0 :(得分:1)
从我可以收集的信息来看,似乎既没有例外也没有“返回”适合您的情况。在您的问题中,您谈到“返回结果”,但您的特定代码示例/用例表明,如果使用“坏块”,算法不应停止或中断。异常和从函数“返回”将导致更复杂的控制流,在某些情况下,更复杂的状态处理将取决于您处理异常的方式。
如果您选择例外路线,我建议您在system_error之后对“报告”类进行建模。
如果您选择非控制流路线,我建议将错误代码和其他元数据推送到另一个可以使用的数据结构中(如果该部件本身太昂贵而无法复制)。 p>
您选择做什么取决于坏片是否需要立即采取行动。如果没有,则异常不是要走的路,因为这意味着它需要在某个时刻处理。