Frage

Sollte eine API Rect liefern :: enthält (Punkt) oder Punkt :: is_inside (Rect) oder beides? oder Math :: enthält (Point, Rect) denn es ist symmetrisch?

Das gleiche gilt für Q Linesegment :: enthält (Point), Rect :: fully_contains (Kreis) etc.

War es hilfreich?

Lösung

Rect::contains(Point) macht am meisten Sinn, da es ein Baustein ist. Die andere ist nicht wirklich notwendig, da Sie jede spezifische Form erwarten würde die Operation zu implementieren, während die Point nicht über jede erdenkliche Form zu wissen braucht. Die gleiche Antwort gilt für LineSegment.

In Bezug auf die Beziehung zwischen Circle und Rect es komplizierter ist die meisten objektorientierten Frameworks und hat keine definitive Antwort. Etwas andere Art der objektorientierten wie CLOS tut es durch die Verwendung generische Funktionen und Methoden ihm eine nicht Frage zu machen.

Andere Tipps

hängt ganz davon ab, was macht den Ausdruck Ihres Programm sauberen, mit dem Problem ausgerichtet sind Sie zu lösen versuchen. Also zu einem gewissen Grad sollten, alle der oben genannten in verschiedenen Kontexten in Ordnung sein.

Allerdings, allgemein gesprochen, ich bin ein wenig in der Gunst des Rect::contains(Point) gekippt statt Point::Is_inside(Rect). Das ist, weil ich die Point Klasse denken, da es von allen Arten von Klassen verwendet werden würde (wie eine ‚Kreis‘, ‚Hexagon‘ etc.) sollte sehr einfach sein und darf nur die minimale Schnittstelle.

Math::contains(Rect, Point) wäre meine zweite Wahl sein. Ich würde diesen Ansatz verwenden, wenn ich sehr primitiv meine Klasse Rectangle halten wollte und nicht zu viel „Convenience“ Funktionen, um es hinzuzufügen.

Eine wichtige Sache zu erinnern ist, setzen Sie das Design Ihrer Klassen nicht betrachten wie in Stein gemeißelt. Dann nichts wie los und das Design, die am besten sieht nun . Jedes Mal, wenn sich Ihre Anforderungen ändern, können Sie und Sie sollte ändern es. Dies ist die so genannte Refactoring .

Ich bin mit Frederick auf der Math :: Ansatz enthält, obwohl der größte Nachteil meiner Meinung nach ist, dass der Entwickler die Auffindbarkeit von IntelliSense verliert die Methode bei der Suche. Das ist eine meiner beefs mit Boost und STL.

Ein Beispiel, wo Rect :: enthält schließlich geht falsch ist die Methode des iPhone SDK von Zeichen Strings, die im Grunde String :: drawInRect ist.

Es hängt von der Implementierung, aber wie Federick würde ich neige dazu, auch für Math gehen :: enthält (Rect, Point) , über Rect :: enthält (Punkt) . Der Grund dafür ist, dass Letzteres führt zu einer Objekthierarchie, die die enthält enthält Elementfunktion als eine virtuelle, die von Klasse zu Klasse überschrieben wird. Dies kann zu einem potenziell erheblichen Aufwand, wo Sie mit einer sehr großen Anzahl von Rechtecken und ähnliche Primitive handelt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top