[TC] prg Паттерн DataMapper
Здравствуйте, industry.
Пытаюсь с проектировать приложение используя данный шаблон.
Существует несколько таблиц: Студенты, Вузы, Курсы.
Каждая из них содержит соответствующую информацию.
Я создаю несколько классов каждый из которых соответствует одной из
таблиц и несколько мапперов соответствующих одному из классов.
К примеру таблица student,класс "student.php", и класс маппера
"studentMapper.php".
в классах мапперов реализованны несколько методов к примеру:
studentMapper.add(), studentMapper.delete(),studentMapper.fetchAll() и
пр.
Методы, требующие этого, получают на вход обьект student, а другие
возвращают соответствующий обьект.
И в итоге получается множество
мапперов которые практически
дублируют функции друг
друга,отличаясь лишь в том, что
выполняют эти операции с различными
обьектами.
Правильно ли это или может быть это
делается совершенно иначе?
Буду очень благодарен за ответ.
Приветствую всех.
Это неверная формулировка. Классы должны соответствовать не таблицам базы данных,
а сущностям из предметной области.
Паттерн data mapper используется именно тогда, когда классы объектов, которыми
оперирует приложение, заметно отличаются от записей в таблице БД.
А если поля класса у вас соответствуют полям записи в таблице БД, а отношения
между объектами достаточно просты или вовсе отсутствуют,то в использовании этого
паттерна нет особой необходимости.
По поводу количества классов распределителей (mappers) -- это правильно для обобщенного
случая.
В конкретном случае этих классов может быть меньше -- зависит от того, насколько
удачно вы построите иерархию классов распределителей.
Кроме того, если для нескольких объектов (студенты, преподаватели, курсы, вузы
и т.д.) набор методов для взаимодействия с распределителем совпадает (в смысле
имен), то эти методы можно оформить в самостоятельный интерфейс, что приведет
к уменьшению количества классов распределителей, так как теперь будет нужен один
распределитель для интерфейса, а не для каждого объекта.
Если код класса дублирует код другого класса, то их надо объединить в общую иерархию,
а дублируемый код вынести в базовый класс (суперкласс).
Не совсем понятно, что побудило вас использовать этот паттерн. Если вы делаете
это в целях изучения, то вопросов нет, а если проектируете реальное приложение,
то нужно смотреть техзадание, чтобы оценить, насколько продуктивен ваш подход.
На первый взгляд, если судить по вашим словам, у вас не такая сложная структура
взаимоотношений предметных сущностей и базы данных, чтобы строить прослойку из
распределителей.
Вы потратите время на разработку и поддержку параллельной иерархии классов-распределителей,
а никаких преимуществ для решения конкретной задачи это не даст.
Посоветовать могу следующее:
- в основу иерархии распределителей положить абстрактный класс, в котором описать
все необходимые методы. Эти методы будете реализовывать в наследниках, обрабатывающих
конкретные объекты. Это сделает ваш код независимым от конкретных распределителей
и вам не придется его переписывать, если вы решите для класса Student заменить
распределитель StudentDataMapper на StudentSuperDataMapper.
- чтобы не писать все время вызовы конструкторов конкретных распределителей,
добавьте либо фабричный метод в вышеуказанный базовый класс, либо создайте фабрику
распределителей.
Успехов. Анатолий.