Pregunta

¿Debería una API proporcionar Rect :: contiene (Punto) o Point :: is_inside (Rect) o ambos? o Math :: contiene (Point, Rect) porque es simétrico?

La misma Q va para LineSegment :: contiene (Punto), Rect :: totalmente_contiene (Círculo) etc.

¿Fue útil?

Solución

Rect :: contiene (Punto) tiene más sentido ya que es un bloque de construcción. El otro no es realmente necesario ya que se esperaría que cada forma específica implementara la operación, mientras que el Point no tiene que conocer todas las formas posibles. La misma respuesta se aplica a LineSegment .

En cuanto a la relación entre Circle y Rect , es más complicado usar la mayoría de los marcos orientados a objetos y no tiene una respuesta definitiva. Algún otro estilo de objeto orientado como CLOS lo hace mediante el uso de funciones y métodos genéricos, lo que hace que no sea una pregunta.

Otros consejos

Depende completamente de lo que hace que la expresión de su programa sea más limpia, más alineada con el problema que está tratando de resolver. Entonces, hasta cierto punto, todo lo anterior debería estar bien en diferentes contextos.

Sin embargo, en términos generales, estoy ligeramente inclinado a favor de Rect :: contiene (Point) en lugar de Point :: Is_inside (Rect) . Esto se debe a que creo que la clase Point , ya que sería utilizada por todo tipo de clases (como un 'Círculo', 'Hexágono', etc.) debería ser muy básica y contener solo la interfaz mínima.

Math :: contiene (Rect, Point) sería mi segunda opción. Usaría este enfoque, si quisiera mantener mi clase Rectangle muy primitiva y no agregar demasiada "conveniencia" funciones para ello.

Una cosa importante para recordar es que no considere el diseño de sus clases como escrito en piedra. Solo sigue adelante y elige el diseño que mejor se vea ahora . Siempre que sus necesidades cambien, puede y debería alterarlo. Esto es lo que se llama refactoring .

Estoy con Frederick en el enfoque Math :: contiene, aunque el mayor inconveniente en mi opinión es que el desarrollador pierde la capacidad de detección de IntelliSense al encontrar el método. Ese es uno de mis puntos fuertes con Boost y STL.

Un ejemplo de dónde Rect :: contiene eventualmente falla es el método del iPhone SDK para dibujar cadenas, que es básicamente String :: drawInRect.

Depende de la implementación, pero al igual que Federick, también tendería a Matemáticas :: contiene (Rect, Punto) , sobre Rect :: contiene (Punto) . La razón de esto es que la última conduce a una jerarquía de objetos que incluye la función miembro contiene como virtual, que se reemplaza de una clase a otra. Esto puede tener una sobrecarga potencialmente significativa cuando se trata de un gran número de rectángulos y primitivas similares.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top