YiiFramework Yii PHP framework 2 public preview

MiksIr

miksir@home:~$
Не, ну вообще, DM, низведенный до завязки на парную с ним модель, вполне может жить в том же классе. Два тесно связанных класса, которые хрен расширишь, ничем не лучше одного.
Хм, как раз если мы возмем класс DM, ограничим его работой с одной моделью и поместим весь код мапера в эту модель - это и будет AR, а как еще то?
 

fixxxer

К.О.
Партнер клуба
Это не каноничный AR. Каноничный ничего не знает о связях и не умеет возвращать коллекции.

Собственно, предупреждение Фаулера о проблемах расширения AR и порождаемого такими попытками говнокоде легко видеть на попытках добавить в yii операции обновления по связям. Каноничный AR тупой как пробка и не выдерживает таких издевательств, порождая монстров.
 

MiksIr

miksir@home:~$
С одной стороны да, с другой - связь можно рассматривать как бизнес-логику модели (не имеющую отношения к AR). А работу с коллекциями, насколько я понимаю, и DM не решает - это уже в сторону TDG.
 

fixxxer

К.О.
Партнер клуба
Почему не решает?

Вот из Фаулера:

PHP:
class AbstractMapper...

   protected List loadAll(ResultSet rs) throws SQLException {
      List result = new ArrayList();
      while (rs.next())
         result.add(load(rs));
      return result;
   }
...
   public List findMany(StatementSource source) {
      PreparedStatement stmt = null;
      ResultSet rs = null;
      try {
         stmt = DB.prepare(source.sql());
         for (int i = 0; i < source.parameters().length; i++)
            stmt.setObject(i+1, source.parameters()[i]);
         rs = stmt.executeQuery();
         return loadAll(rs);
      } catch (SQLException e) {
         throw new ApplicationException(e);
      } finally {
         DB.cleanUp(stmt, rs);
      } 
}
 

MiksIr

miksir@home:~$
Да и опять же, ну если претит, что AR возвращает коллекции - да пусть выносят в отдельный файндер. Я в общем даже с этой идеей могу согласится (хотя вопрос "зачем" остается). Мне просто реализация этого в Yii2 не понравилась.
 

Вурдалак

Продвинутый новичок
От реализации зависит. В случае "friend classes", когда оба паблики морозовы друг другу - я сомневаюсь, что лучше.
Ну в том примере, на который я дал ссылку, Book::mapper() это по сути BookMapper::getInstance(), метод из модели можно выкинуть и получается, что модель про DM вообще ничего не знает.
 

fixxxer

К.О.
Партнер клуба
Ну в том примере, на который я дал ссылку, Book::mapper() это по сути BookMapper::getInstance(), метод из модели можно выкинуть и получается, что модель про DM вообще ничего не знает.
Тут важно, каким образом взаимодействуют модель и маппер.
 

MiksIr

miksir@home:~$
The Active Record class typically has methods that do the following:
• Construct an instance of the Active Record from a SQL result set row
• Construct a new instance for later insertion into the table
Static finder methods to wrap commonly used SQL queries and return Active Record objectS
• Update the database and insert into it the data in the Active Record
• Get and set the fields
• Implement some pieces of business logic
И потом, Фаудер проводит аналогию между RDG и AR - дает по сути главное отличие - бизнес-логика в модели. А в RDG в файндере даже в примерах есть метод возвращающий коллекцию.
И, кстати, перед процитированным есть тоже интересный абзац про связи.
 

fixxxer

К.О.
Партнер клуба
MiksIr, ну вон я написал код который делает ровно все перечисленное (только бизнес-логики нет, но подразумевается, что она тоже там).

RDG - это тоже прямой маппинг объекта на строку в базе. Отличие действительно одно.

Из перечисленных у Фаулера паттернов только DM дает полноценную отвязку полей моделей от структуры таблиц и возможность работы одновременно с несколькими связанными моделями.

У меня старое издание, там этого абзаца нет, пойду загуглю

UPD:
А, не, все есть, это искалка тупит. FK mapping-то. Ну все равно никуда не уходим от model==table, плюс "лобовая" реализация с созданием моделей по FK, во-первых, негодна, поскольку не в транзакции, во-вторых, не решает проблемы связей сложнее, чем 1:1. Собственно, сам Фаулер о FK mapping рассказывает на примере DM.
 
Последнее редактирование:
Сверху