读程序员的README笔记04_防御式编程

这篇具有很好参考价值的文章主要介绍了读程序员的README笔记04_防御式编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

读程序员的README笔记04_防御式编程文章来源地址https://www.toymoban.com/news/detail-749476.html

1. 编写可维护的代码

1.1. 生产环境下的软件必须一直保持可用的状态

1.1.1. 用户行为不可预测,网络不可靠,事情总会出错

1.2. 编写可维护的代码有助于你应对不可预见的情况,可维护的代码有内置的保护、诊断和控制

1.2.1. 切记通过安全和有弹性的编码实践进行防御式编程来保护你的系统,安全的代码可以预防许多故障,而有弹性的代码可以在故障发生时进行恢复

1.2.1.1. 切记让你的代码安全而有弹性

1.2.1.2. 编写拥有良好防御性的代码是一种对那些运行你的代码的人(包括你自己!)富有同情心的表现

1.2.1.3. 防御性的代码较少发生故障,就算它发生故障,也更有可能恢复

1.2.1.4. 安全的代码利用编译时的校验来避免运行时的故障,使用不可变的变量、限制范围的访问修饰符和静态类型检查工具来防止bug

1.2.2. 一个可维护的系统具有可配置参数和系统工具

1.2.3. 你需要在不修改代码的情况下控制系统

1.2.4. 将日志、指标和跟踪的调用信息暴露出来可以方便诊断

2. 避免空值

2.1. 没有值的变量默认为null(或nil、None或其他一些变体)

2.2. 通过检查变量是否为空,通过使用空对象模式(null object pattern),或通过可选类型(option type)来避免空指针异常

2.2.1. 空对象模式会使用一个对象来代替空值

2.3. 切记在方法的开头进行空值检查

2.3.1. 可以使用NotNull注解和编程语言中类似的特性

2.3.2. 在前面校验变量是否为空意味着后面的代码可以安全地假定它是在处理真实的值,这将使你的代码更干净、更易读

3. 保持变量不可变

3.1. 不可变的变量一旦被赋值就不能被改变

3.1.1. 不可变的变量可以防止意外的修改

3.2. 使用不可变的变量可以使并发编程变得更简单,而且当编译器或运行环境知道变量不会改变时就可以运转得更有效率

4. 使用类型提示和静态类型检查器

4.1. 限制变量可以被赋的值

4.2. 静态类型检查器在代码执行之前会使用类型提示来发现潜在bug,所以配合静态类型检查器一起使用,你就可以防止运行时出现故障

5. 验证输入

5.1. 永远不要相信你的代码接收的输入

5.2. 校验输入的值可以避免出现意外

5.3. 开发人员、有问题的硬件和人为的错误都会破坏输入的数据

5.3.1. 计算机硬件并不总值得信赖,网络和磁盘可能会损坏数据

5.3.2. 不要忽视安全问题,外部输入是危险的

5.3.2.1. 恶意用户可能试图在输入中注入代码或SQL,或撑爆缓冲区以获得对你的应用程序的控制权限

5.4. 通过校验输入的正确性去保护你的代码

5.4.1. 用先决条件、校验和(checksum)以及校验数据合法性

5.4.1.1. 如果你需要强大的耐久性保证,使用校验和的方式来检查数据没有意外的变化

5.4.2. 套用安全领域中的最佳实践

5.4.2.1. 强制转义输入的字符来防止SQL注入攻击

5.4.2.2. 在使用strcpy(特别是strncpy)等命令操作内存时,明确地设置缓冲区的大小,以防止缓冲区溢出

5.4.2.3. 使用广泛采用的安全与密码类库或协议,而不是自己去编写这样的类库或协议

5.4.2.4. 熟悉开放式Web应用程序安全项目(open Web application security project,OWASP)的十大安全报告以快速建立你的安全知识体系

5.4.3. 使用工具来发现常见的错误

5.4.3.1. 使用成熟的类库和框架来防止跨站脚本攻击

5.4.4. 尽可能地提早拒绝不良输入

5.5. 使用前置条件和后置条件的方式来校验方法中输入的变量

5.5.1. 当你使用的数据类型不能完全地捕获有效的变量值时,可以使用校验前置条件的类库和框架

6. 善用异常

6.1. 有弹性的代码使用异常处理中的最佳实践来优雅地处理故障

6.2. 不要使用特殊的返回值来标识错误类型(如null、0、−1等)

6.3. 异常要有精确含义

6.3.1. 精确的异常使代码更容易使用

6.3.2. 尽可能地使用内置的异常,避免创建通用的异常

6.3.2.1. 如果一个内置的异常可以描述问题,就不要创建自定义的异常

6.3.2.2. 当你创建自己的异常时,不要把它们弄得太通用

6.3.2.2.1. 通用的异常很难处理,因为开发人员并不知道他们正面临什么样的具体问题

6.3.3. 使用异常处理来应对故障,而不是控制应用程序的运行逻辑

6.3.3.1. 不要在应用程序的运行逻辑中使用异常

6.3.4. 使用异常来跳出方法常常令人困惑,并且使代码难以调试

6.3.4.1. 你的代码是不出人意料的,而不是聪明的

6.4. 早抛晚捕

6.4.1. 遵循“早抛晚捕”的原则来处理异常

6.4.2. “早抛”意味着在尽可能接近错误的地方引发异常,这样开发人员就能迅速地定位相关的代码

6.4.3. “晚捕”意味着在调用的堆栈上传播这个异常,直到你到达能够处理异常的程序的层级

7. 智能重试

7.1. 在故障发生之后,系统处于什么状态并不总显而易见

7.1.1. 面对一个错误时,适当反应往往是简单地再试一次就好

7.1.2. 不要盲目地重试所有失败的调用,尤其是那些写入数据或可能触发一些业务流程的调用

7.2. 最单纯的重试方法是捕捉到一个异常马上就进行重试

7.3. 谨慎的做法是使用一种叫作“退避”(backoff)的策略

7.3.1. 退避会非线性地增加休眠时间(通常使用指数退避,如(retry number)^2)

7.4. 构建幂等系统

7.4.1. 处理重试的最好方法是构建幂等系统

7.4.2. 一个幂等的操作是可以被进行多次并且仍然产生相同结果的操作

8. 及时释放资源

8.1. 当故障发生后,要确保清理所有的资源,释放你不再需要的内存、数据结构、网络套接字和文件句柄

8.2. 所谓网络套接字泄露,是指在使用后没有关闭它们

8.2.1. 网络套接字泄露会使无用的连接一直存在,从而填满连接池

到了这里,关于读程序员的README笔记04_防御式编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 读程序员的README笔记09_代码评审

    4.4.1.1. walk-through 4.4.1.2. 一种面对面的会议,开发人员在会上共享他们的屏幕,并引导队友了解正在进行的修改内容 4.4.1.3. 是启发想法和让你的团队适应代码修改的好方法 5.1.2.1. 如果紧急度不明确,请询问提交者 5.4.4.1. SQL注入攻击、敏感数据泄露和跨站脚本攻击的漏洞

    2024年02月05日
    浏览(54)
  • 读程序员的README笔记10_软件交付(上)

    3.1.1.1. 打包一个构件称为发布 3.1.3.1. 部署的软件还不能被用户访问 3.1.3.1.1. 只是被安装了而已 3.1.3.2. 一旦部署,软件就会通过将用户转移到新的软件上而进行展开 3.1.4.1. 交付过程是更大的产品开发周期中的一部分 6.10.2.1. 每季度或每年发布一次

    2024年02月04日
    浏览(160)
  • 读程序员的README笔记01_学习如何学习

    6.3.2.1. 错误是不可避免的。成为一名软件工程师的路途艰辛,我们有时会失败 6.5.4.1. 代码从不说谎。注释有时却会。 6.5.4.1.1. Code never lies. Comments sometimes do 6.5.4.1.2. 去读源代码,因为它并不总是与设计文档相吻合 6.5.4.1.3. 不要只读你自己的代码库,还要去阅读高质量的开

    2024年02月05日
    浏览(54)
  • 读程序员的README笔记11_软件交付(下)

    1.3.5.1. 通过持续交付,人力被完全从部署环节中移除 1.3.5.2. 打包、测试、发布、部署,甚至展开环节都是自动化的 1.3.6.1. Puppet、Salt、Ansible和Terraform等现成的解决方案可以与现有的工具集成,并且它们是专门为了自动化部署而设计的 1.4.4.1. 只需再次指向旧的版本 1.5.1.1. 

    2024年02月04日
    浏览(61)
  • 读程序员的README笔记14_技术设计流程(下)

    1.4.2.1. 该项目将需要至少一个月的工程时间 1.4.2.2. 变更将对软件的扩展和维护产生长期的影响 1.4.2.3. 变更将显著影响其他团队 1.5.2.1. 设计文档是一种工具,可以帮助你思考、获得反馈、让你的团队了解情况、培养新的工程师,并推动项目规划 1.5.5.1. 阅读大量的设计文档

    2024年02月04日
    浏览(44)
  • 读程序员的README笔记18_职业生涯规划

    3.1.5.1. 他们的工作职责之一是管理他们的团队,而管理的一部分就是对你投入时间 3.1.5.2. 对管理者而言,反复取消一对一面谈可以是一个有价值的信号 3.3.2.1. 每个目标都附有3到5个关键结果,它们是标志着目标达成的具体指标 3.3.2.2. 不要把关键结果变成待办事项清单 3.

    2024年02月04日
    浏览(55)
  • 读程序员的README笔记05_日志、监控与配置

    6.1.1.1. 测量的是某个事件发生的次数 6.1.1.2. 通过使用计数器获得缓存命中数和请求总数,你就可以计算出缓存命中率 6.1.2.1. 一个基于时间点的测量值 6.1.2.2. 既可以上升又可以下降 6.1.3.1. 根据事件的大小幅度分成不同的范围 6.1.3.2. 每一个范围都会有一个计数器,每当某

    2024年02月05日
    浏览(54)
  • 读程序员的README笔记13_技术设计流程(上)

    3.4.1.1. 外界干扰是深度工作的“杀手” 3.4.1.2. 避免所有的交流方式 3.4.1.2.1. 关闭聊天 3.4.1.2.2. 关闭电子邮件 3.4.1.2.3. 禁用电话通知 3.4.1.2.4. 换个地方坐 3.4.2.1. 有形产出是一份设计文档 4.2.3.1. 如果有一个以上的问题,询问哪些问题是最优先的 4.3.7.1. 注意与外人交流时不

    2024年02月04日
    浏览(71)
  • 读程序员的README笔记12_On-Call

    4.4.2.1. 回应不一定代表解决方案 4.4.3.1. 每次更新时,提供一个新的时间预估 4.5.3.1. 如果请求者没有回应,就说你将在24小时内因缺乏回应而关闭该任务票,然后真的这样做 5.3.1.1. 工程师必须找到问题,确定其严重性,并确定谁能修复它 5.3.1.2. 确认问题并了解其影响,以

    2024年02月04日
    浏览(44)
  • 读程序员的README笔记17_构建可演进的架构(下)

    1.3.3.1. 开发人员可以只专注于和自己相关的字段,因为它们会继承其他字段的默认值 1.3.3.2. 默认值可使大型API在感觉上很小巧 1.4.1.1. OpenAPI通常用于RESTful服务 1.4.1.2. non-REST服务则使用Protocol Buffers、Thrift或类似的接口定义语言(interface definition language,IDL) 1.4.1.3. 接口定义工

    2024年02月04日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包