应用程序接口应该提供Rect::contains(点)或Point::is_inside(Rect),还是两者都提供?或者数学::包含(Point,Rect),因为它是对称的?
同样的Q也适用于线段::包含(点),Rect::fully_contains(圆)等。
发布于 2009-01-05 11:16:02
Rect::contains(Point)最有意义,因为它是一个构建块。另一个实际上并不是必需的,因为您期望每个特定的形状都能实现该操作,而Point不必知道每个可能的形状。同样的答案适用于LineSegment。
关于Circle和Rect之间的关系,使用大多数面向对象的框架会更加棘手,并且没有任何明确的答案。其他一些面向对象的风格,如CLOS,是通过使用泛型函数和方法来实现的,这使得它成为一个不成问题的问题。
发布于 2009-01-05 11:19:03
这完全取决于是什么让你的程序表达更清晰,更符合你试图解决的问题。因此,在某种程度上,上面的所有内容在不同的上下文中都应该很好。
然而,总的来说,我稍微倾向于Rect::contains(Point)而不是Point::Is_inside(Rect)。这是因为我认为Point类,因为它将被所有类型的类使用(如‘圆’,‘六边形’等)。应该是非常基本的,并且只包含最小的接口。
Math::contains(Rect, Point)将是我的第二选择。如果我想保持我的Rectangle类非常原始,并且不想给它添加太多的“方便”函数,我会使用这种方法。
需要记住的一件重要的事情是,不要把类的设计看得一成不变。只需继续并选择现在看起来最好的设计。当你的需求发生变化时,你可以而且应该改变它。这就是所谓的refactoring。
发布于 2009-01-05 11:33:58
我同意Frederick的数学::包含方法,尽管在我看来,最大的缺点是开发人员在查找方法时失去了IntelliSense的可发现性。那是我用Boost和STL做的事之一。
Rect::contains最终出错的一个例子是iPhone开发工具包绘制字符串的方法,基本上是String::drawInRect。
https://stackoverflow.com/questions/412823
复制相似问题