如何在工程中降低错误率

57 阅读4分钟

目前现存项目其实大部分更多的是迭代,维护,这类项目,更重要的是稳定性,那一般从工程中,常见策略,是通过单测,或者自动化测试等,但是本文,更多的是想从开发者自身,编码习惯,设计思想,数据流设计等方向,从根源去解决,如果每次都依赖测试去发现,本质上也是没有对自己的代码,和项目负责

编码习惯

抽象复用,凡是有可能超过两次使用模块,函数,全部抽象 涉及数组下标的访问,需要去考虑这个数组越界问题。 不要在上线前几个小时,重构,变更代码需求

全局变量,还有那些定义当前组件的公共方法,提至当前组件顶部

编码原则之--对于共有的函数需要去提炼共有路哟及hi

冗余字段变量要及时去除,避免后期引用变量混乱,统一,同时设立全局redux变量,不要什么都设置,只有出现多次被引用,才行

对于多个涉及同样策略的逻辑应该统一提炼到一处

尽最大限度避免重复,无效接口请求造成的访问压力,如果出现明细的空值请求,统一拦截在实际请求前

尽量用解构运算符合简化操作,对于可能多个用到的变量,需要统一提前解构获取,更容易理解和阅读

编码原则: 对于接口调用,首先判空,避免空值调用,其次对于一些非法字段请求,也应该一开始就不应该去

对于useeffect由于初始化即便有依赖性但还是会被执行,所以你必须重新合并或者缓存

线上多次报错的根源在于返回内容有可能无也就是undefined,这类问题想从根源解决要考虑当前入参,值有没有可能是undefined ,也就是要对所有可能为空的值做兜底。

JSON.parse() 补充 try...catch  color需定义并使用变量 组件开发中,一般要每个颜色都有统一的变量,不要自己随便去定义。

方法名称的命名应体现方法用途及返回情况,见名知意

参数判空条件,要注意隐士转换问题,因为其实真正关注的是否为null,undefined 对于本身!0的方式,有可能,直接就是为真了,这个判断是否存在的条件,要具体,不能只去写一个if(!test) 这种会规避隐含问题

加上代码执行顺序尽量,不要和书写顺序解耦,不要因为换个位置就导致非预期结果,这种把条件语句调换一下位置,整个逻辑就错了,整体代码结构非常的脆弱
	    let target = valatilityData?.data?.[0]?.volatilityDetail;
	    if (valatilityData?.volatilityType === volatilityType &&
	      valatilityData?.endTradeDateType === endTradeDateType &&
	      valatilityData.underlying === windCode
	      // 是否正确
	      // target.length > 0
	    ) {
	  
	      // 境内逻辑
	      if (judgeIRIB(windCode, isAbroad)) {
	        let initialValue = target?.[0]?.[index];
	        if (volatilityType === 1) {
	          initialValue = '100%';
	        }
	        if (volatilityType === 2) {
	          initialValue = target?.[(target?.length - 1) / 2]?.[index];
	        }
	        if (varietyType === undefined) {
	          setSelectVale([])
	        } else {
	          setSelectVale([initialValue]);
	        }
	      } else {
	        if (volatilityType === 0) {
	          target = getSurroundingObjects(target, baseLine, 20);
	        }
	        
	          let initialValue = target?.[0]?.[index];
	          if (volatilityType === 1) {
	            initialValue = '100%';
	          }
	          if (volatilityType === 2) {
	            initialValue = target?.[(target?.length - 1) / 2]?.[index];
	          }

函数名字不语义化,语义化主要是从这个函数的功能去思考叫什么,it must be a 动词

组件库的开发原则:颜色变量,不要写死,一个是为了复用,另一个是为了不同主题色的切换。

防御编程思想的建立: 尤其看到一个函数,首先思考的是这个参数需要传递哪些,然后这个函数功能如何,以及这个参数是否存在越界的情况。正数,负数,0是不是都可以

样式代码尽可能减少类名的书写,不同条件下,可以依据类名进行区分,共有属性可以提炼至全局。

接口定义,要注意,不要去给变量声明的时候,不要随意去继承, 接口继承的前提是这个继承的类型是能用的上的。

颜色变量,组件开发,一方面为了复用,已经主题切换,颜色变量不要写死,就是要用到变量去解决。