API 应该提供 Rect::contains(Point) 或 Point::is_inside(Rect) 还是两者都提供?或 Math::contains(Point, Rect) 导致它是对称的?
LineSegment::contains(Point)、Rect::fully_contains(Circle) 等也是同样的 Q。
Rect::contains(Point)
最有意义,因为它是一个构建块。另一个并不是真正必要的,因为您希望每个特定的形状都可以实现操作,而Point
不必知道每个可能的形状。同样的答案也适用于LineSegment
。
关于 和 之间的关系,Circle
使用Rect
大多数面向对象的框架更加棘手,并且没有任何明确的答案。其他一些面向对象的风格,如 CLOS,通过使用通用函数和方法来做到这一点,这使得它成为一个不成问题的人。
完全取决于是什么使您的程序表达更清晰,更符合您要解决的问题。因此,在某种程度上,以上所有内容在不同的情况下都应该没问题。
但是,总的来说,我略微倾向于Rect::contains(Point)
而不是Point::Is_inside(Rect)
. 那是因为我认为这个Point
类,因为它会被各种类(比如'Circle','Hexagon'等)使用,应该是非常基本的并且只包含最小的接口。
Math::contains(Rect, Point)
将是我的第二选择。如果我想保持我的 Rectangle 类非常原始并且不给它添加太多“便利”功能,我会使用这种方法。
要记住的重要一点是,不要认为你的课程设计是一成不变的。继续选择现在看起来最好的设计。每当您的需求发生变化时,您都可以并且应该对其进行更改。这就是所谓的重构。
我在 Math::contains 方法上支持 Frederick,尽管我认为最大的缺点是开发人员在查找方法时失去了 IntelliSense 的可发现性。这是我对 Boost 和 STL 的不满之一。
Rect::contains 最终出错的一个例子是 iPhone SDK 的绘制字符串的方法,它基本上是 String::drawInRect。
这取决于实现,但像 Federick 一样,我也倾向于选择Math::contains(Rect,Point),而不是Rect::contains(Point)。这样做的原因是后者导致了一个对象层次结构,其中包含作为虚拟的包含成员函数,它在类之间被覆盖。在处理大量矩形和类似图元时,这可能会产生巨大的开销。