в Zend, Почему мы используем класс модели DB и класс Mapper как два отдельных? - PullRequest
7 голосов
/ 17 февраля 2012

Я работаю над проектом 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 ]

12 голосов
/ 17 февраля 2012

DataMapper - это шаблон проектирования из Patterns of Enterprise Application Architecture .

Data Mapper - это уровень программного обеспечения, который отделяет объекты в памяти от базы данных. Его ответственность заключается в передаче данных между ними, а также в их изоляции друг от друга. С Data Mapper объекты в памяти не должны знать даже, что есть база данных; они не нуждаются в коде интерфейса SQL и, конечно, не знают схемы базы данных.

То, как вы храните данные в реляционной базе данных, обычно отличается от того, как вы будете структурировать объекты в памяти. Например, у объекта будет массив с другими объектами, а в базе данных ваша таблица будет иметь внешний ключ для другой таблицы. Из-за несоответствия объектно-реляционного импеданса вы используете промежуточный уровень между объектом домена и базой данных. Таким образом, вы можете развиваться как без влияния на другого.

Разделение ответственности за отображение на его собственном уровне также более точно следует принципу Единой ответственности . Ваши объекты не должны знать о логике БД и наоборот. Это дает вам большую гибкость при написании кода.

Если вы не хотите использовать модель предметной области, вам обычно не нужен DataMapper. Если ваши таблицы базы данных просты, вам лучше использовать TableModule и TableDataGateway или даже просто ActiveRecord.

Для различных других моделей см. Мой ответ на

7 голосов
/ 17 февраля 2012

Идея модели заключается в том, чтобы обернуть логический набор данных внутри вашего кода.

Идея DataMapper состоит в том, чтобы связать этот набор данных на уровне приложения с тем, как вы его храните.

Для многих реализаций ActiveRecord платформа не обеспечивает такое разделение намерений, и это может привести к проблемам. Например, модель BlogPost может заключать в себе основную информацию в блоге, например

  • название
  • автор
  • корпус
  • date_posted

Но, возможно, вы также хотите, чтобы оно содержало что-то вроде:

  • number_of_reads
  • number_of_likes

Теперь вы можете хранить все эти данные в одной таблице MySQL для начала, но по мере роста вашего блога и становления супер-знаменитостью вы обнаруживаете, что ваши статистические данные получают очень много хитов, и вы хотите переместить это на отдельный сервер базы данных.

Как бы вы перенесли эти поля объектов BlogPost в другое хранилище данных без изменения кода приложения?

С помощью DataMapper вы можете изменить способ сохранения объекта в базе (-ах) и способ его загрузки из базы (-ов). Это позволяет настроить механизм хранения без необходимости изменять фактический сбор информации, на которую опирается ваше приложение.

...