API は Rect::contains(Point) または Point::is_inside(Rect) またはその両方を提供する必要がありますか? または Math::contains(Point, Rect) の原因は対称ですか?
LineSegment::contains(Point)、Rect::fully_contains(Circle) などにも同じ Q が適用されます。
Rect::contains(Point)
ビルディングブロックであるため、最も理にかなっています。すべての特定の形状が操作を実装することを期待するため、もう 1 つは実際には必要ではありPoint
ませんが、可能なすべての形状について知る必要はありません。についても同じ答えですLineSegment
。
Circle
との関係については、Rect
ほとんどのオブジェクト指向フレームワークを使用するのがより難しく、決定的な答えがありません。CLOSのようなオブジェクト指向の他のスタイルは、一般的な関数とメソッドを使用してそれを行い、それを問題にしません。
プログラムの表現をよりクリーンにし、解決しようとしている問題とより一致させるものに完全に依存します。したがって、ある程度、上記のすべてはさまざまなコンテキストで問題ないはずです。
しかし、一般的に言えば、私はRect::contains(Point)
よりもの方に少し傾いていPoint::Is_inside(Rect)
ます。Point
これは、クラスはあらゆる種類のクラス (「Circle」、「Hexagon」など) で使用されるため、非常に基本的で、最小限のインターフェイスのみを含む必要があると思うためです。
Math::contains(Rect, Point)
私の2番目の選択肢になります。Rectangle クラスを非常にプリミティブに保ち、「便利な」関数をあまり追加しないようにしたい場合は、このアプローチを使用します。
覚えておくべき重要なことは、クラスの設計を石で書かれたものと見なさないことです。今一番似合うデザインを選んでください。ニーズが変わったときはいつでも変更できますし、変更する必要があります。これがリファクタリングと呼ばれるものです。
私は、Math::contains アプローチで Frederick と協力していますが、私の意見では、開発者がメソッドを見つける際に IntelliSense の発見可能性を失うことが最大の欠点です。これは、Boost と STL を使用した私のビーフの 1 つです。
Rect::contains が最終的にうまくいかない例は、基本的には String::drawInRect である、文字列を描画する iPhone SDK のメソッドです。
それは実装に依存しますが、フェデリックのように、私もMath::contains(Rect,Point)をRect::contains(Point)よりも優先する傾向があります。この理由は、後者が、containsメンバー関数を仮想として含むオブジェクト階層につながり、クラスからクラスへとオーバーライドされるためです。これは、非常に多数の四角形や同様のプリミティブを扱っている場合に、かなりのオーバーヘッドになる可能性があります。