相信已經入門的開發人員,大多數開發人員在寫代碼的時候基本上一上來就考慮業務邏輯的實現,腦中被業務流程全部佔據,如果你基本功不夠,沒有在業務流程之外的程序健壯性予以考慮,則後期必然會導致很多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)
如果不加上單例處理