Является ли модель Model-Glue в Coldfusion такой же, как модель в других средах MVC? - PullRequest
1 голос
/ 02 сентября 2011

Если вы следуете руководству по быстрому старту, предоставленному официальными документами Model-Glue, см. Здесь:

http://docs.model -glue.com / вики / QuickStart / 2% 3AModellingourApplication # Quickstart2: ModelingourApplication

Может показаться, что "модель" - это класс, который выполняет операцию приложения. В этом примере они создали класс Translator, который будет переводить фразу в Pig Latin. Отсюда легко сделать вывод, что логикой программы также должны быть «модели», такие как классы работы с базой данных и помощники HTML.

Однако недавно я получил ответ на вопрос, который я задал здесь о MVC:

Как с помощью MVC спроектировать представление так, чтобы оно не требовало знания переменных, устанавливаемых контроллером?

В одном из ответов было упомянуто, что «модель» в MVC должна быть объектом, который контроллер заполняет данными, которые затем передаются в представление, и представление использует его как объект со строгой типизацией для визуализировать данные. Это означает, что для приведенного выше примера Model-Glue должны были существовать контроллер транслятора , представление транслятора , класс PigLatinTranslator и модель Translation это выглядит так:

component Translation
{
    var TranslatedPhrase = "";
}

Этот контроллер будет использовать его так:

component TranslatorController
{
    public function Translate(string phrase)
    {
        var translator = new PigLatinTranslator();
        var translation = new Translation();
        translation.TranslatedPhrase = translator.Translate(phrase);

        event.setValue("translation", translation);
    }
}

И представление отобразит это так:

<p>Your translated phrase was: #event.getValue("translation").TranslatedPhrase#</p>

В этом случае PigLatinTranslator - это просто класс, который где-то находится и не может рассматриваться как модель, контроллер или представление.

У меня вопрос, отличается ли модель ColdFusion Model-Glue от модели MVC? Или руководство по быстрому старту, которое они предоставили плохой пример MVC, и код, который я перечислил выше, правильный способ сделать это? Или я совершенно не в курсе всего этого?

Ответы [ 2 ]

5 голосов
/ 02 сентября 2011

Я думаю, что, возможно, вы увязли в особенностях реализации.

Мое понимание (общего) MVC следующее:

  • нужно проделать определенную работу
  • контроллер определяет, как выполняется эта работа и как она представляется
  • контроллер [делает что-то], что в конечном итоге вызывает обработку модели для выполнения
  • процессы модели обрабатывают всю обработку данных: получение данных из [где-то], применение бизнес-логики, а затем размещение результатов [где-то]
  • Затем контроллер [делает что-то], что в конечном итоге вызывает обработку представления, и использует систему обработки представления данных из модели
  • процессы представления получают ожидаемые данные и представляют эти данные каким-либо образом.

Это нарочно очень абстрактно.

Я думаю, что пример в документации MG реализует это соответствующим образом, хотя пример довольно надуманный. Контроллер вызывает модель, которая обрабатывает данные (входные данные преобразуются в выходные данные), а затем устанавливает результат. Затем контроллер вызывает представление, которое берет данные и отображает их.

Я не согласен с предпосылкой этого вопроса "Используя MVC, как мне спроектировать представление так, чтобы оно не требовало знания переменных, устанавливаемых контроллером?" Представление не должно заботиться о том, откуда берутся данные, оно должно просто знать, какие данные ему нужны, и извлекать их откуда-то. Где-то в системе должно быть соглашение о том, что модель помещает данные для использования куда-то, и представление получает необходимые данные откуда-то (в противном случае, как это могло бы работать?); разъединение состоит в том, что модель просто помещает данные туда, где им было сказано, а представление просто выводит данные из того места, где им было сказано. Контроллер (или соглашение используемой системы MVC) определяет, как это реализовано. Я не думаю, что MG нарушает какие-либо принципы MVC так, как он это обрабатывает.

Что касается этого утверждения: «В этом случае PigLatinTranslator - это просто класс, который находится где-то и не может рассматриваться как модель, контроллер или представление». Ну ... да ... вся модель - это какой-то код. Таким образом, PigLatinTranslator.cfc моделирует бизнес-логику здесь.

И этот: «В одном из ответов было упомянуто, что« модель »в MVC должна быть объектом, который контроллер заполняет данными, которые затем передаются в представление» ... Я не думаю, что это правильно. Контроллер просто определяет, какие модели и какие представления необходимо вызвать, чтобы выполнить требование, и возможные обмены данными между ними (хотя это также может быть сделано по соглашению). Контроллер не выполняет обработку данных; он решает, какую обработку данных необходимо выполнить.

Наконец, я не думаю, что «строго типизированный» комментарий является уместным или подходящим соображением в среде CF, потому что CF не является строго типизированным. Это соображение, специфичное для платформы, и не имеющее ничего общего с принципами MVC.

1 голос
/ 03 сентября 2011

Я думаю, что одним из распространенных заблуждений вокруг MVC является то, что существует несколько видов, несколько контроллеров, но только одна модель.У cfWheels есть объект «модель» для каждого объекта постоянного домена, что, на мой взгляд, очень запутанно, но, конечно, cfWheels взят из Ruby on Rails, который также использует «модель» в этом контексте.

В общем, в MVC«Модель» представляет ваши бизнес-данные и логику в целом.Модель состоит из нескольких объектов домена (которые обычно являются постоянными) и нескольких объектов службы (которые существуют для организации операций между несколькими объектами домена).В реальных приложениях у вас обычно есть слой данных, который управляет постоянством объектов домена - который может быть разделен несколькими способами.

Это может также помочь думать о входных данных, которые нужны представлению, так как оно«API», и задача контроллера - удовлетворить этот API путем предоставления совместимых данных.Подумайте больше о том, что контроллер должен знать, какой тип данных будет удовлетворять представлению, а не наоборот.

...