相信已经入门的开发人员,大多数开发人员在写代码的时候基本上一上来就考虑业务逻辑的实现,脑中被业务流程全部占据,如果你基本功不够,没有在业务流程之外的程序健壮性予以考虑,则后期必然会导致很多bug,只有等待测试发现,而很多的测试依然是基于功能的黑盒测试,对于很对异常系问题不能完全测到,一个高素质的程序员无论在写任何业务流程代码,基本的程序健壮性是必不可少的硬实力。而很多基本的健壮性处理是共通的,只要你平时多加积累,注重应用就能避免,本篇博文将对js程序设计的健壮性问题进行总结。
1.入参检测
对函数入参进行判空是任何程序代码上来处理参数的第一步,如果不判空则会导致后面的操作报错,引起崩溃。
需要注意,如果为空怎办么办?直接终止吗?判空之后对参数如何处理比较合适?
答案是要判空,类型判断,根据实际情况加默认值,或直接给出异常返回错误信息,以上问题就要不同问题不同处理了。
比如我们要实现两个数字的加发运算
function add(a,b){
if(typeof a != 'number' || a == null || a===''){
a=0;
}
if (typeof a != 'number' || b == null || b === '') {
b = 0;
}
return a+b;
}
如果是对象呢
function addObj(obja,objb){
if(obja && objb){
return obj.a + obj.b;
}
}
但是如果方法要执行的不是加法而是乘法,默认值给0当然不合适。
2.tyr catch
此类问题针对文件操作或者网络请求是预判如果可能会发生未知错误,则就用try catch处理
try {
执行某个逻辑
} catch (e) {
出问题鸟,换个逻辑执行
}
function divsion(a,b){
var result = 0;
try{
result = a.b.c
}catch(e){
console.log(e)
}
return result;
}
divsion(0,0)
3.实例化检测
例如我们要对dog的实例对象进行操作,传入的对象类型就必须进项判断如果不是dog实例则停止后面的操作
function Dog(name){
this.name = name;
}
Dog.prototype.action = function(){
console.log("汪汪");
}
let dog = new Dog("lala");
function dosome(dog){
if(dog && dog instanceof Dog){
dog.action();
}
}
dosome(dog)
4.单例模式
利用单例模式可以是我们的程序健壮性增强
例如我们使用vuex 的store 如果源码中没有对单例的处理,程序中有多个store将会引起严重的后果
此处给一个简单的单例模式方法
function store(){
this.store = {
};
if(store.install){
return store.install;
}else{
store.install = this;
}
return this
}
let s1 = new store();
let s2 = new store();
s1.store.a="aaaa";
s2.store.b ="bbb";
console.log(s1);
console.log(s2);
console.log(s1 === s2)
如果不加上单例处理