1. 程式人生 > >關於對健壯性程式碼的理解

關於對健壯性程式碼的理解

> 這兩天學到了很多知識,對專案的嚴密性有了極為深刻的理解,簡而言之,身為前端開發者要站在使用者的角度去寫相關程式碼,而不能僅僅侷限於理所當然,也不可以認為資料有便有,沒有便沒有,身為開發者,更多的應該考慮使用者的感受,總結了以下幾點: ### 提高程式碼的健壯性 1.非空過濾 > 給每一條要渲染顯示的資料新增過濾器 > 要思考的不僅僅是渲染成功後的結果,更多要思考的是如果渲染不成功會顯示什麼,也就是當返回結果為空時,要顯示給使用者的是什麼 2. 不完全相信後臺 > 發起請求時新增條件判斷 > 雖然if/else飽受詬病,但可能後臺開發者本身也不能確保不出任何問題,為了提高容錯率,加一點條件判斷是必要的,並且,要結合多個條件確保拿到的是正確的資料 3. 不完全相信使用者 > 對使用者輸入的資料進行嚴格驗證 > 作為開發者當然期待使用者輸入的是自己想要的格式,**但使用者是單純的**,你不能確保使用者一定會按照你想要的進行輸入,這一點至關重要 4. 考慮程式碼的可複用性 > 包括html/css/js/單頁面元件 > 原則:抽離共性,保留不同 >> html: 若dom結構大致相同,可以使用相同的dom結構; >> css/less/scss/stylus: 同一app內若有多次的div/view/text style,可以直接在public.css/less/sass/stylus中宣告共有樣式 >> js:將需要多次使用的業務邏輯封裝成單一功能函式,並在函式內部首先對引數格式進行評估,之後新增條件判斷對引數進行過濾篩選,最後再對符合條件的引數進行處理 >>> 如果單頁面中需要多次使用該函式,則僅需要對在script內進行封裝,如果在多頁面中需要多次使用該函式,可以建立一個utils.js檔案存放共有函式 >>> (vue/uniapp)如果匯入utils.js的函式並準備在單頁面中進行使用時,推薦在該單頁面中寫入一個與utils.js中的**同名**函式,並直接return該同名函式(本質是為了返回utils.js中的同名函式) 5.考慮網路請求 > 使用者的流量是寶貴的,後臺伺服器的壓力是可觀的 > 基於使用者場景(思考:使用者來到某一頁面的目的是什麼)選擇是否傳送適當的請求,要思考的是,如何在保證功能不變的情況下,減少與後臺的互動,從而節省頻寬 ------------------------------------------------------------*假裝是條分割線*---------------------------------------------------------------------- ### 精妙的過濾函式 #### 1. 展示資料的非空處理 ```js //用於過濾 undefined,空字串,null,'null' filterEmpty(value,success,tips){ if(value === undefined || value === '' || value === null || value === 'null' || value === " "){ if(tips === undefined){ return "-"; }else{ return tips } }else{ if(typeof(success) === "function"){//如果是一個方法則呼叫方法 return success(); }else{//否則直接返回第一個引數 return value; } } } ``` #### 2. 表單相關驗證 > 2.1 正則相關驗證 ```js //只包含數字,英文,漢字 isNYC:function(obj ,tipValue,$this){ let specialCharacters = /[\\ud83c\\udc00-\\ud83c\\udfff]|[\\ud83d\\udc00-\\ud83d\\udfff]|[\\u2600-\\u27ff]/g; if(/[^a-zA-Z0-9\u4E00-\u9FA5]/.test(obj) && specialCharacters.test(obj)){ let tip; if(tipValue !== undefined && tipValue !== '' && tipValue !== null && tipValue !== '' && tipValue !== " "){ tip = tipValue; }else { tip = '名稱不能包含特殊字元'; } uni.showToast({ title:tip }) return false; } return true; } ``` > 2.2 漢字驗證 ```js // 漢字 isChinese: function(obj,$this) { var reg = /^[\u0391-\uFFE5]+$/; if(obj != "" && !reg.test(obj)) { uni.showToast({ title:'必須輸入中文' }) return false; } return true; } ``` > 2.3 字母 ```js // 字母 checkChar: function(obj,$this) { var zmReg = /^[a-zA-Z]*$/; if(obj != "" && !zmReg.test(obj)) { uni.showToast({ title:'只能是英文字母' }) return false; } return true; } ``` > 2.4 數字 ```js // 數字 checkNumber: function(obj,$this) { var reg = /^[0-9]+$/; if(obj != "" && !reg.test(obj)) { uni.showToast({ title:'只能輸入數字' }) return false; } return true; } ``` > 2.5 英文字母和數字 ```js // 英文字母和數字 checkStrOrNum: function(obj,$this) { var zmnumReg = /^[0-9a-zA-Z]*$/; if(obj != "" && !zmnumReg.test(obj)) { uni.showToast({ title:'只能輸入是字母或者數字,請重新輸入' }) return false; } return true; }, ``` > 2.6 郵箱 ```js // 郵箱 email: function(obj,$this) { var myreg = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/; if(!myreg.test(obj)) { uni.showToast({ title:'請輸入有效的郵箱' }) return false; } return true; }, ``` #### 3 時間戳轉換 ```js changeInfoDate(msesInt, format) { Date.prototype.Format = function(fmt) { var o = { "M+": this.getMonth() + 1, //月份 "d+": this.getDate(), //日 "H+": this.getHours(), //小時 "m+": this.getMinutes(), //分 "s+": this.getSeconds(), //秒 "q+": Math.floor((this.getMonth() + 3) / 3), //季度 "S": this.getMilliseconds() //毫秒 }; if(/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); for(var k in o) if(new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); return fmt; }; var dt = new Date(msesInt); // 初始化Date物件 var ndt = dt.Format(format); return ndt; }; filterDate(date,success,tips) {//用於過濾時間戳 if(date === undefined || date === '' || date === null || date === 'null' || date == 0 || date === ' ' || date === " "){//判空處理 if(tips == undefined){ return "-"; }else { return tips; } }else{ if(typeof(date) === "number" || (typeof (date) === "string" && (date.length >= 10 && date.length <= 13) && date.indexOf("/") === -1 && date.indexOf("-") === -1 && date.indexOf("年") === -1 && date.indexOf(".") === -1)){//為時間戳 if(typeof(date) === "string"){ date = parseInt(date); } return changeInfoDate(date, 'yyyy-MM-dd'); } else{ if(typeof(success) === "function"){//如果是一個方法則呼叫方法 return success(); }else{//否則直接返回第一個引數 return date; } } } } ``` 以上。 ![](https://img2020.cnblogs.com/blog/1542059/202006/1542059-20200606153713897-18125516