如何构建具有大量IF语句的程序(过程)

Mic*_*hel 13 c# design-patterns

我必须为一种复杂的过程创建一个程序.嗯,这个过程并不复杂,但是有很多变量可以控制这个过程.我不能详细讲述这个过程,所以我编造了一个,它具有相同的IF负载:

过程是:我们应该停止铁熔炉.我们有这些参数:如果温度超过800摄氏度,请停止它除外,当我们预计在接下来的20分钟内从烤箱2可以获得冷水时,我们可以继续

除了,当温度在接下来的10分钟内上升10度时,我们不能再等待10分钟的冷水,所以我们必须停下来.

除了当温度由于某种原因导致790-800度下降5分钟时,我们需要额外的5分钟才能获得额外的冷水.

除了当温度由于某种原因导致780-790度下降5分钟时,我们还需要额外的5分钟来增加额外的冷水.

等等

除了/ if/then之外,你们都可以想到另外20个

在我们的过程中,我们有> 50种情况,一个目标:机器是否停止.

我必须说我通常没有那么多的情况为一个目标/问题(即:停止机器与否),它也是时间限制:如果这发生了10分钟然后......,我们必须每分钟再计算一次情况.

有没有办法以智能方式编程?

(还有单元测试,因为我们有负载和负载的组合,我猜这都是单独的单元测试?)

Mar*_*ers 7

根据您对烤箱工作原理的了解,您可以让计算机为您完成此操作,而不是手动计算出必须停止烤箱的所有情况.

尝试为烤箱的工作方式编写模型,并在每个时间点模拟未来10分钟左右的情况.如果模拟显示很快就会出现严重问题,那么您现在可以停止烤箱,否则让它运行一分钟,读取输入并再次运行模拟.

编写准确的模型需要付出一些努力,但随着您的需求略有变化(例如,您的需求已经升级或修复),更新模型将相对容易 - 在最好的情况下,您只需修改模型参数或更新单个公式.

使用当前的方法,如果您稍微修改了烤箱,则必须首先手动计算将产生的效果,然后逐行更新不同条件的所有代码.


关于单元测试 - 理想情况下,您应该在各种情况下测试您的模型来自真实烤箱的数据,并检查您的模拟预测实际测量结果(允许读数不准确的一些公差).如果这是不可能的,那么您可以硬编码一些示例场景和预期结果(例如过热)并测试模拟正确预测结果.


MrD*_*osu 6

一些问题空间非常优雅地不符合OOP原则.听起来你的情况可以在基于规则的范例中更好地管理(特别是当规则发生变化时).以下是基于规则的.NET框架的示例:http://www.codeproject.com/KB/cs/Drools_NETPrimer.aspx

  • @eglasius Drools还实现了复杂事件处理的形式http://en.wikipedia.org/wiki/Complex_event_processing,这在规则开始相互依赖时非常重要(在我们谈论实时系统时尤为重要) . (2认同)