zoukankan      html  css  js  c++  java
  • EXTJS4官方文档翻译系列一:类系统和编码规范

    上个礼拜开始使用extjs4,之前都没用过ext,所以现在只好努力的看文档了,顺便记下来避免以后忘记.括号中内容是我自己添加的备注或者原文.英语比较烂,但不想一直烂,所以试着翻译,希望大家指能出错误的地方,英语好的建议看官方文档,不要被我误导了.

    地址: http://docs.sencha.com/ext-js/4-0/#/guide/class_system

    PS:上次说要翻译的一些titanium的文档,无奈后面太监了..没办法,工作用不上,业余时间要学工作的东西.titanium虽然喜欢,但是很久没去碰了.有机会继续吧..

    ext4使用新的类机制进行了大量的重构,这在ext的历史上还是第一次!为了支撑新的架构,ext4几乎重写了每一个类,因此最好先好好的理解一下新的架构,再开始编码

    本文适合想在extjs4中扩展现有类或者创建新类的开发者(注:其实想用ext4的都要看看).共分为4个部分:

    第一部分:概述,说明了强大的类机制的必要性.

    第二部分:编码规范,讨论类、方法、属性、变量和文件命名的最佳实践.

    第三部分:动手,详细的编码示例.

    第四部分:错误处理和调试,提供一些有用的调试和异常处理技巧

     

    一,概述


    ExtJS4拥有超过300个的类.迄今为止,我们的社区拥有超过20万来自世界各地,使用不同后台语言的开发者.要在这种规模的框架上提供具有以下特点的架构,需要面临巨大的挑战:

    1,简单易学。2,快速开发、调试简单、部署容易。3,良好的结构、可扩展性和可维护性。

    javascript是一种类无关(原文:classless)、基于原型的语言。因此javascript最强大的特点是灵活。同样的事情可以使用不同的方式,不同的编码风格和技巧去完成。这个特点也会带来一些不可预测的风险。如果没有统一的编码规范,javascript代码将很难理解、维护和复用。

    相反的,基于类的编程语言拥有较为流行的面向对象模型,强类型、内建的封装机制和强制的编码约束等特点。通过强制开发人员遵守一些大的原则来使代码的行为更容易被理解,以及提高可扩展性(这里不明白,javascript这类动态语言不是更容易扩展么?)和可伸缩性。但是,这类语言没有javascript的灵活性。

    二,命名约定


    在所有类、命名空间(namespace)和文件名中使用一致的命名约定,有助于保持代码的良好结构和可读性。

    1)类

    类名只能包含字母和数字。允许包含数字,但是大部分情况下不建议使用,除非这些数字是专业术语的一部分。不要使用下划线,连字符等非数字字母符号。例如:

    MyCompany.useful_util.Debug_Toolbar 不建议

    MyCompany.util.Base64 合适的(虽然包含数字,但是数字是术语的一部分)

    类名应该包含在使用点号分隔的命名空间中。至少,要有一个顶级命名空间。例如:

    MyCompany.data.CoolProxyMyComp

    MyCompany.data.CoolProxyMyCompa

    顶级命名空间和实际的类名应使用驼峰命名(CamelCased),其他则为小写。例如:

    MyCompany.form.action.AutoLoad

    不是Sencha开发的类(即不是Ext自带的)不要使用Ext做为顶级命名空间。

    缩写也要遵守以上的驼峰式命名约定。例如:

  • Ext.data.JsonProxy而不是Ext.data.JSONProxy
  • MyCompany.util.HtmlParser而不是MyCompary.parser.HTMLParser
  • MyCompany.server.Http而不是MyCompany.server.HTTP
  • 2)代码文件

    类名对应类所在的文件(包括文件名)。因此,每个文件应该只包含一个类(类名和文件名一样)。例如:

  • Ext.util.Observable 存储在 path/to/src/Ext/util/Observable.js
  • Ext.form.action.Submit 存储在 path/to/src/Ext/form/action/Submit.js
  • MyCompany.chart.axis.Numeric 存储在 path/to/src/MyCompany/chart/axis/Numeric.js
  • path/to/src 是你应用程序所在目录。所有类都应该在这个通用根目录下,并且使用适当的命名空间以利于开发、维护和部署。

    3)方法和变量

  • 和类命名一样,方法和变量也只能包含字母和数字。数字同样是允许但不建议,除非属于专业术语。不要使用下划线,连字符等任何非字母数字符号。

  • 方法和变量名一样使用驼峰式命名,缩写也一样。

  • 举例

    • 合适的方法名:

                        encodeUsingMd5() getHtml() 代替 getHTML()

                        getJsonResponse() 代替 getJSONResponse()

                        parseXmlContent() 代替parseXMLContent()

    • 合适的变量名:

                        var isGoodName

                        var base64Encoder

                        var xmlReader

                        var httpServer

  • 4)属性

  • 类属性名称遵循以上的变量和方法命名约定.除非是静态的常量.

  • 类的静态属性常量应该全部大写。例如:

    • Ext.MessageBox.YES = "Yes"
    • Ext.MessageBox.NO = "No"
    • MyCompany.alien.Math.PI = "4.13"
  • 三,动手实践

    1).声明

    1.1) 旧的方式

    如果你曾经使用过旧版本的extjs,那么你肯定熟悉使用Ext.extend来创建一个类:

       1: varMyWindow=Ext.extend(Object,{...});

     

     

     

    这个方法很容易从现有的类中继承创建新的类.相比直接继承,我们没有好用的API用于类创建的其他方面,诸如:配置、静态方法、混入(Mixins)。呆会我们再来详细的重新审视这些方面。现在,让我们来看看另一个例子:

       1: My.cool.Window = Ext.extend(Ext.Window, { ... });

     

     

    在这个例子中,我们创建我们的新类,继承Ext.Window,放在命名空间中。我们有两个问题要解决:

    1,在我们访问My.cool的Window属性之前,My.cool必须是一个已有的对象.

    2,Ext.Window必须在引用之前加载.

    第一个问题通常使用Ext.namespace(别名Ext.ns)来解决.该方法递归创建(如果该对象不存在)这些对象依赖.比较繁琐枯燥的部分是你必须在Ext.extend之前执行Ext.ns来创建它们.

       1: Ext.ns('My.cool');
       2: My.cool.Window = Ext.extend(Ext.Window, { ... });

    第二个问题不好解决,因为Ext.Window可能直接或间接的依赖于许多其他的类,依赖的类可能还依赖其它类...出于这个原因,在ext4之前,我们通常引入整个ext-all.js,即使是我们只需要其中的一小部分.

    1.2) 新的方式

    在Extjs4中,你只需要使用一个方法就可以解决这些问题:Ext.define.以下是它的基本语法:

       1: Ext.define(className, members, onClassCreated);
  • className: 类名
  • members:代表类成员的对象字面量(键值对,json)

    onClassCreated: 可选的回调函数,在所有依赖都加载完毕,并且类本身建立后触发.由于类创建的新的异步特性,这个回调函数在很多情况下都很有用.这些在第四节中将进一步讨论

    例如:

       1: Ext.define('My.sample.Person', {
       2:     name: 'Unknown',
       3:  
       4:     constructor: function(name) {
       5:         if (name) {
       6:             this.name = name;
       7:         }
       8:  
       9:         return this;
      10:     },
      11:  
      12:     eat: function(foodType) {
      13:         alert(this.name + " is eating: " + foodType);
      14:  
      15:         return this;
      16:     }
      17: });
      18:  
      19: var aaron = Ext.create('My.sample.Person', 'Aaron');
      20:     aaron.eat("Salad"); // alert("Aaron is eating: Salad");

    注意我们使用Ext.create()方法创建了My.sample.Person类的一个新实例.我们也可以使用新的关键字(new My.sample.Person())来创建.然而,建议养成始终用Ext.create来创建类示例的习惯,因为它允许你利用动态加载的优势.更多关于动态加载信息,请看入门指南:入门指南

    2).配置

    在ExtJS 4 ,我们引入了一个专门的配置属性,用于提供在类创建前的预处理功能.特性包括:

  • 配置完全封装其他类成员
  • getter和setter.如果类没有定义这些方法,在创建类时将自动生成配置的属性的getter和setter方法。
  • 同样的,每个配置的属性自动生成一个apply方法.自动生成的setter方法内部在设置值之前调用apply方法.如果你要在设置值之前自定义自己的逻辑,那就重载apply方法.如果apply没有返回值,则setter不会设置值.看下面applyTitle的例子:
       1: Ext.define('My.own.Window', {
       2:    /** @readonly */
       3:     isWindow: true,
       4:  
       5:     config: {
       6:         title: 'Title Here',
       7:  
       8:         bottomBar: {
       9:             enabled: true,
      10:             height: 50,
      11:             resizable: false
      12:         }
      13:     },
      14:  
      15:     constructor: function(config) {
      16:         this.initConfig(config);
      17:  
      18:         return this;
      19:     },
      20:  
      21:     applyTitle: function(title) {
      22:         if (!Ext.isString(title) || title.length === 0) {
      23:             alert('Error: Title must be a valid non-empty string');
      24:         }
      25:         else {
      26:             return title;
      27:         }
      28:     },
      29:  
      30:     applyBottomBar: function(bottomBar) {
      31:         if (bottomBar && bottomBar.enabled) {
      32:             if (!this.bottomBar) {
      33:                 return Ext.create('My.own.WindowBottomBar', bottomBar);
      34:             }
      35:             else {
      36:                 this.bottomBar.setConfig(bottomBar);
      37:             }
      38:         }
      39:     }
      40: });

    以下是它的用法:

       1: var myWindow = Ext.create('My.own.Window', {
       2:     title: 'Hello World',
       3:     bottomBar: {
       4:         height: 60
       5:     }
       6: });
       7:  
       8: alert(myWindow.getTitle()); // alerts "Hello World"
       9:  
      10: myWindow.setTitle('Something New');
      11:  
      12: alert(myWindow.getTitle()); // alerts "Something New"
      13:  
      14: myWindow.setTitle(null); // alerts "Error: Title must be a valid non-empty string"
      15:  
      16: myWindow.setBottomBar({ height: 100 }); // Bottom bar's height is changed to 100

    3.Statics

    静态成员可以使用statics配置项来定义

       1: Ext.define('Computer', {
       2:     statics: {
       3:         instanceCount: 0,
       4:         factory: function(brand) {
       5:             // 'this' in static methods refer to the class itself
       6:             return new this({brand: brand});
       7:         }
       8:     },
       9:  
      10:     config: {
      11:         brand: null
      12:     },
      13:  
      14:     constructor: function(config) {
      15:         this.initConfig(config);
      16:  
      17:         // the 'self' property of an instance refers to its class
      18:         this.self.instanceCount ++;
      19:  
      20:         return this;
      21:     }
      22: });
      23:  
      24: var dellComputer = Computer.factory('Dell');
      25: var appleComputer = Computer.factory('Mac');
      26:  
      27: alert(appleComputer.getBrand()); // using the auto-generated getter to get the value of a config property. Alerts "Mac"
      28:  
      29: alert(Computer.instanceCount); // Alerts "2"

    四.错误处理&调试

  • Extjs 4包含一些有用的特性用于调试和错误处理.

    • 你可以使用Ext.getDisplayName()来显示任意方法的名字.这对显示抛出异常的类和方法非常有用.
       1: throw new Error('['+ Ext.getDisplayName(arguments.callee) +'] Some message here');

    当使用Ext.define()定义的类中的方法抛出异常后.你将在调用堆栈中看到类和方法名(如果你使用webkit).例如,以下是chrome浏览器的效果:

    Call Stack

     

     

     

查看全文
  • 相关阅读:
    严重: Parse error in application web.xml file at jndi:/localhost/ipws/WEBINF/web.xml java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml
    Failed to install .apk on device 'emulator5554': timeout解决方法
    java.lang.NoClassDefFoundError:org.jsoup.Jsoup
    Conversion to Dalvik format failed: Unable to execute dex:解决方法
    apache Digest: generating secret for digest authentication ...
    Description Resource Path Location Type Project has no default.properties file! Edit the project properties to set one.
    android service随机自启动
    MVC3 安装部署
    EF 4.3 CodeBased 数据迁移演练
    SQL Server 2008开启sa账户
  • 原文地址:https://www.cnblogs.com/honghongming/p/2096078.html
  • Copyright © 2011-2022 走看看