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)等。
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
,也是同样的答案。
关于Circle
和Rect
之间的关系,大多数面向对象的框架使用起来比较棘手,并没有明确的答案。像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成员函数的对象层次结构,其中该函数作为虚函数从类到类被覆盖。在处理非常大量的矩形和类似的基元时,这可能具有潜在的显着开销。