日期:2014-05-16  浏览次数:20395 次

JSI Side 代码风格与规范

准备编写JSI的外围元素,先整理一下编码风格和一些约定,欢迎大家讨论。

基本风格

??? * 基本参照Java代码风格。
???????? 1. 驼峰式命名(单词无连接字符,单词首字母大写,其余小写);
???????? 2. 类的首字母大写(eg:MyClass);
???????? 3. 变量名,方法名,成员名首字母小写(eg:name,value,targetObject);
???????? 4. 单例对象遵循类的命名方式(eg:GlobalController);
???????? 5. 常量全部大写,下划线分割单词(eg:APPLICATION_ID);

??? 参考:http://java.sun.com/docs/codeconv/

??? * 变量所用单词尽量不用缩写。

??? 缩写的单词容易造成语意的不明,不易阅读,而且容易造成争议。

编码约定


??? * 不要随意扩展原始对象。

??? 自Prototype 起,扩展原始对象似乎成了一个时髦的东西,大家都喜欢用。我承认他的便捷,但是请不要滥用,尽量做到有标准可循(比如为IE5扩展 Array.prototype.push),原始对象就这么几个,万一那天碰到两个人写的代码,行为不一致,那麻烦就大了。

??? * 不要扩展Object.prototype。

??? 这个地雷貌似已经被头大牛踩到,但是你不要踩,谁踩到他,你就和他割席断交吧。

??? * 不要盯上对象的constructor属性。

??? constructor属性是非常不可靠的,很容易也经常被改写,而且经常被改写到Object对象[MyClass.prototype = {...}],能后你以为是你的构造器,动之,能后天下大乱。

??? * 不要写那些中看不中用的集合。


??? 不要模仿Java 集合API,去写什么 HashMap,ArrayList。JavaScript不相信这些,这个世界简单才是硬道理。

??? * 在结构中始终使用区块。

??? 莫偷懒,省略区块(即{ })会引发不经意的错误和麻烦。即使只有一句,也老老实实写上:

??? * 单例模式直接使用对象申明。

??? 我们不需要那个不中用的构造函数, 不如直接来个对象申明,直接定义属性。

??? * 变量名就是最好的文档。

??? 不要担心变量名称的长度,他们只是一个符号,符号的意义在于表明变量的意义,而大小的事就交给压缩工具吧。比如,可以使用thisPackage,targetPackage;而不要用pkg1,pkg2。

??? * 表达式中赋值需要明确注释。

??? 直接在表达式中赋值可以使代码紧凑,但会降低程序可读性,应尽量避免,但是对于一些关键元素,可以采用(压缩/优化考虑),但必须明确注释。

??? * 目录名以"/"结尾。

??? JSI内核中,有一些地方需要记录目录地址。这里我们统一以“/”结尾。

??? * 不要使用原始类型的对象量。

??? 原始对象有些诡异的地方,如。

????? new String("test") != new String("test");
????? if(new Boolean(false)){
??????? alert("执行到")
????? }else{
??????? alert("未被执行")
????? }

??? 对外接口可以考虑兼容,但是内部元素,不考虑,内部也不要使用这些对象。

??? * 杜绝变量悬空现象

??? 不要出现:

??? if (!window.Element){
??????? var Element = new Object();
??? }

??? 改成:

??? var Element = window.Element || new Object();


??? 这段代码来自大名鼎鼎的Prototype,这里没错,但是如果被拷贝到某个函数内,问题就大了,有此类问题的脚本,放在JSI中装载,也会存在问题。


一些诡异的技巧


??? * {}就是Map

??? 哪简单对象当map是个非常方便的地方,缺点是key都被转化成string。但是大多数情况下还是够用的,简单就好,没必要复杂化。

??? * []用作LinkedHashMap

??? 使用数组保存键的顺序,对象存储键的值,基本可以等价于LinkedHashMap结构。缺点是有上,同时,length不能为键。

??? * 使用constructor == String代替typeof


??? 上面说到constructor不可靠,是的,但是constructor用来代替typeof,一般来说更可靠了。还可以同时做好对象类型和值类型的兼容。

??? * 巧用与或。


????? if(fn){

??????? fn();

????? }

????? -->

????? fn&&fn();


慎用动态元素


??? * eval

??? eval的性能问题到不是主要的,主要理由依然是他的动态性,容易给程序带来不稳定因素。

??? * with


??? 少用with,主要不是他的性能问题,其实with的性能问题并不太明显,但是他容易给程序带来不稳定因素。

??? * execScript

??? 类似eval,ie上通行,不同之处在于他是一个上下文无关的eval,传入的脚本直接在全局上下文执行。

??? * document.write

??? 当打印一段脚本标签时,近似等价与execScript

??? * new Function

??? 不仅是动态元素,他同时还有一个上下文短路问题。

??? * 少用属性。

??? 属性虽然是面向对象的常用元素,但JavaScript?属性的动态性太强,不便自动优化处理;同时属性的使用,将产生更多不稳定的状态,虽然貌似易于阅 读,却增加了程序的复杂性。实际编码中应该谨慎。常量性质的私有属性不要出现,能用变量的地方也不要随意升级为属性。

??? * window.xyz

??? 有些人习惯用这个来申明全局变量,或者干脆不申明, 那么,改掉你的坏习惯。

6 楼 s79 2008-04-30