Rect :: содержит (точка) или точка :: is_inside (Rect)
Вопрос
Должен ли 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) . Причина этого заключается в том, что последнее приводит к иерархии объектов, которая включает функцию-член содержит как виртуальную, которая переопределяется от класса к классу. Это может иметь потенциально значительные издержки, когда вы имеете дело с очень большим количеством прямоугольников и аналогичных примитивов.