作者多年来积累了三个原则来帮助编写更模块化、易读和可修改的代码,具体如下:
Write code at a single level of abstraction(在单一抽象级别编写代码):避免编写混合高低层概念的代码,用顶级方法调用其他方法来完成工作,多为私有方法,这样读者能专注于方法做什么而不是怎么做,有助于提高代码可读性,在编写系统/功能/验收测试以及 Elm 中的视图代码时特别有用,如以下渲染调查的代码:
survey [ surveySection "Toppings" [ yesNoQuestion "Pineaple on Pizza?" PoP "pop" , yesNoQuestion "Anchovies?" Anchovies "ancho" ] , surveySection "Crust" [ pickOne [ ("Thin Crust", Thin) , ("Thick Crust", Thick) , ("Chicago Style", Chicago) ] ] ]
Push conditionals up the decision tree(将条件推到决策树的上层):程序员常希望代码遵循单一主路径,为此会有分支,导致重复检查、嵌套过深和条件代码复杂,将条件推到决策树上层则需在程序边界处理不确定性和边缘情况,能得到更自信的代码,如以下复杂条件代码:
# BEFORE def make_noise(loud: true) if is_bird &&!loud make_bird_noise(false) end if loud if is_mammal 2.times { puts mammal_noise } end make_bird_noise(true) if is_bird elsif is_mammal puts mammal_noise end end
经改进后:
# AFTER def make_noise(loud: true) if is_bird && loud make_bird_noise(true) elsif is_bird &&!loud make_bird_noise(false) elsif is_mammal && loud 2.times { puts mammal_noise } elsif is_mammal &&!loud puts mammal_noise end end
在重构复杂表单代码时该原则很有用。
Separate branching from doing code(将分支与执行代码分离):分支代码不应有实现细节,含条件的方法每个分支只能调用其他方法,此原则强调组合性和复用,通过自然分解算法提供子类覆盖的必要钩子,如以下有异味的代码:
# SMELLY def save(for_real:) if for_real File.open("#{@title.downcase}.txt", "w") do |file| file.puts @title file.puts @body end else $stdout.puts "PREVIEW" $stdout.puts @title $stdout.puts @body.slice(0, 240) end end
改进后:
# BETTER def save(for_real:) if for_real save_to_file else output_preview end end
这样更易重组方法,对于有子类的情况也很适用。
- Triangle of separation(分离三角形):三个原则看似不同,但都是关于发现分离代码的线索,从不同角度看是相同的想法,作者将其命名为“分离三角形”,这些原则共同作用能让代码更易读、易改、易扩展和易重组。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。