2. 作用域 — Google 开源项目风格指南
Google+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_为保证唯一性,头文件的命名应基于其所在项目源代码树的全路径。
1. 头文件 — Google 开源项目风格指南
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 编码规范指南
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开发指南范文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源码学习之知识体系指南
chrome源码学习之知识体系指南google chrome浏览器的源代码是非常庞大的,为了较快的进入学习状态,有必要事先对一些知识点进行说明,这里不是要详细说明里面的细节,而是从概念层次阐明一些注意事项。
这里谈到的东西也不一定说非要事先把这些东西搞得很明白才能去学习源代码,主要还是先给大家一个心理准备。
当然如果你最终要在细粒度的层次掌握源代码细节,那么这些知识点必须非常清楚,不过这可以结合源代码的时候再针对性的来澄清这些知识点。
由于chrome源代码包含方方面面的技术非常之多,根据个人喜好可能针对性的对某些技术感兴趣,那么可以针对性的进行学习。
大的原则是理论和实践相结合,chrome包含的代码就是各种规范、理论的具体实践实现。
基础知识基础知识是任何技术方面都应该掌握的领域无关的通用知识。
我认为主要包括“语言基础”和“系统基础”两大类。
语言基础知识整个chrome源代码包括webkit内核、v8引擎全部用c++语言编写。
那么作为语言基础的c++语言就必须是精通的水平才可能流畅的看明白里面的代码。
我一直认为c++是有史以来最复杂的语言(可参考孟岩文章关于C++复杂性的零碎思考),是典型的魔幻语言,我曾经也痴迷去深究c++一些高级技巧,后来某天突然发现这种深究、这种玩法除了增加理解上的复杂性,对实际问题似乎并没有带来任何好处。
后来看到一篇文章(请看孟岩文章Ruby 1.9不会杀死Python),才明白原来自己的性格是喜欢简约风格的语言,从此不再去钻牛角尖玩语言技巧。
对于语言问题每个人都有自己的看法和偏好,但显然,不喜欢归不喜欢,但在现实中,我们有时候又必须去面对我们不太喜欢的东西(当然并不是说我讨厌c++),拿语言来说,这种情况下对于喜欢简约风格的程序员最理智的办法就是以一种简约的方法去使用复杂的c++。
千万不要在实际应用中为了技巧而技巧,这样会非常丑陋别扭,因为你根本没有真正明白什么时候该合理的使用这些技巧。
Google_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学习资料⼀、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 介绍
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样式指南
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})。
Google的C++编程规范
本指南的目的是通过详细阐述 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编程风格指南(一)
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++编程风格指南(一)背景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 C++ 风格指南-中文版
1.2. 头文件依赖
Tip 能用前置声明的地方尽量不使用 #include.
当一个头文件被包含的同时也引入了新的依赖, 一旦该头文件被修改, 代码就会被重新编译. 如果这个头文件又包含 了其他头文件, 这些头文件的任何改变都将导致所有包含了该头文件的代码被重新编译. 因此, 我们倾向于减少包含 头文件, 尤其是在头文件中包含头文件. 使用前置声明可以显著减少需要包含的头文件数量. 举例说明: 如果头文件中用到类 File, 但不需要访问 File 类的 声明, 头文件中只需前置声明 class File; 而无须 #include "file/base/file.h". 不允许访问类的定义的前提下, 我们在一个头文件中能对类 Foo 做哪些操作?
注意: 本指南并非 C++ 教程, 我们假定读者已经对 C++ 非常熟悉.
1. 头文件 — Google C++ Style Guide
Page 1 of 3
1. 头文件
通常每一个 .cc 文件都有一个对应的 .h 文件. 也有一些常见例外, 如单元测试代码和只包含 main() 函数的 .cc 文 件. 正确使用头文件可令代码在可读性、文件大小和性能上大为改观. 下面的规则将引导你规避使用头文件时的各种陷阱.
1.3. 内联函数
Tip 只有当函数只有 10 行甚至更少时才将其定义为内联函数.
定义: 当函数被声明为内联函数之后, 编译器会将其内联展开, 而不是按通常的函数调用机制进行调用.
优点: 当函数体比较小的时候, 内联该函数可以令目标代码更加高效. 对于存取函数以及其它函数体比较短, 性能关键 的函数, 鼓励使用内联.
Google Objective-C Sytle Guide 中文版
例子
一个例子顶上一千句话,我们就从这样的一个例子开始,来感受一下编码的风格、空格以及命名等 等。
当编写纯Objective-C代码时,我们基本遵守标准的Objective-C naming rules,这些命名规则可能与 C++风格指南中的大相径庭。例如,Google的C++风格指南中推荐使用下划线分隔的单词作为变量 名,而(苹果的)风格指南则使用camel命名法,这在Objective-C社区中非常普遍。
一个头文件的例子,展示了在@interface声明中如何进行正确的注释以及空格。
// GTMFoo.h // FooProject // // Created by Greg Miller on 6/13/08. // Copyright 2008 Google, Inc. All rights reserved. //
@try { foo();
} @catch (NSException *ex) {
bar(ex); } @finally {
baz(); }
总结:每个@标签应该有独立的一行,在@与{}之间需要有一个空格。@catch与被捕捉到的异常对 象的声明之间也要有一个空格。
协议
这条规则也同样适用于类声明、成员变量以及方法声明。例如:
[myObject doFooWith:arg1 name:arg2 error:arg3];
[myObject doFooWith:arg1 name:arg2 // aligning keywords instead of colons error:arg3];
Google 开源项目风格指南中文2018版
4 Python 风格指南 - 内容目录 4.1 4.2 4.3 4.4 4.5
扉页 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 背景 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 Python 语言规范 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 Python 风格规范 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 临别赠言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 131
5 Shell 风格指南 - 内容目录 5.1
扉页 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
i
5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9
1 3 3 5 9
3. 类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 4. 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 5. 来自 Google 的奇技 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 5. 其他 C++ 特性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 7. 命名约定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 8. 注释 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Chrome,以及应用架构指南2.0
始 了更新计 划。他们在 Co e l d Pe x上创
建 了 一 个 项 目 站 点 :ww c d p x w. e l . o e
C m/ p A c ,并 计 划 不 断 的将 内容 O A p rh
虽 —但g 出 Ce的 览了面l 然已m是 现ho然 器我前 浏 传久G突 —,o 在们 e 说r还 o ,
员在开发时进行指导 。
依 笔者
在 bo ( lg . d .o j ir lg bo sms nc m/ e/ me )上 的介 绍 ,该 指 引; 盖 :应 用 类 型、 涵 架构 风格 、模式 、逻辑 层 ,物理 层 以 及组 件等 ,详 细可 见其 b g l ,更 新后 o 的 白皮 书会 包括 更丰 富 以及 最新 的架
CS V格 式 的报 表 ;5 内建 支 持 UR L
重 写 机 制 , 提 供 良 好 的 SE O; 6 开 .
iv k d y a c 令 集 有 可能 最 快 n o e D n mi指 在 J v . 版 本 中提供 。 a a 70
上 个 月 我 们 介 绍 了 J s e m Bo s S a
S rie ) evc s ,高 屋 建 瓴 的从 设 计 层 次 )
讲 述 了 基 于 W id wsS re 0 0 no e r 0 v 2 和 . T Fa wok10 如 何 进 NE rme r .,
行 .E N T应 用程 序和 服务 的架 构设 计 。
这 是一 份长 达 1 6页 的文档 , 回答 了 6
。
微 软 P t rs& P a t e at n e rci s团 队 发 布 了 c
以 W ii 形 式 发 布 到 项 目站 点 上 。 k的 根 据 此 项 目 主 导 人 之 一 JD. ir . Mee
Google搜索引擎优化指南(一)
(讯)其实是Google在内部传播的文件,只是后来由于该文件对于网站的新手以及SEO业余爱好者有着很重要的指导作用,所以Google网站管理员才在博客中分享了出来,但是由于篇幅问题,庸人就分两次写吧,当然大致内容是和原文一样的,不过是以庸人自己的理解写出来而已! 独特准确的标题标题无论是对于用户体验还是对于搜索引擎来说都无疑是非常重要的。
对于用户来说,通过标题可以很清楚的知道该网页是不是自己需要的东西,因此说标题对于用户体验是很重要的。
同样对于搜索引擎来说,网站的标题对于网站优化也是占据着很重要的地位。
虽然说书写一个独特准确的标题不能是您的排名在第一,但是好处肯定是大大的。
所以这就要求我们网站的编辑人员要认真的书写网站的标题。
那么咱们该如何来书写标题呢?首先咱们的标题必须能够概括咱们网页的内容,其次对于网站的主页来说,权重一般也必须是整个站点最高的页面,这里咱们需要抓住站点的主题来书写标题;再次就是对于非主页的页面来说,咱们应该根据页面内容来书写不同的标题;最后一点就是需要咱们的标题能够尽量书写的清晰明朗,让用户一看到就能清楚的明白该页面的具体内容。
同样在这里咱们也应该尽量的去避免一些错误的出现,比如:避免标题与页面内容无关;避免站点出现以‘未命名’,‘page1’这种无意义的词语命名的页面;这里值得注意的一点就是要避免标题过长,一般情况下尽量让搜索引擎显示的时候,能够完全显示就行了! 充分利用元标记作为页面的元标记主要是值keywords、description这些东西,这里的书写其实和网站的标题书写大致相同,也有一部分朋友在书写keywords和description的时候直接抄写页面的标题,因此这里的书写要点可以借鉴上文,这里就不啰嗦了。
(庸人曾写过一篇具体如何书写标题和元标记的软文,这里附上连接,希望对大家有所帮助!) 网站的URL结构网站的URL之所以很重要,其实原因也是很简单的,因为一个简单清晰的Url可以让用户很轻松的记住,给用户一个很好的用户体验,因此作为搜索引擎,Url结构的好坏也就成了咱们做SEO时需要考虑的一个重要部分。
代码规范文档
代码规范文档的重要性是一个软件项目中重要的文档,它指导开发人员如何写出高质量的代码。
一个好的可以让开发人员写出易于阅读、易于维护、易于扩展的代码,帮助团队成员之间保持代码风格的一致性,提高代码的可读性,使得团队开发更加高效。
本文将从代码格式、命名规则、注释规范等方面来探讨的编写。
1. 代码格式一个好的代码格式可以让代码更易于阅读。
在中,我们应该指导开发人员如何使用缩进、空格、换行以及其他格式化元素来布局代码,使得代码结构清晰,易于阅读。
对于代码格式,应该有以下几点指导:1.1 使用 Tab 而不是空格。
Tab 的宽度可以配置,使用 Tab 可以提高代码的可移植性。
1.2 代码缩进应该为四个空格。
这是一个通用的代码缩进规范,也是 Google 风格指南等知名所采用的缩进规范。
1.3 代码行长度应该控制在 80 到 120 个字符之间。
过长的代码行会降低代码可读性,建议对过长的代码行进行适当的换行操作。
2. 命名规则命名规则是中较为重要的部分之一。
对于命名规则,应该指导开发人员如何合理地给变量、函数、类等命名,遵循一定的命名规范。
以下是一些命名规范的指导:2.1 变量、函数的命名应该使用驼峰命名法(Camel Case),即第一个单词小写,后面的单词首字母大写。
例如:helloWorld,getUserName。
2.2 类的命名应该使用帕斯卡命名法(Pascal Case),即每个单词的首字母都应该大写。
例如:HelloWorld,UserManager。
2.3 常量的命名应该使用大写字母和下划线组合,例如:MAX_LENGTH。
3. 注释规范注释是中非常重要的一部分,它能够帮助开发人员更好地理解代码,也有助于代码的可读性和可维护性。
以下是一些注释的规范指导:3.1 函数和方法应该有清晰的注释,描述函数的作用、输入和输出参数等信息。
3.2 变量声明应该有注释,描述变量的意义、作用域、是否可变等信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
命名空间将全局作用域细分为独立的, 具名的作用域, 可有效防止全局作用域的命名冲突.
优点:
虽然类已经提供了(可嵌套的)命名轴线 (YuleFox 注: 将命名分割在不同类的作用域内), 命名空间在这基础上又封装了一层.
举例来说, 两个不同项目的全局作用域都有一个类 Foo , 这样在编译或运行时造成冲突. 如 果每个项目将代码置于不同命名空间中, project1::Foo 和 project2::Foo 作为不同符号自 然不会冲突.
静态生存周期的对象,即包括了全局变量,静态变量,静态类成员变量和函数静态变量,都 必须是原生数据类型 (POD : Plain Old Data): 即 int, char 和 float, 以及 POD 类型的指针、数 组和结构体。
静态变量的构造函数、析构函数和初始化的顺序在 C++ 中是只有部分明确的,甚至随着构建 变化而变化,导致难以发现的 bug. 所以除了禁用类类型的全局变量,我们也不允许用函数返 回值来初始化 POD 变量,除非该函数(比如 getenv() 或 getpid() )不涉及任何全局变量。 函数作用域里的静态变量除外,毕竟它的初始化顺序是有明确定义的,而且只会在指令执行 到它的声明那里才会发生。
}
} // namespace mynamespace
更复杂的 .cc 文件包含更多, 更复杂的细节, 比如 gflags 或 using 声明。
#include "a.h"
DEFINE_FLAG(bool, someflag, false, "dummy flag");
namespace a { ...code for a...
属于 if , while 和 for 语句的变量应当在这些语句中正常地声明,这样子这些变量的作用 域就被限制在这些语句中了,举例而言:
while (const char* p = strchr(str, '/')) str = p + 1;
Warning
有一个例外, 如果变量是一个对象, 每次进入作用域都要调用其构造函数, 每次退出作用域 都要调用其析构函数. 这会导致效率降低.
缺点:
命名空间具有迷惑性, 因为它们使得区分两个相同命名所指代的定义更加困难。
内联命名空间很容易令人迷惑,毕竟其内部的成员不再受其声明所在命名空间的限制。内 联命名空间只在大型版本控制里有用。
有时候不得不多次引用某个定义在许多嵌套命名空间里的实体,使用完整的命名空间会导 致代码的冗长。
在头文件中使用匿名空间导致违背 C++ 的唯一定义原则 (One Defini on Rule (ODR)).
综上所述,我们只允许 POD 类型的静态变量,即完全禁用 vector (使用 C 数组替代) 和 string (使用 const char [] )。
如果您确实需要一个 class 类型的静态或全局变量,可以考虑在 main() 函数或 pthread_once() 内初始化一个指针且永不回收。注意只能用 raw 指针,别用智能指针,毕竟 后者的析构函数涉及到上文指出的不定顺序问题。
改善以上析构问题的办法之一是用 quick_exit() 来代替 exit() 并中断程序。它们的不同之 处是前者不会执行任何析构,也不会执行 atexit() 所绑定的任何 handlers. 如果您想在执行 quick_exit() 来中断时执行某 handler(比如刷新 log),您可以把它绑定到 _at_quick_exit() . 如果您想在 exit() 和 quick_exit() 都用上该 handler, 都绑定上去。
如果你必须定义非成员函数, 又只是在 .cc 文件中使用它, 可使用匿名 2.1. 命名空间 或 static 链接关键字 (如 static int Foo() {...} ) 限定其作用域.
2.4. 局部变量
Tip
将函数变量尽可能置于最小作用域内, 并在变量声明时进行初始化.
C++ 允许在函数的任何位置声明变量. 我们提倡在尽可能小的作用域中声明变量, 离第一次使 用越近越好. 这使得代码浏览者更容易定位变量声明的位置, 了解变量的类型和初始值. 特别 是,应使用初始化的方式替代声明再赋值, 比如:
int i=
i; f(nt j = g(); // 好——初始化时声明
用花括号初始化更好 vector<int> v;
v.push_back(1); // v.push_back(2);
好 一开始就初始化 vector<int> v = {1, 2}; // ——v
public: static void Function1(); static void Function2();
}; } // namespace myproject
定义在同一编译单元的函数, 被其他编译单元直接调用可能会引入不必要的耦合和链接时 依赖; 静态成员函数对此尤其敏感. 可以考虑提取到新类中, 或者将函数置于独立库的命名 空间内.
namespace myproject { namespace foo_bar { void Function1(); void Function2(); } // namespace foo_bar } // namespace myproject
而非
namespace myproject { class FooBar {
Docs » C++ 风格指南 - 内容目录 » 2. 作用域
2. 作用域
2.1. 命名空间
Tip 鼓励在 .cc 文件内使用匿名命名空间或 static 声明. 使用具名的命名空间时, 其名称可基 于项目名或相对路径. 禁止使用 using 指示(using-direc ve)。禁止使用内联命名空间 (inline namespace)。
Note
Yang.Y 译注:
上文提及的静态变量泛指静态生存周期的对象, 包括: 全局变量, 静态变量, 静态类成员变量, 以及函数静态变量.
译者 (YuleFox) 笔记
// 左对齐
} // namespace a
不要在命名空间 std 内声明任何东西, 包括标准库的类前置声明. 在 std 命名空间声 明实体是未定义的行为, 会导致如不可移植. 声明标准库下的实体, 需要包含对应的头文 件.
不应该使用 using 指示 引入整个命名空间的标识符号。
// 禁止 —— 污染命名空间
f.DoSomething(i);
}
2.5. 静态和全局变量
Tip
禁止定义静态储存周期非POD变量,禁止使用含有副作用的函数初始化POD全局变量,因 为多编译单元中的静态变量执行时的构造和析构顺序是未明确的,这将导致代码的不可移 植。
禁止使用类的 静态储存周期 变量:由于构造和析构函数调用顺序的不确定性,它们会导致难 以发现的 bug 。不过 constexpr 变量除外,毕竟它们又不涉及动态初始化或析构。
内联命名空间会自动把内部的标识符放到外层作用域,比如:
namespace X { inline namespace Y { void foo(); } // namespace Y } // namespace X
X::Y::foo() 与 X::foo() 彼此可代替。内联命名空间主要用来保持跨版本的 ABI 兼容性。
结论:
根据下文将要提到的策略合理使用命名空间.
遵守 命名空间命名 中的规则。 像之前的几个例子中一样,在命名空间的最后注释出命名空间的名字。 用命名空间把文件包含, gflags 的声明/定义, 以及类的前置声明以外的整个源文件封装 起来, 以区别于其它命名空间:
文件 // .h
namespace mynamespace {
using namespace foo;
不要在头文件中使用 命名空间别名 除非显式标记内部命名空间使用。因为任何在头文
件中引入的命名空间都会成为公开API的一部分。
// 在 .cc 中使用别名缩短常用的命名空间
namespace baz = ::foo::bar::baz;
// 在 .h 中使用别名缩短常用的命名空间 仅限内部使用 namespace librarian {
// 低效的实现
构造函数和析构函数分别调用 次 for (int i = 0; i < 1000000; ++i) {
Foo f;
//
1000000 !
f.DoSomething(i);
}
在循环作用域外面声明这类变量要高效的多:
Foo f;
// 构造函数和析构函数只调用 1 次
for (int i = 0; i < 1000000; ++i) {
namespace impl { // namespace sidetable = ::pipeline_diagnostics::sidetable; } // namespace impl
限制在一个函数中的命名空间别名 inline void my_inline_function() { // namespace baz = ::foo::bar::baz; ... } } // namespace librarian
结论:
推荐、鼓励在 .cc 中对于不需要在其他地方引用的标识符使用内部链接性声明,但是不 要在 .h 中使用。
匿名命名空间的声明和具名的格式相同,在最后注释上 namespace :
namespace { ... } // namespace
2.3. 非成员函数、静态成员函数和全局函数
Tip 使用静态成员函数或命名空间内的非成员函数, 尽量不要用裸的全局函数. 将一系列函数直 接置于命名空间中,不要用类的静态方法模拟出命名空间的效果,类的静态方法应当和类 的实例或静态数据紧密相关.