Rect :: содержит (точка) или точка :: is_inside (Rect)

StackOverflow https://stackoverflow.com/questions/412823

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top