首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防御性编程技术

防御性编程技术
EN

Software Engineering用户
提问于 2011-01-02 09:21:20
回答 3查看 10.2K关注 0票数 7

我试图找出一个软件工程的元素,我认为在CS或SE的典型本科课程工作中,这些元素被忽略了,没有得到强调,也没有教授。我想出的是防御性编程的概念。我想听听社区在防御计划和/或你经常使用的特定技术上的选择。另外,我想知道是否有任何特定于语言的技术。

编辑:

只是为了更清楚。我不是在找防御性项目的教训。我明白这是什么。我希望这能更多地讨论社区成员使用或发现有价值的不同方法。以下是我使用的一些技巧。请记住,我几乎完全使用C。

编码标准您可能一开始并不认为这与防御性编程有任何关系,但确实如此。为了举例说明,假设您的编码标准要求您在变量名称前面加上变量的类型,例如IntValue或UIntValue。该约定允许您轻松发现潜在的促销规则问题,如(IntX = IntValue * UIntValue)

对常量使用预处理宏。就我个人而言,我认为这也使您的程序更加可读性和可维护性,但它也提供了一个安全网。您可以确保在更改值时,将更新使用宏的所有代码区域。预处理器宏的其他用途也可以在代码中提供防御属性。

有些技术是内置在语言中的,如静态变量或函数声明或c++数据封装。

当然,还有更明显的问题,包括验证所有的输入和输出。

EN

回答 3

Software Engineering用户

回答已采纳

发布于 2011-01-02 14:30:03

看看代码完成2,第8章:“防御性编程”。对我来说,这是迄今为止这种技术最好的来源。小(约30页)和主要的想法在那里。

一些主要的概念严格抄袭自这本书,用我的话(所以,也许最好只是买这本书,并阅读原作:- ):

  • 检查和消毒您的投入;
  • 保护你的例行程序不受不良数据的影响。没有“垃圾入,出垃圾”;
  • 使用断言记录前条件和后条件;
  • 规范您的代码的异常处理;
  • 考虑不使用异常的一切-你可以处理错误的另一种方式,编程世界存在的,以前的异常是发明的;
  • 调试和断言在开发过程中帮助您,大多数(但不是所有)调试/断言必须在生产代码中禁用;

但对我来说,关键的概念在于您是否信任您正在使用的“其他”代码。

票数 10
EN

Software Engineering用户

发布于 2011-01-02 11:09:36

我想你的程序里永远不会有太多的断言.向类添加一些紧的不变量,并认为您使用的任何引用/指针在任何时候都是空的.

票数 6
EN

Software Engineering用户

发布于 2011-01-02 11:09:35

防御性方案编制的部分内容已被纳入公认的学习课程。防御性编程需要很多不同的东西,尽管它们都围绕着“处理意想不到的事情”。像Java和C#这样的主流语言有明显的“异常”和“断言”,它们来自于防御性编程哲学。您绝对应该在代码中使用异常。断言更多地是一种“纯粹”的防御性编程,并且不受下面的警告,您应该谨慎地使用它们(在测试代码之外),但要在适当的情况下使用。

传统防御性编程的另外两个方面现在以不同的名称处理。第一个是简单的‘安全’。我不会在这里详细讨论编写安全代码所涉及的所有内容。

另一个是“按合同设计”。由于“敏捷”的兴起,这种编程方法已经过时了,因为它被认为是过多的前端设计。造成这种情况的部分原因有两方面,首先,许多以前在命令式编程中强制执行合同的需求现在由OOP类层次结构处理,因此根本不可能进入糟糕的状态,因此没有必要检查它们。其次,许多传统的参数都需要检查参数,比如缓冲区溢出,现在运行时会自动抛出异常,因此不需要由编码器检查(运行时正在检查)。最后,在敏捷中,有一种对测试驱动开发的驱动,有时不可能为预期不会发生的情况生成单元测试。在这种情况下,一段防御性代码会导致代码覆盖率下降,这是一件坏事。

票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/33156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档