这看起来像露比的鸭子打字一样吗?

| 我创建了一个跟踪汽车行驶里程和服务历史记录的程序,以便为用户更新汽车的近期服务需求。 我有三个班级:
Car
CarHistory
CarServiceHistoryEntry
。第三个很简单;它包含与服务相关的所有属性:日期,里程,执行的服务等。“ 1”类如下:
require_relative \'car_service_history_entry\'

class CarHistory
  attr_reader :entries
  def initialize (*entry)
    if entry.size > 1
      @entries = []
    else
      @entries = entry
    end
  end
  def add_service_entry entry
    @entries << entry
  end
  def to_s
    entries_string = \"\"
    @entries.each {|entry| entries_string << \"#{entry.to_s}\\n\"}
    entries_string
  end
end
initialize
中,应该检查
entry
的等级吗? 在ѭ7中,采用鸭子类型(如“编程Ruby”中Andy Thomas的论点),我什至会测试是否可以添加
CarServiceHistoryEntry
吗?我不能通过a9而不是设置然后在我的单元测试中添加ѭ2吗? 由于
CarHistory
唯一必要的属性是
entries
数组和
to_s
方法,我是否应该将所有此类都废弃,然后将其放入
car
类中?     
已邀请:
对于1和2,当您转向像Ruby这样的松散类型的语言时,需要放松对“严格键入”的控制。 您应该检查输入参数吗?传统答案是肯定的。另一种方法是使用好名字和单元测试来记录并指定该类型应如何工作。如果它可以与其他类型一起使用,那就可以了。因此,如果您传递不兼容的类型,它会因异常而崩溃,这在大多数情况下已经足够了。尝试一下,看看感觉如何(可能的结果:解放/“撤退!”。但请尝试一下。)。如果您正在为共享库设计公共API,则例外-规则不同。对于错误的输入,您需要快速而有经验地失败。 至于将car_history整合到car中,我想问一下您的Car类的职责是什么。如果保持自己的历史是其中之一,那么您可以与他们保持联系。将来,如果您发现许多与汽车历史有关的方法,您可以再次撤销该决定并再次提取CarHistory类型。使用SingleResponsibilityPrinciple做出明智的决定。这只是OOP-Ruby不会降低对象设计的质量。 代码段:代码可以更简洁
# just for simplicity, I\'m making HistoryEntry a string, it could be a custom type too
class CarServiceHistoryEntry << String
end

class CarHistory
  attr_reader :entries
  def initialize(*history_entries)
    @entries = history_entries
  end

  def add_service_entry(entry)
    @entries << entry
  end
  def to_s
    @entries.join(\"\\n\")
  end
end

irb>x = CarHistory.new(\"May 01 Overhaul\", \"May 30 minor repairs\")
irb>x.add_service_entry(\"June 12 Cracked windshield\")
irb>x.to_s
=> \"May 01 Overhaul\\nMay 30 minor repairs\\nJune 12 Cracked windshield\"
    
很难评论ѭ1类与您其他人的关系,但是我敢肯定,随着您的学习,它会变得清晰起来。 您可以简化两种方法,尽管我必须说我不理解ѭ5中的
if
,也许只是倒退,应该是
> 0
def initialize *entry
  @entries = entry # if not specified it will be [] anyway
end

def to_s
  @entries.join \"\\n\"
end
是的,Ruby应该很简单。您不需要使用运行时类型检查来乱扔代码。如果代码运行您的单元测试,那么您只需声明胜利即可。无论如何,成千上万的显式转换往往会修补类型错误。 Ruby仍将在运行时检查您的类型。将类型检查交给解释器并全力投入功能测试是完全合理的。     
我将跳过前两个问题,然后回答第三个问题。如果CarServiceHistoryEntry的唯一属性是字符串,则可以,废弃CarHistory(以及CarServiceHistoryEntry),并向Car添加一个service_history属性,该属性只是一个字符串数组。除非另有证明,否则越简单越好。 至于鸭式打字,您永远都不想测试“是否是”,只是看它是否“响应”(最多)。 最后,要回答问题1,没有比它更简单的了:) 希望这可以帮助, 布赖恩     

要回复问题请先登录注册