zoukankan      html  css  js  c++  java
  • 【转发】网易邮箱前端技术分享之javascript编码规范



    网易邮箱是国内最早使用ajax技术的邮箱。早在2004年就推出了基于ajax引擎的极速风格邮箱,到2012年极速风格已经发展到第五版。最近两年HTML5+CSS3以及移动终端技术方兴未艾,网易邮箱也紧跟技术发展趋势推出了iphone,ipad适配版的邮箱。在这么多年开发邮箱webmail过程中,邮箱前端团队积累了不少心得体会,我们开发了很多基础js库,实现了大量前端效果组件,开发了成熟的opoa框架以及api组件,在此向大家做一些分享。今天想先和大家聊聊javascript的编码规范。
     
    总所周知,javascript是一种语法极其灵活的语言。javascript在设计之初就只是用来为HTML添加动态效果的。由于他动态,弱类型等特性,以及不同浏览器的兼容性问题,造成了开发成本要比java等语言要高很多。正因为它太灵活,我们制定了适用于网易邮箱的javascript编码规范,尽可能多的降低由于语法灵活造成的问题。以下将具体介绍:
     
    变量命名规范
     
    变量名包括全局变量,局部变量,类变量,函数参数等等,他们都属于这一类。
     
    基本规范
    变量命名都以类型前缀+有意义的单词组成,单词首字母都需要大写。例如:sUserName,nCount。
     
    前缀规范
    每个局部变量都需要有一个类型前缀,按照类型可以分为: 
    s:表示字符串。例如:sName,sHtml; 
    n:表示数字。例如:nPage,nTotal; 
    b:表示逻辑。例如:bChecked,bHasLogin; 
    a:表示数组。例如:aList,aGroup; 
    r:表示正则表达式。例如:rDomain,rEmail; 
    f:表示函数。例如:fGetHtml,fInit; 
    o:表示以上未涉及到的其他对象,例如:oButton,oDate; 
     
    例外情况:
     
    1:作用域不大临时变量可以简写,比如:str,num,bol,obj,fun,arr。
     
    2:循环变量可以简写,比如:i,j,k等。
     
    为什么需要这样强制定义变量前缀?正式因为javascript是弱语言造成的。在定义大量变量的时候,我们需要很明确的知道当前变量是什么属性,如果只通过普通单词,是很难区分的。 
     
    例如: 
    var group = [];  
    group.name = 'myGroup';  
    /****  
    some code  
    ***/  
    //这时候你还能一眼就看出来group是什么吗?
    //这时候你还能一眼就看出来group是什么吗?
    又例如:  
    var checked = false;  
    var check = function(){  
    returntrue;  
    }  
    /**  
    some code  
    **/  
    if(check){//可能将checked写成check,由于不能很快速的发现check是函数,造成逻辑错误
    //do some thing}
     
    如果我们写成: 
    var bChecked = false;  
    var fCheck = function(){  
    returntrue;  
    }  
    /**  
    some code  
    **/  
    if(bChecked){  
    // do some thing}  
    if(fCheck()){  
    // do other thing}
     
    就清楚很多了。
     
    全局变量以及常量规范
    网易邮箱前端是基于“类”的概念来来开发javascript的(稍后会专门介绍),每个类定义都是在一个闭包函数中,除了在window下有类的定义而外,只允许有两种变量定义在全局,那就是全局变量和常量。 
    全局变量使用g作为前缀,定义在window下。例如gUserName,gLoginTime。 
    某些作为不允许修改值的变量认为是常量,全部字母都大写。例如:COPYRIGHT,PI。常量可以存在于函数中,也可以存在于全局。 
    看个例子就 很容易明白为什么要这样定义了: 
    
    
    var userName = "dongua";  
    function checkName(userName){  
        //存在函数参数userName以及全局变量userName,如果要比较两个值是否相等,必需写为  
        return window.userName == userName  
    }
    如果使用了全局变量的前缀,就十分清晰了。
     
    函数命名规范
     
    统一使用动词或者动词[+名词]形式,例如:fGetVersion(),fSubmitForm(),fInit();涉及返回逻辑值的函数可以使用is,has等表示逻辑的词语代替动词。 
    如果有内部函数,使用__f+动词[+名词]形式,内部函数必需在函数最后定义。例如: 
    
    
    function fGetNumber(nTotal){  
        if(nTotal<100){  
      nTotal = 100;  
       }  
     return __fAdd(nTotal);  
    
    
     function __fAdd(nNumber){  
      nNumber++;  
      return nNumber;  
     }  
    }  
    
    
    alert(fGetNumber(30));//alert 101
    对象方法实现
    对象方法命名使用 f+对象类名+动词[+名词]形式;例如 fAddressGetEmail
     
    事件响应函数
    某事件响应函数命名方式为触发事件对象名+事件名或者模块名+触发事件对象名+事件名,例如:fDivClick(),fAddressSubmitButtonClick()
     
    其他注意事项
            1:所有命名最好使用英语表示。
     
            2:所有变量名应该明确而必要,尽量避免不必要的容易混淆的缩写。
     
            3:netease.events.mouse.Handler,而不是 netease.events.mouse.MouseEventHandler。
     
            4:对应的方法应该使用对应的动词,例如:get/set, add/remove, create/destroy, start/stop, insert/delete, begin/end。
     
            5:应该避免双重否定意义的变量,例如:bIsNotError, bIsNotFound,不可取。
     
            6:变量应该在最小的范围内定义,并尽可能的保持最少的活动时间。
     
            7:循环变量最好在循环中定义。例如for(var i=0,m=10;i<m;i++){ do something}。
     
            8:尽量避免复杂的条件语句,可以使用临时的boolean变量代替。
     
            9:一定要避免在条件中执行语句,例如:if((i=3)>2){},不可取。
     
            10:不要在代码中重复使用相同意义的数字,用一个变量代替,比如 nTotal=100; num= total。
     
    稍后会向大家分享javascript类编码规范
  • 相关阅读:
    解释机器学习模型的一些方法(一)——数据可视化
    机器学习模型解释工具-Lime
    Hive SQL 语法学习与实践
    LeetCode 198. 打家劫舍(House Robber)LeetCode 213. 打家劫舍 II(House Robber II)
    LeetCode 148. 排序链表(Sort List)
    LeetCode 18. 四数之和(4Sum)
    LeetCode 12. 整数转罗马数字(Integer to Roman)
    LeetCode 31. 下一个排列(Next Permutation)
    LeetCode 168. Excel表列名称(Excel Sheet Column Title)
    论FPGA建模,与面向对象编程的相似性
  • 原文地址:https://www.cnblogs.com/LeeWenjie/p/3459104.html
Copyright © 2011-2022 走看看