搜索

有思俱乐部学习园地

Uform 控件开发规范

                                                   
    12级学生,13级学生,14级学生均开发过控件,但每次开发完后不具有可维护性,一人一套代码规范,低年级学生要看懂代码不如重写一个,为了让大家写的控件有流传价值,需要解决如下问题:
     1、控件调用名称的统一。。
        例如:有些学生写的控件的调用方法是:U.MD.UI.Color.colorPicker(),U.MD.UI.calendar.create()
              统一后调用方法为: U.MD.UI.calendar(),U.MD.UI.Color()
     2、使用new和不用new的做法的区别。
        多份实例才用面向对象的new方法,单份实例均用面向过程的方法。
     3、主函数采用步骤式1,2,3..把界面铺出来。
        在create函数中需要把界面及界面的事件写出来。如果代码很多,需要根据功能划分函数。

一、	控件开发文件放置规范
所有css文件均放置在UseStudio.Manage项目下css文件中的Controls中。
 
所有js文件均放置在UseStudio.Manage项目下js文件中的Controls中。
 
其中:电脑端控件文件放置咋:PC文件夹中,
手机端控件文件放置在:Mobile文件夹中。

JS命名规范:
	主文件以命名控件做为文件命名
	若有其余附属文件则以命名控件+文件功能命名。
Css文件命名规范:
	主文件以js命名控件做为文件命名模板 
如:城市控件的js文件命名为:Namespace.register("U.MD.UI.City"),
则城市控件中最大的元素的命名规则为:U_MD_UI_City.
若有其余附属文件则以主文件名称+附属文件功能命名。
二、	控件开发命名空间规范
电脑端控件开发统一命名空间格式为:
U.MD.UI + 控件名称
例:如果为城市控件,则命名空间为:
      U.MD.UI.City

手机端控件开发统一命名空间格式为:
U.MT.UI + 控件名称
例:如果为图片控件,则命名空间为:
      U.MT.UI.Image
三、	控件开发调用函数名称规范
JavsScript规范说明:
控件调用名称的统一为:命名控件主函数。
	例:如果为图片控件,则命名空间为:U.MT.UI.Image
        则调用图片控件的函数为:U.MT.UI.Image.

函数名定义原则:名字要能准确的描述出该变量所代表的事物,变量名长度最好控制在10~16个字符之间
    1、函数采用命名空间+小驼峰命名法.
       例如:U.UF.S.getFirstName=function(){},第一个单词小写,后面的单词首字母大写.
    2、局部变量统一采用下划线带小驼峰命名法.
       例如: _name="张三";
    3、参数采用全小写命名方法.
       例如:U.UF.C.jsonToStr(obj)

名词解释:小驼峰命名法:第一个单词以小写字母开始;第二个单词的首字母大写或每一个单词的首字母都采用大写字。

函数注释:
1、	对每条函数进行作用使用说明
2、	对每个参数进行解释 包括类型 参数名 作用
3、	对函数的每一块内容进注释(尽可能做到每行注释)

已下面函数为例:
1、/** */内为函数作用使用说明,其中:@param 为参数说明。
2、函数内尽可能做到每行注释,主要说明其在函数中的作用。

/** 定义一个函数,做为对话框类,也相当与java或者net的构造函数
 * @param	string	title 对话框标题
 * @param	object	style 对话框样式
 * @param	function	closecb 关闭回调
 * @param	function	determinecb 确定回调
 * @param	string	content 窗体内容
 * @param	element	parentelement 窗体追加到的指定元素,默认是document.body 
*/
U.UF.UI.dialog = function (title, style, closecb, determinecb, content, parentelement) {
            this.title = title; //对话框标题
            this.style = style; //对话框样式
            this.closecb = closecb; //关闭回调
            this.determinecb = determinecb; //确定回调
            this.content = content; //窗体内容
            this.parentelement = parentelement || document.body; //窗体追加到的指定元素,默认是document.body
            //创建窗体
            this.create(); //控件全部用create创建,必须
}

//包含创建这个控件的界面
U.UF.UI.dialog.create=function(){
	//可包含判断控件是否存在,存在则显示,不存在则执行下面创建界面的过程
	//这里包含了整个dialog的界面铺设,包括元素创建后赋值事件。
    例如:
    //创建标题栏
	$$(“div”,{“onclick”: function(){}});//创建元素和事件的案例。
    //创建内容区域
    $$(“div”,{“onclick”: function(){}});//创建元素和事件的案例。
    //创建尾部区域
    $$(“div”,{“onclick”: function(){}});//创建元素和事件的案例。
}


/** 函数式写法案例
* 创建提示框
* @content     {string/elemnet}  内容
* @callBackFun {function}        回调函数
*/
U.UF.UI.Dialog = function (content, callBackFun) {
    //创建提示框主体
    var _dialog = $$("div", { "style": { "cssText": "width: 100%; background: #fff; overflow:hidden; "} });  
    //创建内容区域
    var _content = $$("div", { "style": { "cssText": "text-align: center; margin: 30px 20px 30px 20px; "} }, _dialog);
    //判断内容是否为元素
    if (U.UF.C.isElement(content)) {
        $(_content).append(content);   //如果为元素则动态添加到对话框中
    } else {
        _content.innerHTML = content || '内容';  //如果为文字则修改inerHTML。
    }
    //创建页脚部分
    var footer = $$("div", { "style": { "cssText": "height:45px;" } }, _dialog);
    //创建确定按钮 并绑定点击函数
    $$("div", {
        "style": {
            "cssText": "text-align: center; color: #fff; width: 30%; padding: 5px; background: #307ed0; border-radius: 5px;float: right; margin: 0 12px 12px 0;"
        },
        innerHTML: "确定",  // 绑定innerHTML
        onclick: function () {
            U.UF.C.isFunction(callBackFun) && callBackFun(); //判断是否存在回调 有则执行。
            U.UF.F.closeWindow(_form.form); //关闭窗口函数
        }
    }, footer); 
    //调用Uform窗体创建函数将主体内容添加到窗体中
    var _form = new U.UF.UI.form("提示框", _dialog,
    {
        "style": {
            "cssText": "font-size: 16px; width: 300px; background:#fff; position: fixed; top: 100px; left: 40%; box-shadow: 0 0 10px 3px black; border-radius: 5px;"   
        }
    }, 
    null,
    {
        "style": { "cssText": "background: #3b5878; padding: 10px; color:#fff;"}
    });
}


//错误事件赋值案例,由于在创建元素外赋值,很难能定位到哪个元素赋值了什么事件,这样会导致代码的易读性很差
bindEvent = function(){
	this.a.onclick= function(){
    }
}

构造函数(new方法)用与不用的说明:
1、	使用情况下使用new方法,什么情况下不使用new方法?
当控件为多份实例时使用new方法作为控件的创建方法,当控件仅需要创建(实例化)一份时采用函数式写法。

2、	尽可能采用函数式写法开发控件
由于构造函数写法不够直观易懂,且在调试过程中难度较大。为方便更多成员学习和更多成员的加入,因此规定尽可能的采用函数式写法开发控件。

3、	举例说明在什么情况下使用new方法	
1)	窗体控件
在使用云操作系统的过程中,用户会打开多个不同的应用,而每个应有都由窗体包裹。
因此窗体控件在云操作系统中被将会被多次调用,但没个窗体的大小、位置,是否缩放,是否关闭等等的属性对于每个窗口来说都是不同的。
采用new方法时,同一个构造函数的对象实例之间无法共享属性或方法。这也对应我们的窗体的操作场景。
因此在这种情况下采用new方法创建窗体,对于各个窗体之间的操作管理就显得比函数式方法更加简便易懂。
2)	城市控件
对于城市控件这一类的控制,在页面我们一般只创建一个控件即可。因此对与此类控件不存在一个属性次使用的问题,即可采用函数式方法制作控件。
使用函数式编写控件时的注意事项:
1)	每条函数对应的功能要尽量单一,切勿多个处理在同一函数中进行。
2)	定义全局变量,一定要在主函数之后定义。
3)	函数命名采用驼峰法命名,传参采用全小写方法命名。
4)	函数内定义变量采用“_”+变量名 已区别与传参混淆。
5)	主函数采用步骤式1, 2,3..完成控件的编写。

使用构造函数编写控件时的注意事项:
1)	每条函数对应的功能要尽量单一,切勿多个处理在同一函数中进行。
2)	定义全局变量,一定要在主函数之后定义。
3)	函数命名采用驼峰法命名,传参采用全小写方法命名。
4)	函数内定义变量采用“_”+变量名 已区别与传参混淆。
5)	切勿在控件中定义全局唯一标识如id等属性。

Html规范说明:
•	(1)、推荐使用div元素
•	(2)、输入文字信息区域用input控件
•	(3)、.输入文件上传文件用 < input type=file />控件
Css规范说明:
避免页面元素重名,命名采用与JS命名空间 + 样式作用
如:城市控件的js文件命名为:Namespace.register("U.MD.UI.City")。
则城市控件中最大的元素的命名规则为:U_MD_UI_City。
其他小元素均需带此前缀,比如城市控件中的头部区域命名为U_MD_UI_City_Head
内容区域命名为U_MD_UI_City_Content,。
除前缀需大写外,元素命名采用大驼峰表示法,并尽量使用英文含义进行注释。
        

工作人员

 
作者:杨思强
信息录入:杨思强