微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何避免 ruby​​ 类中的层次结构?

如何解决如何避免 ruby​​ 类中的层次结构?

我正在用 ruby​​ 处理二维形状。我有一个带有 x 和 y 属性的 Point 类,以及一个有两个端点的 Line 类。在流程链的后期,我经常希望识别和处理垂直线与水平线略有不同,即使两者都可能出现在同一组线中。我有混合来做处理,但我经常发现这个方法有类似

if l.vertical?
  l.do_something_with_y_coordinate
elsif l.horizontal?
  l.do_something_with_x_coordinate
end

我经常看到这种模式,我不喜欢重复。我可以通过识别垂直的 Line 实例并创建一个 VerticalLine 类和一个 Horizo​​ntalLine 类来尝试避免它,但这感觉更像是 .Net 而不是 ruby​​ 并且不会减少重复,只是封装了它。

另一种方法可能是使用返回 :x 或 :y 的方向方法,然后使用返回“do_something_with direction”的方法

还有其他人对如何重构有任何建议吗?

解决方法

它不是“更像 .Net”,它更像是适当的面向对象封装。如果您是通过 .Net 了解到的,那很好,但这是一种非常通用的方法,可以追溯到 .Net 或 Ruby 出现之前的几十年。

有三种方法可以解决这个问题:

  1. 使用 if 来拆分行为。
  2. 使用子类来实现特定的行为。
  3. 概括您的代码,使其无论是垂直的还是水平的都无关紧要,在这两种情况下都应用相同的数学方法。

在第三种情况下,想象一下有向量或矩阵来描述您正在操纵的几何图形。例如,[0,1] 可以表示向上的垂直线,或 [-1,0] 向左的线,具体取决于您的坐标系。每次迭代您只需将其添加到您的基点。水平或垂直的概念消失了。

,

在具体案例中,我看到了三个建议:

1.) 根据两种情况定义映射到 xy 的访问器:

def s=(value)
  if horizontal
    x = value
  else 
    y = value
  end
end 

def t=(value)
  if horizontal
    y = value
  else 
    x = value
  end
end 

有了这个,您可以动态地委派给“正确”的字段。

2.) 通过旋转将水平案例转换为垂直案例,然后执行操作,然后将其旋转回来。

3.) 使用另一种不使用 xy 的表示,例如您的微分消失的极坐标。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?