Я знаю, что в ООП вы хотите, чтобы каждый объект (из класса) был «вещью», например. пользователь, валидатор и т. д.Как правильно моделировать модели: объектно-ориентированный или «пакетный» -ориентированный?
Я знаю основы о MVC, как они взаимодействуют друг с другом.
Однако мне интересно, должны ли модели в MVC быть спроектированы в соответствии с традиционным дизайном ООП, т. Е. Каждая модель должна быть базой/таблицей/строкой (решение 2)?
Или это больше похоже на сбор методов, которые влияют на ту же таблицу или на кучу связанных таблиц (решение 1).
пример для модуля адресной книги в CodeIgniter, где я хочу иметь возможность «CRUD» связаться и добавить/удалить его в/из контактной группы, имеющей CRUD.
Модели раствор 1: гармошки все связанные с ним методы вместе (не реальный объект, а скорее "пакет")
class Contacts extends Model {
function create_contact() {)
function read_contact() {}
function update_contact() {}
function delete_contact() {}
function add_contact_to_group() {}
function delete_contact_from_group() {}
function create_group() {}
function read_group() {}
function update_group() {}
function delete_group() {}
}
Модели решения 2: ООП путь (один класс для каждого файла)
class Contact extends Model {
private $name = '';
private $id = '';
function create_contact() {)
function read_contact() {}
function update_contact() {}
function delete_contact() {}
}
class ContactGroup extends Model {
private $name = '';
private $id = '';
function add_contact_to_group() {}
function delete_contact_from_group() {}
function create_group() {}
function read_group() {}
function update_group() {}
function delete_group() {}
}
Я не знаю, как думать, когда я хочу создать модели. и приведенные выше примеры - мои реальные задачи по созданию адресной книги. Должен ли я просто объединить все функции в одном классе. то класс содержит другую логику (контакт и группу), поэтому он не может содержать свойства, которые являются специфическими для любого из них.
решение 2 работает в соответствии с ООП. но я не знаю, почему я должен сделать такое разделение. какие преимущества будут иметь, например, контактный объект. Это, безусловно, не объект User, так почему бы Contact «жить» со своим собственным состоянием (свойствами и методами). Потому что я склонен думать так: если что-то нуждается в состоянии, тогда я создаю класс ООП, чтобы методы могли влиять на состояние или другие вещи, основанные на состоянии.
так что модели должны быть "stateful" тоже? если они не требуют состояния, почему я должен создать его в соответствии с шаблоном ООП. то я мог бы просто собрать все вместе, как «пакетное» решение.
вы опытные ребята с ООП/MVC, пожалуйста, пролить свет на то, как следует думать здесь, в этой самой конкретной задачи (и вообще при создании модели)
EDIT: задумайтесь о контроллерах в MVC. они создаются в соответствии с решением «пакет». Это заставляет меня задаться вопросом ...
Я думаю, что получаю вашу мысль. но является ли код sql для извлечения/вставки строк из/в базу данных в mapper_model или data_models?почему я должен получать данные из mysql и помещать их в data_model (каждый объект, представляющий контакт) через карту? в чем смысл? или я неправильно понял поток? CONTROLLER вызывает MAPPER_MODEL, который извлекает данные из MYSQL и помещает их в DATA_MODEL? Я думаю, что ошибаюсь. не могли бы вы объяснить поток для меня. –
У вас все в порядке. Контроллер вызывает отображение (обычно косвенно через службу или ссылаясь на другую модель в зависимости от того, как далеко вы хотите что-то делать) и запрашивает модель. Mapper создает модель, заполняет ее и возвращает ее. Целью является абстракция; он защищает модель от изменений в хранилище данных. Код MySQL принадлежит картографу, модель не должна знать об этом. Если вы решили сохранить ваши данные в другом формате позже, скажем, XML, тогда вы напишите картограф, который анализирует XML-файлы и возвращает модель. Таким образом, вся логика персистентности инкапсулируется. – Duncan
это имеет для меня такой смысл! поэтому в основном я должен назвать своих картографов на любом уровне данных, который они используют, например. «xml_mapper_model», «mysql_mapper_model». таким образом, я мог бы использовать любое хранилище данных, которое я предпочитаю. и модели данных являются «contact_model» и «contact_group_model». это как матрица. Всякая программа - это «человеческая душа», ответственная только за одну задачу. мы получили «привратника», «ключевого производителя», «охранников» и т. д. поэтому целое приложение - это всего лишь куча этих объектов, связанных с/делегированием задач друг другу. также как военное правительство =) –