开始时间:2022年5月18日13:19:32
预期目标:学会ruby编程基本逻辑。为之后的进一步工作打好基础。
遵循格式仍旧为
主题:x
阐述:y
主题:源代码排版
阐述:曾经有一句名言说:所有风格都有仇有难读,自己的除外。
如果将自己的除外这些字眼拿掉,这句话也许是对的。
谈到Ruby的排版格式,采用UTF-8为源文件的编码。
每个缩排层级使用两个空格,不使用制表符。
使用Unix风格的换行符。如果使用git,使用以下命令确保项目无忧
git config --global core.autocrlf true
不要使用;隔开语句和表达式,一行一条语句
对于没有主体的类,倾向使用单行定义。
定义方法时,避免单行写法。尽管这种写法有时颇为普遍。但其略显古怪的定义语法容易使人犯错。无论如何,至少保证单行写法的方法不应该拥有一个以上的表达式。
这个规则的一个例外是空方法。
操作符前后适当地添加空格,在逗号,、冒号:、以及分号;之后,尽管ruby解释器会忽略空格,但适量的空格可以增强代码的可读性。
唯一的例外是使用指数操作符时(、【之后,】)之前不要添加任何空格。在{前后,}之前添加空格。
{和}需要额外说明,是因为它们可以同时用在区块、哈希字面及字符串插值中。
对于哈希字面量,有两种可被接受的风格。第一种更具可读性,第二种风格的优点是,在视觉上使得区块与哈希字面量有所区分。无论选择哪种风格,都必须确保使用时的连贯性。
对于插值表达式,括号内两端不要有空格。
!之后,不要添加任何空格。
范围的字面量语法中,不要添加任何空格。
when与case编排在同一层级,一种已经被确立的风格。
当将一个条件表达式的结果赋值给一个变量时,保持分支缩排在同一层级。
在各个方法定义之间添加空行,并将方法分成若干合乎逻辑的段落。
在各个段落之间,使用一个空行分隔。
在属性修饰器之后,使用一个空行分隔。
在不同所缩进词之间,使用不同 的空行分隔。
避免在方法调用的最后一个参数之后添加逗号,尤其当其参数没有分布在同一行时。
当给参数的方法赋予同一默认值时,在=后添加空格。
使用统一风格进行链式方法调用。
当构建数组时,应当保持对齐。
使用_语法改善大数的数值字面量的可读性。
当需要前缀标志进制时,0o表示八进制,0x标志十六进制,0b标志二进制。十进制数值无需前缀标志。
不要在注释与def之间添加空行。
将单行长度控制在80隔字符以内。
文件以空白行结束。
不要使用区块注释,他们不能被空白字符引导,且不如常规注释容易辨认。
主题:语法
阐述:使用::引用常量(包括类与模块)与狗仔妻。不要使用::调用方法。
使用def定义方法时,如果有参数则使用括号。如果无参数则省略括号。
方法调用应当使用括号包裹参数,尤其是第一个参数以(开头时。
但在下述情况下可以使用。但是在下述情况中可以省略括号:
无参数调用;内部DSL的组成部分;具有关键字特性的方法。
定义可选参数时,将可选参数防止在参数列表尾部。
定义变量时,避免并行赋值。
除非必要,否则避免在并行赋值时使用单字符的_变量。
永远不是用for,除非你知道为什么。
永远不要再if/unless中使用then。
在多行if/unless中,总是把条件表达式与if/unless放在同一行。
倾向于使用三元操作符(?:),而不是if/then/else/end结构。前者更为简练且常见。
三元操作符的每个分支只写一个表达式。即不要嵌套三元操作符。嵌套情况请使用if/else结构。
永远不要使用if x; ...。使用三元操作符来替代。
利用if与case是表达式这个特性。
避免使用!!
永远不要使用and与or表达式,用&&与||替代。
避免在多行区块中使用if/unless修饰语法。
避免使用嵌套if/unless/while/until修饰语法,适当情况下,使用&&与||来替代。
对于否定条件,请昂使用unless而不是if。
不要使用unless和else的组合。将他们改写成肯定条件。
不要使用括号包裹流程控制的条件表达式。
对于单行主体,倾向于使用while/until修饰语法。
对于否定条件,倾向于使用until而不是while。
对于无限循环,使用kernel#loop而不是while/until
对于后置条件循环语句,倾向使用kernel#loop与break的组合。而不是begin/end/until或begin/end/while。
对于可选参数的哈希,省略其外围的花括号。
对于DSL内部方法的调用,同时省略其外围的花括号与圆括号。
当被调用方法是当前区块中唯一操作时,倾向于使用剪短的传参语法。
对于单行主体,倾向使用{...}而不是do...end。对于多行主体,避免使用{...}。
优先考虑使用显式区块参数,以避免某些情况下通过创建区块的方法来传递参数给其他区块。此规则对性能有所影响。因为区块会被转换为proc对象。
避免在不需要进行流程控制的时候试用return。
避免在不需要的时候使用self。
避免局部变量蒙蔽方法调用。除非他们有相同的效果。
不要在条件表达式中使用=的返回值,除非复制语句包裹在括号之中。这种管用法被称作条件表达式的安全赋值。
优先考虑简短的自我赋值语法。
当变量尚未初始化时,使用||=对齐进行初始化。
不要用||=对布尔变量进行初始化。
使用&&=预先检查变量是否存在,如果存在,则做相应的动作。
使用==就不要使用更加严格的eql?,其在实践中很少使用。
运行ruy解释器时,总是开启-w选项来。如果忘记了某个重要的规则,则会收到提示。
对于单行区块,使用新的lambda字面量定义语法。对于多行区块,使用lambda定义语法。
定义lambda方法时,如果有参数则使用括号。
定义lambda方法时,如果无参数则省略括号。
倾向使用proc而不是proc.new
对于lambda方法或代码块,倾向使用proc.call(),而不是proc[]或proc.()
使用stdout/$stderr/$stdin而不是STDOUT/STDERR/STDIN。因为后者是常量,解释器会发出警告。
倾向使用sprintf或其别名format而不是灰色的string#%方法
倾向于使用Array#join而不是相当晦涩的带参数字符的Array#方法。
当你希望处理的变量类型是数组,但不太确定其是否真的是数组时,通过使用Array()来替代显式的数组类型检查与转换。
通过使用范围或comparable#between?来替代复杂的比较逻辑。
倾向使用谓词方法而不是==操作符,但数值比较除外。
不做显式的non-nil检查,除非检查对象是布尔变量。
避免使用BEGIN区块,使用kernel#at_exit来替代。
避免使用flip-flops操作符。
流程控制中,避免使用嵌套条件。
倾向使用防御从句进行非法数据断言。防御从句是指处于方法顶部的条件语句。其能尽早地退出方法。
循环中,倾向使用next而不是条件区块。
倾向使用map而不是collect,find而不是delete。select而不是find_all。reduce而不是inject以及size而不是lengthy。这不是一个硬性要求,如果使用别名可以增强可读性,使用它也没关系。
主题:命名
阐述:标志符使用英文命名。
符号、方法、变量使用蛇底式小写。
给符号、方法、变量命名时,避免分隔字母与数字。
类与模块使用驼峰式大小写。
文件名使用蛇底式小写。
主题;注释
阐述:良好的代码自身就是最佳文档。当你要添加一注释时,扪心自问,如何改善代码让它不要注释?
编写让人一目了然的代码然后徐略这一届的其他部分,。
使用英文编写注释。
签到#与注释文本之间增加至少一个空格。
注释超过一个单词时,句首字母应当大写。并在语句停顿或结尾处使用标点符号。
主题:注解
阐述:注解应当直接写在相关代码执行哪行。
注解关键字后面,跟着一个冒号及空格,接着是描述问题的文本。
主题:类与模块
阐述:在类定义中,使用一致的结构。
在混入多个模块时,倾向于使用多行语法。
如果嵌套类数目较多,进而导致外围类定义较长,则将它们从外围类中提取出来,分别放置在单独的都可以嵌套类命名的文件中,并将文件归类至以外围类命名的文件夹下。
定义只有类方法的数据类型时,倾向使用模块而不是类,只有当需要实例化时才使用类。
当你向将模块的实例方法改成类方法时,倾向使用module_function而不是extend_sel
主题:异常
阐述:杜宇㕈处理,倾向使用raise而不是fail
不要抑制异常
避免使用rescue修饰语法
不予奥将异常处理作为流程控制使用
避免补货Exception。这种做法会同事将信号与exit方法困住。
把较具体的异常放在处理链的上层。不然他们永远不会被执行。
主题:集合
阐述:对于数组与哈希,倾向于使用字面量方语法来构建实例。
创建一组元素为单词的数组时,倾向使用%w而不是【】。
主题:元编程
阐述:避免无谓的元编程。
当编写程序库时,不要使核心类混乱。