Иллюстрированный самоучитель по Architecture .NET

Проектирование абстракций

Поскольку на самом деле нам нужно реализовать не только систему резервирования гостиничных номеров, но и систему резервирования других ресурсов, включая резервирование авиабилетов и автомобилей напрокат, необходимо тщательно продумать механизм абстракции. С одной стороны, чем больше функций мы сможем включить в базовый класс, тем меньше останется работы при реализации каждой конкретной системы резервирования. С другой стороны, если базовый класс будет содержать слишком много функций, то множество задач, для решения которых его можно применить, уменьшится. При качественном проектировании необходимо определить оптимальное множество функций, включаемых в базовый класс.

Еще одним свойством "хороших" абстракций является то, что их не задевают даже серьезные изменения в реализации. Далее в этой книге будет показано, что вносить изменения в абстракции системы резервирования гостиничных номеров не придется даже тогда, когда мы реализуем ее с помощью базы данных SQL Server.

Упомянутые абстракции в C++ представлены с помощью абстрактных классов, описанных в файле Broker.срр.

Класс Reservabie (Резервируемый объект, ресурс)

В качестве первой абстракции выберем объект, который мы будем резервировать. Назовем эту абстракцию просто Reservabie (Резервируемый объект, ресурс). Основной момент в резервировании – это использование ресурса. Нельзя, чтобы один ресурс был зарезервирован несколькими пользователями одновременно, поэтому основным атрибутом Reservabie (Резервируемый объект, ресурс) является capacity (объем имеющихся ресурсов). Например, в гостинице – 100 номеров, авиарейс имеет 250 мест.

Для объекта Reservable (Резервируемый объект, ресурс) также потребуется уникальный идентификатор, который мы обозначим unitid (Вместо более длинного, неудобного имени reservableid, было выбрано более короткое unitid. Позже мы будем использовать слово unit (объект, единица) и в других именах Например, метод для добавления резервируемого объекта назовем AddUnit)

В приложениях мы введем дополнительный атрибут cost (стоимость). Для гостиничного номера – это его стоимость за сутки, для авиабилета – цена и т д Обратите внимание на то, что к некоторым резервируемым объектам этот атрибут может быть неприменим. Например, стоимость зала заседаний для компании может и не быть определена, но поскольку наше приложение будет использоваться в коммерческих целях, то атрибут cost (стоимость) нужно включить в модель.

Упрощения
< p>

Поскольку цель примера состоит в том, чтобы проиллюстрировать основные понятия управляемого C++ и .NET, модель примера довольно упрощена, чтобы не тратить время на программирование деталей. Например, в реальной гостинице есть несколько видов номеров разной стоимости. Точно так же на авиарейс имеются места в разных классах. На практике ситуация еще осложняется тем, что цена билета зависит от того, был ли он зарезервирован, есть ли ограничения на полет и т.д. Чтобы облегчить себе жизнь, предположим, что стоимость всех резервируемых объектов одного типа одинакова.

В управляемом C++ мы представим Reservable (Резервируемый объект, ресурс) в виде абстрактного класса.

public _gc _abstract class Reservable
// сборщик мусора – класс Reservable
{
static private int nextid = 0; // статический частный
protected: // защищенный
int unitid; public:
int capacity; // вместимость
Decimal cost; // Десятичная стоимость;
Reservable(int capacity, Decimal cost)
// вместимость, Десятичная стоимость
{
this › capacity = capacity;
// вместимость
this › cost = cost;
// стоимость
unitid = nextid++;
}
};

В конструкторе можно задать атрибуты capacity (объем имеющихся ресурсов) и cost (стоимость) Значение поля unitid генерируется автоматически с помощью статической переменной. Минимальное значение этого атрибута – ноль, так как мы будем использовать его в качестве одного из индексов двумерного массива, который содержит информацию о количестве клиентов, резервирующих данный объект на конкретную дату.

Роль спецификаторов управления доступом private (частный), internal (внутренний) и protected (защищенный) мы обсудим позже.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.