• Есть ли учебный материал по паттернам на основе пошагового создания веб-приложения?

    copal: нет, это вы видимо не понимаете что модель самодостаточна и ей не нужны никакие VС для существования. Ну либо мы имеем в виду примерно одно и тоже но договориться в чем-то не можем.

    Компонент - это VC, а не MVC, модель живет своей жизнью и ей плевать на UI и презентационную логику.

    Ваш пример с поиском взять. Есть "что-то" что выполняет саму работу - поиск, назовем это сервисом (потому что довольно общее название). И есть компонент, который отвечает за UI поиска, что бы пользователь имел возможность вбить айдишку, нажать кнопку и получить результат. И в этом случае наш компонент будет представлять собой вьюшку и контроллер (или вьюшку и вью модель, вьюшку и презентер, тут как угодно - от этого зависит только реализация самого UI компонента). Но по итогу работать этот компонент будет именно с этим сервисом, и именно этот сервис будет для этого компонента моделью.
  • Есть ли учебный материал по паттернам на основе пошагового создания веб-приложения?

    copal:

    Если рассматривать на примере тостера, то есть BaseView, в которую вложено ещё три LeftSideView, CenterView и LeftView. А вот уже они собирают в себе компоненты, которые к mvc вообще никакого отношения не имеют, они просто компоненты.


    Это как-то не очень гибко. Давайте рассмотрим только сайд меню. Оно у нас примерно одинаковое для всех страниц, то есть мы можем вынести это как отдельный UI-элемент и будем реюзать его на каждой странице. Условно мы можем выделить в рамках этого компонента следующие под компоненты:

    <toster-sidebar>
       <profile></profile> 
       <navigation></navigation>
       <notifications></notifications>
    </toster-sidebar>


    У каждого из них есть вьюшка. Мы можем рассматривать компонент нотификаций как отдельный элемент, он никак не привязан к месту его использования. Он полностью самодостаточен. Точно так же как и другие, но он чуть интереснее чем статическая навигация.

    По сути мы можем представить (только представить) что это отдельное полноценное приложение. Например есть отдельная страница где кроме этого компонента вообще ничего нет. Есть список нотификаций (3 штуки) и счетчик непрочитанных нотификаций.

    Если этот отдельный компонент мы можем представить как отдельное приложение - то стало быть у этого приложения своя вьюшка, своя модель (не ругайтесь пока, просто представим что все приложение - это некая система нотификаций, откуда они берутся - не важно). Контроллер тут по сути не нужен.... но если мы представим это приложение например как мобильное приложение (да да, аж целое приложение для отображения нотификаций) то контроллер уже понадобится для того что бы открывать другие скрины по клику на нотификации и счетчик непрочитанных сообщений.

    Итого, мы имеем полноценное MVC приложение. С точки зрения этого приложения - больше ничего нет. Представлению фиалетово откуда модель берет список нотификаций. Например модель берет данные о нотификациях из базы данных, и другое приложение в эту базу данных пишет (что не ок, но мы же пока проводим мысленный эксперемент).

    Однако если мы посмотрим именно на тостер - помимо этого относительно маленького элемента UI у нас есть еще куча других. Скажем комментарии к вопросам или ответам - это так же самодостаточное MVC приложение. Вот мы и можем уже представить одно большое MVC приложение как иерархию более мелких независимых приложений. Это позволяет нам реюзать элементы как нам того хочется. Если мы абстрагируем "модель" компонента от домена, мы можем реюзать этот компонент в других приложениях.

    По сути у нас есть "модель" и "контроллер + вьюшка", которые и представляют собой UI-компоненты.

    Одним из недостатков MVC является как раз таки отсутствие в описании механизмов общения между компонентами. То есть для того что бы как-то влиять друг на друга, компонентам нужен кто-то сверху. Потому придумали HMVC, который решал эту проблему по своему.

    Некоторым показалось что view становится слишком сложным (это было во времена когда view небыл просто куском декларативной XML-подобной разметки и там было реально дофига кода) и решили разделить на пассивные вьюшки и активные презентеры. Это позволило отделить UI от модели, то есть теперь только презентер умел работать с моделью, что резко снижало связанность UI компонента от приложения и мы могли более качественно их реюзать.

    Кто-то заменил презентер на view model, по сути тоже самое, но вводилось еще понятие биндингов, которое здорово упрощало взаимодействие всех компонентов между собой.

    Но суть в этом всем одна и та же - модели плевать кто и как ее использует, она главная. А все остальные буквы формируют отдельные UI-компоненты.
  • Есть ли учебный материал по паттернам на основе пошагового создания веб-приложения?

    copal: вы не путаете ассеты в контексте вью (какие-то картинки которые являются частью view) и картинки, которые могут являться частью домена (например инстаграм, или система поиска продуктов в каталоге по изображению или что-либо еще)? Ну или может я путаю. Если ассеты как часть view - то согласен. Но я говорю несколько о другом. Мы можем заменить "картинки" на видео например (вот делаем мы новый твитч или ютуб), это пользовательский контент, с ним могут быть отдельные бизнес правила (например мы можем ограничить доступ к определенному контенту, это уже бизнес правило).

    Модель может содержать названия тех операций, которые необходимы провести с картинкой, если это необходимо по логике.


    Ок, а реализация этих операций не в модели? Вот вам пример. Продукты для каталога товаров - это явно часть модели, сущности которые являются неотъемлимой частью домена, так? Для пользователя немаловажную ценность могут представлять картинки, описывающие внешний вид товара, стало быть это такая же часть домена как и описание товара, как стоимость оного, отзывы, заказы и скидки. Все это - часть модели предметной области.

    Но в системе эти картинки обычно представлены в виде объекта. То есть это не совсем картинка, это скорее "ссылка" на нее, а View-ка уже умеет этот объект трансформировать в обычную картинку, которую покажет пользователю.
  • Есть ли учебный материал по паттернам на основе пошагового создания веб-приложения?

    copal: "картинки" или ассеты - это какие-то данные. Вместо картинок может быть история транзакций счета в банке. Отображение картинки - это уже презентационная логика.

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

    Допустим у нашего сервиса есть 3 интерфейса взаимодействия:

    - HTTP (обычный web интерфейс)
    - HTTP API (для мобильных приложений например)
    - MQ (поскольку это прилоение может быть лишь одним микросервисом в более крупной системе).

    Если эта логика есть часть View - то у нас возникает дублирование.
  • Есть ли учебный материал по паттернам на основе пошагового создания веб-приложения?

    copal:

    состояние это информационная модель, которая отношения к бизнес модели не имеет.


    Немного как по мне переусложнено, но в принципе согласен.

    Это была первая часть. С чем Вы не согласны?


    Полностью согласен с "модель ничерта не должна знать о презентационной логике".

    Единственое что я хотел бы уточнить - "состояние" имеет какое-то представление в системе (скажем датами мы оперируем как объектами типа Date, для денег можем сделать объект типа Money и т.д.). Но это представление состояния данных именно в контексте бизнес модели и фактически это является деталью ее реализации. К View в MVC это не имеет никакого отношения (просто уточняю). Это просто удобный способ для манипуляции с данными. Так в рамках нашей бизнес модели мы можем выделить отдельные объекты и строить декомпозицию этой модели. Так?
  • Есть ли учебный материал по паттернам на основе пошагового создания веб-приложения?

    copal: нет никакого представления. Вообще никакого. Есть тупо какое-то состояние каких-то объектов, никакой презентационной логики в моделях.

    И как так "у приложения нет бизнес логики"? Любое манипуляция состоянием (будь то складской учет или картинки с голомы женщинами) происходит в рамках каких-то конкретных задач, в рамках какой-то логики. Просто бывает что слой логики очень тонкий по сравнению с презентационной логикой.

    Вы просто представьте себе ситуацию, при которой у нас НЕТ view, вообще. Тогда не нужны и контроллеры (потому как это медиатор между контролами (редакторами в оригинальной доке) и моделью). И MVVM не нужен, поскольку view model так же нечег освязывать. И презентер не нужен, поскольку... нет логики презентационной.

    Ну и следующее ваше высказывание про "душу программы", то есть душа это UI?
  • Есть ли учебный материал по паттернам на основе пошагового создания веб-приложения?

    copal: я ничерта не понял из примера с конюхом, рожью и причем тут MVC. Извините что такой тугой. Давайте лучше сменим формат дискуссии и разберемся хотя бы с моделями.

    Пожалуй проще всего разобраться будет придумав пример, в котором нет UI. Тесты идеальны для этого. Мы тестируем отдельные объекты (не будем вводить слово "модель" пока-что) и их поведение. В качестве "интерфейса" взаимодейтсвия мы просто дергаем методы напрямую, то есть никаких дополнительных прослоек нам не нужно. На уровне юнит тестов мы тестируем поведение зашитое в отдельные сущности, отдельные объекты предметной области (паттерн domain object), отдельные сервисы. На уровне интеграционных тестов мы тестируем куски системы в сборе, но мы все так же не нуждаемся в какой-либо прослойке между самими тестами и тестируемыми объектами, и "представлением" данных в этом случае будет прямое отображение состояния этих объектов.

    Причем мы можем так описать абслютно любую систему, абсолютно любое приложение. Нам безразличен контекст применения этого приложения на данном уровне, у нас пока нет UI. Мы можем полностью сформировать логику приложения, по сути работающее приложение, используя только тесты.

    И если допустить, что мы реализовали 100% функционала таким образом, то по сути у нас готово все приложение, просто нет UI и пользователь с приложением взаимодействовать не сможет. Но фичи работают, тесты это подтверждают, и по сути это и есть то что называется "приложением", это то что важно, вся бизнес логика, все выполняемые пользовательские сценарии реализованы.

    До этого этапа согласны?

    Заметте, слово "модель" мы пока не вводили. Да, у нас там может быть "модель предметной области", но это никакого отношения к MVC не имеет поспольку у нас пока нет необходимости в V (представлении).

    И вот только тогда, когда на сцену выходит необходимость организации взаимодействия с приложением, мы можем уже говорить о separated presentation и всех ее реализациях (MVC, MVVM, MVP, MVA, тыщи их). Это ведь логично - пока у нас не presentation нам нечего делать separated.
  • Есть ли учебный материал по паттернам на основе пошагового создания веб-приложения?

    copal: я понял что вы воспринимаете отдельные сущности как "представление". Я могу согласиться с вами что "модель" у предметной области одна, но тогда и вы согласитесь что эта "одна" модель как правило состоит из сервисов и сущностей, отдельных объектов, которые как-то между собой связаны. Даже если они связаны через pub/sub (вы же любите ивенты) речи о представлении быть не может.

    И вы не хотите мне отвечать на вопрос почему у вас внезапно "сущность" карабля это представление. Так кто из нас еще упертый? Объясните мне доходчиво, почему это "представление" и причем тут MVVM.
  • Есть ли учебный материал по паттернам на основе пошагового создания веб-приложения?

    copal: у меня ровно такие же опасения на ваш счет. Вы лучше парируйте мои доводы. Ибо у меня складывается впечатление что вы плохо дружите с декомпозицией.
  • Есть ли учебный материал по паттернам на основе пошагового создания веб-приложения?

    copal:

    Еще раз, Вы не понимаете что такое модель, так как сказали что модели две. Модель всего одна, второй модели с точки зрения приложения не существует, она всего-лишь представление, которое зависит от модели.


    Совершенно не верные выводы. Модель одна - это модель игры в нашем случае, так? Из чего она состоит? Из отдельных компонентов игровой логики (сущности, сервисы). Каждая сущность представляет собой отдельный продукт декомпозиции, наделенный своими знаниями о домене и представляющие собой отдельные модели отдельных компонентов системы.

    То есть если мы рассматриваем всю систему сверху - у нас модель одна. Если мы рассматриваем систему в масштабах одного карабля - у нас тоже одна модель - но это уже модель карабля.

    Благодаря этому мы можем строить декомпозицию системы настолько глубоко, насколько это вообще возможно. И на каждом уровне у нас будет одна модель. Но что это за модель - зависит от масштаба точки зрения.

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


    Вы тут подменяете понятие "представления". "модель коробля" это отдельная самодостаточная сущность, которая управляет состоянием караблях в рамках всей нашей системы. Эта модель ничего не знает о других караблях и может отвечать только за себя.

    А представления - его пока нет. Мы пока можем воспринимать "состояние" системы (всей совокупности объектов, которые представляет систеам) как представление. Но это не то что может нормально воспринимать живой пользователь. Для него будет отдельная прослойка, которая это "состояние" будет переводить в граффический вид.

    И поскольку декомпозицию граффического интерфейса никто не отменял (уменьшение сложности, реюз элементов) для каждой "вьюшки" у нас будет своя "модель", которая в каждом конкретном случае будет представлять одну из вершин графа "модель всей системы".
  • Есть ли учебный материал по паттернам на основе пошагового создания веб-приложения?

    copal: не совсем так. Представление запросит картинки, а какие картинки - решает модель. То что вы описали (подсовывание контента исходя из каких-то бизнес правил) это именно бизнес логика, а не логика представления.

    Так что это либо вы в своем примере засунули бизнес логику в представление, либо мы друг друга не поняли.

    Представление не может запрашивать данные с сервера, оно может только попросить модель что-то предоставить, а уже как это делает модель - не имеет значения в контексте вопроса.

    Маленький пример - у меня есть тест. Его модель содержит коллекцию, которая содержит узлы с полем index. Сам тест заключается в анализе последовательности индексов.

    Это модель из mvc.


    У тестов не может быть модели. Модель может тестироваться тестами, но это не "его" модель. Тесты имитируют пользовательский код, то есть код, который будет использовать поведение тестируемых объектов.

    Так же нет никакой "модели из MVC", есть просто модель. Модель предметной области. Оно никак не связано с темой MVC/MVVM/MVP/etc, это просто модель. В этом собственно вся суть - модель ничего не знает ни о MVC ни о чем бы то нибыло.

    Вы по сути мне именно это и говорили чуть ранее в комментариях а теперь уже как-то наоборот. Либо я вас не верно понял.
  • Есть ли учебный материал по паттернам на основе пошагового создания веб-приложения?

    copal:

    Но может быть такая ситуация, когда второстепенной модели может потребоваться обратится к модели приложения. Вот тогда бы я мог сказать что такой подход можно назвать mvvm, но только как подход, когда модель обращается к другой модели


    вот тут. Откуда тут вылезно MVVM если у нас нет представления, есть только две "модели"?
  • Есть ли учебный материал по паттернам на основе пошагового создания веб-приложения?

    copal: вы не ответили на вопрос. Откуда у вас при обсуждании слоя предметной области вылезно MVVM?
  • Есть ли учебный материал по паттернам на основе пошагового создания веб-приложения?

    copal: так, давайте еще раз. Почему я представление считаю моделью?

    Для справки, я не люблю анемичные модели, люблю DDD, люблю сначала проектировать бизнес логику а потом уже UI (то есть если мы говорим про ангуляр, я сначала прописываю всю логику без UI, без компонентов/директив и.... в принципе без ангуляра, моя бизнес логика на него никак не завязана)

    Возможно в своей статье я действительно пошел немного не той дорогой назвав модель "просто объектом хранящим состояние" не уделив этому должного внимания. Пожалуй этому стоит уделить чуть больше внимания, и объяснить что сама по себе модель полностью отделена от всего остального и обо всем остальном знать не знает.
  • Есть ли учебный материал по паттернам на основе пошагового создания веб-приложения?

    copal:

    > Вот тогда бы я мог сказать что такой подход можно назвать mvvm, но только как подход, когда модель обращается к другой модели, что в рамках mvc является вполне обычным делом.

    вот вы хороший пример писали про морской боль. И мы же вроде как обсуждали только модель, само приложение, никакого графического интерфейса - только логика игры, модель системы. И вот у нас уже откуда-то вылезло mvvm и т.д.

    Можете пояснить откуда оно у вас тут вылезло если мы пока не затрагивали вопрос UI? Просто это то что я пытаюсь сказать - пока у нас нет UI, пока нет presentation layer, нам не нужны ни MVC ни MVVM ни FLUX ни что бы то нибыло.
  • Есть ли учебный материал по паттернам на основе пошагового создания веб-приложения?

    copal:

    > Вы присоединились к армии mvc-php'шников, которые говоря о 79 годе пишут полную ересь.

    На бэкэнде нет MVC. Там есть Mediating Controller MVC или MVA. Про это в статье будет. Так же часто MVC путают с Model2 (потому что выходят те же компоненты но абсолютно другой способ их взаимодействия).

    > Типа, вот в 79 году была вышла в глаза статья о mvc, которая говорит что бурундук это овца, подключаю установку, три.

    что что простите?

    > То что Вы показали не является ни разу моделью, это типичная анемичная модель которой место в ...

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

    Так что еще раз повторюсь, в чем проблема?
  • Есть ли учебный материал по паттернам на основе пошагового создания веб-приложения?

    copal: я потом перечитаю ваши комментарии ибо как-то слегка запутался в вашей точке зрения. Вы же сами приводили мне первоисточники по MVC (за что вам спасибо, или это были не вы?). Словом, я еще переворю чуть ваши "мысли" ибо сейчас сходу я даже не могу сказать что точно понимаю чем именно вы не довольны.
  • Есть ли учебный материал по паттернам на основе пошагового создания веб-приложения?

    copal:

    1) у фаулера чуть по другому. Просто это достойный автор который неплохо все это дело уже описал до нас с вами. И он так же грустит что под MVC часто подразумевают не то чем это все является на самом деле.

    2) Про FLUX я хотел отдельно написать, так как идеи там примерно те же - separated presentation, это один из способов организации (как и MVC), который чуть отличается и решает некоторые проблемы. Вы же не станите спорить что MVC и MVP отличаются?

    Ну и да - все это UI компоненты. И именно на этой идее я и хочу сконцентрироваться. Что MVC - это именно UI, и "модель" - это просто хранилище состояния. Детали реализации модели не интересны, и за ней скрывается (ну или может скрываться) огромный пласт объектов, отдельные слои, базы данных и прочее. Но это не часть модели.

    3) конструктивной критики судя по всему я от вас не дождусь, а жаль. Ну и да - я сейчас статью пишу руководствуясь своим опытом работы с десктоп прилоениями (лет так 5 назад). То есть мы пока не добрались до MVVM ангуляров и т.д. Но доберемся поскольку MVC немножко устарел и текущие подходы сильно отличаются от того что было в 79-ом.
  • Есть ли учебный материал по паттернам на основе пошагового создания веб-приложения?

    copal: что до игр - там все чуть-чуть сложнее поскольку задачи отделения презентационной логики и ее повторного использования особо не стоит.