2012-02-17 5 views
7

Я работаю над проектом zend, я имею в виду другой проект zend для создания нового проекта Zend. Но мне не нравится слепо следовать этому проекту, не понимая. В структуре Zend каталога, в модели класса существуют в основном два типа классов, которые я вижу, вроде как вв Zend, Почему мы используем класс DB Model и класс Mapper как два отдельных?

- 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) 

Почему эта конкретная структура следует? Разделяет ли это класс класса Object и класс модели базы данных?

Просьба пояснить.

+0

Вкратце: Да. Что вы ожидаете от ответа? (sidenote: когда 'Blog' имеет методы' save() 'и т. д., это скорее реализация с активной записью и менее модель в смысле концепции model-mapper) – KingCrunch

+0

@KingCrunch, я хочу знать, почему это используется структура? Нельзя ли использовать один класс для хранения значений в базе данных? Я только что начал с zend, это было wny. Не знаете причины этого шаблона? –

+0

Я не читал ответы, таким образом, я думаю, что там где-то есть ответы. Краткая причина заключается в следующем: Разделение логики доступа к бизнес-данным и данных. – KingCrunch

ответ

12

DataMapper is a design pattern from Patterns of Enterprise Application Architecture.

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

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

Разделение ответственности за сопоставление в собственном слое также более тесно связано с Single Responsibility Principle. Ваши объекты не обязательно должны знать о логике БД и наоборот. Это дает вам большую гибкость при написании кода.

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

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

6

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

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

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

  • титул
  • автор
  • тело
  • date_posted

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

  • number_of_reads
  • number_of_likes

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

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

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