両方を選んでみませんか?
実際、重要なのはライブラリとその内部の間のインターフェースだけです。または、ユーザーがライブラリをどのように使用するか。長方形の情報は好きなように保存できますが、ユーザーが長方形の保存方法を気にする必要がなく、実際には長方形であるというだけで、ユーザーから遠く離れた場所にカプセル化する必要があります。
つまり、両方を選択すると、オブジェクト指向コードを記述している場合は、長方形を好きなように保存してから、ユーザーがどちらかの方法を使用して長方形を作成できるようにすることができます。
たとえば、宣言は次のようになります。
class Rectangle
{
public:
Rectangle(Point p1, Point p2);
Rectangle(Point origin, int width, int height);
...
};
(C ++、タグ付けしたので)
ポイントはいくつかのクラスです:
class Point
{
public:
Point(int x, int y) : mX(x), mY(y) {}
private:
int mX;
int mY;
};
このように、ライブラリは、長方形を作成するための1つのタイプの仕様のみをサポートするように制限されていません。
特に実装に関しては、それは本当に重要ではありません。これらは両方とも機能し、相互に簡単に変換でき、同じ量のメモリを使用するため、一方を他方に使用してもパフォーマンスに大きな影響はありません。
開発を簡単にするために、長方形のユースケースを検討してください。そのクラス用に作成する必要のある各メンバー関数を見て、それらの関数の作成を容易にする形式を検討してください。
もし私だったら、おそらく2つのポイントで実装するでしょう。
編集:どちらの方法でも実装しても、ほとんどの場合、まったく違いがないと思う理由に対する学術的なアプローチ。
長方形で機能するか、計算を行うRectangleクラスのメンバー関数または操作があるとします。1つの実装方法(幅/高さ/原点または2つのポイント)が他の実装よりも大幅に高速にこの操作を実行すると仮定します。
次のようにして、実装の幅/高さ/原点から変換できます。
// assuming x0,y0 is top left and x1,y1 is bottom right
x0 = originX;
y0 = originY;
x1 = originX + width;
y1 = originY + height;
そして、次のように実装から2つのポイントに変換できます。
// assuming x0,y0 is top left and x1,y1 is bottom right
originX = x0;
originY = y0;
width = x1 - x0;
height = y1 - y0;
したがって、他の実装よりもはるかに遅い/悪いこの操作を実行する実装は、O(1)の実行時間で他の実装に変換できるため、他の実装は最初の実装よりもはるかに優れていることはありません。
この操作を1秒間に数千回実行するか、パフォーマンスが非常に制限されているデバイスで実行しない限り、パフォーマンスに違いはないと確信しています。どちらの実装も4つのfloat/intを格納するだけなので、メモリの違いはすでにありません。
これにより、コーディングの利便性が大幅に向上します。上記の元の投稿で述べたように、「長方形のユースケースを検討してください。そのクラス用に作成する必要のある各メンバー関数を見て、考えてみてください。どのフォーマットがそれらの関数を書きやすくするかについて。」