Объектный интерфейс ресурса |
Объектный интерфейс, описывающий обобщенный ресурс, определяет общее поведение всех типов ресурсов:
каждый ресурс должен сообщать в вышестоящий интерфейс (интерфейс-контейнер) обо всех изменениях своей стоимости;
интерфейс-контейнер должен сообщать встроенному объекту-ресурсу об изменении текущего этапа;
интерфейс-контейнер должен сообщать встроенному объекту-ресурсу о необходимости удалить все ресурсы, относящиеся к текущему этапу;
интерфейс-контейнер должен уметь спросить у встроенного объекта-ресурса есть у заданного этапа ресурсы или нет;
для перерасчета стоимости обход иерархии владельцев ресурсов должен выполнять контейнер, а непосредственно обработку ресурсов - объект-ресурс.
Объектный интерфейс ресурса проектируется с учетом возможного использования ресурсов в разных интерфейсах.
Сообщение об изменении стоимости ресурса передается для корректировки стоимости соответствующих этапов и для визуализации изменения стоимости этапов. Интерфейс-контейнер не знает специфику вычисления стоимости каждого конкретного ресурса. Ему достаточно знать на сколько изменилась стоимость ресурса и к какому этапу относится ресурс. С другой стороны, ресурс не знает как его стоимость влияет на стоимость договора. Об этом должен знать интерфейс-контейнер. Сообщение об изменении стоимости передается в контейнер через механизм событий. Ресурс генерирует событие "изменилась стоимость" с параметром "величина изменения стоимости", а контейнер может подключить обработчик данного события. Изменение стоимости относится к текущему этапу в интерфейсе-контейнере.
В структуре данных ресурса предусмотрены 2 суммы - плановая и фактическая. Предполагается, что в каждом конкретном интерфейсе изменяться будет только одна из сумм. В частности, в интерфейсе работы с проектами вручную будут вводиться и корректироваться только плановые цифры. Поэтому достаточно сообщения об изменении одной суммы.
Примечание. Вызов метода контейнера вместо генерации события потребовал бы введения соответствующего объектного интерфейса для контейнеров, включающих ресурсы. Данное требование накладывает излишнее ограничение на контейнер и усложняет дальнейшую поддержку интерфейсов, использующих ресурсы.
Сообщение об изменении текущего этапа в интерфейсе-контейнере передается для корректного отображения ресурсов, относящихся к текущему этапу. Т.к. изменение текущего этапа происходит по инициативе интерфейса-контейнера, то сообщение передается вызовом метода объекта-ресурса "Изменился хозяин ресурсов" с параметром "NRec текущего этапа".
Сообщение о необходимости удалить все ресурсы, относящиеся к текущему этапу, передается при удалении текущего этапа. Сообщение передается вызовом метода объекта-ресурса "Удалить все ресурсы" с параметром "NRec владельца удаляемых ресурсов".
Проверка наличия ресурсов у заданного этапа потребуется для реализации разумного поведения в ряде ситуаций. Например, при удалении этапа. Проверка выполняется вызовом метода объекта-ресурса "Есть ресурсы?" с параметром "NRec владельца ресурсов".
Для перерасчета стоимости у ресурса вводится метод "Скопировать ресурсы". Поскольку объект-ресурс не знает структуры данных интерфейса-контейнера, единственное разумное действие, которое он может выполнить: скопировать ресурсы владельца "от кого" владельцу "кому". Если копируемый ресурс у владельца-приемника уже есть, то его количество увеличивается, новая запись не создается (копирование со сжатием).
Спроектированный класс объектов "ресурс" задуман как универсальный. Однако, если мы захотим использовать его в другом месте, ничего не получится, т.к. данные об экземплярах ресурсов привязаны к таблице "Проекты-Этапы". За счет небольшого усовершенствования можно повысить универсальность класса объектов "ресурс". Достаточно в методы добавить параметр "код владельца ресурса". Соответственно, в таблицы ресурсов (PrjMaterials и PrjExecutors) необходимо добавить поле "код владельца ресурса".
В пределах одного жизненного цикла объекта "ресурс" (от создания до уничтожения) код владельца ресурса меняться не будет. Поэтому он задается при создании объекта, а не при вызове методов объекта.
В текущей версии приложения имеется один владелец ресурсов. В дальнейшем коды владельцев ресурсов будут добавляться по мере необходимости.
Полученная сущность относится к горизонтальным и переводится в компонент "Ядро приложения".
Описание интерфейса ресурса приведено в разделе "IResources. Интерфейс к ресурсам. ".