读书笔记:《代码大全第2版》 05.创建高质量的代码之防御式编程

《代码大全2》读书笔记 这本书的核心思想是: 管理软件项目的本质是管理复杂性。 代码承载的是人与人之间的交流。 第一部分 打好基础第2章 隐喻重要的研发成果常常产自类比(analogy)。通过把你不太理解的东西和一些你较为理解、且十分类似的东西做比较,你可以对这些不太理解的东西产生深刻的理解。这种使用隐喻的方法叫做“建模”。目前最合适隐喻:建造软件(Building Software)第3章 前期准备( Measure T 阅读详情

防御式编程

防御式编程的主要思想:方法应该不因传入错误数据而被破坏,哪怕是由其他方法产生的错误数据。

防御式编程的最佳方式就是在一开始不要在代码中引入错误。使用迭代、编码前先写伪代码、写代码前先写测试用例、低层设计检查等活动,都有助于防止引入错误。

1、保护程序免遭非法输入数据的破坏

  • 检查所有来源于外部的数据值(确保外部数据合法,在允许的范围内)
  • 检查子程序所有输入参数的值
  • 决定如何处理错误的输入数据

2、断言

断言(Assertion)是在开发期间使用的,让程序在运行时进行自检的代码(通常是一个子程序或者宏)。断言为真,表示程序运行正常,断言为假,则意味着它已经在代码之中发现了意料之外的错误。

断言可以用来处理如下的假定:

  • 输入参数或者输出参数的取值处于预期的范围内
  • 子程序开始(或者结束)执行时,文件或流的读写位置处于开头或者结尾处
  • 子程序开始(或者结束)执行时,文件或流是处于打开(或关闭)的状态
  • 文件或流已用只读、只写或可读可写方式打开
  • 仅用于输入的变量的值没有被子程序所修改
  • 指针非空
  • 传入子程序的数组或其它容器至少能容纳X个数据元素
  • 表已初始化,存储着真实的数值
  • 子程序开始(或结束)执行时,某个容器是空的(或满的)
  • 一个经过高度优化的复杂子程序的运算结果和相对缓慢但代码清晰的子程序的运算结果一致

使用断言的指导性建议:

  • 用错误处理代码来处理预期会发生的状况,用断言来处理绝不应该发生的状况
    • 错误处理代码是在编码时能预料到的不太可能经常发生的非正常情况,通常用来检查有害的输入数据
    • 断言用在那些你知道绝对不会发生的事情上,但是人难免会犯错,所以捕捉的是程序员自己的错误
  • 避免把需要执行的代码放到断言中
  • 用断言来注解并验证先条件和后条件
    • 前条件是子程序或类的调用方代码在调用子程序或实例化对象之前要确保为真的属性
    • 后条件是子程序或类的在执行结束后要确保为真的属性
  • 对于高健壮性的代码,应该先使用断言再处理错误

3、错误处理技术

通常断言用来处理代码中不应发生的错误,错误处理代码用来处理预料中可能发生的错误。

常用的错误处理技术:

  1. 返回中立值(比如数值计算可以返回0,字符串操作可以返回空字符串)
  2. 换用下一个正确的数据
  3. 返回与前次相同的数据
  4. 换用最接近的合法值(比如超过最大量程的数据就当做最大的量程)
  5. 把警告信息记录到日志文件中
  6. 返回一个错误码(将不能处理的部分交给上游程序处理)
  7. 调用错误处理子程序或对象
  8. 当错误发生时显示出错消息
  9. 用最妥当的方式在局部处理错误
  10. 关闭程序(在一些重要的场合,关闭程序比给出错误的数据更好)

正确性意味着永远不返回不准确的结果,哪怕不返回结果也比返回不准确的结果好。
健壮性则意味着要不断尝试采取某些措施,以保证软件可以持续地运转下去,哪怕有时做出一些不够准确的结果。

4、异常

异常是把代码中的错误或异常事件传递给调用方代码的一种特殊手段。

异常用得好的话可以降低复杂度,但如果用得不好的话会使代码变得几乎无法理解。

使用异常时的注意事项:

  • 用异常通知程序的其他部分,发生了不可忽略的错误
  • 只在真正例外的情况下才抛出异常
  • 不能用异常来推卸责任,错误能局部处理就处理掉
  • 避免在构造函数中抛出异常,除非你在同一地方把它们捕获
  • 在恰当的抽象层次抛出异常(P200)
  • 在异常消息中加入关于导致异常发生的全部消息(比如抛出数组下标越界异常时,应指明其上界、下界和非法的下标值等信息)
  • 避免使用空的catch语句
  • 了解所用函数库可能抛出的异常
  • 考虑创建一个集中的异常报告机制(比如Spring的全局异常处理机制)
  • 把项目中对异常的使用标准化
  • 考虑异常的替换方案(有些错误可以使用错误处理技术就使用,而不要因为语言有异常处理机制就用异常)

5、隔栏(Barricade)

让软件的某些部分处理“不干净”的数据,而让另一些部分处理“干净的”数据,即可让大部分代码无须再担负检查错误数据的职责。就好似进入手术室之前的都要经过消毒处理,外科医生默认接收到的手术器材都是安全的。

隔栏外部的程序使用错误处理技术,在那里对数据的做任何假定都是不安全的;隔栏内部的程序使用断言技术,如果此时内部的程序有错误,那就是程序的错误而不是数据的错误了。

6、线上代码中该保留多少防御式代码

  • 保留那些检查重要错误的代码
  • 去掉检查细微错误的代码
    • "去掉"指使用版本控制、预编译开关等技术来编译不包含这段特定代码的程序,而不是永久地删除
  • 去掉可以导致程序硬性崩溃的代码
  • 保留可以让程序稳妥地崩溃的代码
  • 为你的技术支持人员记录错误信息
  • 确认留在代码中的错误消息是友好的

7、总结

过度的防御式编程也会引起问题。如果你在每一个能想到的地方用每一种能想到的方法检查从参数出入的数据,那么你的程序员将会变得臃肿而缓慢,增加软件的复杂度。

核对表

SAP Parallel Accounting(平行分类账业务)配置及操作手册【适用于多国家会计准则】 在SAP系统中,分类账(Ledger)是用于会计核算的核心概念,它允许企业根据不同的会计原则和货币进行财务记录。定义分类账是配置平行账(Parallel Accounting)的第一步。分类账的创建:通过事务代码OX18可以创建新的分类账。通常,一个SAP系统会有一个主分类账(如0L),它代表法定会计和实时传输至管理会计(CO)的账本。分类账属性:在创建分类账时,需要定义其属性,如会计年度变式、货币、会计原则等。这些属性将决定分类账的核算规则和适用性。 阅读详情

相关推荐

高光谱目标检测论文学习(1)—— Hyperspectral Target Detection:Hypothesis Testing,SNR and SA Theories

前言 从这篇开始,将会学习一些高光谱目标检测的论文,我仍然把这篇文章放到了读论文专栏里,但是不对其进行顺序编号了,因为这个方向是比较小众的。今天来学习这篇TGRS2021的最新论文,讲的比较详细,相对比较适合初学者入门。我之前也写过一些有关目标检测的论文,但是高光谱目标检测(HTD)和之前的我们学的目标检测是不同的,因为其检测的对象不是普通摄像头得来的数字图像,而是高光谱遥感图像。其包含了很多光谱信息,而光谱信息本身经过处理后就可以作为特征,因此很多情况下就无需使用广义的目标检测问题中的卷积神经网络等方式去

MrBamboo2000的博客 7481

12个防御性编程“技巧”,“开猿节流”的克星

降低代码可读性的方式方法 包括但不限于以上12种;像二狗这样的程序员包括但不限于二狗。大家不要向二狗学习,因为他是真的。

竹林幽深 670

数据库迁移策略实战:MySQL到PostgreSQL

数据库迁移是一项复杂且细致的任务,需要充分的准备工作、合适的迁移策略和严格的验证与优化步骤。通过选择合适的迁移工具、进行手动迁移和应用程序适配、以及迁移后的验证与优化,可以确保数据迁移的成功和业务的连续性。希望本文的分享能够为大家在MySQL到PostgreSQL的数据库迁移实战中提供一些有用的参考和启示。

shejizuopin的博客 1730

防御性编程技巧

在防御性编程的大框架之下,有许多常识性的规则。人们在想到防御性编程的时候,通常都会想到“断言”,这没有错。我们将在后面对此进行讨论。但是,还是有一些简单的编程习惯可以极大地提高代码的安全性。尽管看上去像是常识,但是这些规则却往往被人们忽视,这就是为什么世界上并不缺少低质量软件的原因。只要程序员们警惕起来,受到足够的督促,更高的安全性和可靠的开发很容易就能够实现。在下面的几页中,将列出防御性编程的一些规则。我们将先从粗略的概览开始,整体地描述防御的技巧、过程和步骤。随着讨论的深入,我们会加入更多的细节,进一步

everpenny的专栏 8654

骑砍2霸主MOD开发(9)-游戏大地图(MapScene)

Settlement类型由town,castle,castle_village,village,hideout五种类型组成,通过对GameEntity中添加tag实现类型的加载.大地图中军团(MobileParty)的移动速度,AI寻路,食物消耗等均和当前MobileParty所处地形有关,地形统一被定义为TerrainType,类型有森林,荒漠等.MapScene.Read("Main_map", ref sceneInitializationData, "") 装载Main_map大地图。

骑砍战团&霸主MOD开发 1621

如何提升代码的安全性 —— 代码防御性编程的十条技巧

顾名思义,防御性编程是一种细致、谨慎的编程方法。为了开发可靠的软件,我们要设计系统中的每个组件,以使其尽可能的”保护”自己。我们通过明确地在代码中对设想进行检查,这是一种努力,防止我们的代码以将会展现错误行为的方式被调用。防御性编程使我们可以尽早的发现较小的问题,而不是等到它们发展成大的灾难的时候才发现。其开发软件的过程是: 下面总结了一些防御性编程的反对和支持者的意见:采用良好的编码风格,来防范大多数编码错误。如:const关键字: 关键字const可以给读你代码的人传达非常有用的信息。例如,在函数的形参

ZP1015 3254

34、婴儿监视器应用开发指南

本文详细介绍了基于 ESP32 和 Edge Impulse 开发婴儿监视器应用的全过程,涵盖音频处理、机器学习推理、ESP RainMaker 平台集成以及内存监控等功能。通过实现 AppAudio、AppRmaker 和 AppMem 三个核心类,完成了婴儿哭声的实时检测与远程通知,并通过合理的内存管理优化,有效节省了 ESP32 的内部 RAM 资源。文章还提供了完整的代码示例和配置说明,适用于物联网和嵌入式 AI 应用开发爱好者参考学习。

python9snake的博客 93

不被“开猿节流”的12个防御性编码技巧

你好,我是坚持分享干货的 EarlGrey,翻译出版过《Python编程无师自通》、《Python并行计算手册》等技术书籍。如果我的分享对你有帮助,请关注我,一起向上进击。创作不易,希望大家给一点鼓励,把公众号设置为“星标”,给文章点个“赞”和“在看”,谢谢大家啦~本文分享自掘金社区,原文:juejin.cn/post/7286155742850449471工作六七年以来,接手过无数个烂摊子,屎山...

codingpy的博客 422

SpringCloud最新最全面试题

在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息比如服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何RPC远程框架中,都会有一个注册中心存放服务地址相关信息(接口地址)。

qq_38196449的博客 4328

从 VL02N 拣配到 ABAP 自动化,读懂 SD_DELIVERY_UPDATE_PICKING 的位置和风险

文章摘要:SAP SD模块中,SD_DELIVERY_UPDATE_PICKING函数模块用于处理出库交货单的拣配确认,更新交货项目的拣配数量。该函数适用于未启用WM/EWM的传统SD流程,能确保拣配状态与标准交货处理逻辑同步,比直接修改数据库更安全。但在S/4HANA Cloud等新环境中,应优先使用API_OUTBOUND_DELIVERY_SRV等公开发布接口。使用该函数时需注意参数完整性和按交货单整体处理的原则,避免逐项提交导致的数据不一致问题。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 243

防御式编程

作为一名程序猿,或软件开发工程师,或技术工人,首要任务就是编写好代码(编写高质量代码)。那么编写好代码有什么用呢?靠编写好代码可以维持你的工作(基础),可以去影响你的同事和领导(让你同事和领导从代码中认为你是一个技术能力靠谱的人)(进阶),那么继续下去,你可能参与团队或部门或公司重要的项目或事情(高级),再下去,你就可以在团队和部门中提高你的技术影响力,从而你更有机会获得更多的资源(时间和人力)和更多的成就(升职和加薪)。当然,也有可能在你工作的环境中,编写好代码和编写坏代码结果一样。

wangjiang 2112

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

代码大全 读书笔记

代码大全读书笔记Chap7-9第 7 章 高质量的子程序7.1 章节概述7.2 关键内容7.2.1 概念相关7.2.2 关键内容7.3 思维导图第8 章 防御式编程8.1 章节概述8.2 关键内容8.2.1 概念相关8.2.2 关键内容8.3 思维导图第 9 章 第9章伪代码编程过程9.1 章节概述9.2 关键内容9.2.1 概念相关9.2.2 关键内容9.3 思维导图 第 7 章 高质量的子程序 7.1 章节概述 本章主要介绍何为高质量的子程序,以及如何构建高质量的子程序的内容。介绍的内容包括为何创建子程

GorMing 的博客 411

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

《代码大全》读书笔记

文章目录第1部分第2部分第7章 高质量的子程序7.3 好的子程序名字7.5 如何使用子程序参数7.6 使用函数时要特别考虑的问题第8章 防御式编程第9章 伪代码编程过程创建类和子程序的步骤概述第3部分 变量第10章 使用变量的一般事项10.1 数据认知10.2 轻松掌握变量定义10.3 变量初始化原则10.4 作用域10.5 持续性10.6 绑定时间10.7 数据类型和控制结构之间的关系第11章 变量名的力量11.1 选择好变量名的注意事项11.2 为特定类型的数据命名11.3 命名规则的力量11.4 非正

淡水瑜的博客 1973

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

读书笔记:《代码大全第2版》 06.创建高质量的代码之伪代码编程

文章目录伪代码编程过程1、类和子程序的创建过程2、伪代码3、通过伪代码创建子程序3.1 设计子程序3.2 编写子程序的代码3.3 检查代码3.4 收尾工作4、总结 伪代码编程过程 创建类和子程序通常都是一个迭代的过程。在创建子程序的过程中获得的认识常常会反过来影响类的设计。 1、类和子程序的创建过程 类的创建过程 子程序的创建过程 2、伪代码 如何编写一段伪代码: 用类似英语的语句来精确描述...

github_39353936的博客 505

Code Complete《代码大全》读书笔记

最近拜读了《代码大全》,这部大块头确实经典,涉及到了软件开发的方方面面。有点后悔没有早些阅读,值得推荐给还没读过的朋友。它并不是针对某种语言的武林秘籍,应该可以看作是基础内功修炼吧。 笔记比较简略,只供简单查阅~ 一、开发前期准备相关 1.需求阶段: 发现错误的时间要尽量接近进入该错误的时间。由于需求是首先进行的活动,所以需求阶段引入的缺陷可能在系统中潜伏的时间最长,代价也更昂贵。 如果没有一个良好的问题定义,你努力解决的可能是一个错误的问题。 明确的需求有助于确保用户驾驭系统的能力; ...

Peter的博客 2384

【代码大全】 读书笔记

文章目录第七章 高质量的子程序1.创建子程序的理由2.内聚性3.好的子程序名字4.子程序的参数5.使用函数时要注意的问题第八章 防御式编程1.保护程序免遭非法输入数据的破坏2.断言 assertions3.错误代码的处理4.异常的处理 exception5.各种错误的处理机制:第十章 使用代码的一般事项变量初始化原则作用域 : 使变量引用局部化第十一章 变量名的力量1.注意事项2.变量的...

wxq_1993的博客 848

代码大全2读书笔记【6-8章】

ADT:描述类的数据和操作(子程序) 好处:能够隐藏实现细节和内部数据,降低耦合,增加可读性,方便维护(发现错误不用一个个地方修改,只用修改一处,就是这个方法)。类的接口应该展现一致的抽象层次 根据类就大概能知道类的作用 没有良好抽象的类,各类型混杂的方法职能不专一,会让程序越来越难以理解 一定要理解类所实现的抽象是什么 一些类很相似,需要理解类的接口需要的抽象是哪一个。可能使用的时候我们暂时都可以用,但是一定要仔细考虑。提供成对的服务 创建子程序的时候,需要考虑是否需要创建与之互补的另一个操作。把不相关的

qq_35515283的博客 998

代码大全第二版读书笔记 第二部分-创建高质量的代码 八、防御式编程

防御式编程(P187) 防御式编程并不是说让你在编程时持“防备批评或攻击”的态度——“它就是这么工作!”你永远不能预先确定代码中会出什么错误。其核心想法是要承认程序都会有问题,都需要被修改,聪明的程序员应该根据这一点来编程序。 1.保护程序免遭受非法输入数据的破坏 对已经形成产品的软件而言,仅仅“垃圾进,垃圾出”还不够。不管进来什么,好的程序都不会生成垃圾。 通常有三种方法来处

CODING 919

代码大全2读书笔记

代码大全2读书笔记 作者写这本书的首要目的,就是希望缩小本行业中一般商用实践与大师级人物及专家们之间的知识差距。许多强大的编程技术在被编程领域的大众接触之前,都已在学术论文和期刊里尘封了多年。 成功学大师拿破仑希尔说过:什么思想决定什么样行为;什么样行为决定什么样的习惯,什么样的习惯决定什么样性格,而什么性格决定什么样的命运。 本书给我印象较深刻的章节有:前期准备、软件构建...

weixin_30409849的博客 422

代码大全-读书笔记

一、打好基础 1、人生苦短,当有大量更好到选择摆在你面前的时候,在一个蛮荒的软件企业中工作是不明智的。 --3.1 前期准备的重要性 2、作为技术雇员,你的一部分工作就是培训周围的非技术人员,讲解开发过程。 3、程序员是软件食物链的最后一环。架构师吃掉需求,设计师吃掉架构,而程序员则消化设计。 4、发现错误的时间要尽可能接近引入该错误的时间。缺陷在软件食物链里面呆的时间越长,它...

diankou2456的博客 175

【值得反复读3遍的书】程序员的百科全书——《代码大全》读书笔记

程序员的百科全书——《代码大全》读书笔记

追寻上飞的博客 853
上一篇: 读书笔记:《代码大全第2版》 04.创建高质量的代码之高质量的方法
下一篇: 读书笔记:《代码大全第2版》 06.创建高质量的代码之伪代码编程
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值