Rect :: содержит (точка) или точка :: is_inside (Rect) - PullRequest
4 голосов
/ 05 января 2009

Должен ли API предоставлять Rect :: contains (Point) или Point :: is_inside (Rect) или оба? или Math :: содержит (Point, Rect), потому что это симметрично?

То же самое Q относится к LineSegment :: contains (Point), Rect :: full_contains (Circle) и т. Д.

Ответы [ 4 ]

8 голосов
/ 05 января 2009

Rect::contains(Point) имеет больше смысла, так как это строительный блок. Другой не является действительно необходимым, так как вы ожидаете, что каждая конкретная фигура будет реализовывать операцию, тогда как Point не должен знать о каждой возможной фигуре. Тот же ответ идет для LineSegment.

Относительно отношения между Circle и Rect более сложно использовать большинство объектно-ориентированных сред и не имеет однозначного ответа. Некоторые другие объекты, ориентированные на объекты, такие как CLOS, делают это с помощью универсальных функций и методов, что делает его без вопросов.

1 голос
/ 05 января 2009

Всецело зависит от того, что делает выражение вашей программы более четким и более согласованным с проблемой, которую вы пытаетесь решить. Так что в некоторой степени все вышеперечисленное должно быть хорошо в разных контекстах.

Однако, вообще говоря, я немного склонен в пользу Rect::contains(Point), а не Point::Is_inside(Rect). Это потому, что я думаю, что класс Point, поскольку он будет использоваться всеми классами (например, «Круг», «Шестиугольник» и т. Д.), Должен быть очень базовым и содержать только минимальный интерфейс.

Math::contains(Rect, Point) будет моим вторым выбором. Я бы использовал этот подход, если бы я хотел, чтобы мой класс Rectangle был очень примитивным и не добавлял к нему слишком много «удобных» функций.

Важно помнить, что не считайте дизайн ваших классов написанным на камне. Просто выбери дизайн, который выглядит лучше всего сейчас . Всякий раз, когда ваши потребности меняются, вы можете, и вы должны изменить это. Это то, что называется рефакторинг .

0 голосов
/ 05 января 2009

Это зависит от реализации, но, как и Федерик, я бы также склонялся к Math :: Содержит (Rect, Point) , более Rect :: содержит (Point) Причина этого заключается в том, что последний приводит к иерархии объектов, которая включает , содержащую функцию-член в качестве виртуальной, которая переопределяется от класса к классу. Это может иметь потенциально значительные издержки, когда вы имеете дело с очень большим количеством прямоугольников и аналогичных примитивов.

0 голосов
/ 05 января 2009

Я с Фредериком на подходе Math :: contains, хотя самый большой недостаток, на мой взгляд, заключается в том, что разработчик теряет способность IntelliSense обнаруживать метод. Это одна из моих проблем с Boost и STL.

Примером, где Rect :: contains в конечном итоге идет не так, является метод рисования строк в iPhone SDK, который в основном является String :: drawInRect.

...