Я разработал на Yii Framework некоторое время (4 месяца), и до сих пор я сталкивался с некоторыми проблемами с MVC, которые я хочу поделиться с опытными разработчиками там. Я расскажу об этих проблемах, указав уровни сложности.
[Уровень 1] Форма CR (создать обновление). Во-первых, у нас много форм. Каждая форма сама по себе является моделью, поэтому каждый из них имеет некоторые правила валидации, некоторые атрибуты и некоторые операции для выполнения атрибутов. Во многих случаях каждая из этих форм выполняет как обновление, так и создание записей в db с использованием одного объекта активной записи.
- > Итак, на этом уровне сложности форма должна
-
при открытии
-
сможет отображать db-дружественные данные из db в удобном для человека способом
-
может отображать все поля формы с атрибутами активного объекта записи. Добавление, удаление, изменение столбцов из таблицы db влияет на отображение формы.
-
-
при сохранении, возможность форматировать дружественные для человека данные для дружественных данных, прежде чем получать данные
-
при проверке, с возможностью выполнения основных проверок, выполняемых активным объектом записи, он также должен выполнять другие проверки для выполнения некоторых бизнес-правил.
-
когда проверка не выполняется, можно отменить изменения, внесенные в атрибут, а также изменения, внесенные в db, и представить пользователю свои первоначально введенные данные.
[Уровень 2] Расширенная форма CR. Форма, которая может выполнять создание/обновление записей из разных таблиц сразу. Не только то, будет ли форма создавать/обновлять одну из своих записей, иногда может зависеть от других условий (более бизнес-правил), поэтому форма может иногда обновлять записи в таблице A, B, но не D, а иногда обновлять записи в A, D, но не B - > Итак, на этом уровне сложности мы видим, что форма должна:
-
сможет удовлетворить [Уровень 1]
-
иметь возможность условно создавать/обновлять определенные записи, условно создавать/обновлять определенные столбцы определенных записей.
[Уровень 3] Дерево моделей. Роль формы в приложении - это, во многом, порт, который позволяет пользователю взаимодействовать с вашим приложением. Чтобы удовлетворить запросы, этот порт будет взаимодействовать со многими другими объектами, которые, в свою очередь, взаимодействуют со многими другими объектами. Некоторые из этих объектов можно рассматривать как модели. Активная запись - это модель, но Mailer также может быть моделью, поэтому RobotArm. Эти модели используют друг друга для удовлетворения запроса пользователя. Каждая модель может выполнять свою собственную операцию, и все дерево должно иметь возможность откатывать любые изменения, сделанные в случае ошибки/сбоя.
Кто-нибудь там сталкивался или смог решить эти проблемы?
Я придумал много вещей, таких как инкапсуляция атрибутов модели в объектах ModelAttribute, чтобы решить их существование на всех уровнях клиента, сервера и db.
Я также подумал, что мы должны дать дереву моделей Observer наблюдать и сообщать наблюдаемым моделям об изменениях отката при возникновении ошибок. Но что, если могут существовать несколько наблюдателей, что если node использует своего родительского наблюдателя, но дает своим детям еще один наблюдатель.
Инженеры, разработчики, Rails, Yii, Zend, ASP, JavaEE, любые ребята из MVC, пожалуйста, присоединяйтесь к этой дискуссии ради науки.
- Обновить до ответа teresko: ---
@teresko Я на самом деле намеревался включить сервисы в выполнение внутри единицы работы и заставить Рабочую группу не беспокоиться о новых/обновленных/удаленных. Каждый объект внутри единицы работы будет отвечать за свое состояние и должен будет выполнять свои собственные commit() и rollback(). После возникновения ошибки блок работы откатит все изменения от самого нового зарегистрированного объекта до самого старого зарегистрированного объекта, поскольку мы имеем дело не только с базой данных, у нас могут быть почтовые программы, издатели и т.д. Если иначе, дерево успешно выполняется, мы вызываем commit() от самого старого зарегистрированного объекта к самому новому зарегистрированному объекту. Таким образом, почтовая программа может сохранить почту и отправить ее на фиксацию.
Использование Data Mapper - отличная идея, но нам все равно нужно убедиться, что столбцы в db соответствуют данным mapper и объекту домена. Более того, расширенная форма CR или модель, которая имеет свои атрибуты в зависимости от других моделей, должна соответствовать их атрибутам с точки зрения проверки и типа данных. Может быть, атрибут может быть объектом и отправлен из модели в модель? Атрибут также может определить, если он был изменен, какая проверка должна быть выполнена на нем, и как он может быть удобным для пользователя, удобным для приложений и дружественным к db. Любое обновление схемы db повлияет на этот атрибут и, тем самым, бросая исключения, требующие от разработчиков внести изменения в систему, чтобы удовлетворить это изменение.