2. 作用域 — Google 开源项目风格指南
- 格式:pdf
- 大小:601.73 KB
- 文档页数:9
Google C++编程风格指南(一)背景Google的开源项目大多使用C++开发。
每一个C++程序员也都知道,C++具有很多强大的语言特性,但这种强大不可避免的导致它的复杂,这种复杂会使得代码更易于出现bug、难于阅读和维护。
本指南的目的是通过详细阐述在C++编码时要怎样写、不要怎样写来规避其复杂性。
这些规则可在允许代码有效使用C++语言特性的同时使其易于管理。
风格,也被视为可读性,主要指称管理C++代码的习惯。
使用术语风格有点用词不当,因为这些习惯远不止源代码文件格式这么简单。
使代码易于管理的方法之一是增强代码一致性,让别人可以读懂你的代码是很重要的,保持统一编程风格意味着可以轻松根据“模式匹配”规则推断各种符号的含义。
创建通用的、必需的习惯用语和模式可以使代码更加容易理解,在某些情况下改变一些编程风格可能会是好的选择,但我们还是应该遵循一致性原则,尽量不这样去做。
本指南的另一个观点是C++特性的臃肿。
C++是一门包含大量高级特性的巨型语言,某些情况下,我们会限制甚至禁止使用某些特性使代码简化,避免可能导致的各种问题,指南中列举了这类特性,并解释说为什么这些特性是被限制使用的。
由Google开发的开源项目将遵照本指南约定。
注意:本指南并非C++教程,我们假定读者已经对C++非常熟悉。
头文件通常,每一个.cc文件(C++的源文件)都有一个对应的.h文件(头文件),也有一些例外,如单元测试代码和只包含main()的.cc文件。
正确使用头文件可令代码在可读性、文件大小和性能上大为改观。
下面的规则将引导你规避使用头文件时的各种麻烦。
1. #define的保护所有头文件都应该使用#define防止头文件被多重包含(multiple inclusion),命名格式当是:<PROJECT>_<PATH>_<FILE>_H_为保证唯一性,头文件的命名应基于其所在项目源代码树的全路径。
Docs » C++ 风格指南 - 内容目录 » 1. 头文件1. 头文件通常每一个.cc文件都有一个对应的.h文件. 也有一些常见例外, 如单元测试代码和只包含main()函数的.cc文件.正确使用头文件可令代码在可读性、文件大小和性能上大为改观.下面的规则将引导你规避使用头文件时的各种陷阱.1.1. Self-contained 头文件Tip头文件应该能够自给自足(self-contained,也就是可以作为第一个头文件被引入),以.h 结尾。
至于用来插入文本的文件,说到底它们并不是头文件,所以应以.inc结尾。
不允许分离出-inl.h头文件的做法.所有头文件要能够自给自足。
换言之,用户和重构工具不需要为特别场合而包含额外的头文件。
详言之,一个头文件要有1.2. #define 保护,统统包含它所需要的其它头文件,也不要求定义任何特别 symbols.不过有一个例外,即一个文件并不是 self-contained 的,而是作为文本插入到代码某处。
或者,文件内容实际上是其它头文件的特定平台(pla orm-specific)扩展部分。
这些文件就要用.inc文件扩展名。
如果.h文件声明了一个模板或内联函数,同时也在该文件加以定义。
凡是有用到这些的.cc文件,就得统统包含该头文件,否则程序可能会在构建中链接失败。
不要把这些定义放到分离的-inl.h文件里(译者注:过去该规范曾提倡把定义放到 -inl.h 里过)。
有个例外:如果某函数模板为所有相关模板参数显式实例化,或本身就是某类的一个私有成员,那么它就只能定义在实例化该模板的.cc文件里。
1.2. #define 保护Tip所有头文件都应该使用#define来防止头文件被多重包含, 命名格式当是:<PROJECT>_<PATH>_<FILE>_H_ .为保证唯一性, 头文件的命名应该基于所在项目源代码树的全路径. 例如, 项目foo中的头文件foo/src/bar/baz.h可按如下方式保护:#ifndef FOO_BAR_BAZ_H_#define FOO_BAR_BAZ_H_...#endif // FOO_BAR_BAZ_H_1.3. 前置声明Tip尽可能地避免使用前置声明。
Google JavaScript 编码规范指南修订版: 2.9Aaron WhyteBob JervisDan PupiusEric ArvidssonFritz SchneiderRobby Walker每个条目都有概述信息, 点击查看详细的内容. 你也可以点击下面的按钮展开全部重要注意事项显示被隐藏的内容这份指南中, 可以点击旁边的按钮来显示更多的细节.Hooray! 这里是更多详细的内容, 你也可以点击最上面的"显示/隐藏全部按钮"来切换显示更多内容.背景JavaScript 是一种客户端脚本语言, Google 的许多开源工程中都有用到它. 这份指南列出了编写JavaScript 时需要遵守的规则.JavaScript 语言规范变量声明变量必须加上var关键字.Decision:当你没有写var, 变量就会暴露在全局上下文中, 这样很可能会和现有变量冲突. 另外, 如果没有加上, 很难明确该变量的作用域是什么, 变量也很可能像在局部作用域中, 很轻易地泄漏到Document 或者Window 中, 所以务必用var去声明变量.常量常量的形式如: NAMES_LIKE_THIS, 即使用大写字符, 并用下划线分隔. 你也可用@const标记来指明它是一个常量. 但请永远不要使用const关键词.Decision:对于基本类型的常量, 只需转换命名.对于非基本类型, 使用@const标记.这标记告诉编译器它是常量.至于关键词const, 因为IE 不能识别, 所以不要使用.分号总是使用分号.如果仅依靠语句间的隐式分隔, 有时会很麻烦. 你自己更能清楚哪里是语句的起止.而且有些情况下, 漏掉分号会很危险:这段代码会发生些什么诡异事呢?1. 报JavaScript 错误- 例子1上的语句会解释成, 一个函数带一匿名函数作为参数而被调用, 返回42后, 又一次被"调用", 这就导致了错误.2. 例子2中, 你很可能会在运行时遇到'no such property in undefined' 错误, 原因是代码试图这样x[ffVersion][isIE]()执行.3. 当resultOfOperation()返回非NaN 时, 就会调用die, 其结果也会赋给THINGS_TO_EAT.为什么?JavaScript 的语句以分号作为结束符, 除非可以非常准确推断某结束位置才会省略分号. 上面的几个例子产出错误, 均是在语句中声明了函数/对象/数组直接量, 但闭括号('}'或']')并不足以表示该语句的结束. 在JavaScript 中, 只有当语句后的下一个符号是后缀或括号运算符时, 才会认为该语句的结束.遗漏分号有时会出现很奇怪的结果, 所以确保语句以分号结束.嵌套函数可以使用嵌套函数很有用, 比如,减少重复代码, 隐藏帮助函数, 等. 没什么其他需要注意的地方, 随意使用.块内函数声明不要在块内声明一个函数不要写成:虽然很多JS 引擎都支持块内声明函数, 但它不属于ECMAScript 规范(见ECMA-262, 第13和14条). 各个浏览器糟糕的实现相互不兼容, 有些也与未来ECMAScript 草案相违背.ECMAScript 只允许在脚本的根语句或函数中声明函数. 如果确实需要在块中定义函数, 建议使用函数表达式来初始化变量:异常可以你在写一个比较复杂的应用时, 不可能完全避免不会发生任何异常. 大胆去用吧.自定义异常可以有时发生异常了, 但返回的错误信息比较奇怪, 也不易读. 虽然可以将含错误信息的引用对象或者可能产生错误的完整对象传递过来, 但这样做都不是很好, 最好还是自定义异常类, 其实这些基本上都是最原始的异常处理技巧. 所以在适当的时候使用自定义异常.标准特性总是优于非标准特性.最大化可移植性和兼容性, 尽量使用标准方法而不是用非标准方法, (比如, 优先用string.charAt(3)而不用string[3] , 通过DOM 原生函数访问元素, 而不是使用应用封装好的快速接口.封装基本类型不要没有任何理由去封装基本类型, 另外还存在一些风险:除非明确用于类型转换, 其他情况请千万不要这样做!有时用作number, string或boolean时, 类型的转换会非常实用.多级原型结构不是首选多级原型结构是指JavaScript 中的继承关系. 当你自定义一个D类, 且把B类作为其原型, 那么这就获得了一个多级原型结构. 这些原型结构会变得越来越复杂!使用the Closure 库中的goog.inherits()或其他类似的用于继承的函数, 会是更好的选择.方法定义Foo.prototype.bar = function() { ... };有很多方法可以给构造器添加方法或成员, 我们更倾向于使用如下的形式:闭包可以, 但小心使用.闭包也许是JS 中最有用的特性了. 有一份比较好的介绍闭包原理的文档.有一点需要牢记, 闭包保留了一个指向它封闭作用域的指针, 所以, 在给DOM 元素附加闭包时, 很可能会产生循环引用, 进一步导致内存泄漏. 比如下面的代码:这里, 即使没有使用element, 闭包也保留了element, a和b的引用, . 由于element也保留了对闭包的引用, 这就产生了循环引用, 这就不能被GC 回收. 这种情况下, 可将代码重构为:eval()只用于解析序列化串(如: 解析RPC 响应)eval()会让程序执行的比较混乱, 当eval()里面包含用户输入的话就更加危险. 可以用其他更佳的, 更清晰, 更安全的方式写你的代码, 所以一般情况下请不要使用eval(). 当碰到一些需要解析序列化串的情况下(如, 计算RPC 响应), 使用eval很容易实现.解析序列化串是指将字节流转换成内存中的数据结构. 比如, 你可能会将一个对象输出成文件形式:很简单地调用eval后, 把表示成文件的数据读取回内存中.类似的, eval()对RPC 响应值进行解码. 例如, 你在使用XMLHttpRequest发出一个RPC 请求后, 通过eval () 将服务端的响应文本转成JavaScript 对象:with() {}不要使用使用with让你的代码在语义上变得不清晰. 因为with的对象, 可能会与局部变量产生冲突, 从而改变你程序原本的用义. 下面的代码是干嘛的?答案: 任何事. 局部变量x可能被foo的属性覆盖, 当它定义一个setter 时, 在赋值3后会执行很多其他代码. 所以不要使用with语句.this仅在对象构造器, 方法, 闭包中使用.this的语义很特别. 有时它引用一个全局对象(大多数情况下), 调用者的作用域(使用eval时), DOM 树中的节点(添加事件处理函数时), 新创建的对象(使用一个构造器), 或者其他对象(如果函数被call()或apply()).使用时很容易出错, 所以只有在下面两个情况时才能使用:∙在构造器中∙对象的方法(包括创建的闭包)中for-in 循环只用于object/map/hash 的遍历对Array用for-in循环有时会出错. 因为它并不是从0到length - 1进行遍历, 而是所有出现在对象及其原型链的键值. 下面就是一些失败的使用案例:而遍历数组通常用最普通的for 循环.关联数组永远不要使用Array作为map/hash/associative 数组.数组中不允许使用非整型作为索引值, 所以也就不允许用关联数组. 而取代它使用Object来表示map/hash 对象. Array仅仅是扩展自Object (类似于其他JS 中的对象, 就像Date, RegExp和String)一样来使用.多行字符串不要使用不要这样写长字符串:在编译时, 不能忽略行起始位置的空白字符; "\" 后的空白字符会产生奇怪的错误; 虽然大多数脚本引擎支持这种写法, 但它不是ECMAScript 的标准规范.Array 和Object 直接量使用使用Array和Object语法, 而不使用Array和Object构造器.使用Array 构造器很容易因为传参不恰当导致错误.如果传入一个参数而不是2个参数, 数组的长度很有可能就不是你期望的数值了.为了避免这些歧义, 我们应该使用更易读的直接量来声明.虽然Object 构造器没有上述类似的问题, 但鉴于可读性和一致性考虑, 最好还是在字面上更清晰地指明.应该写成:修改内置对象的原型不要千万不要修改内置对象, 如Object.prototype和Array.prototype的原型. 而修改内置对象, 如Function.prototype的原型, 虽然少危险些, 但仍会导致调试时的诡异现象. 所以也要避免修改其原型.IE下的条件注释不要使用不要这样子写:条件注释妨碍自动化工具的执行, 因为在运行时, 它们会改变JavaScript 语法树. JavaScript 编码风格命名通常, 使用functionNamesLikeThis, variableNamesLikeThis, ClassNamesLikeThis, Enum NamesLikeThis, methodNamesLikeThis, 和SYMBOLIC_CONSTANTS_LIKE_THIS.展开见细节.属性和方法∙文件或类中的私有属性, 变量和方法名应该以下划线"_" 开头.∙保护属性, 变量和方法名不需要下划线开头, 和公共变量名一样.更多有关私有和保护的信息见, visibility.方法和函数参数可选参数以opt_开头.函数的参数个数不固定时, 应该添加最后一个参数var_args为参数的个数. 你也可以不设置var_args而取代使用arguments.可选和可变参数应该在@param标记中说明清楚. 虽然这两个规定对编译器没有任何影响, 但还是请尽量遵守Getters 和SettersGetters 和setters 并不是必要的. 但只要使用它们了, 就请将getters 命名成getFoo()形式, 将setters 命名成setFoo(value)形式. (对于布尔类型的getters, 使用isFoo()也可.)命名空间JavaScript 不支持包和命名空间.不容易发现和调试全局命名的冲突, 多个系统集成时还可能因为命名冲突导致很严重的问题. 为了提高JavaScript 代码复用率, 我们遵循下面的约定以避免冲突.为全局代码使用命名空间在全局作用域上, 使用一个唯一的, 与工程/库相关的名字作为前缀标识. 比如, 你的工程是"Project Sloth", 那么命名空间前缀可取为sloth.*.许多JavaScript 库, 包括the Closure Library and Dojo toolkit 为你提供了声明你自己的命名空间的函数. 比如:明确命名空间所有权当选择了一个子命名空间, 请确保父命名空间的负责人知道你在用哪个子命名空间, 比如说, 你为工程'sloths' 创建一个'hats' 子命名空间, 那确保Sloth 团队人员知道你在使用sloth.hats.外部代码和内部代码使用不同的命名空间"外部代码" 是指来自于你代码体系的外部, 可以独立编译. 内外部命名应该严格保持独立. 如果你使用了外部库, 他的所有对象都在foo.hats.*下, 那么你自己的代码不能在foo.hats.*下命名, 因为很有可能其他团队也在其中命名.如果你需要在外部命名空间中定义新的API, 那么你应该直接导出一份外部库, 然后在这份代码中修改. 在你的内部代码中, 应该通过他们的内部名字来调用内部API , 这样保持一致性可让编译器更好的优化你的代码.重命名那些名字很长的变量, 提高可读性主要是为了提高可读性. 局部空间中的变量别名只需要取原名字的最后部分.不要对命名空间创建别名.除非是枚举类型, 不然不要访问别名变量的属性.不要在全局范围内创建别名, 而仅在函数块作用域中使用.文件名文件名应该使用小写字符, 以避免在有些系统平台上不识别大小写的命名方式. 文件名以.js结尾, 不要包含除-和_外的标点符号(使用-优于_).自定义toString() 方法应该总是成功调用且不要抛异常.可自定义toString()方法, 但确保你的实现方法满足: (1) 总是成功(2) 没有其他负面影响.如果不满足这两个条件, 那么可能会导致严重的问题, 比如, 如果toString()调用了包含assert的函数, assert输出导致失败的对象, 这在toString()也会被调用.延迟初始化可以没必要在每次声明变量时就将其初始化.明确作用域任何时候都需要任何时候都要明确作用域- 提高可移植性和清晰度. 例如, 不要依赖于作用域链中的window对象. 可能在其他应用中, 你函数中的window不是指之前的那个窗口对象.代码格式化展开见详细描述.主要依照C++ 格式规范 (中文版), 针对JavaScript, 还有下面一些附加说明. 大括号分号会被隐式插入到代码中, 所以你务必在同一行上插入大括号. 例如:数组和对象的初始化如果初始值不是很长, 就保持写在单行上:初始值占用多行时, 缩进2个空格.比较长的标识符或者数值, 不要为了让代码好看些而手工对齐. 如:不要这样做:函数参数尽量让函数参数在同一行上. 如果一行超过80 字符, 每个参数独占一行, 并以4个空格缩进, 或者与括号对齐, 以提高可读性. 尽可能不要让每行超过80个字符. 比如下面这样:传递匿名函数如果参数中有匿名函数, 函数体从调用该函数的左边开始缩进2个空格, 而不是从function 这个关键字开始. 这让匿名函数更加易读(不要增加很多没必要的缩进让函数体显示在屏幕的右侧).更多的缩进事实上, 除了初始化数组和对象, 和传递匿名函数外, 所有被拆开的多行文本要么选择与之前的表达式左对齐, 要么以4个(而不是2个)空格作为一缩进层次.空行使用空行来划分一组逻辑上相关联的代码片段.二元和三元操作符操作符始终跟随着前行, 这样就不用顾虑分号的隐式插入问题. 如果一行实在放不下, 还是按照上述的缩进风格来换行.括号只在需要的时候使用不要滥用括号, 只在必要的时候使用它.对于一元操作符(如delete, typeof和void ), 或是在某些关键词(如return, throw, case, new )之后, 不要使用括号.字符串使用' 优于"单引号(') 优于双引号("). 当你创建一个包含HTML 代码的字符串时就知道它的好处了.可见性(私有域和保护域)推荐使用JSDoc 中的两个标记: @private和@protectedJSDoc 的两个标记@private和@protected用来指明类, 函数, 属性的可见性域.标记为@private的全局变量和函数, 表示它们只能在当前文件中访问.标记为@private的构造器, 表示该类只能在当前文件或是其静态/普通成员中实例化; 私有构造器的公共静态属性在当前文件的任何地方都可访问, 通过instanceof操作符也可.永远不要为全局变量, 函数, 构造器加@protected标记.标记为@private的属性, 在当前文件中可访问它; 如果是类属性私有, "拥有"该属性的类的所有静态/普通成员也可访问, 但它们不能被不同文件中的子类访问或覆盖.标记为@protected的属性, 在当前文件中可访问它, 如果是类属性保护, 那么"拥有"该属性的类及其子类中的所有静态/普通成员也可访问.注意: 这与C++, Java 中的私有和保护不同, 它们是在当前文件中, 检查是否具有访问私有/保护属性的权限, 有权限即可访问, 而不是只能在同一个类或类层次上. 而C++ 中的私有属性不能被子类覆盖. (C++/Java 中的私有/保护是指作用域上的可访问性, 在可访问性上的限制. JS 中是在限制在作用域上. PS: 可见性是与作用域对应)// File 2./*** @return {number} The number of ducks we've arranged in a row.*/AA_PublicClass.prototype.method = function() {// Legal accesses of these two properties.return this.privateProp_ + AA_PublicClass.staticPrivateProp_;};// File 3./*** @constructor* @extends {AA_PublicClass}*/AA_SubClass = function() {// Legal access of a protected static property.AA_PublicClass.staticProtectedProp = this.method();};goog.inherits(AA_SubClass, AA_PublicClass);/*** @return {number} The number of ducks we've arranged in a row.*/AA_SubClass.prototype.method = function() {// Legal access of a protected instance property.return this.protectedProp;};JavaScript 类型强烈建议你去使用编译器.如果使用JSDoc, 那么尽量具体地, 准确地根据它的规则来书写类型说明. 目前支持两种JS2 和JS1.x 类型规范.JavaScript 类型语言JS2 提议中包含了一种描述JavaScript 类型的规范语法, 这里我们在JSDoc 中采用其来描述函数参数和返回值的类型.JSDoc 的类型语言, 按照JS2 规范, 也进行了适当改变, 但编译器仍然支持旧语法.JavaScript中的类型可空vs. 可选参数和属性JavaScript 是一种弱类型语言, 明白可选, 非空和未定义参数或属性之间的细微差别还是很重要的.对象类型(引用类型)默认非空. 注意: 函数类型默认不能为空. 除了字符串, 整型, 布尔, undefined 和null 外, 对象可以是任何类型.告诉编译器myValue_属性为一对象或null. 如果myValue_永远都不会为null, 就应该如下声明:这样, 当编译器在代码中碰到MyClass为null 时, 就会给出警告.函数的可选参数可能在运行时没有定义, 所以如果他们又被赋给类属性, 需要声明成:这告诉编译器myValue_可能是一个对象, 或null, 或undefined.注意: 可选参数opt_value被声明成{Object=}, 而不是{Object|undefined}. 这是因为可选参数可能是undefined. 虽然直接写undefined 也并无害处, 但鉴于可阅读性还是写成上述的样子.最后, 属性的非空和可选并不矛盾, 属性既可是非空, 也可是可选的. 下面的四种声明各不相同:注释使用JSDoc我们使用JSDoc 中的注释风格. 行内注释使用// 变量的形式. 另外, 我们也遵循C++ 代码注释风格. 这也就是说你需要:∙版权和著作权的信息,∙文件注释中应该写明该文件的基本信息(如, 这段代码的功能摘要, 如何使用, 与哪些东西相关), 来告诉那些不熟悉代码的读者.∙类, 函数, 变量和必要的注释,∙期望在哪些浏览器中执行,∙正确的大小写, 标点和拼写.为了避免出现句子片段, 请以合适的大/小写单词开头, 并以合适的标点符号结束这个句子.现在假设维护这段代码的是一位初学者. 这可能正好是这样的!目前很多编译器可从JSDoc 中提取类型信息, 来对代码进行验证, 删除和压缩. 因此, 你很有必要去熟悉正确完整的JSDoc .顶层/文件注释顶层注释用于告诉不熟悉这段代码的读者这个文件中包含哪些东西. 应该提供文件的大体内容, 它的作者, 依赖关系和兼容性信息. 如下:类注释每个类的定义都要附带一份注释, 描述类的功能和用法. 也需要说明构造器参数. 如果该类继承自其它类, 应该使用@extends标记. 如果该类是对接口的实现, 应该使用@implements标记.方法与函数的注释提供参数的说明. 使用完整的句子, 并用第三人称来书写方法说明.对于一些简单的, 不带参数的getters, 说明可以忽略.属性注释也需要对属性进行注释.类型转换的注释有时, 类型检查不能很准确地推断出表达式的类型, 所以应该给它添加类型标记注释来明确之, 并且必须在表达式和类型标签外面包裹括号.JSDoc 缩进如果你在@param, @return, @supported, @this或@deprecated中断行, 需要像在代码中一样, 使用4个空格作为一个缩进层次.不要在@fileoverview标记中进行缩进.虽然不建议, 但也可对说明文字进行适当的排版对齐. 不过, 这样带来一些负面影响, 就是当你每次修改变量名时, 都得重新排版说明文字以保持和变量名对齐.枚举注意一下, 枚举也具有有效类型, 所以可以当成参数类型来用.Typedefs有时类型会很复杂. 比如下面的函数, 接收Element 参数:你可以使用@typedef标记来定义个常用的类型表达式.JSDoc 标记表在第三方代码中, 你还会见到其他一些JSDoc 标记. 这些标记在JSDoc Toolkit Tag Reference 都有介绍到, 但在Google 的代码中, 目前不推荐使用. 你可以认为这些是将来会用到的"保留" 名. 它们包含:∙@augments∙@argument∙@borrows∙@class∙@constant∙@constructs∙@default∙@event∙@example∙@field∙@function∙@ignore∙@inner∙@link∙@memberOf∙@name∙@namespace∙@property∙@public∙@requires∙@returns∙@since∙@static∙@versionJSDoc 中的HTML类似于JavaDoc, JSDoc 支持许多HTML 标签, 如<code>, <pre>, <tt>, <strong>, <ul>, <ol>, <li>, <a>, 等等.这就是说JSDoc 不会完全依照纯文本中书写的格式. 所以, 不要在JSDoc 中, 使用空白字符来做格式化:上面的注释, 出来的结果是:Computes weight based on three factors: items sent items received items received 应该这样写:另外, 也不要包含任何HTML 或类HTML 标签, 除非你就想让它们解析成HTML 标签.出来的结果是:Changes tags to tags.另外, 也应该在源代码文件中让其他人更可读, 所以不要过于使用HTML 标签:上面的代码中, 其他人就很难知道你想干嘛, 直接改成下面的样子就清楚多了:编译推荐使用建议您去使用JS 编译器, 如Closure Compiler.Tips and TricksJavaScript 小技巧True 和False 布尔表达式下面的布尔表达式都返回false:∙null∙undefined∙''空字符串∙0数字0但小心下面的, 可都返回true:∙'0'字符串0∙[]空数组∙{}空对象下面段比较糟糕的代码:你可以直接写成下面的形式(只要你希望x 不是0 和空字符串, 和false):如果你想检查字符串是否为null 或空:但这样会更好:注意: 还有很多需要注意的地方, 如:∙Boolean('0') == true'0' != true∙0 != null0 == []0 == false∙Boolean(null) == falsenull != truenull != false∙Boolean(undefined) == falseundefined != trueundefined != false∙Boolean([]) == true[] != true[] == false∙Boolean({}) == true{} != true{} != false条件(三元)操作符(?:)三元操作符用于替代下面的代码:你可以写成:在生成HTML 代码时也是很有用的:&& 和||二元布尔操作符是可短路的, 只有在必要时才会计算到最后一项. "||" 被称作为'default' 操作符, 因为可以这样:你可以使用它来简化上面的代码:"&&" 也可简短代码.比如:你可以像这样来使用:或者:不过这样就有点儿过头了:使用join() 来创建字符串通常是这样使用的:但这样在IE 下非常慢, 可以用下面的方式:你也可以是用数组作为字符串构造器, 然后通过myArray.join('')转换成字符串. 不过由于赋值操作快于数组的push(), 所以尽量使用赋值操作.遍历Node ListNode lists 是通过给节点迭代器加一个过滤器来实现的. 这表示获取他的属性, 如length 的时间复杂度为O(n), 通过length 来遍历整个列表需要O(n^2).这样做会更好:。
GWT开发指南范文GWT(Google Web Toolkit)是一种开发Web应用程序的框架,由Google推出并开源。
它允许开发人员使用Java语言编写Web应用程序,然后将其编译为高度优化的JavaScript代码,以在不同的浏览器中运行。
本文将介绍GWT开发的一般流程和一些最佳实践。
一、GWT的基本概念1. 项目结构:一个GWT项目通常包括一个主模块(.gwt.xml文件)和一些客户端类(Java代码),其负责生成JavaScript代码。
GWT还支持使用UI绑定器(UiBinder)将UI和Java代码分离,并支持使用CSS样式表。
2. 生成与调试:GWT支持通过将Java代码编译为JavaScript来生成Web应用程序。
GWT提供了一个开发模式(Development Mode)来简化程序的调试。
开发者可以在浏览器中直接运行应用程序,并通过浏览器的调试工具进行调试。
3. RPC:GWT的远程过程调用(RPC)机制允许开发人员通过定义Java接口和实现类来实现服务器与客户端之间的通信。
开发人员可以使用预定义的RPC机制,也可以通过自定义稍微复杂的通信需求。
二、GWT开发的流程1. 设计界面:首先,开发人员需要设计应用程序的用户界面。
GWT支持使用UI绑定器和CSS样式表来设计界面。
开发人员可以使用GWT提供的预定义部件(Widgets),也可以自定义部件。
2.实现业务逻辑:其次,开发人员需要实现应用程序的业务逻辑。
GWT的客户端类中包含了应用程序的业务逻辑代码。
开发人员可以在客户端类中定义处理用户事件的方法,并通过调用服务器提供的服务来实现与服务器的通信。
3.调试与测试:在实现业务逻辑之后,开发人员需要通过调试和测试来确保应用程序的正确性和稳定性。
GWT提供了一个开发模式,可以方便地进行调试。
开发人员可以在浏览器中运行应用程序,并通过浏览器的调试工具进行调试。
4. 编译与部署:最后,开发人员需要将应用程序编译为JavaScript,并将其部署到Web服务器上。
chrome源码学习之知识体系指南google chrome浏览器的源代码是非常庞大的,为了较快的进入学习状态,有必要事先对一些知识点进行说明,这里不是要详细说明里面的细节,而是从概念层次阐明一些注意事项。
这里谈到的东西也不一定说非要事先把这些东西搞得很明白才能去学习源代码,主要还是先给大家一个心理准备。
当然如果你最终要在细粒度的层次掌握源代码细节,那么这些知识点必须非常清楚,不过这可以结合源代码的时候再针对性的来澄清这些知识点。
由于chrome源代码包含方方面面的技术非常之多,根据个人喜好可能针对性的对某些技术感兴趣,那么可以针对性的进行学习。
大的原则是理论和实践相结合,chrome包含的代码就是各种规范、理论的具体实践实现。
基础知识基础知识是任何技术方面都应该掌握的领域无关的通用知识。
我认为主要包括“语言基础”和“系统基础”两大类。
语言基础知识整个chrome源代码包括webkit内核、v8引擎全部用c++语言编写。
那么作为语言基础的c++语言就必须是精通的水平才可能流畅的看明白里面的代码。
我一直认为c++是有史以来最复杂的语言(可参考孟岩文章关于C++复杂性的零碎思考),是典型的魔幻语言,我曾经也痴迷去深究c++一些高级技巧,后来某天突然发现这种深究、这种玩法除了增加理解上的复杂性,对实际问题似乎并没有带来任何好处。
后来看到一篇文章(请看孟岩文章Ruby 1.9不会杀死Python),才明白原来自己的性格是喜欢简约风格的语言,从此不再去钻牛角尖玩语言技巧。
对于语言问题每个人都有自己的看法和偏好,但显然,不喜欢归不喜欢,但在现实中,我们有时候又必须去面对我们不太喜欢的东西(当然并不是说我讨厌c++),拿语言来说,这种情况下对于喜欢简约风格的程序员最理智的办法就是以一种简约的方法去使用复杂的c++。
千万不要在实际应用中为了技巧而技巧,这样会非常丑陋别扭,因为你根本没有真正明白什么时候该合理的使用这些技巧。
Google C++编程风格指南(一)背景Google的开源项目大多使用C++开发。
每一个C++程序员也都知道,C++具有很多强大的语言特性,但这种强大不可避免的导致它的复杂,这种复杂会使得代码更易于出现bug、难于阅读和维护。
本指南的目的是通过详细阐述在C++编码时要怎样写、不要怎样写来规避其复杂性。
这些规则可在允许代码有效使用C++语言特性的同时使其易于管理。
风格,也被视为可读性,主要指称管理C++代码的习惯。
使用术语风格有点用词不当,因为这些习惯远不止源代码文件格式这么简单。
使代码易于管理的方法之一是增强代码一致性,让别人可以读懂你的代码是很重要的,保持统一编程风格意味着可以轻松根据“模式匹配”规则推断各种符号的含义。
创建通用的、必需的习惯用语和模式可以使代码更加容易理解,在某些情况下改变一些编程风格可能会是好的选择,但我们还是应该遵循一致性原则,尽量不这样去做。
本指南的另一个观点是C++特性的臃肿。
C++是一门包含大量高级特性的巨型语言,某些情况下,我们会限制甚至禁止使用某些特性使代码简化,避免可能导致的各种问题,指南中列举了这类特性,并解释说为什么这些特性是被限制使用的。
由Google开发的开源项目将遵照本指南约定。
注意:本指南并非C++教程,我们假定读者已经对C++非常熟悉。
头文件通常,每一个.cc文件(C++的源文件)都有一个对应的.h文件(头文件),也有一些例外,如单元测试代码和只包含main()的.cc文件。
正确使用头文件可令代码在可读性、文件大小和性能上大为改观。
下面的规则将引导你规避使用头文件时的各种麻烦。
1. #define的保护所有头文件都应该使用#define防止头文件被多重包含(multiple inclusion),命名格式当是:<PROJECT>_<PATH>_<FILE>_H_为保证唯一性,头文件的命名应基于其所在项目源代码树的全路径。
Python3学习资料⼀、python3 学习计划Python⼊门学习计划安排:(按序号来)推荐直接从Python3开始学起。
参考了 Python3.x基础学习资料整理第⼀⽬标是:通过学习python学会编程。
第⼆⽬标:会写爬⾍,⽹页采集。
第三⽬标:学会web开发。
1、推荐廖雪峰⽼师的⽹站:(强烈建议你从⽬录的开始学到结束)。
2、看以下⽹站学习:Python3官⽅指南(中⽂):Python3官⽅教程(中⽂):Python ⼊门指南:Python3 教程 | 菜鸟教程:Python最佳实践指南:更多的学习资源:视频补充:1、爬⾍⽅向:2、数据分析实战:3、Django web开发:⼆、python3学习推荐书籍、视频1、推荐书籍Python编程快速上⼿:让繁琐⼯作⾃动化(⼊门,但细节不够)Python编程:从⼊门到实践(⼊门,推荐)Python参考⼿册(第4版)(⼊门,推荐)Python程序设计戴维 I.施奈德(David I. Schneider)著;车万翔译(⼊门)Effective Python:编写⾼质量Python代码的59个有效⽅法(推荐)Python学习⼿册 Mark Lutz (第4版)(很厚的书)Python语⾔及其应⽤ Bill Lubanovic (⼊门,推荐)像计算机科学家⼀样思考Python 第2版其他⼊门书籍:1、《笨⽅法学Python》英⽂名(learn python the hard way)中译版的电⼦版:Python 核⼼编程第⼆版(进阶)Python Cookbook(第3版) (进阶,推荐)Python编程实战:运⽤设计模式、并发和程序库创建⾼质量程序(作为进阶!)Python性能分析与优化(进阶)《Python Web开发测试驱动⽅法》(进阶,重点推荐)《python标准库》 Doug Hellmann (可当做⼯具书)⾼性能Python 作者: (美)⼽雷利克 / (英)欧⽇沃尔德《Python⽂本分析》Python Cookbook(在线预览)2、推荐视频3、其他资料python3.8 新特性:千⾏代码⼊门Python:8 个 Python 实⽤脚本:5 个 Python 特性:从0到1,Python Web开发的进击之路:GitHub上Stars最多的10个Python项⽬Python⾯试题-概念篇:Python⾯试题-代码篇:有哪些学习数据分析的⽹站:项⽬试验:Python练习⼩项⽬:Python 100例练习题:Python 100例(菜鸟教程)美图2018春招笔试题⽬-算法⽅向:京东2019春招编程题参考代码:如何训练⾃⼰的编程思路?三、Python编程规范和风格指南Google 开源项⽬风格指南——中⽂版(Python语⾔)Python 代码风格指南:PEP8,原⽂:PEP8中⽂:r代码排版,命名与注释:。
studygolang 介绍摘要:一、引言二、Go 语言简介1.Go 语言的起源2.Go 语言的特点三、Go 语言的应用领域1.后端开发2.微服务架构3.容器技术四、学习Go 语言的优势1.简洁易懂的语法2.并发编程的优势3.跨平台和丰富的标准库五、如何学习Go 语言1.学习资源推荐2.实践项目3.参与社区交流六、总结正文:一、引言Go 语言,又称Golang,是一门开源的编程语言,自2007 年由谷歌推出以来,受到了广泛关注和应用。
Go 语言以简洁、高效、并发编程为特点,吸引了越来越多的开发者投身于这门语言的学习和应用。
本文将详细介绍Go 语言的相关知识,帮助你更好地了解和学习这门语言。
二、Go 语言简介1.Go 语言的起源Go 语言由谷歌的Robert Griesemer、Rob Pike 和Ken Thompson 三位工程师于2007 年创立,旨在开发一门简洁、高效、可扩展的编程语言。
Go 语言的诞生受到了C 语言、Python 语言和Java 语言的影响,同时融入了现代编程语言的一些特性。
2.Go 语言的特点Go 语言具有以下特点:(1)简洁易懂:Go 语言的语法简洁,易于学习和理解。
(2)并发编程:Go 语言原生支持并发编程,通过goroutine 和channel 实现轻量级的线程调度和通信。
(3)高效性能:Go 语言的执行速度快,性能优越,特别适用于高并发、高性能的场景。
(4)跨平台:Go 语言支持多种操作系统和平台,包括Windows、Linux、macOS 等。
(5)丰富的标准库:Go 语言拥有丰富的标准库,涵盖了网络编程、加密算法、文件操作等众多领域。
三、Go 语言的应用领域1.后端开发Go 语言在Web 开发、API 接口、网络编程等方面表现优异,被广泛应用于后端开发领域。
2.微服务架构Go 语言的轻量级特性使其非常适合开发微服务,许多知名项目如Docker、Kubernetes 等都是使用Go 语言编写。
GoogleJavaScript样式指南Google JavaScript样式指南⽬录1简介本⽂档⽤作JavaScript编程语⾔中Google源代码编码标准的完整定义。
JavaScript源⽂件被描述为Google风格,当且仅当它符合此处的规则时。
与其他编程风格指南⼀样,所涉及的问题不仅包括格式化的美学问题,还包括其他类型的约定或编码标准。
但是,本⽂档主要关注我们普遍遵循的严格规则,并避免提供不明确可执⾏的建议(⽆论是通过⼈⼯还是⼯具)。
1.1术语说明在本⽂件中,除⾮另有说明:1. 术语注释总是指实现注释。
我们不使⽤"⽂档注释"这⼀短语,⽽是使⽤常⽤术语“JSDoc”来表⽰⼈类可读的⽂本和机器可读的注释/** …*/。
2. 使⽤短语时,本样式指南使⽤术语必须,不得,应该,不应该,也可以。
术语偏好和避免分别对应应该和不应该对应。
命令性和陈述性陈述是规定性的,并且必须符合。
其他"术语说明"将在整个⽂件中偶尔出现。
1.2指南说明本⽂档中的⽰例代码是⾮规范性的。
也就是说,虽然⽰例是Google风格,但它们可能并没有说明代表代码的唯⼀时尚⽅式。
在⽰例中进⾏的可选格式选择不得作为规则强制执⾏。
2源⽂件基础知识2.1⽂件名⽂件名必须全部⼩写,并且可以包含下划线(_)或短划线(-),但不包含其他标点符号。
遵循项⽬使⽤的约定。
⽂件名的扩展名必须是.js。
2.2⽂件编码:UTF-8源⽂件以UTF-8编码。
2.3特殊字符2.3.1空⽩字符除了⾏终⽌符序列之外,ASCII⽔平空格字符(0x20)是唯⼀出现在源⽂件中任何位置的空⽩字符。
这意味着1. 字符串⽂字中的所有其他空⽩字符都被转义,并且2. 制表符不⽤于缩进。
2.3.2特殊转义序列对于具有特殊的转义序列(任何字符\',\",\\,\b,\f,\n,\r,\t,\v),该序列使⽤,⽽不是对应的数字逃逸(例如\x0a,\u000a或\u{a})。
本指南的目的是通过详细阐述 C++ 注意事项来驾驭其复杂性. 这些规则在保证代码易于管理的同时, 高效使用 C++ 的语言特性.风格, 亦被称作可读性, 也就是指导 C++ 编程的约定. 使用术语 “风格” 有些用词不当, 因为这些习惯远不止源代码文件格式化这么简单.使代码易于管理的方法之一是加强代码一致性. 让任何程序员都可以快速读懂你的代码这点非常重要. 保持统一编程风格并遵守约定意味着可以很容易根据 “模式匹配” 规则来推断各种标识符的含义. 创建通用, 必需的习惯用语和模式可以使代码更容易理解. 在一些情况下可能有充分的理由改变某些编程风格, 但我们还是应该遵循一致性原则,尽量不这么做.本指南的另一个观点是 C++ 特性的臃肿. C++ 是一门包含大量高级特性的庞大语言. 某些情况下, 我们会限制甚至禁止使用某些特性. 这么做是为了保持代码清爽, 避免这些特性可能导致的各种问题. 指南中列举了这类特性, 并解释为什么这些特性被限制使用.Google 主导的开源项目均符合本指南的规定.注意: 本指南并非 C++ 教程, 我们假定读者已经对 C++ 非常熟悉.« C++ 风格指南 - 内容目录 :: Contents :: 1. 头文件 »© Copyright . Created using Sphinx 1.1.3.© Copyright . Created using Sphinx 1.1.3.定义:Boost 库集是一个广受欢迎, 经过同行鉴定, 免费开源的 C++ 库集.优点:Boost代码质量普遍较高, 可移植性好, 填补了 C++ 标准库很多空白, 如型别的特性, 更完善的绑定器, 更好的智能指针, 同时还提供了TR1 (标准库扩展) 的实现.缺点:某些 Boost 库提倡的编程实践可读性差, 比如元编程和其他高级模板技术, 以及过度 “函数化” 的编程风格.结论:为了向阅读和维护代码的人员提供更好的可读性, 我们只允许使用 Boost 一部分经认可的特性子集. 目前允许使用以下库:Compressed Pair : boost/compressed_pair.hppPointer Container : boost/ptr_container (序列化除外)Array : boost/array.hppThe Boost Graph Library (BGL) : boost/graph (序列化除外)Property Map : boost/property_map.hppIterator中处理迭代器定义的部分 : boost/iterator/iterator_adaptor.hpp,boost/iterator/iterator_facade.hpp, 以及boost/function_output_iterator.hpp我们正在积极考虑增加其它 Boost 特性, 所以列表中的规则将不断变化.« 4. 来自 Google 的奇技 :: Contents :: 6. 命名约定 »© Copyright . Created using Sphinx 1.1.3.。
Google编程风格指南(一)
0. 扉页
0.1 译者前言
Google 经常会发布一些开源项目, 意味着会接受来自其他代码贡献者的代码. 但是如果代码贡献者的编程风格与Google 的不一致, 会给代码阅读者和其他代码提交者造成不小的困扰. Google 因此发布了这份自己的编程风格指南, 使所有提交代码的人都能获知Google 的编程风格.
翻译初衷:
规则的作用就是避免混乱. 但规则本身一定要权威, 有说服力, 并且是理性的. 我们所见过的大部分编程规范, 其内容或不够严谨, 或阐述过于简单, 或带有一定的武断性. Google 保持其一贯的严谨精神, 5 万汉字的指南涉及广泛, 论证严密. 我们翻译该系列指南的主因也正是其严谨性. 严谨意味着指南的价值不仅仅局限于它罗列出的规范, 更具参考意义的是它为了列出规范而做的谨慎权衡过程.
指南不仅列出你要怎么做, 还告诉你为什么要这么做, 哪些情况下可以不这么做, 以及如何权衡其利弊. 其他团队未必要完全遵照指南亦步亦趋, 如前面所说, 这份指南是Google 根据自身实际情况打造的, 适用于其主导的开源项目. 其他团队可以参照该指南, 或从中汲取灵感, 建立适合自身实际情况的规范.
我们在翻译的过程中, 收获颇多. 希望本系列指南中文版对你同样能有所帮助.
我们翻译时也是尽力保持严谨, 但水平所限, bug 在所难免. 有任何意见或建议, 可与我们取得联系.
中文版和英文版一样, 使用 Artistic License/GPL 开源许可.
中文版修订历史:
2015-08 : 热心的清华大学同学@lilinsanity 完善了「类」章节以及其它一些小章节。
至此,对Google CPP Style Guide 4.45 的翻译正式竣工。
Google C++编程风格指南(一)背景Google的开源项目大多使用C++开发。
每一个C++程序员也都知道,C++具有很多强大的语言特性,但这种强大不可避免的导致它的复杂,这种复杂会使得代码更易于出现bug、难于阅读和维护。
本指南的目的是通过详细阐述在C++编码时要怎样写、不要怎样写来规避其复杂性。
这些规则可在允许代码有效使用C++语言特性的同时使其易于管理。
风格,也被视为可读性,主要指称管理C++代码的习惯。
使用术语风格有点用词不当,因为这些习惯远不止源代码文件格式这么简单。
使代码易于管理的方法之一是增强代码一致性,让别人可以读懂你的代码是很重要的,保持统一编程风格意味着可以轻松根据“模式匹配”规则推断各种符号的含义。
创建通用的、必需的习惯用语和模式可以使代码更加容易理解,在某些情况下改变一些编程风格可能会是好的选择,但我们还是应该遵循一致性原则,尽量不这样去做。
本指南的另一个观点是C++特性的臃肿。
C++是一门包含大量高级特性的巨型语言,某些情况下,我们会限制甚至禁止使用某些特性使代码简化,避免可能导致的各种问题,指南中列举了这类特性,并解释说为什么这些特性是被限制使用的。
由Google开发的开源项目将遵照本指南约定。
注意:本指南并非C++教程,我们假定读者已经对C++非常熟悉。
头文件通常,每一个.cc文件(C++的源文件)都有一个对应的.h文件(头文件),也有一些例外,如单元测试代码和只包含main()的.cc文件。
正确使用头文件可令代码在可读性、文件大小和性能上大为改观。
下面的规则将引导你规避使用头文件时的各种麻烦。
1.#define的保护所有头文件都应该使用#define防止头文件被多重包含(multiple inclusion),命名格式当是:<PROJECT>_<PATH>_<FILE>_H_为保证唯一性,头文件的命名应基于其所在项目源代码树的全路径。
(讯)其实是Google在内部传播的文件,只是后来由于该文件对于网站的新手以及SEO业余爱好者有着很重要的指导作用,所以Google网站管理员才在博客中分享了出来,但是由于篇幅问题,庸人就分两次写吧,当然大致内容是和原文一样的,不过是以庸人自己的理解写出来而已! 独特准确的标题标题无论是对于用户体验还是对于搜索引擎来说都无疑是非常重要的。
对于用户来说,通过标题可以很清楚的知道该网页是不是自己需要的东西,因此说标题对于用户体验是很重要的。
同样对于搜索引擎来说,网站的标题对于网站优化也是占据着很重要的地位。
虽然说书写一个独特准确的标题不能是您的排名在第一,但是好处肯定是大大的。
所以这就要求我们网站的编辑人员要认真的书写网站的标题。
那么咱们该如何来书写标题呢?首先咱们的标题必须能够概括咱们网页的内容,其次对于网站的主页来说,权重一般也必须是整个站点最高的页面,这里咱们需要抓住站点的主题来书写标题;再次就是对于非主页的页面来说,咱们应该根据页面内容来书写不同的标题;最后一点就是需要咱们的标题能够尽量书写的清晰明朗,让用户一看到就能清楚的明白该页面的具体内容。
同样在这里咱们也应该尽量的去避免一些错误的出现,比如:避免标题与页面内容无关;避免站点出现以‘未命名’,‘page1’这种无意义的词语命名的页面;这里值得注意的一点就是要避免标题过长,一般情况下尽量让搜索引擎显示的时候,能够完全显示就行了! 充分利用元标记作为页面的元标记主要是值keywords、description这些东西,这里的书写其实和网站的标题书写大致相同,也有一部分朋友在书写keywords和description的时候直接抄写页面的标题,因此这里的书写要点可以借鉴上文,这里就不啰嗦了。
(庸人曾写过一篇具体如何书写标题和元标记的软文,这里附上连接,希望对大家有所帮助!) 网站的URL结构网站的URL之所以很重要,其实原因也是很简单的,因为一个简单清晰的Url可以让用户很轻松的记住,给用户一个很好的用户体验,因此作为搜索引擎,Url结构的好坏也就成了咱们做SEO时需要考虑的一个重要部分。