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