Baixe o app para aproveitar ainda mais
Prévia do material em texto
Inserir Título Aqui Inserir Título Aqui Arquitetura de Software Padrões de Projeto e Model-View-Controller (MVC) Responsável pelo Conteúdo: Prof. Me. Wilson Vendramel Revisão Textual: Prof.ª Dr.ª Luciene Oliveira da Costa Granadeiro Nesta unidade, trabalharemos os seguintes tópicos: • Padrões de Projeto e Model-View-Controller (MVC); • Model-View-Controller (MVC). Fonte: iStock/Getty Im ages Objetivos • Aplicar métodos e técnicas de análise e projeto arquitetural no processo de desen-- -volvimento de sistemas de software; • Entender a importância da utilização de padrões de projeto como uma solução reusável e o propósito do padrão de arquitetura MVC. Caro Aluno(a)! Normalmente, com a correria do dia a dia, não nos organizamos e deixamos para o último momento o acesso ao estudo, o que implicará o não aprofundamento no material trabalhado ou, ainda, a perda dos prazos para o lançamento das atividades solicitadas. Assim, organize seus estudos de maneira que entrem na sua rotina. Por exemplo, você poderá escolher um dia ao longo da semana ou um determinado horário todos ou alguns dias e determinar como o seu “momento do estudo”. No material de cada Unidade, há videoaulas e leituras indicadas, assim como sugestões de materiais complementares, elementos didáticos que ampliarão sua interpretação e auxiliarão o pleno entendimento dos temas abordados. Após o contato com o conteúdo proposto, participe dos debates mediados em fóruns de discussão, pois estes ajudarão a verificar o quanto você absorveu do conteúdo, além de propiciar o contato com seus colegas e tutores, o que se apresenta como rico espaço de troca de ideias e aprendizagem. Bons Estudos! Padrões de Projeto e Model-View-Controller (MVC) UNIDADE Padrões de Projeto e Model-View-Controller (MVC) Contextualização As aplicações Web estão cada vez mais presentes no mercado de tecnologia da infor- mação. Isso é fato! A engenharia de software já reconhece que, para obter um software melhor, com entrega rápida e custos mais baixos, é necessário um processo de desenvol- vimento de software baseado na reutilização de softwares existentes. Nos últimos anos, tem ocorrido uma mudança significativa a favor do desenvolvimento de sistemas de software baseado em reúso. Padrões de projeto, padrões de arquitetura e engenharia de software baseados em componentes são abordagens de reúso de software. Uma arqui- tetura de software recomendada para aplicações Web é a arquitetura em três camadas, pois separa a interface de usuário e o comportamento da aplicação. O padrão de arqui- tetura MVC permite a separação da camada de apresentação da camada de aplicação, trazendo benefícios para uma solução de software baseada na Web. 6 7 Padrões de Projeto e Model-View-Controller (MVC) Este material teórico apresenta a aplicação de métodos e técnicas de análise e projeto arquitetural no processo de desenvolvimento de sistemas de software e a importância da utilização de padrões de projeto como uma solução reusável, além do propósito do padrão de projeto de arquitetura Model-View-Controller (MVC). Para facilitar a com- preensão da representação do MVC, serão utilizadas notações da Unified Modeling Language (UML), especificamente o diagrama de classes. Reúso de Software Ao estudar padrões de projeto, nós estamos estudando o reúso de software. O reúso (reutilização) de software existente é uma abordagem de desenvolvimento enfatizada pelos atuais modelos de processo de desenvolvimento de sistemas de software. A reu- tilização de componentes é bastante importante no projeto (design) de arquitetura de sistemas de software. Se pensarmos nos atributos de qualidade de um sistema de software, qual seria o atributo mais importante para o software? Funcionalidade? Segurança? Portabilidade? Usabilida- de? Interoperabilidade? Desempenho? Manutenibilidade? Algum outro atributo? Já pensaram? Na realidade, todos esses atributos são importantes para a qualidade de um sistema de software. Dependendo do propósito do software em relação ao domínio de ne- gócio, alguns atributos devem ser priorizados enquanto outros são relevados. Desde alguns anos, percebemos que a qualidade mais importante para um software é estar pronto. Isso mesmo, dissemos “estar pronto”. Um software pronto é um software existente e que já exe- cuta suas funções com qualidade, podendo incluir um ou mais atributos de qualidade mencio- nados na pergunta supracitada. Nesse caso, por que você vai desenvolver um software novo para atender a alguma exigência, sendo que já existe um software pronto para tal? A maioria das disciplinas de engenharia de sistemas é projetada pela composição de componentes existentes que já foram reutilizados em outros sistemas. A própria enge- nharia de software reconhece que, para obter um software melhor, de forma mais rá- pida e com custos menores, é necessário um processo de desenvolvimento de software baseado no reúso sistemático de softwares existentes. Dessa forma, nos últimos anos, tem ocorrido uma mudança significativa favorável ao desenvolvimento de sistemas de software baseado em reúso. Dentre os benefícios do reúso de software, alguns são elencados logo abaixo: • Maior confiabilidade: o software existente foi testado e já está em funcionamento, sendo provavelmente mais confiável do que desenvolver um software novo; • Menor risco de processo: o custo do software existente já é conhecido, pois os custos de desenvolvimento são uma questão que envolve julgamento; 7 UNIDADE Padrões de Projeto e Model-View-Controller (MVC) • Uso eficaz de especialistas: a reutilização de software evita a repetição do mesmo tra- balho e encapsula o conhecimento de especialistas em uma solução de software pronta; • Conformidade com padrões: alguns padrões podem ser implementados como um conjunto de componentes reutilizáveis, como, por exemplo, os padrões de interface de usuário. A utilização de interfaces de usuário já conhecidas aumenta a confiança dos usuários, pois eles tendem a cometer menos erros quando interagem com in- terfaces as quais já estão familiarizados; • Desenvolvimento agilizado: o reúso de um software pronto pode acelerar a cons- trução do sistema porque tende a reduzir o tempo de desenvolvimento e de validação, entregando o sistema de software de forma mais rápida. (SOMMERVILLE, 2011) A engenharia de software baseada em reúso é uma abordagem de desenvolvimento de sistemas de software que visa maximizar o reúso de softwares existentes. O tamanho das unidades de software reutilizadas pode variar bastante, por exemplo: • Reúso de sistemas de aplicação por inteiro, incorporando-o sem mudanças a outros sistemas ou desenvolvendo famílias de aplicações; • Reúso de componentes de uma aplicação desde os subsistemas até os obje- tos elementares; • Reúso de componentes de software que implementam uma função bem definida ou objetos (SOMMERVILLE, 2011). O reúso pode existir independentemente do modelo de processo de desenvolvimen- to de sistemas de software. A figura 1 apresenta um modelo geral de desenvolvimento baseado em reúso, também conhecido como engenharia de software orientada a reú- so. Apesar de as fases de especificação de requisitos e de validação do sistema serem compatíveis com outros modelos de processo de software, as fases intermediárias em um modelo orientado a reúso são: a) Análise de componentes: a partir da especificação de requisitos, é realizada uma busca de componentes para implementar essa especificação. Muitas ve- zes, não há uma correspondência exata, sendo que os componentes podem ser usados somente para fornecer alguma funcionalidade necessária; b) Alterações nos requisitos: os requisitos são analisados com base nas informa- ções dos componentes encontrados. Em seguida, os requisitos são modificados para ser possível reutilizar os componentes disponíveis. Havendo mudanças inviáveis nos requisitos, a fase de análise de componentes pode ser realizada novamente visando buscarsoluções alternativas; c) Projeto de sistema com reúso: o framework do sistema é projetado ou algo que já existe é reutilizado. Os arquitetos analisam os componentes que serão reusa- dos e organizam o framework para reúso. O desenvolvimento de algum software novo pode ser necessário se não houver componente de software disponível; d) Desenvolvimento e integração: softwares que não podem ser adquiridos ex- ternamente são desenvolvidos, sendo que os componentes são integrados para construir o novo sistema. A integração de sistemas pode ser parte do processo 8 9 de desenvolvimento de software, ao invés de uma atividade separada. De for- ma geral, há três tipos de componentes de software passíveis de utilização em um modelo de processo orientado a reúso: » Web services: desenvolvidos conforme os padrões de serviço, estando dis- poníveis para invocação remota; » Coleções de objetos: desenvolvidas como um pacote a ser integrado com um framework de componentes (.NET, JEE, ...); » Sistemas de software stand alone: configurados para uso em um ambiente específico (SOMMERVILLE, 2011). Projeto de sistema com reúso Alterações nos requisitos Análise de componentes Especi�cações de requisitos Desenvolvimento e integração Validação de sistema Figura 1 – Engenharia de software orientada a reúso Apenas para exemplificar uma forma simples de reutilização de software, a figura 2 mostra as diferentes formas de implementação de um componente em diversas situações de software, sendo que, em cada uma delas, a classe cliente está sendo implementada de forma diferente, adaptando-se a cada projeto e situação. Uma forma implementa a relação de generalização (herança), outra implementa a relação de agregação, enquanto a terceira implementa a relação de dependência não estrutural. Figura 2 – Implementação de um componente em diversas situações Apesar de o reúso de software geralmente ser lembrado apenas no reúso de compo- nentes, existem várias abordagens de reúso distintas que podem ser usadas. Um ponto interessante é que o reúso é possível em vários níveis, desde funções mais simples até mesmo a reutilização de aplicações de software completas. A figura 3 mostra um pa- norama do reúso de software apresentando diversas abordagens que apoiam o reúso. 9 UNIDADE Padrões de Projeto e Model-View-Controller (MVC) Observe nesta figura que padrões de projeto, padrões de arquitetura e engenharia de software baseados em componentes são formas de reutilização de software. Padrões de projeto Padrões de arquitetura Aplicações verticais con guráveis Empacotamento de sistemas legados Engenharia de software baseada em componentes Engenharia dirigida a modelos Sistemas orientados a serviços Desenvolvimento do software orientado a aspectos Geradores de programas Bibliotecas de programas Frameworks de aplicações Linhas de produtos de software Integração de COTS Sistemas de ERP Figura 3 – Panorama do reúso de software E quanto aos padrões de projeto e aos padrões de arquitetura de software que tanto nos interessam? É o que vamos estudar nas próximas seções deste material. Padrões de Projeto Quando nós estudamos padrões de projeto (design patterns), é muito difícil não elen- car o importante livro Padrões de projeto: soluções reutilizáveis de software orientado a objetos de Gamma et al. (2000), originalmente publicada sob o título Design Patterns: Elements of Reusable Object-Oriented Software (1994). Os autores do referido livro são conhecidos como Gangue dos Quatro, do inglês Gang of Four, portanto, os padrões de pro- jeto descritos por esses autores são chamados de padrões GoF (Gang of Four). Autores de livros de Engenharia de Software e de Desenvolvimento de Software, incluindo Sommerville (2011), Bezerra (2015) e Kerievsky (2008) citam os referidos autores em suas obras. Por que adotar padrões de projeto é uma tarefa importante no desenvolvimento de sistemas de software? Por que o arquiteto de software tem interesse na adoção de pa- drões em suas soluções? Todos sabem o valor da experiência de projeto. Muitas vezes, já passou pela sua cabeça aquele sentimento de que já solucionou um problema semelhante anteriormente, mes- mo não sabendo exatamente onde e quando. Se você conseguisse lembrar os detalhes do problema anterior e de que forma o resolveu, você poderia reutilizar a experiência ao invés de redescobrir a solução adotada, não é verdade? Contudo, houve uma falha considerável, pois essa solução não foi registrada para possibilitar uma reutilização futura por parte de outros arquitetos em novos projetos de software. 10 11 Projetar sistema de software orientado a objetos é uma tarefa complicada, mas pro- jetar software reutilizável orientado a objetos é ainda mais complicado, pois é necessário identificar objetos pertinentes, refatorar esses objetos em classes no nível certo de gra- nularidade, definir as interfaces das classes, as hierarquias de generalização e especia- lização (herança) e as relações existentes entre esses conceitos. O projeto de software deve ser específico o suficiente para resolver o problema em questão, porém, genérico o suficiente para resolver problemas e atender a requisitos exigidos no futuro. Arquitetos de software experientes realizam bons projetos de software, ao passo que arquitetos inexperientes são sobrecarregados pelas diversas alternativas disponíveis, com tendência de adotar técnicas não orientadas a objetos. Normalmente, um profis- sional de desenvolvimento de software leva um tempo para compreender o que é um bom projeto de software orientado a objetos. Algo que os arquitetos experientes sabem é que não se deve resolver cada problema a partir de princípios elementares ou do zero. Ao invés disso, eles reutilizam soluções que já funcionaram no passado. Ao encontrar uma boa solução, eles a utilizam por repetidas vezes, possibilitando a identificação de padrões de classes e de comunicação entre objetos que surgem com frequência na maio- ria dos sistemas de software orientados a objetos. Esses padrões solucionam problemas específicos de projeto (design), tornando o projeto orientado a objetos mais flexível e, principalmente, reutilizável, possibilitando aos arquitetos desenvolverem novos projetos, reusando projetos bem-sucedidos a partir da experiência anterior. Um arquiteto habitua- do com tais padrões pode aplicá-los de imediato em diferentes problemas de projeto, sem necessidade de descobrir os mesmos novamente. (GAMMA et al., 2000) Afinal, o que são padrões de projeto (design patterns)? “Padrões de projeto são des- crições de objetos e classes comunicantes que precisam ser personalizadas para resolver um problema geral de projeto num contexto particular”. (GAMMA et al., 2000, p. 20) Um padrão de projeto é uma forma de reusar conhecimento abstrato sobre um pro- blema e sua solução, descrevendo o problema e a essência da sua solução. Para tal, um padrão de projeto precisa ser abstrato o suficiente para ser reutilizado em configurações distintas. Normalmente, os padrões fazem uso de características orientadas a objetos, como herança e polimorfismo. (SOMMERVILLE, 2011) Os padrões de projeto facilitam o reúso de projetos e arquiteturas bem-sucedidas. Técnicas testadas, aprovadas e registradas tornam as soluções mais acessíveis aos novos desenvol- vedores de software. Os padrões de projeto auxiliam a selecionar alternativas de projeto que fazem um software ser mais reusável e a evitar alternativas que comprometam o reú- so, além de melhorar a documentação e a manutenção de sistemas de software ao forne- cer uma especificação visível de interações de classes e objetos e o seu propósito implícito. Resumindo, os padrões de projeto ajudam um arquiteto de software a obter um projeto adequado de forma mais rápida. (GAMMA et al., 2000) Gamma et al. (2000) elaboraram um catálogo de padrões de projeto, classificando os mesmos a partir de dois critérios. O primeiro critério corresponde àfinalidade do 11 UNIDADE Padrões de Projeto e Model-View-Controller (MVC) padrão, ou seja, o que o padrão faz. Os padrões podem ser de finalidade de criação, estrutural, ou comportamental. Os padrões de criação enfatizam o processo de criação dos objetos; os padrões estruturais trabalham com montagem da estrutura das classes, ou objetos; os padrões comportamentais descrevem as formas pelas quais as classes ou objetos interagem e distribuem responsabilidades. O segundo critério corresponde ao escopo do padrão, ou seja, especifica se o padrão é aplicável principalmente no escopo de classes ou de objetos. Os padrões para classes visam aos relacionamentos entre clas- ses e suas subclasses, definidos por meio de herança, sendo, portanto, estáticos, pois trabalham em tempo de compilação, enquanto os padrões para objetos se preocupam com relacionamentos entre objetos que podem mudar em tempo de execução, sendo, portanto, mais dinâmicos. A tabela 1 mostra o catálogo dos padrões de projeto da Gang of Four (GoF), organi- zado conforme os dois critérios explicados anteriormente. Ao todo, são 23 padrões de projeto, sendo 5 de criação, 7 estruturais e 11 comportamentais. Tabela 1 – Padrões de Projeto GoF Finalidade De criação Estrutural Comportamental Escopo Classe Factory Method Adapter InterpreterTemplate Method Objeto Abstract Factory Builder Prototype Singleton Bridge Composite Decorator Façade Flyweight Proxy Chain of Responsibility Command Iterator Mediator Memento Observer State Strategy Visitor Fonte: Adaptado de Gamma et al. (2000, p. 26) Os padrões de projeto de criação para classes deixam alguma parte da criação de objetos para subclasses, enquanto os padrões de criação para objetos deixam a constru- ção para outro objeto. Os padrões estruturais para classes usam a herança para com- por classes, já os padrões estruturais de objetos descrevem formas de compor objetos. Os padrões comportamentais para classe utilizam herança para especificar algoritmos e fluxo de controle, enquanto os padrões comportamentais para objetos definem como um grupo de objetos colabora para executar uma tarefa que um objeto não pode execu- tar isoladamente. (GAMMA et al., 2000) Uma alternativa de organizar os padrões de projeto GoF é de acordo com as relações existentes entre eles. A figura 4 mostra essa forma de organização. Apesar de não ser uma figura complexa, a visão dos relacionamentos entre padrões de projeto é interessante. 12 13 ProxyMemento Adapter Builder BridgeIterator Command Observer Chain of Responsibility Composite Mediator Flyweight Visitor Decorator Strategy State evitando histerese salvando o estado da iteração criando compostos enumerando �lhos acrescendo responsabilidade a objetos usando composto de�nindo percursos de�nindo a cadeia adicionando operações de�nindo a gramática compartilhando símbolos terminais compartilhando compostos administração de dependências complexas Interpreter Factory MethodPrototype Singleton Facade adicionando operações mudando o exterior versus o interior compartilhando estratégias compartilhando estados Template Method usos frequentes de�nindo os passos do algorítmo Abstract Method implementa usando instância única instância única con�gurar a fábrica dinamicamente Figura 4 – Relacionamentos entre padrões de projeto Para maiores detalhes sobre os padrões GoF, você também pode explorar o livro Padrões de projeto: soluções reutilizáveis de software orientado a objetos, de Gamma et al. (2000), disponibilizado na Biblioteca Virtual Pearson, disponível em: https://goo.gl/g72tci 13 UNIDADE Padrões de Projeto e Model-View-Controller (MVC) Model-View-Controller (MVC) O Model-View-Controller (MVC) é um padrão de arquitetura de software que especi- fica a interação entre objetos de interface com o usuário e os demais objetos de uma apli- cação. Esse padrão arquitetural é comumente utilizado para separar as responsabilidades entre a lógica da apresentação e a lógica da aplicação. O ideal da camada de apresentação é não possuir inteligência, mas apenas a implementação da lógica da apresentação, como preenchimento de controles com dados oriundos das camadas da aplicação, habilitação de controles, definição de cores etc. Inicialmente, esse padrão de arquitetura foi apresentado na linguagem de programação Smalltalk-80, sendo que, ao longo do tempo, surgiram variações dessa arquitetura. Esse padrão de arquitetura apresenta três componentes: • Model: esse componente representa a parte da aplicação que contém os dados e suas validações. Esse componente corresponde ao estado, à estrutura e ao compor- tamento dos dados, sendo visualizados e manipulados pelo usuário do sistema por meio de interface gráfica. O objeto-modelo apresenta operações em sua interface para que o restante do sistema possa manipular seus dados; • View: um sistema de software pode apresentar aos usuários diversas visões de um mesmo objeto-modelo. Um exemplo é haver uma interface gráfica para editar as notas de um estudante de uma turma e outra interface gráfica para visualizar essas notas. Esse componente representa cada uma das possíveis formas de mostrar uma informação vinda do objeto-modelo; • Controller: cada objeto-visão tem a ele associado um objeto controlador, que ajuda na implementação de sua interface gráfica (BEZERRA, 2015). Fique atento(a) com o conceito de interface! Quando o termo é utilizado para objeto-visão, o conceito se refere à interface gráfica (de usuário), porém, quando o conceito é utilizado para objeto-modelo, o termo é utilizado para interface de objeto. Vale ressaltar que o MVC não é um padrão GoF. Na verdade, o MVC é um padrão de arquitetura de software desenvolvido para a linguagem de programação orientada a objetos chamada Smalltalk, podendo ser usado para qualquer sistema de software inte- rativo. Muitos frameworks de desenvolvimento adotaram o referido padrão arquitetural, principalmente os frameworks de desenvolvimento de aplicações Web. Para maiores informações sobre a linguagem de programação Smalltalk, você também pode explorar a partir do link https://goo.gl/7TTRxa Uma arquitetura de software recomendada para aplicações Web é a arquitetura em três camadas porque separa a interface da navegação e o comportamento da aplicação. Essa separação simplifica a implementação e aumenta a reutilização. O padrão MVC permite a separação da interface de usuário da funcionalidade e do conteúdo informa- cional de uma aplicação Web. (PRESSMAN e MAXIM, 2016) A figura 5 apresenta a arquitetura do padrão MVC, mostrando seus três compo- nentes: View (Visão), Controller (Controlador) e Model (Modelo). As solicitações são 14 15 manipuladas pelo controlador que também seleciona o objeto-visão aplicável, conforme a solicitação do usuário. Uma vez identificado o tipo de solicitação, uma solicitação de comportamento é enviada ao objeto-modelo que implementa a funcionalidade ou recu- pera o conteúdo necessário para atender à solicitação. O objeto-modelo acessa os dados armazenados em um banco de dados. Os dados gerados pelo objeto-modelo devem ser formatados e organizados pelo objeto-visão apropriado e enviados do servidor de aplica- ções de volta para o navegador para exibição no computador do usuário. Um dos conjuntos mais completos da Web em termos de padrões e linguagens de padrões pode ser encontrado em: https://goo.gl/W4Nf4o Controlador Gerencia solicitções do usuário Seleciona compostamento do modelo Seleciona resposta da visão Visão Prepara dados do modelo Solicita atualizações do modelo Apresenta a visão selecionada pelo controlador Modelo Encapsula funcionalidade Encapsula objetos de conteúdo Incorpora todos os estados da WebApp Navegador Seleção da visão Solicitação de atualização Dados externos Servidor Dados do modelo Solicitação de comportamento (mudança de estado) Requisição ou dados do usuário Cliente Dados HTNL Figura 5– A arquitetura do MVC O padrão de projeto de arquitetura MVC reúne padrões de projeto GoF como o padrão estrutural Composite e o padrão comportamental Observer. A figura 6 ilustra as comunicações existentes entre os três componentes do MVC, utilizando o padrão Composite entre os componentes Visão e Controlador e o padrão Observer entre os componentes Controlador e Modelo. O usuáro fez alguma coisa Mude o seu estado Mude os dados exibidos Já mudei Composite Observer Controlador class Player Play ( ) Rip ( ) burn ( ) OK Figura 6 – Relação entre o MVC e outros padrões de projeto Outras informações sobre a utilização do padrão arquitetural MVC podem ser encontradas em: https://goo.gl/QO4O5P 15 UNIDADE Padrões de Projeto e Model-View-Controller (MVC) Representação do MVC em um Diagrama de Classes Antes de representar o MVC em um diagrama de classes, nós vamos falar sobre o conceito de dependência, já que o referido conceito é modelado em um diagrama de classes de projeto. Assim, aproveitamos para explicar um pouco mais do refinamento do diagrama de classes de análise para o diagrama de classes de projeto. O relacionamento de dependência indica que uma classe depende dos serviços (operações) fornecidos por outra classe. Na visão de análise, é utilizada apenas a dependência estrutural (também chamada de dependência por atributo), na qual a classe dependente possui um atributo que é uma referência para a outra classe. A implementação padrão de um relacionamento de associação é por dependência estrutural. De qualquer forma, há também as dependências não estruturais: • Dependência por variável global: um objeto de escopo global é referenciado em algum método da classe dependente; • Dependência por variável local: um objeto recebe outro como retorno de um método, ou possui uma referência para o outro objeto como uma variável local em algum método; • Dependência por parâmetro: um objeto recebe outro como parâmetro em um método (BEZERRA, 2015). As dependências não estruturais também são representadas na UML, relacionan- do as classes envolvidas. O sentido é da classe dependente (cliente) para a classe da qual ela depende (fornecedora). São utilizados três tipos de estereótipos predefinidos: <<global>>, << local>>, << parameter>>. Cada estereótipo representa um tipo de dependência não estrutural. A figura 7 exibe um exemplo de utilização de dependência não estrutural por parâmetro. Observe que o objeto da classe A depende dos objetos das classes B e C, recebendo estes como parâmetros nas operações (métodos). Para maiores detalhes sobre dependências, você também pode explorar o livro Utilizan- do UML e padrões: uma introdução à análise e ao projeto orientados a objetos e ao desen- volvimento iterativo, de Larman (2007), disponibilizado na Biblioteca Virtual Pearson, disponível em: https://goo.gl/g72tci Classe A +oper 1 (in param: Classe C) +oper 2 (in param 1: Classe B, in param 2: Classe C) Classe B Classe C <<parameter>> <<parameter>> Figura 7 – Exemplo de uso de dependência não estrutural Em qual relacionamento entre classes você deve utilizar dependência estrutural? E a de- pendência não estrutural? 16 17 Bezerra (2005) entende que, ao longo do projeto de classes, é preciso avaliar, para cada relação de associação existente, se é possível transformá-la em uma dependência não estrutural. A dependência não estrutural aumenta o encapsulamento de cada classe e diminui o acoplamento entre elas, em contrapartida, o desempenho tende a ser menor. A dependência por atributo é uma forma mais forte de dependência, diminuindo o encap- sulamento e aumentando o acoplamento, porém, o desempenho tende a ser maior. Analisando as vantagens e desvantagens de cada tipo de dependência, é recomendável utilizar dependências estruturais entre as classes de modelo. Por outro lado, é recomendá- vel utilizar dependências não estruturais entre as classes de controle e as classes de modelo. Vamos, agora, exemplificar uma possibilidade de representação do padrão de ar- quitetura MVC em um diagrama de classes da UML. Para tal, vamos trabalhar com o diagrama de classes de projeto apresentado na Unidade 1 desta disciplina. Para você se lembrar do diagrama o qual estamos mencionando, o mesmo é mostrado na figura 8. Cliente - CPF: String - Nome: String - Telefone: String - E-mail: String + getCPF( ): boolean 1 * Locação - DataRetirada: Date - HoraRetirada: Time - DataDevolução: Date - HoraDevolução: Time - ValorLocação: Currency + getValorLocação( ): Currency Carro - Modelo: String - Chassi: String - Cor: String - Km: int - ValorDiária: Currency + getValorDiária( ): Currency * 1 Figura 8 – Diagrama de Classes de Análise As três classes existentes no diagrama de classes de projeto são classificadas como classes de modelo, pois correspondem à parte da aplicação que contém os objetos do domínio de negócio. Nesse caso, estão faltando as classes de visão para permitir ao usuário do sistema visualizar e manipular os dados e as classes controladoras que auxi- liam na implementação das classes de visão. As classes podem ser definidas por meio de estereótipos ou notações MVC. Para você associar melhor, a tabela 2 mostrevista uma correspondência entre os estereótipos e as notações. Tabela 2 – Correspondência entre estereótipos e notações MVC Estereótipo Notação MVC <<view>> View Controller Model <<controller>> <<model>> Fonte: Adaptado de Bezerra, 2015 A figura 10 apresenta uma representação do MVC em um diagrama de classes de projeto. As classes de modelo foram alocadas em dois pacotes Model. As classes 17 UNIDADE Padrões de Projeto e Model-View-Controller (MVC) controladoras foram alocadas no pacote Controller, enquanto as classes de visão foram agrupadas no pacote View. Observe, na figura, que as classes de modelo estão relacio- nadas por meio de dependência estrutural. Por outro lado, os pacotes estão relaciona- dos por meio de dependência não estrutural. Como tivemos o interesse de mostrar as propriedades das classes, definimos as classes de modelo com a notação convencional de classe, utilizando o estereótipo <<model>>. Já as classes de controle e de visão foram definidas com as notações típicas do MVC. Tela Locação Controle LocaçãoControle Cliente Tela Cliente <<model>> Locação - DataRetirada: Date - HoraRetirada: Time - DataDevolução: Date - HoraDevolução: Time - ValorLocação: Currency + getValorLocação( ): Currency <<model>> Carro - Modelo: String - Chassi: String - Cor: String - Km: int - ValorDiária: Currency + getValorDiária( ): Currency * 1 Locação model <<model>> Locação - DataRetirada: Date - HoraRetirada: Time - DataDevolução: Date - HoraDevolução: Time - ValorLocação: Currency + getValorLocação( ): Currency Cliente model View Controller Figura 9 – Representação do MVC em um diagrama de classes O diagrama de classes de projeto apresentado na figura 9 é relativamente simples por conta do número de classes utilizadas no exemplo. Mesmo assim, é possível verifi- car uma forma do padrão MVC ser representada em um diagrama de classes. Não se preocupe com o conceito de pacote, pois o mesmo será abordado na próxima unidade desta disciplina. Para maiores detalhes sobre a UML, você também pode explorar o livro UML Essencial: um breve guia para a linguagem-padrão de modelagem de objetos de Fowler (2005), disponi- bilizado na Biblioteca Virtual Pearson, em: https://goo.gl/g72tci 18 19 Material Complementar Indicações para saber mais sobre os assuntos abordados nesta Unidade: Sites The Hillside Group https://goo.gl/W4Nf4o Bibliotecas do Grupo Cruzeiro do Sul https://goo.gl/g72tci Leitura MVC https://goo.gl/QO4O5P Smalltalk https://pt.wikipedia.org/wiki/Smalltalk 19 UNIDADE Padrões de Projeto e Model-View-Controller (MVC) Referências BEZERRA, E. Princípios de Análise e Projeto de Sistemas com UML. 3.ed. São Paulo: Elsevier, 2015. BRAUDE, E. Projeto de software – da programação à arquitetura:uma abordagem baseada em Java. São Paulo: Bookman, 2005. FOWLER. M. UML Essencial: um breve guia para a linguagem-padrão de modelagem de objetos. 3.ed. Porto Alegre: Bookman, 2005. FREEMAN, E.; FREEMAN, E. Use a cabeça! Padrões de projetos. 2.ed. São Paulo: Alta Books, 2007. GAMMA, E.; HELM, R.; RALPH, J.; VLISSIDES, J. Padrões de projeto: soluções reutilizáveis de software orientado a objetos. Porto Alegre: Bookman, 2000. KERIEVSKY, J. Refatoração para padrões. Porto Alegre: Bookman, 2008. LARMAN, C. Utilizando UML e padrões: uma introdução à análise e ao projeto orientados a objetos e ao desenvolvimento iterativo. 3.ed. Porto Alegre: Bookman 2007. PRESSMAN, R. S.; MAXIM. B. R. Engenharia de software. 8.ed. Porto Alegre: AMGH, 2016 SOMMERVILLE, I. Engenharia de software. 9.ed. São Paulo: Pearson, 2011. 20
Compartilhar