程序员的README——编写可维护的代码(一)
用户行为不可预测,网络不可靠,事情总会出错。生产环境下的软件必须一直保持可用状态。
编写可维护的代码有助于你应对不可预见的情况,可维护的代码有内置的保护、诊断和控制。
切记通过安全和有弹性的编码实践进行防御式编程来保护你的系统,安全的代码可以预防许多故障,而弹性的代码可以在故障发生时,进行恢复。
一个可维护的系统具有可配置参数和系统工具。
防御式编程
编写拥有良好防御性代码是一种对那些运行你代码的人(包括自己)富有同情心的表现。
防御性的代码较少发生故障,就算它发生故障,也更有可能恢复。
安全的代码利用编译时的校验来避免运行时的故障,使用不可变的变量、限制范围的访问修饰符和静态类型检查工具来防止bug。在运行时,检验输入的值可以避免出现意外。有弹性的代码使用异常处理中最佳实践来优雅地处理故障。
避免空值
切记在方法的开头进行空值检查,在条件允许的情况下,可以使用NotNull注解和编程语言中类似的特性。在前面校验变量是否为空意味着后面的代码可以安全地假定它是在处理真实的值,这将使你的代码更干净更易读。
空对象模式会使用一个对象来代替空值。这种模式的一个例子:对于某个搜索方法,当它没有任何返回值的时候,会返回一个空列表而不是null。返回空列表可以允许调用者安全地遍历这个返回值,而不需要特别的代码来处理空结果集。
保持变量不可变
不可变量的变量可以防止意外的修改。
使用常量可以使并发编程变得更简单。
当编译器或者运行的环境知道变量不会改变就更有效率。
使用类型提示和静态类型检查器
TS中少用any。
静态类型检查器在代码执行之前会使用类型提示来发现潜在的bug,可以防止在运行时出现bug。
验证输入
永远不要相信你的代码接收的输入。
可以借用Attribute,实现参数的校验。
也不要忽视安全问题。
恶意用户试图在输入中注入代码或SQL,或冲爆缓冲区以获得对你应用程序的控制权限
使用成熟的类库和框架来防止攻击。
善用异常
不要使用特殊的返回值来标识错误类型,异常可以比null或-1携带更多信息。
异常要有精确含义
准确的异常使代码更容易使用。
尽可能的使用内置的异常,避免创建通用的异常,使用异常处理来应对故障,而不是控制应用程序的运行逻辑。
当开发人员创建异常时,不用通用。通用的异常很难处理,因为开发人员不知道正在面对什么样的具体问题。
早抛晚捕
“早抛”意味着在最接近错误的地方引发异常,这样开发人员就能迅速地定位代码。
“晚捕”意味着在能处理异常的地方捕获它。
智能重试
重试的谨慎的做法是“退避”,比如等待时间是retrynumber^2。
如果所有的客户端同时进行“退避”。他们会在同一时间重新发起请求,这称为“惊群效应”。
这个时候,可以在退避策略中加入抖动。引入随机性可以分散请求,降低发生“踩踏”的可能性。
不要盲目的重试所有失败的调用,尤其是那些写入数据或可能触发业务流程的调用。
最好是让应用程序在遇到其在设计时没有想到的错误时崩溃,这被称为“快速失败”。不仅要快速失败,还要尽可能的提示用户。
构建幂等系统
处理重试最好的方法是构建幂等系统。
一个幂等的操作是可以被进行多次并且仍然产生相同成果的操作。
及时释放资源
当故障发生后,要确保清理所有资源,释放你不在需要的内存、数据结构、网络套接字和文件句柄。
操作系统对文件句柄和网络套接字有限制,一旦超出限制,所有的文件和网络都不能再打开。
网络套接字泄露,是指在使用后没有关闭他们。网络套接字的泄露会使无用的连接一直存在,从而填满连接池。
相关文章:
程序员的README——编写可维护的代码(一)
用户行为不可预测,网络不可靠,事情总会出错。生产环境下的软件必须一直保持可用状态。 编写可维护的代码有助于你应对不可预见的情况,可维护的代码有内置的保护、诊断和控制。 切记通过安全和有弹性的编码实践进行防御式编程来保护你的系统&a…...
数据库管理-第160期 Oracle Vector DB AI-11(20240312)
数据库管理160期 2024-03-12 数据库管理-第160期 Oracle Vector DB & AI-11(20240312)1 向量的函数操作to_vector()将vector转换为标准值vector_norm()vector_dimension_count()vector_dimension_format() 2 将向量转换为字符串或CLOBvector_seriali…...
(C++进阶)boost库笔记
目录 1、boost::function 1.1 概述 1.2 boost包装器和C11包装器对比 1.2、代码示例 1、boost::function 1.1 概述 boost::function 是 Boost 库中提供的一个通用函数对象包装器,它可以存储指向任何可调用对象的指针,并且可以在任何时候通过 operat…...
MapReduce面试重点
文章目录 1. 简述MapReduce整个流程2. join原理 1. 简述MapReduce整个流程 数据划分(Input Splitting):开始时,输入数据被分割成逻辑上的小块,每个块被称为Input Split。 映射(Map):每个Input Split 由一个或多个Map任务处理&…...
C语言简单题(7)从主函数中输入10个等长字符串,用一个函数对他们排序,然后在主函数输出这10个已排好序的字符串
从主函数中输入10个等长字符串,用一个函数对他们排序,然后在主函数输出这10个已排好序的字符串 /* 从主函数中输入10个等长字符串,用一个函数对他们排序,然后在主函数输出这10个已排好序的字符串 */ #include<stdio.h> …...
光伏科普|太阳能光伏发电应用场景有哪些?
太阳能光伏发电的应用领域其实非常广泛,很多人会不相信,但在我们的日常生活中随处可见太阳能光伏产业,本文将详细介绍其应用场景有哪些。 一、工业领域厂房 太阳能光伏发电作为一种清洁、可再生的能源,安装在工业领域厂房&#…...
Go 构建高效的二叉搜索树联系簿
引言 树是一种重要的数据结构,而二叉搜索树(BST)则是树的一种常见形式。在本文中,我们将学习如何构建一个高效的二叉搜索树联系簿,以便快速插入、搜索和删除联系人信息。 介绍二叉搜索树 二叉搜索树是一种有序的二叉…...
基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的交通信号灯识别系统(深度学习+UI界面+训练数据集+Python代码)
摘要:本研究详细介绍了一种采用深度学习技术的交通信号灯识别系统,该系统集成了最新的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期算法进行了性能评估对比。该系统能够在各种媒介——包括图像、视频文件、实时视频流及批量文件中——准确地…...
以太坊开发学习-solidity(三)函数类型
目录 函数类型 函数类型 solidity官方文档里把函数归到数值类型 函数类型是一种表示函数的类型。可以将一个函数赋值给另一个函数类型的变量, 也可以将一个函数作为参数进行传递,还能在函数调用中返回函数类型变量。 函数类型有两类:- 内部&…...
教你把公司吃干抹净、榨干带走
大家好: 衷心希望各位点赞。 您的问题请留在评论区,我会及时回答 正文 打工人一定要做到够自私,把公司的一切为我所用,你要知道闷头打工是没有出路的。聪明的人会以最快的速度榨干带走公司的一切资源、人脉、技能,为…...
开发指南007-导出Excel
平台上开发导出Excel比过去的单体架构要复杂些,因为前端和后台不在一个进程空间里。 后台的操作是先生成excel文件,技术路线是jxl <dependency><groupId>net.sourceforge.jexcelapi</groupId><artifactId>jxl</artifactId&g…...
滑块验证码
1.这里针对滑块验证给了一个封装的组件verifition,使用直接可以调用 2.组件目录 3.每个文件的内容 3.1 Api文件中只有一个index.js文件,用来存放获取滑块和校验滑块结果的api import request from /router/axios//获取验证图片 export function reqGe…...
cmd常用指令
cmd全称Command Prompt,中文译为命令提示符。 命令提示符是在操作系统中,提示进行命令输入的一种工作提示符。 在不同的操作系统环境下,命令提示符各不相同。 在windows环境下,命令行程序为cmd.exe,是一个32位的命令…...
【嵌入式DIY实例】-DIY手势识别和颜色识别(基于APDS9960)
DIY手势识别和颜色识别(基于APDS9960) 文章目录 DIY手势识别和颜色识别(基于APDS9960)1、硬件准备2、APDS9960 手势识别传感器介绍3、硬件接线4、代码实现4.1 手势识别4.2 颜色识别4.3 趋近感应代码5、综合实例代码在本文中,我们将介绍 APDS9960 手势、RGB 和接近传感器与…...
python 直方图
python可以调用hist方法绘制直方图。 import matplotlib.pyplot as plt import numpy as np; plt.rcParams["font.family"]["SimHei"] # 确保图中中文字体正确显示 x[0.1,0.2,0.3,0.4,0.5,0.6,0.1,0.2,0.2,0.2] plt.xlabel(满意程度) plt.ylabel(频数) …...
如何在数据库中使用sql语言插入数据
在SQL中,你可以使用INSERT INTO语句来添加数据到数据库表中。以下是一个基本示例,说明如何向表中插入数据: 假设你有一个名为students的表,它有以下字段:id, name, age 和 grade。 CREATE TABLE students ( id INT P…...
JVM的双亲委派模型和垃圾回收机制
jvm的作用是解释执行java字节码.java的跨平台就是靠jvm实现的.下面看看一个java程序的执行流程. 1. jvm中的内存区域划分 jvm也是一个进程,进程在运行过程中,要行操作系统申请一些资源.这些内存空间就支撑了后续java程序的执行. jvm从系统申请了一大块内存,这块内存在java程序使…...
ThreadLocal-内存泄露问题
ThreadLocal概述 ThreadLocal是多线程中对于解决线程安全的一个操作类,它会为每个线程都分配一个独立的线程副本从而解决了变量并发访问冲突的问题。ThreadLocal 同时实现了线程内的资源共享案例:使用JDBC操作数据库时,会将每一个线程的Conn…...
ISIS默认层级实验简述
ISIS被划分为三个层级:Level 1、Level 2和Level 1-2。 默认情况下,ISIS路由器属于level 1-2,是指同时支持Level 1和Level 2的路由器。路由器既可以在同一个自治系统内部进行路由选择,也可以将路由信息传递到其他自治系统。 实验拓扑图&#…...
在Flutter中创建自定义的左对齐TabBar组件
在Flutter应用程序中,TabBar是一种常见的UI模式,用于在不同的标签页之间进行导航。然而,默认情况下,Flutter的TabBar在水平方向上是居中对齐的。本文将介绍如何创建一个自定义的左对齐TabBar组件,以满足特定的布局需求…...
3分钟解锁网易云音乐加密文件:NCMDump黑科技全攻略
3分钟解锁网易云音乐加密文件:NCMDump黑科技全攻略 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经在网易云音乐下载了心爱的歌曲,却只能在官方App里听?那种感觉就像买了一本好书&#…...
OpenLS-DGF:开源逻辑综合数据集生成框架,赋能EDA机器学习研究
1. 项目概述与核心价值在芯片设计的漫长流水线中,逻辑综合(Logic Synthesis)扮演着承上启下的关键角色。它负责将工程师用硬件描述语言(如Verilog)编写的、描述电路功能的“高级蓝图”,翻译并优化成由具体逻…...
C#中预处理器指令的实现示例
1. 什么是编译器?编译器是一种将高级编程语言代码(如 C#、Java、Python)翻译成计算机可执行代码(如机器码或中间语言)的程序。它的核心作用包括:语法检查:验证代码是否符合语言规范。优化&#…...
7自由度机械臂逆运动学求解:13种算法对比与混合策略实战
1. 项目概述:当机械臂遇到“无限可能”的烦恼在机器人领域,让机械臂的“手”(末端执行器)精准地到达一个指定的位置和姿态,是一个看似简单实则复杂的基础问题,这就是逆运动学。对于常见的6自由度机械臂&…...
机器学习辅助砌体结构均质化:从虚拟实验室到高效损伤本构模型
1. 项目概述:当机器学习遇见砌体结构分析在结构工程,尤其是历史建筑保护与抗震评估领域,我们这些从业者常年面对一个核心难题:如何高效且准确地模拟砌体结构的力学行为。砌体,这个由砖块和砂浆以特定方式组合而成的古老…...
建筑项目进度延误率下降37%的秘密:一个轻量化AI Agent工作流,已在12个EPC项目中闭环验证
更多请点击: https://codechina.net 第一章:建筑项目进度延误率下降37%的秘密:一个轻量化AI Agent工作流,已在12个EPC项目中闭环验证 在某头部工程总承包(EPC)企业落地的轻量化AI Agent工作流,…...
机器翻译中的自校正方法:利用模型动态知识应对语义错位噪声
1. 项目概述:在嘈杂世界中学习翻译做机器翻译这行久了,最头疼的往往不是模型架构不够新,而是数据“不够干净”。我们每天打交道的数据,尤其是从互联网上爬取的海量平行语料库,比如大家熟知的ParaCrawl、CCAligned&…...
火焰不飘、不燃、不爆?,Midjourney 6.6火效失效紧急修复方案(含--no参数黑名单清单与替代性热力图引导法)
更多请点击: https://codechina.net 第一章:火焰不飘、不燃、不爆?——Midjourney 6.6火效失效现象的本质溯源 近期大量用户反馈,在 Midjourney v6.6 中使用 fire、 flame、 blazing 等关键词生成图像时,火焰元素普遍…...
避坑指南:在Ubuntu 22.04服务器上部署LibreOffice和JODConverter的完整流程(含中文字体配置)
Ubuntu 22.04服务器部署LibreOffice与JODConverter全流程:从中文字体配置到生产级优化在文档管理系统开发中,文件预览功能一直是刚需。不同于Windows环境的图形化操作,Linux服务器部署面临依赖缺失、字体配置、服务管理等诸多挑战。本文将手把…...
CoQMoE:面向FPGA的MoE-ViT量化与硬件协同设计实践
1. 项目概述:当视觉Transformer遇上FPGA,为何需要“协同设计”?最近几年,视觉Transformer(ViT)在图像识别、目标检测等任务上展现出了不输甚至超越传统卷积神经网络(CNN)的性能。但随…...
