В Zend, Почему мы используем класс модели DB и класс Mapper как два отдельных?
Я работаю над проектом Zend, я имею в виду другой проект Zend, чтобы создать новый проект Zend. Но я не люблю слепо следовать этому проекту без понимания. В структуре Zend Directory, в классе Model, я вижу в основном два типа классов, как в
- models
- DbTables
- Blog.php //Extends Zend_Db_Table_Abstract
- Blog.php // Contains methods like validate() and save()
- BlogMapper.php // Also Contains methods like validate(Blog b) & save(Blog b)
Почему эта конкретная структура соблюдается? Это разделить класс объекта и модель базы данных?
Пожалуйста, объясни.
2 ответа
DataMapper - это шаблон проектирования из Patterns of Enterprise Application Architecture.
Data Mapper - это уровень программного обеспечения, который отделяет объекты в памяти от базы данных. В его обязанности входит передача данных между ними, а также их изоляция друг от друга. При использовании Data Mapper объекты в памяти не должны знать даже, что присутствует база данных; они не нуждаются в коде интерфейса SQL и, конечно, не знают схемы базы данных.
То, как вы храните данные в реляционной базе данных, обычно отличается от того, как вы структурируете объекты в памяти. Например, у объекта будет массив с другими объектами, а в базе данных ваша таблица будет иметь внешний ключ для другой таблицы. Из-за несоответствия объектно-реляционного импеданса вы используете промежуточный слой между объектом домена и базой данных. Таким образом, вы можете развиваться как без влияния на другого.
Разделение ответственности за картирование на собственный уровень также более точно следует принципу единой ответственности. Ваши объекты не должны знать о логике БД и наоборот. Это дает вам большую гибкость при написании кода.
Если вы не хотите использовать модель предметной области, вам обычно не нужен DataMapper. Если ваши таблицы базы данных просты, вам может быть лучше использовать TableModule и TableDataGateway или даже просто ActiveRecord.
Для различных других моделей см. Мой ответ на
Идея модели заключается в том, чтобы обернуть логическую коллекцию данных внутри вашего кода.
Идея DataMapper состоит в том, чтобы связать этот набор данных на уровне приложения с тем, как вы храните его.
Для многих реализаций ActiveRecord платформа не обеспечивает такое разделение намерений, и это может привести к проблемам. Например, модель BlogPost может заключать в себе основную информацию в блоге, например
- заглавие
- автор
- тело
- Дата Отправки
Но, возможно, вы также хотите, чтобы он содержал что-то вроде:
- number_of_reads
- number_of_likes
Теперь вы можете хранить все эти данные в одной таблице MySQL для начала, но по мере роста вашего блога и становления супер-известностью вы обнаруживаете, что ваши статистические данные получают огромное количество посещений, и хотите перенести их в отдельный сервер базы данных.
Как бы вы перенесли эти поля объектов BlogPost в другое хранилище данных без изменения кода приложения?
С помощью DataMapper вы можете изменить способ сохранения объекта в базе данных и способ его загрузки из базы данных. Это позволяет настроить механизм хранения без необходимости изменять фактический сбор информации, на которую опирается ваше приложение.