ООП при проектировании
Введение
Наследование — механизм объектно-ориентированного программирования (наряду с инкапсуляцией, полиморфизмом и абстракцией), позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом.
Класс, от которого произошло наследование, называется базовым, или родительским (англ. base class). Классы, которые произошли от базового, называются потомками, наследниками или производными классами (англ. derived class).
Класс-наследник реализует спецификацию уже существующего класса, что позволяет обращаться с объектами класса-наследника точно так же, как с объектами базового класса.
Абстрактный класс
В системе используются абстрактные классы. Абстрактный класс — это класс, описанный в программе и имеющий поля и методы, но не использующийся непосредственно ни для хранения данных, ни для создания объекта. От абстрактного класса можно наследоваться, создавая экземпляры дочерних классов со всеми полями и методами, объявленными в родителе. Например, абстрактным классом может быть базовый класс «сотрудник вуза», от которого наследуются классы «аспирант», «профессор» и т. д. Так как производные классы имеют общие поля и функции (например, поле «год рождения»), то эти члены класса могут быть описаны в базовом классе.
Способы наследования
В моделях возможно наследование одной сущности от другой. Возможны три способа наследования сущностей. Все способы реализованы в DataObject, поэтому могут использоваться в проекте.
Single Table Inheritance
Все классы-наследники хранятся в одной таблице
Самый быстрый способ хранения, всегда делается простой select.
Нужен механизм, чтобы отличать объекты базового класса от наследуемого.
Сложности с уникальностью, Nullable/NotNullable полями в наследниках.
Для отличия одного класса от другого используется поле дискриминатор типа. В таблице может быть очень много слабозаполненных колонок. Возможно, с этим могут быть проблемы.
Class Table Inheritance
По таблице на каждый тип (в том числе и абстрактный, если у него есть не абстрактные наследники)
Отсутствует дублирование данных, в каждой таблице только поля конкретного класса.
Минимальные изменения БД при изменении одного класса.
Для получения объекта-наследника нужно делать объединение JOIN по нескольким таблицам (для значений родительских полей).
Нужен механизм, позволяющий понять, сколько есть объектов определенного класса (без учета наследников).
Concrete Table Inheritance
По таблице на каждый конкретный (не абстрактный) класс.
Отличается от предыдущего тем, что не создаются таблицы для абстрактных классов. Таблицы классов содержат все поля, как собственные, так и наследуемые.
В примере: нет таблицы для Player, все остальные таблицы содержат name. Для выборки всех Player — нужны UNION.
Гораздо быстрее предыдущего варианта для глубокого наследования
Избыточное хранение данных. Проблемы с синхронизацией.
Для получения всех объектов класса с учетом наследников надо делать JOIN.
В проекте использованы на данный момент 2 и 3 способы наследования.
Преимущества наследования в учетных системах
Быстрое проектирование
Использование базовых классов позволяет быстро создавать новые документы и справочники, похожие на те, что уже есть в системе.
Объединение списков объектов
Использование базовых классов позволяет получать общие списки различных документов. Например, на основе базового документа «Входящие» мы можем получить журнал входящих документов, состоящий из списка всех его наследников
Легкая поддержка
Для того чтобы изменить маршрут, бизнес правило или какое-либо поведение группы документов, наследуемых от одного документа, достаточно внести изменения только в базовый документ.
Кроме легкости и понятности, в проекте также достигается минимальная избыточность программного кода.
Пример наследования в системе
В качестве примера рассмотрим наследование Справочников. Откроем Справочник Пользователи и роли и посмотрим его структуру через меню Действия -> Структура:
Также откроем структуру справочника Роли и увидим, что он является наследником справочника Пользователи и роли:
Аналогично можно убедиться в том, что Справочник Пользователи — наследник справочника Пользователи и роли: