原文:EXTJS Code Style Guide with examples

Ext JS风格指南:

  • 熟知的且易于学习
  • 快速开发,易于调试,轻松部署
  • 组织良好、可扩展和可维护

Ext JS应用程序的命名约定:

1、类

类名应使用驼峰命名(CamelCased)。
不要使用下划线,或其他连接字符。
如:MyCustomClass

不是通过Sencha分发的类,永远不要使用Ext作为顶层命名空间。
在类名中,应至少使用一次点号来划分命名空间。
如TopLevelNamespace.MyClassName

顶层命名空间和实际类名应使用驼峰命名,而其他则应使用小写字母。
//好的类名
如:TopNamespace.midlevelnamespace.MyCustomClass
如:MyModule.view.UserGrid
//坏的类名
eg:MyCompany.useful_util.Debug_Toolbar

2、使用命名空间来分组相关的组件

命名空间应基于目录结构构建。目录应基于功能化的业务组件将组件分组为逻辑模块。这意味着维护用户可根据命名空间和组件啦管理组件:

目录结构:
MyModule/controller/UserController.js
MyModule/store/UserStore.js
MyModule/model/UserModel.js
MyModule/view/UserGrid.js
MyModule/view/UserForm.js

类名:
MyModule.controller.UserController
MyModule.store.UserStore
MyModule.model.UserModel
MyModule.view.UserGrid
MyModule.view.UserForm

3、Ext JS的组件和控件

所有组件都应使用3个小写字母作为前缀,之后适当使用每一个单词(如txtFirstName, cboDisplay, dtmStartDate)。

Form Panel = frm
Text Field = txt
Combo Box = cbo
Button = btn
Label = lbl
Check Box = chk
Date Field = dtm
Number Field = num
Grid = grd
Tab Panel = tab
Tab Page = pge
Panel = pnl
Container = con
Toolbar = tlb
Paging Toolbar = pgt

每一个Sencha组件都应当将itemId设置为控件的名称。使用驼峰命名来为itemId命名(如txtFirstName)。
如:itemId : txtFirstName

4、变量、常量、私有变量、属性和方法:

A. 变量应总是使用驼峰命名。

如:
var isGoodName;
var base64Encoder;
var thisIsMyName;
var base64Encoder

B. 常量应使用大写字母

如:
 var SALARY = 1000;
 var MAX_COUNT = 10;
    var URL = "http://www.mydomain.net/";

C. 私有变量应以“_”开始

如: var _modelRecord;
 var _get = Ext.data.Model.prototype.get;
    var _set = Ext.data.Model.prototype.set;
    var val = _get.apply(this, arguments); // private variable used in thisway

D. 属性应总是使用驼峰命名。静态属性应使用大写字母。

如1:
Ext.MessageBox.YES = "Yes";
MyCompany.alien.Math.PI = "4.13";
如2:
/**@property {String} MASK_MESSAGE_SAVING_FORM Mask message for Saving form*/
    MASK_MESSAGE_SAVING_FORM: 'Saving form data, please wait...',

E. 方法:方法应总是使用驼峰命名。这也适用于首字母缩写词。

如:
可接受的方法名称:
encodeUsingMd5()
getExtComponentByReference()
getHtml() instead of getHTML()
getJsonResponse() instead of getJSONResponse()
parseXmlContent() instead of parseXMLContent()

5. 公共基类要加注释文档

一个组件如何被用来作为其他组件的共同祖先,它就应当被放置咋爱common目录。
如:
/**
 * @class Common.CommonFunctions  
 * @author Sencha User
 *  
 * 该文件包含公共功能,可被用于任何Ext JS应用程序
 *
 *
 */
Ext.define('Common.CommonFunctions', {});

6、为方法添加注释文档

如:
/**
 * This will return an ExtJs component based on a reference
 * to that component.  This reference can either be the component
 * itself or the comopnent's id.
 * @param {String/Object} ref A reference to an ExtJs component, can either be the the components id or the component itself
 * @return {Object}
 */
function getExtComponentByReference(ref){
 var component;
 if (typeof ref === 'string'){
  component = Ext.getCmp(ref);
 } else if (typeof ref === 'object'){
  component = ref;
 } else {
  return false;
 }
 return component;
}

7. 为控制器的方法添加注释文档

如:
    /**
     * Function to provide logic to validate a BPM form prior to submitting it.
     * Override this method in your own custom controller to add form specific submit validation.
     * Note:  By default this function will simply call form.isValid() to determine if form is valid.
     *
     * @returns {boolean} If the form is valid for submit or not
     */
    isBPMFormValidForSubmit: function(){
     return this.getBpmForm().isValid();
    },

8、全局引用:

// 注意: 要指定他们使用的地方
   var globalPreferedMode = false;
   var globalUserPreferenceArr = [];  // Array used to compare with preference cols of trade grid while applying preferences

9、要为组件和控制器内为任何用户定义的配置项添加注释文档

如:

/**
  * @cfg {Number} headerColumns
  * The total number of columns to create in the table for this layout. If not specified, all Components added
  * to this layout will be rendered into a single row using one column per Component.
  */
 headerColumns: 6,
 
 /**
  * @cfg {Object/Object[]} headerFields
  * A single item, or an array of child Components to be added to this container.
  */
 headerFields: [],
 
  /** @readonly */
    isWindow: true,

   /** @cfg {String} title The default window's title */
    title: 'Title Here',

   /** @cfg {Object} bottomBar The default config for the bottom bar */
    bottomBar: {
        enabled: true,
        height: 50,
        resizable: false
    },

  /**
  * @cfg {String} store (required)
  * The key of the store to be used to back this form.
  */
 store: ''

10、最佳实践:使用scope(作用域)

如:

getPeople :function(people){
 Ext.Ajax.request({
    url: 'people.php',
    method : 'GET',
    params: {
        id: 1,
        name:'test'
    },
    scope: this,
    success: this.onAfterGetPeople
 });
},

onAfterGetPeople:  function(response){
        //Dp some stuff
        var jsonData = Ext.decode(response.responseText);
        // process server response here
        this.getDepartments(jsonData,departments);
},
getDepartments : function(departments){
  Ext.Ajax.request({
      url: 'departments.php',
      method : 'GET',
      params: departments,
      scope: this,
      success: this.onAfterGetDepartments
   });
},
onAfterGetDepartments : function(response){
 //DO more work
}

11、最佳实践:正确缩进和优化代码

如:
segmentContactModule :function(segButton,button,pressed){

  var contactListStore = Ext.getStore('ContactListStore').
  contactView      = this.getContactView(),
  contactList      = contactView.query('#listContactItemsId')[0],
  contactDetailView= this.getContactDetailView(),
  selectedRecords  = contactList.getSelection(),
  buttonText    = button.getText();

  contactListStore.clearFilter();
 
 if(pressed) {
   if(contactListStore.getCount() == 0){
    contactDetailVIew.setActiveItem(0);
   }else{

     if(selectedRecords.length>0){
     this.contactListItemEvent(null,null,null,selectedRecords[0]);
    }else{
     contactDetailView.setActiveItem(0);
    }
   }
 }
 else{
  if(selectedRecords.lenght>0){
    this.contactListItemEvent(null,null,null,selectedRecords[0]);
  }
 }
} // end of method

12、最佳实践:总是让代码具有可读性

如:
if(!this.isReadable()){
 this.refactorWith({
  properIndentation : true,
  optimizedCodeReadability: true

  });
}else{
 this.beHappy();
}

13、最佳实践:方法的返回类型

eg:
testSomeVal : function(someVal){
 return (someVal <=2); //添加括号提高可读性
}

14、最佳实践:

延迟初始化 - 只在必要时添加条目或视图
延迟渲染 - 节省浏览器时间
重用某些东西 - 节省开发时间

15、最佳实践 : 针对this的两个规则

当一个函数通过var引用来执行时,默认的执行上下文(this)是window
如:
var myFn = function(){
 console.log(this);
};
myFn();

当一个函数通过一个对象的键值来执行时,执行上下文(this)是object
如:
 var member = {
  name: 'Eric',
     getName: function(){
   console.log(this);     
  }
 };
member.getName();

混合:
如:
var getName = member.getName;
getName();

如:
var member1 = {
  name: 'Eric',
     getName: function(){
   console.log(this);     
  }
 };
var member2 = {
  name: 'Bob',
     getName: member1.getName
 };
member2.getName();

【翻译】EXTJS 编码风格指南与实例的更多相关文章

  1. PEP8中文版 -- Python编码风格指南

    Python部落组织翻译, 禁止转载 目录      缩进      制表符还是空格?      行的最大长度      空行      源文件编码      导入      无法忍受的      其 ...

  2. Objective-C 编码风格指南

    本文转自:[Objective-C 编码风格指南 | www.samirchen.com][2] ## 背景 保证自己的代码遵循团队统一的编码规范是一个码农的基本节操,能够进入一个有统一编码规范的团队 ...

  3. Python PEP-8编码风格指南中文版

    #PEP 8 – Python编码风格指南 PEP: 8 Title: Style Guide for Python Code Author: Guido van Rossum , Barry War ...

  4. (转)PEP 8——Python编码风格指南

    PEP 8——Python编码风格指南标签(空格分隔): Python PEP8 编码规范原文:https://lizhe2004.gitbooks.io/code-style-guideline-c ...

  5. R 语言编码风格指南

    R 语言是一门主要用于统计计算和绘图的高级编程语言.这份 R 语言编码风格指南旨在让我们的 R代码更容易阅读.分享和检查.以下规则系与 Google 的 R 用户群体协同设计而成. 概要: R编码风格 ...

  6. 来自 Google 的 R 语言编码风格指南

    来自 Google 的 R 语言编码风格指南R 语言是一门主要用于统计计算和绘图的高级编程语言. 这份 R 语言编码风格指南旨在让我们的 R 代码更容易阅读.分享和检查. 以下规则系与 Google ...

  7. 【翻译】Ext JS——高效的编码风格指南

    原文:ExtJS - Efficient coding style guide 作者:Raja 切勿使用"new"关键字:在Ext JS中,使用"new"关键字 ...

  8. Python 编码风格指南

    原文:http://python.jobbole.com/84618/ 本文超出 PEP8 的范畴以涵盖我认为优秀的 Python 风格.本文虽然坚持己见,却不偏执.不仅仅涉及语法.模块布局等问题,同 ...

  9. JavaScript编码风格指南(中文版)

    前言: 程序语言的编码风格对于一个长期维护的软件非常重要,特别是在团队协作中.如果一个团队使用统一规范的编码分风格,可以提高团队的协作水平和工作效率.编程风格指南的核心是基本的格式化规则,这些规则决定 ...

随机推荐

  1. PHP 5 Calendar 函数

    PHP Calendar 简介 日历扩展包含了简化不同日历格式间的转换的函数. 它是基于 Julian Day Count(儒略日计数),是从公元前 4713 年 1 月 1 日开始计算的. 注释:如 ...

  2. 初识在Spring Boot中使用JPA

    前面关于Spring Boot的文章已经介绍了很多了,但是一直都没有涉及到数据库的操作问题,数据库操作当然也是我们在开发中无法回避的问题,那么今天我们就来看看Spring Boot给我们提供了哪些疯狂 ...

  3. Dynamics CRM 本地插件注册器连CRMAn unsecured or incorrectly secured fault was received from the other party

    今天遇到个问题,在本地打开插件注册器连接到远程CRM服务器时报如下问题 但我在CRM服务器上连接注册器是可以打开的,所以不存在账号权限这类的问题了(当然我用的是超管的账号也不可能存在),最后查询得知是 ...

  4. ROS机器人程序设计(原书第2版)补充资料 (玖) 第九章 导航功能包集进阶 navigation

    ROS机器人程序设计(原书第2版)补充资料 (玖) 第九章 导航功能包集进阶 navigation 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中 ...

  5. ROS(indigo) 安装和使用更新版本的Gazebo----3,4,5,6,7 附:中国机器人大赛中型组仿真比赛说明

    ROS(indigo) 安装和使用更新版本的Gazebo,本文以7为例. Gazebo7支持更多新的功能,如果使用下面命令安装ROS(indigo): ~$ sudo apt-get install ...

  6. activiti 数据库升级 upgrade

    分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519) 在项目中我们如果使用activiti 工作流引擎的时候,肯定是需要 ...

  7. Cocoa层粒子发射器动画添加多个cell的一种重构

    在iOS动画之旅第19章中最后的挑战中需要我们在雪花例子发生器中添加多个雪花贴图,也就是多个cell,因为我们不可能将每个cell的参数都重新写一遍,所以有必要写一个helper方法来做这件事: fu ...

  8. 2.cocos2dx 3.2中语法的不同之处,lambada表达式的使用和function和bind函数的使用

    1        打开建好的T32  Cocos2dx-3.2的一个项目 2        设置Cocos显示窗口的位置是在AppDelegate.cpp中: 3  设置自适应窗口大小的代码是在上面的 ...

  9. JAVA对象及属性的内存堆栈管理(通过小程序简单说明)

    JAVA在执行过程中会划分4个内存区域(heap.stack.data segment.code segment)代码区(codesegment):java开始执行会把代码加载到code segmen ...

  10. windows下安装nginx (转载自:http://blog.163.com/njut_wangjian/blog/static/1657964252013327103716818/)

    1.  到nginx官网上下载相应的安装包,http://nginx.org/en/download.html:下载进行解压,将解压后的文件放到自己心仪的目录下,我的解压文件放在了d盘根目录下,如下图 ...