【问题标题】:how best to handling ruby nils, and should CSV return empty strings or nils?如何最好地处理 ruby​​ nils,CSV 应该返回空字符串还是 nils?
【发布时间】:2013-04-27 20:10:04
【问题描述】:

在配对会话中,我们遇到了如何处理 ruby​​ nil 以及 csv 解析(通过 ruby​​ 的 CSV 包)是否会更好,如果它传回空字符串...

您可以在此处查看我们创建的规范:

https://github.com/mtc2013/LocalSupport/blob/seed-refactoring/spec/models/organization_spec.rb

我们正在尝试处理 csv 格式的文本文件中的数据,但如果传入的元素为 nil,我们提取邮政编码的处理将失败,因此我们有这些可悲的路径:

expect(Organization.extract_postcode('HARROW BAPTIST CHURCH, COLLEGE ROAD, HARROW')).to eq(nil)
expect(Organization.extract_postcode(nil)).to eq(nil)

实际上,我猜这个 extract_postcode 方法可能会返回一个空字符串。你可以在这里看到我们实现的代码:

https://github.com/mtc2013/LocalSupport/blob/seed-refactoring/app/models/organization.rb

def self.extract_postcode(address_with_trailing_postcode)  
    match = address_with_trailing_postcode && address_with_trailing_postcode.match(/\s*(\w\w\d\s* \d\w\w)/)
    match && match[1]
  end

我们仍然觉得这有点难看。在Objective C之类的东西中,您可以只调用nil对象上的方法,然后它们返回nil。在 ruby​​ 中它们会抛出异常,因此我们使用“match && match[1]”操作进行检查,但是否推荐这样做?

另一种方法可能是确保 CSV 解析始终生成空字符串而不是 nil,但感觉我们仍然需要保护我们的代码不被传入的 nil。

我想我们最终的问题是这里的红宝石方式是什么?如果您有一个方法,它是否应该在通过 nil 时抛出错误?还是应该抓住它们然后返回 nil?如果是字符串操作方法,还是空字符串?

我想如果建议抛出 nil 错误,那么我们应该只专注于修复我们的 CSV 解析以将丢失的元素视为空字符串......或者更好的方法是捕获 nil 错误并重新抛出它们使用我们自己的自定义错误消息?

非常感谢任何建议

【问题讨论】:

  • 为什么不用Ruby内置的CSV
  • nil.to_s 会产生一个空字符串,所以也许一个合适的 to_s 可以解决这个问题。
  • Neil - 我们正在使用 CSV 来获取 CSV 格式的数据
  • Steenslag - 很棒的建议 - 将不得不尝试...
  • @steenslag - 我们采纳了您的建议,这简化了很多代码 - 如果您想添加它作为答案,我可以给您打勾?

标签: ruby csv null


【解决方案1】:

我认为您的extract_postcode 返回nil 是准确的。当没有从地址中提取的邮政编码时,这是一个很好的表示。如果该方法返回了一个空字符串,并且您希望调用者处理它,调用代码仍然需要直接检查内容以决定如何处理该值(毕竟它不是有效或有用的邮政编码)。空字符串邮政编码仅对您有用,因为您可以安全地在其上调用 String 方法,但这忽略了您实际上没有邮政编码数据的事实 - 您的代码迟早必须承认这一事实。

使用像extract_postcode 这样的方法名称,我认为在没有邮政编码数据时引发异常也是合理的。但是异常处理可能是获取所需逻辑流的一种更尴尬的方式。

如果您将提取的数据存储在其他地方,则可能值得考虑将返回值与设置方式对齐。如果您的数据库在邮政编码列中存储空值以表示“无邮政编码”,那么 Ruby 中的 nil 值比空字符串更匹配。这样做可以节省表示之间的代码映射。

AFAIK 最终没有“Ruby 方式”。保持一致,至少在整个应用程序中运行此代码的任何层的上下文中,将为您带来最佳回报。

【讨论】:

  • 非常感谢您的详细建议。经过各种重构后,我们现在有了一个 parse_address 方法:github.com/tansaku/LocalSupport/blob/master/app/models/…,它当然要求进行提取类重构,但我们将其推迟到以后。 @steenslags to_s 非常有帮助。必须处理匹配为零仍然很奇怪...... match.length = 4 实际上是以前的宿醉,当我们通过两种方式匹配正则表达式时 - 现在可能会丢失 - 但会喜欢 match[1] 到如果匹配为 nil,则返回 nil ...
  • 发现了一个很棒的演讲,其中推荐了 to_s 方法:youtube.com/watch?v=T8J0j2xJFgQ
猜你喜欢
  • 1970-01-01
  • 2011-11-06
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
相关资源
最近更新 更多