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