我试图找出一个软件工程的元素,我认为在CS或SE的典型本科课程工作中,这些元素被忽略了,没有得到强调,也没有教授。我想出的是防御性编程的概念。我想听听社区在防御计划和/或你经常使用的特定技术上的选择。另外,我想知道是否有任何特定于语言的技术。
编辑:
只是为了更清楚。我不是在找防御性项目的教训。我明白这是什么。我希望这能更多地讨论社区成员使用或发现有价值的不同方法。以下是我使用的一些技巧。请记住,我几乎完全使用C。
编码标准您可能一开始并不认为这与防御性编程有任何关系,但确实如此。为了举例说明,假设您的编码标准要求您在变量名称前面加上变量的类型,例如IntValue或UIntValue。该约定允许您轻松发现潜在的促销规则问题,如(IntX = IntValue * UIntValue)
对常量使用预处理宏。就我个人而言,我认为这也使您的程序更加可读性和可维护性,但它也提供了一个安全网。您可以确保在更改值时,将更新使用宏的所有代码区域。预处理器宏的其他用途也可以在代码中提供防御属性。
有些技术是内置在语言中的,如静态变量或函数声明或c++数据封装。
当然,还有更明显的问题,包括验证所有的输入和输出。
发布于 2011-01-02 14:30:03
看看代码完成2,第8章:“防御性编程”。对我来说,这是迄今为止这种技术最好的来源。小(约30页)和主要的想法在那里。
一些主要的概念严格抄袭自这本书,用我的话(所以,也许最好只是买这本书,并阅读原作:- ):
但对我来说,关键的概念在于您是否信任您正在使用的“其他”代码。
发布于 2011-01-02 11:09:36
我想你的程序里永远不会有太多的断言.向类添加一些紧的不变量,并认为您使用的任何引用/指针在任何时候都是空的.
发布于 2011-01-02 11:09:35
防御性方案编制的部分内容已被纳入公认的学习课程。防御性编程需要很多不同的东西,尽管它们都围绕着“处理意想不到的事情”。像Java和C#这样的主流语言有明显的“异常”和“断言”,它们来自于防御性编程哲学。您绝对应该在代码中使用异常。断言更多地是一种“纯粹”的防御性编程,并且不受下面的警告,您应该谨慎地使用它们(在测试代码之外),但要在适当的情况下使用。
传统防御性编程的另外两个方面现在以不同的名称处理。第一个是简单的‘安全’。我不会在这里详细讨论编写安全代码所涉及的所有内容。
另一个是“按合同设计”。由于“敏捷”的兴起,这种编程方法已经过时了,因为它被认为是过多的前端设计。造成这种情况的部分原因有两方面,首先,许多以前在命令式编程中强制执行合同的需求现在由OOP类层次结构处理,因此根本不可能进入糟糕的状态,因此没有必要检查它们。其次,许多传统的参数都需要检查参数,比如缓冲区溢出,现在运行时会自动抛出异常,因此不需要由编码器检查(运行时正在检查)。最后,在敏捷中,有一种对测试驱动开发的驱动,有时不可能为预期不会发生的情况生成单元测试。在这种情况下,一段防御性代码会导致代码覆盖率下降,这是一件坏事。
https://softwareengineering.stackexchange.com/questions/33156
复制相似问题