函数应该在两个类中的一个/两个中运行,还是独立运行?

Should a function go in one/both of two classes or be free-standing?

本文关键字:两个 运行 独立 一个 函数      更新时间:2023-10-16

我对OOP比较陌生。有时我遇到我不确定方法应该放在哪里的情况。我会尽量给出一个最小的例子;我希望我不会做得太过火,使它太抽象。

假设我有一个Point类,它包含一个点的位置,一个Line类,它包含一条直线的方程。我现在需要一种方法来计算PointLine之间的(垂直)距离。我可以:

  • :: distance_to_line (L)
  • :: distance_to_point(点P)
  • 一个独立函数:point_line_distance(Line L, point P)

在一般的OOP中是否有首选的方法,或者它是否依赖于语言?在c++中,独立函数是一种选择,但从我对Java的有限理解来看,它不允许独立函数。在这种情况下,你会创建一个类PointLineDistanceCalculator吗?

不属于PointLine类的第三个选项是最好的选择。

Points不应该知道Lines,反之亦然。否则,它们将紧密耦合。

http://en.wikipedia.org/wiki/Loose_coupling

但是,可能有其他类同时知道这两个。

在java中,我可能会做第三个Distance类或DistanceCalculator,可以计算几个对象之间的距离。

Distance.between(Point a, Point b)
Distance.between(Point a, line l)

在java中,您总是可以将独立函数创建为两个类之一(或第三个辅助类)的静态方法。

我不认为一般来说有一个首选的方法,但是您可以同时使用这三种方法以获得最大的灵活性,并重用代码。

例如,一个方法将包含以下逻辑:

class Point {
...
   float distToLine (Line l) {
       ....
       return some result;
   }
...
}

,然后其他方法将调用原始方法:

class Line {
...
   float distToPoint (Point p) {
      return p.distToLine (this);
   }
...
   static float pointToLineDistance (Point p, Line l) {
      return p.distToLine (l);
   }
...
}

第四个选项是在类层次结构中找到/构造一个共同的祖先类似于"GeometricEntity"。

任何"到另一个几何实体的距离"有意义的东西。