稳健性的最佳实践

Ada*_*iss 10 robustness

我只是碰上了这个问题有关初始化局部变量.许多答案都争论简单/可读性稳健性.作为(远程部署)嵌入式系统的开发者,我总是喜欢稳健性,并倾向于遵循几个看似相互冲突的规则:

  • 以允许设备继续运行的方式尽可能地处理每个错误.

  • 在编程或致命错误发生后,尽快将代码设计为失败.

我们都经过培训,可以验证输入,防止设备因用户(或其他外部)输入而损坏; 总是假设数据可能无效并相应地进行测试.

您还遵循哪些其他具体做法来确保稳健性? 示例很有帮助,但我也对普遍适用的技术感兴趣.

Jim*_*ger 7

我是" 实用程序员 "中描述的技术的粉丝.我也使用TDD而不是DBC,因为我觉得它更灵活,更有效率.例如,'pragprog'中描述的一些技术包括:

  • 经常测试.早点测试.自动测试
  • 不要重复自己
  • 使用破坏者来测试您的测试
  • 对异常问题使用例外
  • 不要和破窗户住在一起
  • 不要使用手动程序

它们看起来都是常识,但令人惊讶的是,当面临最后期限时,团队如何迅速偏离这些基础原则.


Ada*_*iss 6

我喜欢第二双眼睛的方法:在我编写并测试了一些关键代码之后,我有时会要求同事专门审查它,以寻找打破它的方法.

以这种方式展现人们的创造力很有趣.:-)


Jas*_*dez 5

听起来你已经有了这两个:
快速失败.http://en.wikipedia.org/wiki/Fail-fast
失败安全.http://en.wikipedia.org/wiki/Fail-safe

这三个可能比任何其他人更好地服务于我:

尽可能避免状态.创建和使用不可变对象 - 它们更容易测试,更不容易背叛你.

不要写不必要的代码.这个很难.查看最近由Strunk和White 撰写的关于" 风格元素 "的文章.

每10分钟左右问自己:"这个笨吗?" 说实话.这个更难.

-Jason


Nat*_*ate 2

我实施了多种方法来防止错误并从错误中恢复:

1)处理所有异常。正如您所说,“处理每个错误”。如果用户单击表单上的按钮,应用程序应该不会因未处理的异常而消失(“噗”)。出于这个原因,我用通用的 try catch 包装事件处理程序。

2) 使用完整的堆栈跟踪记录错误。当我重新抛出异常时,我总是创建一个新异常并将捕获的异常添加为内部异常。我的日志记录代码递归地解开消息,这比其他方式提供了更多的细节。

3) 决定你的类是否可重用。如果没有记录下来。考虑在代码中实现一个接口,例如IRestartableIReusable。任何没有实现它的对象在使用一次后必须被丢弃。

4)永远不要假设线程安全。我经历了惨痛的教训才知道.NET 是极其多线程的。许多事件是在任意线程上处理的。用 .NET 编写的给定应用程序可能会同时执行许多线程,并且没有一行代码显式创建线程。

5) 保持变量范围尽可能窄。在使用对象的地方实例化对象,而不是在方法开头的大块中实例化对象。您可能会缩短对象的寿命,并且您不会忘记位于类或方法顶部的巨大块中不需要或重用的变量。

5)很简单,但我仍然看到它发生。像躲避瘟疫一样避免全局变量。我见过带有数百个未使用/重用变量的代码。弄清楚和重构是一团糟。