【问题标题】:Parameters in Dynamic Type Checking动态类型检查中的参数
【发布时间】:2016-11-22 08:22:12
【问题描述】:

Sandi MetzPractical Object-Oriented Design In Ruby 中,她完美地解释了上述示例中的问题:: p>

class Trip
  attr_reader :bicycles, :customers, :vehicle

  def prepare(preparers)
    preparers.each { |preparer|
      case preparer
      when Mechanic
        # ...
      when TripCoordinator
        # ...
      when Driver
        # ...
      end
    }
  end
end

class Mechanic
  # ...
end

class TripCoordinator
  # ...
end

class Driver
  # ...
end

但是; preparers 参数是动态的,在这种情况下,从静态类型检查语言的角度来看,它是否被认为是一个缺点

【问题讨论】:

    标签: ruby oop dynamic parameters


    【解决方案1】:

    什么是优势,什么是劣势取决于每个程序员和手头的任务。

    动态类型带来的灵活性在某些情况下非常强大,而在其他情况下则很糟糕。例如,C# 允许所有内容(参见 dynamic 类型)本身并没有任何优势或劣势。

    您在示例中描述的内容称为委托模式,并且已经非常成功地涵盖并集成到 ruby​​ 中(我的观点)。您有关于该主题的 bunch 文档。

    您的示例的主要缺点是您在添加/删除准备器类型时需要编辑一个开关。它不像动态代码所期望的那样灵活。看看委托模式、注入和接口,你会很擅长编写能够自我维持的动态代码。

    【讨论】:

      【解决方案2】:

      检查此代码

      class Trip
         attr_reader :bicycles, :customers, :vehicle
      
         def prepare(preparers)
            preparers.each { |preparer|
              case preparer.class.name
                 when Mechanic
                    # ...
                 when TripCoordinator
                    #  ...
                 when Driver
                    # ...
               end
            }
          end
      end
      class Mechanic
         # ...
      end
      class TripCoordinator
         # ...
      end 
      class Driver
         # ...
      end
      

      这里preparer.class.name返回类名

      【讨论】:

        猜你喜欢
        • 2021-01-15
        • 2021-02-01
        • 1970-01-01
        • 2011-07-02
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        • 2011-06-10
        • 1970-01-01
        相关资源
        最近更新 更多