在课间委托调用是不是很糟糕?

时间:2011-07-10 20:56:36

标签: c++

我知道在同一个类中从一个方法委托给另一个方法是可以的,因为它减少了代码重复,但是将调用委托给被认为是不良实践的其他类类型?

例如:

这样做没关系。

 
double Point::GetDistanceFrom(const Point& point) const {
    return GetDistanceFrom(this->GetX(), this->GetY(), point.GetX(), point.GetY());
}

double Point::GetDistanceFrom(const Point& one, const Point& two) {
    return GetDistanceFrom(one.GetX(), one.GetY(), two.GetX(), two.GetY());
}

double Point::GetDistanceFrom(double x1, double y1, double x2, double y2) {
    return std::sqrt(GetDistanceFromSquared(x1, y1, x2, y2));
}

double Point::GetDistanceFromSquared(double x1, double y1, double x2, double y2) {
    x2 -= x1;
    y2 -= y1;
    return (x2 * x2 + y2 * y2);
}
double Point::GetDistanceFromSquared(const Point& one, const Point& two) {
    return GetDistanceFromSquared(one.GetX(), one.GetY(), two.GetX(), two.GetY());
}
 

但是这个怎么样?

 

double Point::GetDistanceFrom(const Line& line, bool isInfinite) const {
    if(isInfinite) return line.ptLineDist(line.GetPointOne().GetX(), line.GetPointOne().GetY(), line.GetPointTwo().GetX(), line.GetPointTwo().GetY(), this->GetX(), this->GetY());
    return line.ptSegDist(line.GetPointOne().GetX(), line.GetPointOne().GetY(), line.GetPointTwo().GetX(), line.GetPointTwo().GetY(), this->GetX(), this->GetY());
}

 

这个?

 

double Line::GetDistanceFrom(const Point& point, bool isInfinite) const {
    return point.GetDistanceFrom(*this, isInfinite);
}
 

2 个答案:

答案 0 :(得分:2)

  

是否将调用委托给其他被视为不良做法的类类型?

可能最适用的OO设计规则是encapsulationPoint类不应该真正知道ptSegDist上存在Line方法。但是可以通过公共界面自由地做任何事情。

在这种情况下,您似乎可以轻松交换您委派的职责:

double Point::GetDistanceFrom(const Line& line, bool isInfinite) const {
    return line.GetDistanceFrom(*this, isInfinite);
}

double Line::GetDistanceFrom(const Point& point, bool isInfinite) const {
    if(isInfinite) return ptLineDist(GetPointOne().GetX(), GetPointOne().GetY(), GetPointTwo().GetX(), GetPointTwo().GetY(), point.GetX(), point.GetY());
    return ptSegDist(GetPointOne().GetX(), GetPointOne().GetY(), GetPointTwo().GetX(), GetPointTwo().GetY(), point.GetX(), point.GetY());
}

在类上调用现有的getter不会违反任何OO或封装规则。在这种情况下,它也需要稍微少的代码。

答案 1 :(得分:2)

计算直线和点之间距离的函数既不是直线也不是点的一部分。我会把它变成一个全局函数。或者某个Distance类的静态方法。实际上,所有其他GetDistanceFrom函数也应该去那里。想象一下,你必须计算一个正方形和一个三角形之间的距离。那个功能会去哪里?