使代码看起来更好的替代方法或设计

问题描述 投票:0回答:1

我有一个班级人员的列被禁用(如果该人被禁用) 如果此人是残疾人,我们标记为 true 如果那个残疾人有轮椅,我们就把残疾人设为假

但是当我尝试获取带有开关的人员列表时,应返回所有残疾人以及配备轮椅的人员

出示代码

class Person
  def disabled
    self.where(disable: true).any?
  end
  
  def personA?
    Person.find_by_id(1).present?
  end
  
  def display
    if switch?
      disabled && personA?
    else
      disabled
    end
  end
end
  

我们能否将逻辑更改为 DRY 或更改设计,寻找解决方案而不添加额外的列(如果可能的话),学习知识帮助我找到了编写这些设计逻辑的方法

ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4
1个回答
0
投票

如果信息具有单个布尔标志,则无法表示两部分:

  • 此人需要轮椅吗? (对/错)
  • 此人轮椅吗? (对/错)

另外,我建议不要使用“残疾人”一词来表示“需要轮椅”。残疾有许多不同的形式;像

wheelchair_user
这样的东西对于代码和现实世界都更具描述性。

因此我将代码写成这样:

class Person
  def needs_wheelchair?
    wheelchair_user && !has_wheelchair
  end
end

作为替代方案,您可以考虑将这种轮椅状态 表示为

enum
。像这样的东西:

class Person
  enum wheelchair_status: [:not_required, :needed, :owned], _prefix: :wheelchair
end

上面的实现会自动定义一个

Person#wheelchair_needed?
方法,以及像
Person.wheelchair_not_required
这样的范围。

但是,潜在的缺点是您会失去数据粒度:无法识别“不需要轮椅但仍拥有轮椅”的人。 (除非您为此边缘情况添加了第四个 enum 值?!)

    

© www.soinside.com 2019 - 2024. All rights reserved.