`
jindw
  • 浏览: 509926 次
  • 性别: Icon_minigender_1
  • 来自: 初到北京
社区版块
存档分类
最新评论

JSI Side 代码风格与规范

    博客分类:
  • JSI
阅读更多

准备编写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

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

分享到:
评论
5 楼 jindw 2008-04-30  
s79 写道

"在结构中始终使用区块",如果if、for的{}里真的只有一句,不妨省略并与if、for写在一行。这和下边的巧用||、&&一样紧凑易读。

虽然我依然坚持我自己的风格,但是,我觉得,你的提法也可以接受。
但是,换行的写法,我坚决反对,那样太伤眼睛^_^


s79 写道

"少用属性",我觉得属性和方法一定是public的,可以供程序中其他模块或最终用户直接使用。不想公开属性或方法的就利用变量作用域做闭包,成为私有变量。

同意这个观点。那种下划线前缀的伪私有约定,其实并不怎么漂亮^_^
不过在JSI下,闭包就不必自己显式申明了。


s79 写道

"window.xyz"申明全局变量,和var xyz申明的全局变量不一样,var xyz申明的全局变量是不能用delete window.xyz删除的。一般调试程序的时候可以使用window.xyz来保存某个对象以便跟踪查看。

反对这种变量申明方式,因为,这个动态性太强,不便于自动工具处理与解析。当能, 在框架级别上还是可以考虑的,比如JSI导入的最后环节其实就是利用了这点。


4 楼 jindw 2008-04-30  
关于window.xx
我认为他是完全等价于申明的全局变量的。
这点ECMA里面也有明确说明,变量是某个scope的属性。而scope一般都是无法获取的,但是全局scope例外。他就是window,或者(function(){return this})()。

关于delete;
delete 是用来删除属性的,不是删除变量的,所有,我感觉和楼上的陈述刚好相反。
3 楼 csf178 2008-04-30  
事实上 delete window.xyz什么都做不了 哪种都没法删掉

有些时候window.xyz用来动态声明全局变量 不过有JSI的话当然就不需要了
2 楼 s79 2008-04-30  
<div class='quote_title'>jindw 写道</div>
<div class='quote_div'>
<p>...<br/>
<strong>
    * 在结构中始终使用区块。</strong>
<br/>
<br/>
    莫偷懒,省略区块(即{ })会引发不经意的错误和麻烦。即使只有一句,也老老实实写上: </p>
<p>
...</p>
<p>    var Element = window.Element || new Object();</p>
<p>   fn&amp;&amp;fn();</p>
<p>...</p>
<p><br/>
<strong>
    * 少用属性。</strong>
<br/>
   
属性虽然是面向对象的常用元素,但JavaScript?属性的动态性太强,不便自动优化处理;同时属性的使用,将产生更多不稳定的状态,虽然貌似易于阅
读,却增加了程序的复杂性。实际编码中应该谨慎。常量性质的私有属性不要出现,能用变量的地方也不要随意升级为属性。 <br/>
...<br/>
<strong>
    * window.xyz</strong>
<br/>
<br/>
    有些人习惯用这个来申明全局变量,或者干脆不申明, 那么,改掉你的坏习惯。</p>
</div>
<p>对以上几点有不同意见或补充,如下:</p>
<p>"<strong>在结构中始终使用区块</strong>",如果if、for的{}里真的只有一句,不妨省略并与if、for写在一行。这和下边的巧用||、&amp;&amp;一样紧凑易读。</p>
<p>"<strong>少用属性</strong>",我觉得属性和方法一定是public的,可以供程序中其他模块或最终用户直接使用。不想公开属性或方法的就利用变量作用域做闭包,成为私有变量。</p>
<p>"<strong>window.xyz</strong>"申明全局变量,和var xyz申明的全局变量不一样,var xyz申明的全局变量是不能用delete window.xyz删除的。一般调试程序的时候可以使用window.xyz来保存某个对象以便跟踪查看。</p>
<p>其他地方完全支持楼主观点!</p>
1 楼 csf178 2008-04-29  
每一条都very good
没有任何问题

相关推荐

    JSI, java脚本开发工具

    JSI有隐式的名称空间,既有名称空间的好处,又没有名称空间的麻烦和性能损失,还可以方便重构(修改报名无需修改代码)。即:你的脚本放在哪个目录下,他就自动属于哪个名称空间 * 优化脚本组织 可以按包...

    JSI-full-2.0

    2. **example**:这个目录可能包含了一些示例代码或页面,用来展示JSI-full-2.0的功能和用法。开发者可以通过这些例子快速理解和学习如何使用这个项目。 3. **images**:存放图像资源的文件夹,可能包括logo、图标...

    JSI-GAN:JSI-GAN的官方存储库(于AAAI 2020接受)

    我们提供了培训和测试代码,以及经过训练的权重和用于JSI-GAN的数据集(train + test)。 如果您发现此存储库有用,请考虑引用我们的。 参考: Soo Ye Kim *,Jihyong Oh *和Munchurl Kim“ JSI-GAN:基于GAN的...

    海尔液晶电源 0094001224B JSI-190419-050 JSI-220409-050原理图.pdf

    根据提供的信息,我们可以了解到这份文档是关于海尔液晶电视电源板(型号:0094001224B JSI-190419-050 JSI-220409-050)的原理图。这份原理图详细地展示了电源板的内部电路结构、元件布局及其连接方式等关键信息。...

    jsi-modules:用jsi进行模块学习

    在JavaScript的世界里,JSI(JavaScript Interpreter)是一个用于在运行时执行JavaScript代码的解释器,它为各种应用场景提供了便利,比如在嵌入式系统、服务器端或是其他非浏览器环境中运行JavaScript。"jsi-...

    using使用JSI为React Native提供快速简便的多线程-C/C++开发

    react-native-multithreading using使用JSI的React Native的快速简便的多线程处理。 安装npm install react-native-multithreading npx pod-i react-native-multithreading using使用JSI进行React Native的快速简便...

    海尔液晶电源背光板 0094001274E JSI-320411 原理图.pdf

    本文将详细解析海尔液晶电视电源背光板0094001274E JSI-320411原理图中的关键元件及其功能、电路设计思路与工作原理,帮助读者更好地理解该背光板的工作机制,并为可能遇到的问题提供诊断和维修方面的参考。...

    jsi-wikifier-api

    JSI Wikifier OpenAPI规范 JSI Wikifier API文档存储库。链接文档: : SwaggerUI: ://jsi-eubusinessgraph.github.io/jsi-wikifier-api/swagger-ui/ 看完整规格: JSON YAML 警告:仅当Travis CI完成部署后,以上...

    轻量系统JS-UI框架子系统

    - **编译与运行时支持**:支持JS代码的编译和运行,提供高效的执行环境。 - **模板引擎**:提供模板语言,简化UI布局的编写,提高开发效率。 - **状态管理**:管理应用的状态,确保数据与视图的同步。 - **事件...

    HDT-JSI01

    通过阅读和分析这些文件,你可以深入理解项目的工作原理,学习如何组织代码、如何实现特定功能,以及如何与其他开发者协作。此外,它还可能包含README文件,提供项目介绍、安装指南和使用说明。通过研究这样的项目,...

    自定义三种方式进度条

    在Android开发中,自定义控件是提升应用用户体验和界面美观...通过查看和学习这些代码,你可以更好地理解如何将理论知识应用于实际项目中。在实践中不断探索和优化,你将能够创建出更加美观、功能丰富的自定义进度条。

    java推荐算法源码-jsi:Java空间索引

    该代码是开源的,并在 2.1 或更高版本下发布。 用法 强烈建议首先查看位于 的 jsi-examples 存储库。 简而言之,您需要像这样初始化 RTree: // Create and initialize an rtree SpatialIndex si = new RTree(); si....

    eccl-jsi.github.io

    eccl-jsi.github.io

    jsish:Jsi是一个小型的C嵌入式javascript解释器,具有紧密编织的Web和DB支持

    Jsi是带有内置websocket-server,sqlite和C -extensibility的javascript -ish解释器。 | | | 快速开始下载适用于 / 的二进制文件: wget ...

    网页博客底部跳动的小鱼原代码

    在网页设计中,为了增加互动性和趣味性,有时会在页面底部添加一些动态元素,比如“跳动的小鱼”。... ...在`&lt;head&gt;`部分,我们将引入外部JavaScript文件,用于实现小鱼动画的效果。例如: ...接下来,我们创建一个名为`...

    Java Spatial Index.zip

    在JSI-master这个压缩包中,我们可能找到了JSI的源代码和相关文档,这为我们提供了深入理解其工作原理的机会。源代码通常包含了实现空间索引的各种类和方法,包括但不限于以下组件: 1. **空间对象表示**:JSI需要...

    javascript sfs

    javascript sfs多个关键字请用空格分隔,最多填写5个。点击右侧Tag快速添加

    react-native-multithreading:using使用JSI为React Native提供快速简便的多线程

    :thread: 使用JSI的React Native的快速简便的多线程处理。 安装 npm install react-native-multithreading npx pod-install 需要包括的react-native-reanimated版本。 您可以自己打补丁,也可以等到它发布后再...

    react-native-quick-md5:快速C ++实现与MD5的JSI绑定,用于React Native

    通过React 5的MD5的JSI绑定,以极快的速度实现C ++实现。 确认它比在iPhone 11 Pro上使用快10倍,在Essential Phone上快8倍。 您可以在下查看基准测试。 安装 npm install react-native-quick-md5 用法 import { ...

    Java 空间索引.zip

    该代码是开源的,并根据GNU 宽通用公共许可证2.1 或更高版本发布。用法强烈建议首先查看 jsi-examples 存储库https://github.com/aled/jsi-examples。简而言之,您需要像这样初始化 RTree// Create and initialize ...

Global site tag (gtag.js) - Google Analytics