程序员的README——编写可维护的代码(一)

news/2024/10/28 23:24:37/

用户行为不可预测,网络不可靠,事情总会出错。生产环境下的软件必须一直保持可用状态。
编写可维护的代码有助于你应对不可预见的情况,可维护的代码有内置的保护、诊断和控制。
切记通过安全和有弹性的编码实践进行防御式编程来保护你的系统,安全的代码可以预防许多故障,而弹性的代码可以在故障发生时,进行恢复。
一个可维护的系统具有可配置参数和系统工具。

防御式编程

编写拥有良好防御性代码是一种对那些运行你代码的人(包括自己)富有同情心的表现。
防御性的代码较少发生故障,就算它发生故障,也更有可能恢复。
安全的代码利用编译时的校验来避免运行时的故障,使用不可变的变量、限制范围的访问修饰符和静态类型检查工具来防止bug。在运行时,检验输入的值可以避免出现意外。有弹性的代码使用异常处理中最佳实践来优雅地处理故障。

避免空值

切记在方法的开头进行空值检查,在条件允许的情况下,可以使用NotNull注解和编程语言中类似的特性。在前面校验变量是否为空意味着后面的代码可以安全地假定它是在处理真实的值,这将使你的代码更干净更易读。
空对象模式会使用一个对象来代替空值。这种模式的一个例子:对于某个搜索方法,当它没有任何返回值的时候,会返回一个空列表而不是null。返回空列表可以允许调用者安全地遍历这个返回值,而不需要特别的代码来处理空结果集。

保持变量不可变

不可变量的变量可以防止意外的修改。
使用常量可以使并发编程变得更简单。
当编译器或者运行的环境知道变量不会改变就更有效率。

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

TS中少用any。
静态类型检查器在代码执行之前会使用类型提示来发现潜在的bug,可以防止在运行时出现bug。

验证输入

永远不要相信你的代码接收的输入。
可以借用Attribute,实现参数的校验。

也不要忽视安全问题。
恶意用户试图在输入中注入代码或SQL,或冲爆缓冲区以获得对你应用程序的控制权限
使用成熟的类库和框架来防止攻击。

善用异常

不要使用特殊的返回值来标识错误类型,异常可以比null或-1携带更多信息。

异常要有精确含义

准确的异常使代码更容易使用。
尽可能的使用内置的异常,避免创建通用的异常,使用异常处理来应对故障,而不是控制应用程序的运行逻辑。
当开发人员创建异常时,不用通用。通用的异常很难处理,因为开发人员不知道正在面对什么样的具体问题。

早抛晚捕

“早抛”意味着在最接近错误的地方引发异常,这样开发人员就能迅速地定位代码。
“晚捕”意味着在能处理异常的地方捕获它。

智能重试

重试的谨慎的做法是“退避”,比如等待时间是retrynumber^2。
如果所有的客户端同时进行“退避”。他们会在同一时间重新发起请求,这称为“惊群效应”。
这个时候,可以在退避策略中加入抖动。引入随机性可以分散请求,降低发生“踩踏”的可能性。
不要盲目的重试所有失败的调用,尤其是那些写入数据或可能触发业务流程的调用。

最好是让应用程序在遇到其在设计时没有想到的错误时崩溃,这被称为“快速失败”。不仅要快速失败,还要尽可能的提示用户。

构建幂等系统

处理重试最好的方法是构建幂等系统。
一个幂等的操作是可以被进行多次并且仍然产生相同成果的操作。

及时释放资源

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

操作系统对文件句柄和网络套接字有限制,一旦超出限制,所有的文件和网络都不能再打开。

网络套接字泄露,是指在使用后没有关闭他们。网络套接字的泄露会使无用的连接一直存在,从而填满连接池。


http://www.ppmy.cn/news/1387510.html

相关文章

苍穹外卖-day08:导入地址簿功能代码(单表crud)、用户下单(业务逻辑)、订单支付(业务逻辑,cpolar软件)

苍穹外卖-day08 课程内容 导入地址簿功能代码用户下单订单支付 功能实现:用户下单、订单支付 用户下单效果图: 订单支付效果图: 1. 导入地址簿功能代码(单表crud) 1.1 需求分析和设计 1.1.1 产品原型&#xff08…

k8s helm 删除 tiller

kuberneter 上面装了 helm 想卸载还并不是那么简单, 参考 stackoverflow 回复 kubectl get -n kube-system secrets,sa,clusterrolebinding -o name|grep tiller|xargs kubectl -n kube-system delete kubectl get all -n kube-system -l apphelm -o name|xargs kubectl dele…

一文解读ISO26262安全标准:功能安全管理

一文解读ISO26262安全标准:功能安全管理 1 安全生命周期1.1 概念阶段1.2 产品开发阶段1.3 生产发布后续阶段 2 安全管理的角色和职责3 安全活动的裁剪4 安全活动的评审5 安全活动的评估6 交付物 下文的表中,一些方法的推荐等级说明: “”表示…

Python面试笔记

Python面试笔记 PythonQ. Python中可变数据类型与不可变数据类型,浅拷贝与深拷贝详解Q. 解释什么是lambda函数?它有什么好处?Q. 什么是装饰器?Q. 什么是Python的垃圾回收机制?Q. Python内置函数dir的用法?Q…

springboot 查看和修改内置 tomcat 版本

解析Spring Boot父级依赖 去到项目的根pom文件中&#xff0c;找到parent依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>${springboot.version}…

Redis是如何实现持久化的?请解释RDB和AOF持久化方式的区别和优缺点。Redis是单线程还是多线程的?为什么Redis使用单线程模型仍然能保持高性能?

Redis是如何实现持久化的&#xff1f;请解释RDB和AOF持久化方式的区别和优缺点。 Redis实现持久化主要有两种方式&#xff1a;RDB&#xff08;Redis DataBase&#xff09;和AOF&#xff08;Append Only File&#xff09;。这两种方式的主要区别在于它们的持久化机制和适用场景。…

蓝桥杯day2刷题日记

由浅入深 P8717 [蓝桥杯 2020 省 AB2] 成绩分析 #include <iostream> using namespace std; int num; double sum; int maxs,mins; int n;int main() {mins1e9;maxs-1e9;sum0;cin>>n;for(int i0;i<n;i){cin>>num;sumnum;maxsmax(maxs,num);minsmin(mins…

探索未来科技:量子计算的前沿与挑战

随着信息技术的飞速发展&#xff0c;传统的计算模式已经难以满足日益增长的数据处理需求。在这个背景下&#xff0c;量子计算作为一种全新的计算模式&#xff0c;逐渐进入人们的视野。本文将探讨量子计算的前沿技术以及在软件开发领域所面临的挑战。 量子计算的前沿技术 量子计…