{"id":12704,"date":"2020-09-16T11:49:02","date_gmt":"2020-09-16T08:49:02","guid":{"rendered":"https:\/\/itsm.com\/?p=12704"},"modified":"2024-09-23T11:55:44","modified_gmt":"2024-09-23T08:55:44","slug":"mv-patterny-v-razrabotke-veb-prilozheniya-2","status":"publish","type":"post","link":"https:\/\/itsm.com\/pb\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/","title":{"rendered":"Padr\u00f5es MV* no desenvolvimento de aplicativos da Web"},"content":{"rendered":"<p>O c\u00f3digo de aplicativo complexo escrito sem os padr\u00f5es MV* \u00e9 dif\u00edcil de testar, reutilizar e manter. Os padr\u00f5es eliminam ou enfraquecem a conex\u00e3o entre a visualiza\u00e7\u00e3o, o modelo e o controlador, separam o c\u00f3digo e simplificam o desenvolvimento. Abordaremos os tipos de padr\u00f5es MV* e seu uso no SimpleOne.<\/p>\n<p>Ao desenvolver um aplicativo SimpleOne, projetamos cuidadosamente a interface do usu\u00e1rio (UI) e a experi\u00eancia do usu\u00e1rio (UX) para facilitar e tornar conveniente o uso da plataforma pelos nossos clientes. Mas a UI \u00e9 apenas a ponta do iceberg vista pelo usu\u00e1rio (User). Por tr\u00e1s dos bot\u00f5es e campos est\u00e1 o c\u00f3digo que deve ser dimension\u00e1vel, sustent\u00e1vel e confi\u00e1vel. Para resolver esses problemas, os desenvolvedores aplicam os padr\u00f5es MV*, que s\u00e3o usados para separar o c\u00f3digo da interface do usu\u00e1rio, a l\u00f3gica e o processamento de dados.<\/p>\n<h2>UI sem padr\u00f5es<\/h2>\n<p>Vamos imaginar um aplicativo que tenha um formul\u00e1rio com v\u00e1rios elementos e widgets. O c\u00f3digo desse formul\u00e1rio cont\u00e9m tanto a descri\u00e7\u00e3o da l\u00f3gica quanto o c\u00f3digo dos elementos da interface do usu\u00e1rio, e tamb\u00e9m pode conter fragmentos para processamento de dados. Para um aplicativo simples, o suporte a esse princ\u00edpio de programa\u00e7\u00e3o n\u00e3o \u00e9 um problema. A qualquer momento, voc\u00ea pode encontrar inter-rela\u00e7\u00f5es e fazer altera\u00e7\u00f5es sem quebrar a integridade. Quando o aplicativo se torna mais complexo, o suporte a uma interface escrita sem padr\u00f5es se torna um problema.<\/p>\n<p>O problema vem da viola\u00e7\u00e3o do princ\u00edpio da responsabilidade \u00fanica (<a href=\"http:\/\/en.wikipedia.org\/wiki\/Single_responsibility_principle\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">single responsibility principle<\/a>) &#8211; &#8220;Uma classe deve ter apenas um motivo para ser alterada&#8221;. Temos o c\u00f3digo da interface do usu\u00e1rio (View), a l\u00f3gica (Controller) e o processamento de dados (Model) reunidos em uma interface, portanto, h\u00e1 v\u00e1rios motivos para alterar. Quando alteramos o c\u00f3digo de um componente, temos que alterar outros componentes tamb\u00e9m. Isso complica o suporte ao aplicativo, \u00e9 quase imposs\u00edvel realizar testes automatizados e a reutiliza\u00e7\u00e3o do c\u00f3digo \u00e9 muito limitada.<\/p>\n<p>\u00c9 por isso que \u00e9 conveniente e correto usar padr\u00f5es &#8211; eles separam o c\u00f3digo da interface do usu\u00e1rio (visualiza\u00e7\u00e3o), o c\u00f3digo da l\u00f3gica (apresentador, controlador, ViewModel e outros) e o c\u00f3digo de processamento de dados (modelo). Podemos alterar facilmente a l\u00f3gica sem alterar a interface do usu\u00e1rio ou fazer altera\u00e7\u00f5es apenas nas rotinas de processamento de dados. Cada padr\u00e3o pode ser testado independentemente dos outros e usado posteriormente em outros aplicativos.<\/p>\n<p>Os padr\u00f5es mais comumente usados s\u00e3o <a href=\"https:\/\/itsm.com\/pb\/glossary\/mvc\/\">Model-View-Controller<\/a>, <a href=\"https:\/\/itsm.com\/pb\/glossary\/mvp\/\">Model-View-Presenter<\/a> e <a href=\"https:\/\/itsm.com\/pb\/glossary\/mvvm\/\">Model-View-View-Model<\/a>. Vamos dar uma olhada em como eles diferem e onde se aplicam.<\/p>\n<h2>Modelo e visualiza\u00e7\u00e3o<\/h2>\n<p>Todos os tr\u00eas padr\u00f5es em considera\u00e7\u00e3o t\u00eam dois componentes recorrentes. Eles diferem em recursos, mas s\u00e3o iguais em sua ess\u00eancia.<\/p>\n<p>A visualiza\u00e7\u00e3o \u00e9 uma interface visual (UI). Ela pode consistir em elementos individuais ou widgets. Exemplos de visualiza\u00e7\u00e3o s\u00e3o o c\u00f3digo de cria\u00e7\u00e3o de formul\u00e1rios no MFC e no WinForms, html no ASP.NET, XAML no WPF e no Silverlight.<\/p>\n<p>Model s\u00e3o os dados do aplicativo que s\u00e3o exibidos usando a interface e o processo de recupera\u00e7\u00e3o e salvamento desses dados.<\/p>\n<h2>Model-View-Controller<\/h2>\n<p>O padr\u00e3o mais antigo, que foi desenvolvido em 1979 para o desenvolvimento de aplicativos em Smalltalk. Naquela \u00e9poca, n\u00e3o havia o shell gr\u00e1fico do Windows com seus elementos padr\u00e3o. A interface era renderizada manualmente por c\u00f3digo. Entretanto, mesmo naquela \u00e9poca, a separa\u00e7\u00e3o do c\u00f3digo de exibi\u00e7\u00e3o, l\u00f3gica e dados foi uma revolu\u00e7\u00e3o no desenvolvimento.<\/p>\n<p>Nesse padr\u00e3o, vemos tr\u00eas elementos principais:<\/p>\n<ul>\n<li>Modelo &#8211; dados do aplicativo com a l\u00f3gica para recuper\u00e1-los e salv\u00e1-los. Na maioria das vezes, o modelo opera com dados de um banco de dados ou com os resultados de servi\u00e7os da Web. Os dados s\u00e3o exibidos imediatamente na tela ou adaptados.\n<li>View &#8211; interface visual, bot\u00f5es de renderiza\u00e7\u00e3o, r\u00f3tulos, campos de entrada e outros elementos de formul\u00e1rio. Pode seguir o modelo e exibir dados dele.<\/li>\n<li>\n<li>Controlador &#8211; monitora as a\u00e7\u00f5es do usu\u00e1rio (bot\u00f5es do teclado ou movimentos do mouse), decide o que fazer com elas e atualiza o Model e a View.<\/li>\n<\/li>\n<\/ul>\n<p>Vamos descrever o princ\u00edpio do padr\u00e3o MVC da seguinte forma. O controlador processa as a\u00e7\u00f5es do usu\u00e1rio &#8211; cliques do mouse, pressionamentos do teclado ou solicita\u00e7\u00f5es http de entrada. O controlador passa as altera\u00e7\u00f5es processadas para o modelo e as desenha na visualiza\u00e7\u00e3o (modo passivo), ou o modelo recebe as altera\u00e7\u00f5es diretamente da visualiza\u00e7\u00e3o (modo ativo). A principal tarefa da visualiza\u00e7\u00e3o \u00e9 renderizar os dados do modelo usando o controlador.<\/p>\n<h2>Model-View-Presenter<\/h2>\n<p>O desenvolvimento da programa\u00e7\u00e3o visual e dos widgets aboliu a renderiza\u00e7\u00e3o de elementos individuais da visualiza\u00e7\u00e3o, de modo que uma classe de controlador separada n\u00e3o \u00e9 mais necess\u00e1ria. Os pr\u00f3prios elementos sabem quais a\u00e7\u00f5es o usu\u00e1rio executa com eles. Mas ainda \u00e9 necess\u00e1rio separar a l\u00f3gica do aplicativo dos dados. Assim, o padr\u00e3o foi substitu\u00eddo por Presenter em vez de Controller.<\/p>\n<p>Em compara\u00e7\u00e3o com o MVC, a fun\u00e7\u00e3o Model n\u00e3o foi alterada, a View agora lida com as a\u00e7\u00f5es do usu\u00e1rio (usando widgets, por exemplo) e, se essa a\u00e7\u00e3o alterar algo na l\u00f3gica da interface, ela ser\u00e1 passada para o Presenter.<\/p>\n<p>A principal tarefa desse padr\u00e3o \u00e9 separar a visualiza\u00e7\u00e3o do controlador para criar visualiza\u00e7\u00f5es intercambi\u00e1veis e poder test\u00e1-las independentemente.<\/p>\n<p>O Presenter, como condutor, \u00e9 respons\u00e1vel pelo trabalho sincronizado do Modelo e da Visualiza\u00e7\u00e3o. Se ele receber uma notifica\u00e7\u00e3o da visualiza\u00e7\u00e3o sobre uma a\u00e7\u00e3o do usu\u00e1rio, atualizar\u00e1 o modelo e sincronizar\u00e1 as altera\u00e7\u00f5es com a visualiza\u00e7\u00e3o. Toda a comunica\u00e7\u00e3o ocorre por meio da interface, o que lhes d\u00e1 separa\u00e7\u00e3o.<\/p>\n<p>O MVC tem duas implementa\u00e7\u00f5es: Visualiza\u00e7\u00e3o passiva, em que a visualiza\u00e7\u00e3o n\u00e3o sabe nada sobre o modelo e o apresentador \u00e9 respons\u00e1vel por obter informa\u00e7\u00f5es do modelo e atualizar a visualiza\u00e7\u00e3o, e Controlador de supervis\u00e3o, em que a visualiza\u00e7\u00e3o sabe sobre o modelo e vincula os dados \u00e0 pr\u00f3pria visualiza\u00e7\u00e3o.<\/p>\n<h2>Model-View-View-ViewModel<\/h2>\n<p>A principal diferen\u00e7a entre esse padr\u00e3o e os outros \u00e9 a presen\u00e7a de vincula\u00e7\u00e3o de dados no WPF e no Silverlight.<\/p>\n<p>Aqui n\u00e3o h\u00e1 comunica\u00e7\u00e3o direta entre ViewModel e View, ela \u00e9 feita por meio de comandos (vincula\u00e7\u00e3o) que consistem em propriedades e m\u00e9todos. \u00c9 assim que voc\u00ea pode vincular qualquer visualiza\u00e7\u00e3o e ViewModel, desde que tenha as propriedades corretas. A associa\u00e7\u00e3o XAML tamb\u00e9m permite que voc\u00ea associe n\u00e3o apenas dados, mas tamb\u00e9m a\u00e7\u00f5es \u00e0 visualiza\u00e7\u00e3o. Definimos um objeto como uma propriedade do modelo e o vinculamos declarativamente \u00e0 propriedade correspondente na visualiza\u00e7\u00e3o. O resultado \u00e9 um objeto separado que cont\u00e9m dados e comportamento, independente da visualiza\u00e7\u00e3o. O ViewModel \u00e9 uma combina\u00e7\u00e3o de Model e Controller.<\/p>\n<p>As principais vantagens do MVVM s\u00e3o o design f\u00e1cil da interface, o teste independente e o c\u00f3digo reduzido para a visualiza\u00e7\u00e3o.<\/p>\n<h2>Otimiza\u00e7\u00e3o e desempenho<\/h2>\n<p>Se usarmos os padr\u00f5es MV* para separar o c\u00f3digo da visualiza\u00e7\u00e3o, do modelo e do controlador, em sistemas altamente carregados, ser\u00e1 poss\u00edvel obter um benef\u00edcio adicional ao separar esses elementos em diferentes unidades computacionais.<\/p>\n<ol>\n<li>A visualiza\u00e7\u00e3o \u00e9 trazida para o dispositivo do cliente (laptop, PC, smartphone). A tecnologia de aplicativo de p\u00e1gina \u00fanica SPA \u00e9 respons\u00e1vel pela acelera\u00e7\u00e3o. Os c\u00e1lculos complexos s\u00e3o realizados no endpoint do usu\u00e1rio, reduzindo assim a carga nos servidores de back-end.\n<li>Os controladores (Presenter, ViewModel) s\u00e3o movidos para um servidor de back-end separado que lida com a l\u00f3gica.<\/li>\n<li>O modelo \u00e9 o elemento mais volumoso e produtivo, portanto, requer um servidor com um sistema de armazenamento de dados r\u00e1pido e, de prefer\u00eancia, com a capacidade de armazenar em cache as informa\u00e7\u00f5es &#8220;quentes&#8221; na RAM.<\/li>\n<\/li>\n<\/ol>\n<h2>MVC no SimpleOne<\/h2>\n<p>Ao desenvolver o <a href=\"https:\/\/itsm.com\/pb\/products\/itsm\/\">ITSM-system SimpleOne<\/a>, o padr\u00e3o Model-View-Controller \u00e9 tomado como base, o que \u00e9 significativamente otimizado. A fun\u00e7\u00e3o de visualiza\u00e7\u00e3o \u00e9 desempenhada por um aplicativo SPA de p\u00e1gina \u00fanica, que \u00e9 executado inteiramente no dispositivo do cliente e recebe apenas dados do modelo. E para a opera\u00e7\u00e3o do modelo, usamos a abordagem DDD (<a href=\"https:\/\/itsm.com\/pb\/glossary\/domain-driven-design\/\">Domain-Driven Design<\/a>) &#8211; dividimos o padr\u00e3o em camadas &#8211; reposit\u00f3rios por meio dos quais os dados s\u00e3o acessados.<\/p>\n<p>No MVC tradicional, o c\u00f3digo do modelo \u00e9 projetado para um banco de dados espec\u00edfico e sua sintaxe, por exemplo, PostgreSQL. Usando o sistema de reposit\u00f3rio, podemos trocar de camadas e conectar qualquer outro banco de dados sem alterar o c\u00f3digo do aplicativo.<\/p>\n<p>As camadas nos permitem n\u00e3o apenas trabalhar com reposit\u00f3rios como conectores ao banco de dados, mas tamb\u00e9m dividir quaisquer classes em entidades separadas. Por exemplo, se em um modelo MVC comum a classe User cont\u00e9m v\u00e1rios milhares de linhas de c\u00f3digo e \u00e9 respons\u00e1vel por todas as opera\u00e7\u00f5es relacionadas ao usu\u00e1rio (pesquisa, exclus\u00e3o, envio de mensagens e outras), no SimpleOne n\u00f3s a dividimos em v\u00e1rias camadas separadas: a classe de descri\u00e7\u00e3o do usu\u00e1rio, o reposit\u00f3rio do usu\u00e1rio para trabalhar com o banco de dados, as classes de v\u00e1rios servi\u00e7os relacionados ao usu\u00e1rio e outras. Obtemos uma estrutura MVC, mas mais profundamente desenvolvida, permitindo a troca, uma execu\u00e7\u00e3o de consulta muito mais r\u00e1pida e mais f\u00e1cil de manter.<\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>Os padr\u00f5es n\u00e3o s\u00e3o paradigmas r\u00edgidos que devem ser seguidos para criar uma organiza\u00e7\u00e3o de c\u00f3digo perfeita. Eles resolvem problemas muito importantes &#8211; enfraquecendo (eliminando) os v\u00ednculos entre View, Model e Controller e reduzindo a complexidade do desenvolvimento da interface do usu\u00e1rio. A aplica\u00e7\u00e3o dessa abordagem \u00e9 poss\u00edvel se voc\u00ea entender a ess\u00eancia das interconex\u00f5es e procurar a possibilidade de elimin\u00e1-las em cada projeto espec\u00edfico. O <a href=\"https:\/\/itsm.com\/pb\/platform\/\">sistema ESM SimpleOne<\/a> \u00e9 uma plataforma complexa e de desenvolvimento intenso, mas oferece uma interface amig\u00e1vel e pode lidar com cargas pesadas. Essa efici\u00eancia \u00e9 o resultado do uso de tecnologias e m\u00e9todos de desenvolvimento modernos, incluindo o uso de padr\u00f5es MV*.<\/p>","protected":false},"excerpt":{"rendered":"<p>O c\u00f3digo de aplicativo complexo escrito sem os padr\u00f5es MV* \u00e9 dif\u00edcil de testar, reutilizar e manter. Os padr\u00f5es eliminam ou enfraquecem a conex\u00e3o entre a visualiza\u00e7\u00e3o, o modelo e o controlador, separam o c\u00f3digo e simplificam o desenvolvimento. Abordaremos os tipos de padr\u00f5es MV* e seu uso no SimpleOne. Ao desenvolver um aplicativo SimpleOne, [&hellip;]<\/p>\n","protected":false},"author":48,"featured_media":12705,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[14,16],"yoast_head":"<title>Padr\u00f5es MV* no desenvolvimento de aplicativos da Web - SimpleOne - Business Process Automation Platform<\/title>\n<meta name=\"description\" content=\"Blog SimpleOne - Business Process Automation Platform Padr\u00f5es MV* no desenvolvimento de aplicativos da Web\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Padr\u00f5es MV* no desenvolvimento de aplicativos da Web - SimpleOne - Business Process Automation Platform\" \/>\n<meta property=\"og:description\" content=\"Blog SimpleOne - Business Process Automation Platform Padr\u00f5es MV* no desenvolvimento de aplicativos da Web\" \/>\n<meta property=\"og:url\" content=\"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/\" \/>\n<meta property=\"og:site_name\" content=\"SimpleOne - Business Process Automation Platform\" \/>\n<meta property=\"article:published_time\" content=\"2020-09-16T08:49:02+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/itsm.com\/wp-content\/uploads\/2024\/09\/mv-patterny-v-razrabotke-veb-prilozheniya-oblozhka.png\" \/>\n\t<meta property=\"og:image:width\" content=\"927\" \/>\n\t<meta property=\"og:image:height\" content=\"646\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https:\/\/itsm.com\/#organization\",\"name\":\"SimpleOne\",\"url\":\"https:\/\/itsm.com\/\",\"sameAs\":[],\"logo\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/itsm.com\/#logo\",\"inLanguage\":\"pt-BR\",\"url\":\"\/wp-content\/uploads\/2023\/11\/main_logo-1.png\",\"contentUrl\":\"\/wp-content\/uploads\/2023\/11\/main_logo-1.png\",\"width\":166,\"height\":23,\"caption\":\"SimpleOne\"},\"image\":{\"@id\":\"https:\/\/itsm.com\/#logo\"}},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/itsm.com\/#website\",\"url\":\"https:\/\/itsm.com\/\",\"name\":\"SimpleOne - Business Process Automation Platform\",\"description\":\"\u3164\",\"publisher\":{\"@id\":\"https:\/\/itsm.com\/#organization\"},\"inLanguage\":\"pt-BR\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/#primaryimage\",\"inLanguage\":\"pt-BR\",\"url\":\"\/wp-content\/uploads\/2024\/09\/mv-patterny-v-razrabotke-veb-prilozheniya-oblozhka.png\",\"contentUrl\":\"\/wp-content\/uploads\/2024\/09\/mv-patterny-v-razrabotke-veb-prilozheniya-oblozhka.png\",\"width\":927,\"height\":646},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/#webpage\",\"url\":\"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/\",\"name\":\"[:en]MV*-patterns in web application development[:pb]Padr\u00f5es MV* no desenvolvimento de aplicativos da Web[:tr]Web uygulamas\u0131 geli\u015ftirmede MV*-paternleri[:ru]MV*-\u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f[:] - SimpleOne - Business Process Automation Platform\",\"isPartOf\":{\"@id\":\"https:\/\/itsm.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/#primaryimage\"},\"datePublished\":\"2020-09-16T08:49:02+00:00\",\"dateModified\":\"2024-09-23T08:55:44+00:00\",\"description\":\"Blog SimpleOne - Business Process Automation Platform [:en]MV*-patterns in web application development[:pb]Padr\u00f5es MV* no desenvolvimento de aplicativos da Web[:tr]Web uygulamas\u0131 geli\u015ftirmede MV*-paternleri[:ru]MV*-\u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f[:]\",\"breadcrumb\":{\"@id\":\"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/itsm.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MV*-patterns in web application development\"}]},{\"@type\":\"Article\",\"@id\":\"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/#webpage\"},\"author\":{\"@id\":\"https:\/\/itsm.com\/#\/schema\/person\/c7515bc91e745fb07aed438cb94d6358\"},\"headline\":\"Padr\u00f5es MV* no desenvolvimento de aplicativos da Web\",\"datePublished\":\"2020-09-16T08:49:02+00:00\",\"dateModified\":\"2024-09-23T08:55:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/#webpage\"},\"wordCount\":5090,\"publisher\":{\"@id\":\"https:\/\/itsm.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/#primaryimage\"},\"thumbnailUrl\":\"\/wp-content\/uploads\/2024\/09\/mv-patterny-v-razrabotke-veb-prilozheniya-oblozhka.png\",\"keywords\":[\"Ferramentas De Desenvolvimento\",\"Interface\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/itsm.com\/#\/schema\/person\/c7515bc91e745fb07aed438cb94d6358\",\"name\":\"lyubov azarenko\",\"url\":\"https:\/\/itsm.com\/pb\/author\/lyubov-azarenko\/\"}]}<\/script>","yoast_head_json":{"title":"[:en]MV*-patterns in web application development[:pb]Padr\u00f5es MV* no desenvolvimento de aplicativos da Web[:tr]Web uygulamas\u0131 geli\u015ftirmede MV*-paternleri[:ru]MV*-\u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f[:] - SimpleOne - Business Process Automation Platform","description":"Blog SimpleOne - Business Process Automation Platform Padr\u00f5es MV* no desenvolvimento de aplicativos da Web","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"pt_BR","og_type":"article","og_title":"Padr\u00f5es MV* no desenvolvimento de aplicativos da Web - SimpleOne - Business Process Automation Platform","og_description":"Blog SimpleOne - Business Process Automation Platform Padr\u00f5es MV* no desenvolvimento de aplicativos da Web","og_url":"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/","og_site_name":"SimpleOne - Business Process Automation Platform","article_published_time":"2020-09-16T08:49:02+00:00","og_image":[{"width":927,"height":646,"url":"https:\/\/itsm.com\/wp-content\/uploads\/2024\/09\/mv-patterny-v-razrabotke-veb-prilozheniya-oblozhka.png","type":"image\/png"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Organization","@id":"https:\/\/itsm.com\/#organization","name":"SimpleOne","url":"https:\/\/itsm.com\/","sameAs":[],"logo":{"@type":"ImageObject","@id":"https:\/\/itsm.com\/#logo","inLanguage":"pt-BR","url":"\/wp-content\/uploads\/2023\/11\/main_logo-1.png","contentUrl":"\/wp-content\/uploads\/2023\/11\/main_logo-1.png","width":166,"height":23,"caption":"SimpleOne"},"image":{"@id":"https:\/\/itsm.com\/#logo"}},{"@type":"WebSite","@id":"https:\/\/itsm.com\/#website","url":"https:\/\/itsm.com\/","name":"SimpleOne - Business Process Automation Platform","description":"\u3164","publisher":{"@id":"https:\/\/itsm.com\/#organization"},"inLanguage":"pt-BR"},{"@type":"ImageObject","@id":"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/#primaryimage","inLanguage":"pt-BR","url":"\/wp-content\/uploads\/2024\/09\/mv-patterny-v-razrabotke-veb-prilozheniya-oblozhka.png","contentUrl":"\/wp-content\/uploads\/2024\/09\/mv-patterny-v-razrabotke-veb-prilozheniya-oblozhka.png","width":927,"height":646},{"@type":"WebPage","@id":"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/#webpage","url":"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/","name":"[:en]MV*-patterns in web application development[:pb]Padr\u00f5es MV* no desenvolvimento de aplicativos da Web[:tr]Web uygulamas\u0131 geli\u015ftirmede MV*-paternleri[:ru]MV*-\u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f[:] - SimpleOne - Business Process Automation Platform","isPartOf":{"@id":"https:\/\/itsm.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/#primaryimage"},"datePublished":"2020-09-16T08:49:02+00:00","dateModified":"2024-09-23T08:55:44+00:00","description":"Blog SimpleOne - Business Process Automation Platform [:en]MV*-patterns in web application development[:pb]Padr\u00f5es MV* no desenvolvimento de aplicativos da Web[:tr]Web uygulamas\u0131 geli\u015ftirmede MV*-paternleri[:ru]MV*-\u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f[:]","breadcrumb":{"@id":"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/itsm.com\/"},{"@type":"ListItem","position":2,"name":"MV*-patterns in web application development"}]},{"@type":"Article","@id":"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/#article","isPartOf":{"@id":"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/#webpage"},"author":{"@id":"https:\/\/itsm.com\/#\/schema\/person\/c7515bc91e745fb07aed438cb94d6358"},"headline":"Padr\u00f5es MV* no desenvolvimento de aplicativos da Web","datePublished":"2020-09-16T08:49:02+00:00","dateModified":"2024-09-23T08:55:44+00:00","mainEntityOfPage":{"@id":"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/#webpage"},"wordCount":5090,"publisher":{"@id":"https:\/\/itsm.com\/#organization"},"image":{"@id":"https:\/\/itsm.com\/blog\/mv-patterny-v-razrabotke-veb-prilozheniya-2\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2024\/09\/mv-patterny-v-razrabotke-veb-prilozheniya-oblozhka.png","keywords":["Ferramentas De Desenvolvimento","Interface"],"articleSection":["Blog"],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/itsm.com\/#\/schema\/person\/c7515bc91e745fb07aed438cb94d6358","name":"lyubov azarenko","url":"https:\/\/itsm.com\/pb\/author\/lyubov-azarenko\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/itsm.com\/pb\/wp-json\/wp\/v2\/posts\/12704"}],"collection":[{"href":"https:\/\/itsm.com\/pb\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itsm.com\/pb\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itsm.com\/pb\/wp-json\/wp\/v2\/users\/48"}],"replies":[{"embeddable":true,"href":"https:\/\/itsm.com\/pb\/wp-json\/wp\/v2\/comments?post=12704"}],"version-history":[{"count":5,"href":"https:\/\/itsm.com\/pb\/wp-json\/wp\/v2\/posts\/12704\/revisions"}],"predecessor-version":[{"id":12716,"href":"https:\/\/itsm.com\/pb\/wp-json\/wp\/v2\/posts\/12704\/revisions\/12716"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/itsm.com\/pb\/wp-json\/wp\/v2\/media\/12705"}],"wp:attachment":[{"href":"https:\/\/itsm.com\/pb\/wp-json\/wp\/v2\/media?parent=12704"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itsm.com\/pb\/wp-json\/wp\/v2\/categories?post=12704"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itsm.com\/pb\/wp-json\/wp\/v2\/tags?post=12704"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}