分离之三角

作者多年来积累了三个原则来帮助编写更模块化、易读和可修改的代码,具体如下:

  • 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(分离三角形):三个原则看似不同,但都是关于发现分离代码的线索,从不同角度看是相同的想法,作者将其命名为“分离三角形”,这些原则共同作用能让代码更易读、易改、易扩展和易重组。
阅读 8
0 条评论