Глава 9. Представление бизнес-логики 149
служащему, с ним легко выполнять все необходимые операции, собирать информацию
и следовать в направлении связей с другими объектами.
Одна из проблем модели предметной области заключается в сложности создания ин-
терфейсов к реляционным базам данных; последние в подобной ситуации приобретают
роль эдаких бедных родственников, с которыми никто не желает иметь дела. Поэтому
считывание информации из базы данных и запись ее с необходимыми преобразованиями
превращается в прихотливую игру ума.
Типовое решение модуль таблицы предусматривает создание по одному классу на
каждую таблицу базы данных, и единственный экземпляр класса содержит всю логику
обработки данных таблицы. Основное отличие модуля таблицы от модели предметной
области состоит в том, что если, например, приложение обслуживает множество зака-
зов, в соответствии с моделью предметной области придется сконструировать по одному
объекту на каждый заказ, а при использовании модуля таблицы понадобится всего один
объект, представляющий одновременно все заказы.
Принцип действия
Сильная сторона решения модуль таблицы заключается в том, что оно позволяет со-
четать данные и функции для их обработки и в то же время эффективно использовать
ресурсы реляционной базы данных. На первый взгляд модуль таблицы во многом на-
поминает обычный объект, но отличается тем, что не содержит какого бы то ни было
упоминания об идентификационном признаке объекта. Если, скажем, требуется полу-
чить адрес служащего, ДЛЯ ЭТОГО применяется метод anEmployeeModule.GetAddress
(long empioyeeiD). В том случае, когда необходимо выполнить операцию, касающуюся
определенного служащего, соответствующему методу следует передать ссылку на
идентификатор, значение которого зачастую совпадает с первичным ключом служащего
в таблице базы данных.
Модулю таблицы, как правило, отвечает некая табличная структура данных. Подобная
информация обычно является результатом выполнения SQL-запроса и сохраняется в ви-
де множества записей (Record Set, 523). Модуль таблицы предоставляет обширный арсе-
нал методов ее обработки. Объединение функций и данных обеспечивает многие пре-
имущества модели инкапсуляции.
Нередко для решения общей задачи необходимо создать несколько модулей таблицы
и, более того, позволить им манипулировать одним и тем же множеством записей
(рис. 9.4).
Наиболее очевидный пример связан с использованием отдельных модулей таблицы
для каждой (хранимой) таблицы базы данных. Кроме того, можно сконструировать моду-
ли таблицы для любых достойных SQL-запросов и виртуальных таблиц.
Конкретный модуль таблицы может принимать вид экземпляра класса или набора ста-
тических методов. Достоинство первого варианта состоит в том, что он позволяет ини-
циировать модуль данными существующего множества записей, чаще всего получаемого
в результате обработки SQL-запроса. Для манипуляции записями применяются методы
класса. Не исключается и возможность создания иерархии наследования, когда, скажем,
определяются базовый класс с описанием контракта общего вида и целое семейство про-
изводных классов, отвечающих частным разновидностям контрактов.