English 中文(简体)
Rect::contains(Point) 或者 Point::is_inside(Rect)
原标题:
  • 时间:2009-01-05 11:11:40
  •  标签:

Should an API provide Rect::contains(Point) or Point::is_inside(Rect) or both? or Math::contains(Point, Rect) cause it s symmetric?

相同的问题也适用于LineSegment ::包含(Point),Rect :: fully_contains(Circle)等。

最佳回答

Rect::contains(Point) 作为一个构建块最有意义。另一个并不是必需的,因为您期望每个具体形状都实现此操作,而Point 不必知道每个可能的形状。对于LineSegment ,也是同样的答案。

关于CircleRect之间的关系,大多数面向对象的框架使用起来比较棘手,并没有明确的答案。像CLOS这样的其他面向对象的风格通过使用通用函数和方法来解决,使这成为非问题。

问题回答

完全取决于何种因素能使您的程序表达更清晰,在设计中更符合您所要解决的问题。因此,在不同的情境下,以上所有内容都应该适用。

然而,总的来说,我倾向于使用 Rect :: contains(Point)而不是 Point :: Is_inside(Rect)。那是因为我认为 Point 类,由于它将被所有种类的类(如 Circle,Hexagon等)使用,应该非常基本,仅包含最少的接口。

“Math::contains(Rect, Point)” 将是我的第二选择。如果我想让我的矩形类非常基本,而不添加太多“便利”函数,我会使用这种方法。

记住的一件重要的事情是,不要将你的课程设计看作是一成不变的。只需要挑选出目前看起来最好的设计即可。当你的需求发生变化时,你可以并且应该进行修改。这就是所谓的重构。

我赞同Frederick的Math :: contains方法,尽管我认为最大的缺点是开发人员失去了在IntelliSense中找到该方法的可发现性。 这是我对Boost和STL的抱怨之一。

Rect::contains 的错误示例是 iPhone SDK中绘制字符串的方法,基本上是 String::drawInRect。

这取决于实现方式,但像Federick一样,我也倾向于使用Math::contains(Rect,Point),而不是Rect::contains(Point)。原因是后者会导致包含contains成员函数的对象层次结构,其中该函数作为虚函数从类到类被覆盖。在处理非常大量的矩形和类似的基元时,这可能具有潜在的显着开销。





相关问题
热门标签