Framework
Um framework é uma abstração em que um código providencia uma funcionalidade genérica que pode ser selecionadamento sobrescrita ou especializada pelo usuário providenciando um funcionalidade em específico. Frameworks são um caso especial de bibliotecas de software em que abstrações reusáveis de código envolvidos em uma API (Application Programming Interface) bem definida, mas que ainda contém algumas característcias que as distinguem da de bibliotecas comuns.
Algumas dessas característricas são:
- Inversão de Controle: diferente de bibliotecas e applicações comuns de usuários a maioria do controle de fluxo do programa é ditado pelo framework e não por quem usa o framework.
- Comportamento Padrão: frameworks possuem um comportamento padrão, e esse comportamento padrão deve ser algo útil.
- Extensibilidade: frameworks podem ser extendidos pelo usuário, geralmente por uma sobrescrita seletiva ou específica pelo usuário providenciando uma funcionalidade específica.
- Código não modificável: o código do framework em geral, não é permitido que seja modificado. Usuários podem extender o framework, mas não modificá-lo.
Com essas características, os frameworks oferecem vantagens e desvantagens, algumas delas são:
Vantagens:
Reusa código que já foi pré-contruído e pré-testado. Assim ele oferece mais segurança e da aplicação funcionar corretamente, reduz o esforço de programação e teste, e também oferece rapidez para ter um produto ou serviço funcional.
O framework pode ajudar a estabelecer uma melhor prática de programação e o uso apropriado de padrões de projetose novas ferramentas de programação. Uma atualização de framework pode providenciar novas funcionalidades, uma melhor performance ou uma melhor qualidade sem nenhum trabalho adicional por parte do usuário do framework.
Por definição o framework providencia meios para extender o seu comportamento.
Desvantagens:
- Criar um framework é trabalho e demora muito.
- A curva de aprendizado de um framework pode ser bem inclinada.
- Com o tempo, um framework pode se tornar bem complexo.
Padrões de Projeto
O que são Padrões de Projetos?
Design Patterns ou Padrões de Projetos, providenciam soluções para problemas que são comuns no design de software. Em programação orientado a objetos, os Padrões de Projetos são geralmente direcionados para resolver problemas em relação a geração e interação de objetos. Eles nos dão soluções generalizadas na forma de templates que podem ser aplicados a problemas do mundo real.
Padrões de Projetos são uma ferramenta poderosa para desenvolvedores de software. Mas ele não devem serem vistos como uma receita para o software. É mais importante entender os conceitos que o os Padrões de Projetos descrevem, do que memorizar as suas classes, métodos e propriedades. É também importante aplicar os padrões apropriadamente. Usar um padrão incorreto pode a uma situação ou usá-lo em um problema trivial pode complicar o problema mais ainda e levar a problemas de manutenção do código.
Padrões de Projeto a serem abordados
Os 23 Padrões de Projetos que serão abordados nesse documento foram definidos e no livro "Design Patterns: Elements of Reusable Object Oriented Software", escrito por Erich Gamma, Richard Helm, Ralp Johnson e John Vlissides, mais conhecidos como Gang of Four.
- Padrões Criacionistas: providenciam um método de instanciar um único objeto ou um grupo de objetos relacionados.
- Abstract Factory: usado para providenciar um cliente com um conjunto de objetos relacionados ou dependentes. A "família" de objetos são determinados em tempo de execução.
- Builder: é usado para criar objetos complexos com partes integrantes que devem ser criados em uma ordem ou seguindo um algoritmo. Uma classe externa controla a construção do algoritmo.
- Factory Method: é usado para substituir os contrutores das classes, abstraindos o processo de geração do objeto para que o tipo do objeto a ser instanciado possa ser determinado em tempo de execução.
- Prototype: usado para instanciar um novo objeto copiando todas as propriedades de um objeto existente, criando um clone independente. Essa prática é particularmente útil quando a construção de um objeto é insuficiente.
- Singleton: esse padrão assegura que somente uma instancia de uma classe seja criada. Todas as próximas referências à uma classe do Singleton vão se referir à mesma instancia da classe.
- Padrões Estruturais: providenciam um jeito de definir relações entre as classes e objetos.
- Adapter: usado para providenciar uma ligação entre dois tipos não-compatíveis envolvendo o "adaptando" em uma classe que suporta a interface exigida pelo cliente.
- Bridge: esse padrão é usado para separar os elementos abstratos de uma classe dos detalhes de implementação, providenciando meios de substituir os detalhes de implementação sem modificar a abstração.
- Composite: é usado para criar estruturas de árvores recursivas e hierárquicas de objetos relacionados em que qualquer elemento da estrutura pode ser acessada e usadas de uma maneira padrão.
- Decorator: usado para extender ou alterar a funcionalidade dos objetos em tempo de execução envolvendo-os em um objeto da classe Decorator. Isso providencia uma alternativa flexível ao uso de herança para modificar comportamento.
- Facade: esse padrão define uma interdace mais simplifacada para um subsistema mais complexo.
- Flyweight: usado para reduzir o uso de memória e recursos para modelos complexos contendo milhares de milhares de objetos similares.
- Proxy: usado para providenciar um objeto substituto que referencia o objeto verdadeiro. O Proxy providencia a mesma interface pública do que a classe do objeto em questão, adicionando um nível de indireção ao aceitar requisições de objetos clientes e os passando para o objeto real.
- Padrões Comportamentais: definem métodos de comunicação entre métodos e objetos.
- Chain of Responsability: é usado para processar uma variedade de requisições, em que cada pode ser gerenciado por handlers diferentes.
- Command: usado para expressar uma requisição, incluindo a chamada a ser feita e todos os parâmetros requiridos em um comando de objeto. O comando pode então ser executado imediatamente ou guardado para uso posterior.
- Interpreter: usado para definir gramáticas para instruções que formam parte de uma linguagem ou uma notação, ao mesmo tempo que possibilita a gramática de ser facilmente extendida.
- Iterator: usado para definir uma interface padrão para iterar em uma coleção de dados em um objeto agregado sem a necessidade de entender como o mesmo é implementado.
- Mediator: usado para a comunicação entre classes. Invés das classes se comunicarem diretamento, requirindo um conhecimento da sua implementação, eles mandam e recebem mensagens de um objeto Mediator.
- Memento: usado para capturar o estado de um objeto de uma maneira que possa ser restaurado posteriormente sem quebrar as regras de encapsulamento.
- Observer: esse padrão é usado para permitir que o objeto publique mudanças do seu estado. Outros objetos podem estar associados para serem notificados caso haja alguma mudança.
- State: usado para alterar o comportamento do objeto assim que o seu estado interno mudar. Esse padrão possibita que um objeto pareça se modificar em tempo de execução.
- Strategy: esse padrão é usado para criar uma família de algoritmos intermudáveis, em que o processo requerido é escolhido em tempo de execução.
- Template Method: usado para definir passos básicos de um algoritmo e deixa que a implementação de um passo individual seja modificada.
- Visitor: usado para separar um conjunto de classes de dados estruturados relativamente complexos da funcionalidade que pode ser executada sobre os dados que elas armazenam.