动态类型检查中的参数

时间:2016-11-22 08:22:12

标签: ruby oop dynamic parameters

Sandi Metz的实用的面向对象设计 中,她解释了 - 完美 - 上例中的问题:

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参数是动态的,它是否被视为缺点,在这种情况下,是从静态类型检查语言的角度来看?

2 个答案:

答案 0 :(得分:1)

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

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

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

您的示例的主要缺点是,在添加/删除Preparer类型时,您需要编辑一个开关。它没有您对动态代码所期望的灵活性。看一下委托模式,注入和界面,你可以很好地编写维持自身的动态代码。

答案 1 :(得分:0)

检查此代码

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返回类名