MVCS - Model View Controller Store

35

Recentemente, decidi começar a aprender o desenvolvimento do iOS e, para esse fim, tenho lido a programação do iOS: o guia Big Nerd Ranch . No livro, os autores descrevem um padrão de design MVCS - Model-View-Controller-Store , uma vez que muitos aplicativos fazem uso de várias fontes externas de dados, mantendo a lógica de solicitação no controlador, pode ficar muito confuso. proponha que mova toda a lógica de solicitação para fora do controlador e para um objeto separado.

Em suma, para citar o livro

Model-View-Controller-Store coloca a lógica da solicitação em um objeto separado, e chamamos esse objeto de loja (Figura 28.4). O uso de um objeto de armazenamento minimiza o código redundante e simplifica o código que busca e salva dados. Mais importante, ele move a lógica para lidar com uma fonte externa em uma classe organizada, com um objetivo claro e focado. Isso facilita a compreensão do código, o que facilita a manutenção e a depuração, além de compartilhar com outros programadores em sua equipe.

E

O interessante dos armazenamentos assíncronos é que, embora muitos objetos estejam trabalhando muito para processar uma solicitação, o fluxo da solicitação e sua resposta estão em um local no controlador. Isso nos oferece o benefício de código fácil de ler e de modificar.

Eu queria descobrir mais sobre esse padrão e ver o que os outros poderiam ter a dizer sobre ele, mas, ao pesquisar on-line, as únicas referências que pude encontrar foram para o mesmo livro (o padrão talvez seja conhecido por outro nome?).

Para mim, a lógica do autor parece fazer sentido, e parece uma extensão lógica do padrão MVC normal, mas talvez seja porque eu realmente não tenha muita experiência com o padrão MVC na prática (além da incursão no desenvolvimento do iOS, eu tenho tipo de MVV usado com backbone.js (ou seja, se você considerar o MVC )).

Eu esperava que talvez alguém com mais experiência pudesse esclarecer se existem falhas / problemas óbvios no padrão MVCS que estou perdendo.

Jack
fonte
2
RobotLegs no ActionScript usa o "S" no MVCS para significar serviço. Mas é usado essencialmente da mesma maneira. Portanto, há pelo menos outro exemplo disso.
precisa saber é o seguinte
11
No MVC, a loja geralmente faz parte do modelo. É chamado de parte DAO .
Florian Margaine
O @FlorianMargaine está usando em oposição ao Controller (o que parece estar implícito neste livro (ele diz "No MVC, a lógica de solicitação é de responsabilidade dos objetos do controller")? E você vê alguma desvantagem óbvia em movê-lo para sua própria camada ?
Jack

Respostas:

18

"Store", no caso dos padrões de design do MVCS, tende a se inclinar para a lógica de armazenamento. No caso do iOS, isso geralmente é uma implementação de dados principais. Se você criar um modelo com suporte para Dados Principais no Xcode, verá o aspecto "Loja" desse padrão de design escondido na classe AppDelegate.

Para levar isso para o próximo nível, frequentemente criarei uma classe de gerenciador singleton que lida com a configuração da pilha de dados principais e lida com todas as buscas / salvamentos envolvidos na pilha. Como diz a citação mencionada, isso torna muito fácil não apenas chamar esses métodos, mas ajustá-los, se necessário, em vez de ter chamadas de salvamento / busca em todo o lugar em diferentes controladores de exibição.

O paradigma "Store" não é restrito ao Core Data, no entanto. Sua loja pode ser apenas um serviço da web. Talvez você tenha uma classe que interaja com o Facebook, Twitter, Yelp ou alguma outra API baseada em REST. Descobri (e de forma semelhante acompanho a tendência) que esses tipos de classes também têm o nome de Gerente. Eles estão literalmente gerenciando todos os detalhes internos para que suas outras classes possam inserir ou obter exatamente o que precisam.

No que diz respeito a falhas óbvias ou problemas com esse padrão de design ... Como em qualquer padrão de design, o problema mais evidente é garantir que você configure seu projeto de maneira que condiz com o paradigma. Especialmente com um padrão de design novo para você, essa pode ser a parte mais difícil. O benefício de dividir sua lógica "Store" em sua própria classe é o fato de tornar a manutenção do código muito mais fácil.

jmstone
fonte
Obrigado pela compreensão, na verdade semelhante à abordagem que comecei a adotar, pois tenho uma classe de gerenciador único que lida com a pilha de dados principal e uma API da Web.
Jack
Olá @jimstone, estou um pouco confuso em relação à lógica da loja. Você pode por favor ajudar? Suponha que eu possua 5 modelos, para cada um possuo 2 classes, uma que mantém a rede e outro armazenamento em cache de objetos (dados principais e outras coisas). Agora eu deveria ter uma classe Store separada para cada modelo que chame a função que contém chamadas de função de rede + cache ou uma única classe Store que tenha todas as chamadas de função de rede + cache para cada modelo, para que o controlador sempre acesse arquivos únicos para dados.
meteoros
18

'Armazenar' nesse contexto parece muito com um Repositório ou Serviço . Nesse caso, esse é um padrão extremamente comum. As falhas / problemas variam de acordo com a sua implementação e o domínio do problema.

Em geral, parece que o livro está usando 'Store' para representar um nível de lógica de negócios + um nível de lógica de recuperação de dados que lida com um conjunto de dados que podem ou não fazer parte do seu aplicativo.

Por exemplo, agrupar a API do Twitter em uma 'Loja' é uma boa maneira de compartimentar essa lógica.

Pensando melhor
Usando esta definição de MVC (que eu acho bastante interessante), o 'Store' é realmente um subconjunto do modelo. A definição entre se é uma extensão do MVC ou se é um padrão de recuperação de dados não é muito útil. Eles acabam parecendo o mesmo código.

Resumindo, acho que você vai ficar bem seguindo os conselhos que eles sugerem (parece bem geral).

Zachary Yates
fonte
11
Lendo os links que você forneceu Parece semelhante, exceto que aqui está sendo usado como uma extensão do padrão MVC.
Jack
5
+1, parece que eles acabaram de criar um novo nome para o padrão de repositório (um repositório sendo um tipo de serviço).
precisa saber é o seguinte