Почему бы не выбрать обе?
Действительно, единственное, что имеет значение, это интерфейс между вашей библиотекой и ее внутренними элементами. Или, как ваши пользователи будут использовать библиотеку. Вы можете хранить информацию для прямоугольника, но хотите, но это должно быть инкапсулировано далеко, далеко от пользователя, так что им не нужно беспокоиться о том, как их прямоугольник хранится, просто что это действительно прямоугольник.
Другими словами, при выборе обоих, если вы пишете объектно-ориентированный код, вы можете сохранить прямоугольник, как хотите, а затем позволить своему пользователю создать прямоугольник с помощью любого из методов.
Например, ваше объявление может выглядеть примерно так:
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;
};
Таким образом, ваша библиотека не ограничивается только поддержкой одного типа спецификации для создания прямоугольника.
Что касается реализации конкретно, это действительно не имеет значения. Они оба работают и могут быть легко преобразованы друг в друга и использовать один и тот же объем памяти, и поэтому не будет значительных последствий для использования одного над другим.
Для простоты разработки рассмотрите, какие используются варианты использования вашего прямоугольника. Взгляните на каждую функцию-член, которую вам нужно написать для этого класса, и подумайте о том, какой формат упростит запись этих функций.
Если бы это был я, я бы, вероятно, использовал его с двумя точками.
Редактирование: академический подход к тому, почему я думаю, что реализация его в любом случае не будет иметь абсолютно никакого значения в большинстве случаев.
Пусть есть функция-член или операция над нашим классом Rectangle, которая работает на нашем прямоугольнике или делает некоторые вычисления. Предположим, что один метод реализации (ширина/высота/начало или две точки) будет выполнять эту операцию значительно быстрее, чем другая реализация.
Мы можем преобразовать от реализации ширина/высота/происхождения со следующим:
// assuming x0,y0 is top left and x1,y1 is bottom right
x0 = originX;
y0 = originY;
x1 = originX + width;
y1 = originY + height;
И мы можем преобразовать из реализации двух точек следующим образом:
// assuming x0,y0 is top left and x1,y1 is bottom right
originX = x0;
originY = y0;
width = x1 - x0;
height = y1 - y0;
Таким образом, осуществление которых выполняет эта операция намного медленнее/хуже, чем другая реализация может быть преобразована в другую реализацию в O (1) время работы, так что другая реализация не может быть , что намного лучше, чем th первая реализация.
Если вы не выполняете эту операцию несколько тысяч раз в секунду или на устройстве с ограниченной производительностью, я очень уверен, что разница в производительности не будет. Уже нет разницы в памяти, потому что обе реализации в значительной степени просто хранят 4 float/ints.
Это в значительной степени оставляет удобство кодирования, и, как я сказал выше в своем оригинальном посте, вы можете просто «рассмотреть, какие варианты использования вашего прямоугольника есть. Посмотрите на каждую функцию-член, которую вам нужно будет написать для этот класс и подумайте о том, какой формат облегчит запись этих функций ».
Я думаю, что этот вопрос получит окончательный ответ, если мы определим а), где должны быть фигурные фигурные скобки, и б) использовать ли vi или emacs. – molbdnilo