Question

Une API devrait-elle fournir Rect :: includes (Point) ou Point :: is_inside (Rect) ou les deux? ou Math :: contient (Point, Rect) car il est symétrique?

Le même Q s’applique à LineSegment :: includes (Point), Rect :: Fully_contains (Circle), etc.

Était-ce utile?

La solution

Rect :: contient (Point) est tout à fait logique car il s’agit d’un bloc de construction. L'autre n'est pas vraiment nécessaire, car chaque forme spécifique implémenterait l'opération, alors que le Point ne doit pas connaître toutes les formes possibles. La même réponse vaut pour LineSegment .

En ce qui concerne la relation entre Circle et Rect , il est plus délicat d'utiliser la plupart des frameworks orientés objet et n'a pas de réponse définitive. Un autre style orienté objet, comme CLOS, le fait en utilisant des fonctions génériques et des méthodes, ce qui en fait une non-question.

Autres conseils

Dépend entièrement de ce qui rend l'expression de votre programme plus propre, plus alignée sur le problème que vous tentez de résoudre. Donc, dans une certaine mesure, tout ce qui précède devrait aller dans différents contextes.

Cependant, de manière générale, je suis légèrement incliné en faveur de Rect :: contient (Point) plutôt que Point :: Is_inside (Rect) . C'est parce que je pense que la classe Point , puisqu'elle serait utilisée par toutes sortes de classes (comme un "cercle", un "hexagone", etc.) devrait être très basique et ne contenir que l'interface minimale.

Math :: contient (Rect, Point) serait mon deuxième choix. J'utiliserais cette approche si je voulais garder ma classe Rectangle très primitive et ne pas ajouter trop de "commodité". fonctions à elle.

Une chose importante à retenir est que vous ne considérez pas la conception de vos cours comme si elle était écrite en pierre. Allez-y et choisissez le modèle qui vous va le mieux maintenant . Chaque fois que vos besoins changent, vous pouvez et vous devriez le modifier. C’est ce qu’on appelle le refactoring .

Je suis avec Frederick sur l'approche Math :: Contient, bien que le principal inconvénient de mon point de vue réside dans le fait que le développeur perd la possibilité de découvrir IntelliSense lors de la recherche de la méthode. C’est l’un de mes atouts avec Boost et STL.

La méthode de dessin des chaînes du kit de développement logiciel (SDK) pour iPhone du kit SDK de l'iPhone est un exemple de ce que Rect :: contient finit par devenir String :: drawInRect.

Cela dépend de la mise en oeuvre, mais comme Federick, je préférerais Math :: contient (Rect, Point) , au-dessus de Rect :: contient (Point) . La raison en est que cette dernière conduit à une hiérarchie d'objets qui inclut la fonction membre contient en tant que fonction virtuelle, qui est remplacée d'une classe à l'autre. Cela peut avoir un coût potentiellement important lorsque vous traitez avec un très grand nombre de rectangles et de primitives similaires.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top