padrão de design de software

Da Wikipédia, a enciclopédia livre
Ir para a navegação Pular para pesquisar

Na engenharia de software , um padrão de projeto de software é uma solução geral e reutilizável para um problema comum dentro de um determinado contexto no projeto de software . Não é um projeto acabado que pode ser transformado diretamente em código- fonte ou código de máquina . Em vez disso, é uma descrição ou modelo de como resolver um problema que pode ser usado em muitas situações diferentes. Os padrões de design são práticas recomendadas formalizadas que o programador pode usar para resolver problemas comuns ao projetar um aplicativo ou sistema.

Padrões de projeto orientados a objetos geralmente mostram relacionamentos e interações entre classes ou objetos , sem especificar as classes ou objetos finais do aplicativo envolvidos. Padrões que implicam estado mutável podem ser inadequados para linguagens de programação funcionais . Alguns padrões podem se tornar desnecessários em linguagens que possuem suporte embutido para resolver o problema que estão tentando resolver, e os padrões orientados a objetos não são necessariamente adequados para linguagens não orientadas a objetos.

Os padrões de projeto podem ser vistos como uma abordagem estruturada para a programação de computadores intermediária entre os níveis de um paradigma de programação e um algoritmo concreto .

História

Os padrões se originaram como um conceito arquitetônico de Christopher Alexander já em 1977 (cf. "The Pattern of Streets", JOURNAL OF THE AIP, setembro de 1977, vol. 32, nº 3, pp. 273–278). Em 1987, Kent Beck e Ward Cunningham começaram a experimentar a ideia de aplicar padrões à programação – especificamente linguagens de padrões – e apresentaram seus resultados na conferência da OOPSLA naquele ano. [1] [2] Nos anos seguintes, Beck, Cunningham e outros continuaram este trabalho.

Os padrões de projeto ganharam popularidade na ciência da computação depois que o livro Design Patterns: Elements of Reusable Object-Oriented Software foi publicado em 1994 pelo chamado "Gang of Four" (Gamma et al.), que é freqüentemente abreviado como "GoF". Nesse mesmo ano, foi realizada a primeira Conferência de Linguagens de Padrões de Programação e, no ano seguinte, o Repositório de Padrões de Portland foi criado para documentação de padrões de projeto. O escopo do termo permanece uma questão de disputa. Livros notáveis ​​no gênero padrão de design incluem:

  • Gama, Erich ; Helm, Ricardo ; Johnson, Ralph ; Vlissides, John (1994). Padrões de Projeto: Elementos de Software Reutilizável Orientado a Objetos . Addison-Wesley . ISBN 978-0-201-63361-0.
  • Brinch Hansen, Per (1995). Estudos em Ciência Computacional: Paradigmas de Programação Paralela . Prentice Hall. ISBN 978-0-13-439324-7.
  • Buschmann, Frank ; Meunier, Regina; Rohnert, Hans; Sommerlad, Peter (1996). Arquitetura de Software Orientada a Padrões, Volume 1: Um Sistema de Padrões . John Wiley & Filhos. ISBN 978-0-471-95869-7.
  • Beck, Kent (1997). Padrões de Melhores Práticas do Smalltalk . Prentice Hall. ISBN 978-0134769042.
  • Schmidt, Douglas C .; Stall, Michael; Rohnert, Hans; Buschmann, Frank (2000). Arquitetura de Software Orientada a Padrões, Volume 2: Padrões para Objetos Simultâneos e em Rede . John Wiley & Filhos. ISBN 978-0-471-60695-6.
  • Fowler, Martin (2002). Padrões de Arquitetura de Aplicativo Corporativo . Addison-Wesley . ISBN 978-0-321-12742-6.
  • Hohpe, Gregor; Woolf, Bobby (2003). Padrões de Integração Corporativa: Projetando, Construindo e Implantando Soluções de Mensagens . Addison-Wesley . ISBN 978-0-321-20068-6.
  • Freeman, Eric T.; Robson, Elisabeth; Bates, Bert; Serra, Kathy (2004). Use a Cabeça Padrões de Design . Mídia O'Reilly . ISBN 978-0-596-00712-6.

Embora os padrões de projeto tenham sido aplicados praticamente por um longo tempo, a formalização do conceito de padrões de projeto definhou por vários anos. [3]

Praticar

Os padrões de design podem acelerar o processo de desenvolvimento fornecendo paradigmas de desenvolvimento testados e comprovados. [4] O design de software eficaz requer a consideração de questões que podem não se tornar visíveis até mais tarde na implementação. O código recém-escrito geralmente pode ter problemas sutis ocultos que levam tempo para serem detectados, problemas que às vezes podem causar grandes problemas no futuro. A reutilização de padrões de projeto ajuda a evitar esses problemas sutis [5] e também melhora a legibilidade do código para codificadores e arquitetos familiarizados com os padrões.

Para obter flexibilidade, os padrões de projeto geralmente introduzem níveis adicionais de indireção , o que, em alguns casos, pode complicar os projetos resultantes e prejudicar o desempenho do aplicativo.

Por definição, um padrão deve ser programado novamente em cada aplicativo que o utiliza. Como alguns autores veem isso como um retrocesso em relação à reutilização de software fornecida pelos componentes , os pesquisadores trabalharam para transformar padrões em componentes. Meyer e Arnout foram capazes de fornecer componentização total ou parcial de dois terços dos padrões que tentaram. [6]

As técnicas de projeto de software são difíceis de aplicar a uma gama mais ampla de problemas. [ carece de fontes ] Padrões de projeto fornecem soluções gerais, documentadas em um formato que não requer detalhes vinculados a um problema específico.

Estrutura

Os padrões de projeto são compostos de várias seções (consulte § Documentação abaixo). De particular interesse são as seções Estrutura, Participantes e Colaboração. Estas seções descrevem um motivo de projeto : uma microarquitetura prototípica que os desenvolvedores copiam e adaptam a seus projetos particulares para resolver o problema recorrente descrito pelo padrão de projeto. Uma micro-arquitetura é um conjunto de constituintes do programa (por exemplo, classes, métodos...) e seus relacionamentos. Os desenvolvedores usam o padrão de design introduzindo em seus projetos essa microarquitetura prototípica, o que significa que as microarquiteturas em seus projetos terão estrutura e organização semelhantes ao motivo de design escolhido.

Padrões específicos de domínio

Esforços também foram feitos para codificar padrões de projeto em domínios específicos, incluindo o uso de padrões de projeto existentes, bem como padrões de projeto específicos de domínio. Os exemplos incluem padrões de design de interface do usuário , [7] visualização de informações , [8] design seguro, [9] "usabilidade segura", [10] Web design [11] e design de modelo de negócios. [12]

Os procedimentos anuais da conferência Pattern Languages ​​of Programming [13] incluem muitos exemplos de padrões específicos de domínio.

Classificação e lista

Os padrões de design foram originalmente categorizados em 3 subclassificações com base no tipo de problema que eles resolvem. Os padrões de criação fornecem a capacidade de criar objetos com base em um critério necessário e de maneira controlada. Os padrões estruturais tratam da organização de diferentes classes e objetos para formar estruturas maiores e fornecer novas funcionalidades. Finalmente, os padrões comportamentais tratam da identificação de padrões comuns de comunicação entre objetos e da percepção desses padrões.

Padrões de criação

Nome Descrição Em Padrões de Projeto Em Código Completo [14] Outro
fábrica abstrata Forneça uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas. Sim Sim
Construtor Separe a construção de um objeto complexo de sua representação, permitindo que o mesmo processo de construção crie várias representações. Sim Não
Injeção de dependência Uma classe aceita os objetos que requer de um injetor em vez de criar os objetos diretamente. Não Não
Método de fábrica Defina uma interface para criar um único objeto, mas deixe as subclasses decidirem qual classe instanciar. O Factory Method permite que uma classe adie a instanciação para subclasses. Sim Sim
Inicialização preguiçosa Tática de atrasar a criação de um objeto, o cálculo de um valor ou algum outro processo caro até a primeira vez em que for necessário. Este padrão aparece no catálogo GoF como "proxy virtual", uma estratégia de implementação para o padrão Proxy . Não Não PoEAA [15]
Multiton Certifique-se de que uma classe tenha apenas instâncias nomeadas e forneça um ponto de acesso global a elas. Não Não
Conjunto de objetos Evite a aquisição cara e a liberação de recursos reciclando objetos que não estão mais em uso. Pode ser considerado uma generalização dos padrões pool de conexão e pool de threads . Não Não
Protótipo Especifique os tipos de objetos a serem criados usando uma instância prototípica e crie novos objetos a partir do 'esqueleto' de um objeto existente, aumentando assim o desempenho e mantendo o mínimo de consumo de memória. Sim Não
A aquisição de recursos é a inicialização (RAII) Certifique-se de que os recursos sejam liberados adequadamente, vinculando-os à vida útil de objetos adequados. Não Não
solteiro Certifique-se de que uma classe tenha apenas uma instância e forneça um ponto de acesso global a ela. Sim Sim

Padrões estruturais

Nome Descrição Em Padrões de Projeto Em Código Completo [14] Outro
Adaptador , Wrapper ou Tradutor Converta a interface de uma classe em outra interface que os clientes esperam. Um adaptador permite que as classes trabalhem juntas, o que não poderia acontecer devido a interfaces incompatíveis. O equivalente do padrão de integração empresarial é o tradutor. Sim Sim
Ponte Desacople uma abstração de sua implementação, permitindo que os dois variem independentemente. Sim Sim
Composto Componha objetos em estruturas de árvore para representar hierarquias parte-todo. O Composite permite que os clientes tratem objetos individuais e composições de objetos uniformemente. Sim Sim
Decorador Anexar responsabilidades adicionais a um objeto mantendo dinamicamente a mesma interface. Os decoradores fornecem uma alternativa flexível à subclasse para estender a funcionalidade. Sim Sim
Objeto de extensão Adicionar funcionalidade a uma hierarquia sem alterar a hierarquia. Não Não Desenvolvimento Ágil de Software, Princípios, Padrões e Práticas [16]
Fachada Forneça uma interface unificada para um conjunto de interfaces em um subsistema. Facade define uma interface de nível superior que torna o subsistema mais fácil de usar. Sim Sim
Peso Mosca Use o compartilhamento para suportar um grande número de objetos semelhantes de forma eficiente. Sim Não
Controlador frontal O padrão está relacionado ao design de aplicativos da Web. Ele fornece um ponto de entrada centralizado para lidar com solicitações. Não Não

Padrões J2EE [17] PoEAA [18]

Marcador Interface vazia para associar metadados a uma classe. Não Não Java eficaz [19]
Módulo Agrupe vários elementos relacionados, como classes, singletons, métodos, usados ​​globalmente, em uma única entidade conceitual. Não Não
Proxy Forneça um substituto ou espaço reservado para outro objeto para controlar o acesso a ele. Sim Não
Gêmeo [20] Twin permite a modelagem de herança múltipla em linguagens de programação que não suportam esse recurso. Não Não

Padrões de comportamento

Nome Descrição Em Padrões de Projeto Em Código Completo [14] Outro
Quadro-negro Padrão de inteligência artificial para combinar fontes de dados diferentes (consulte sistema de quadro-negro ) Não Não
Cadeia de responsabilidade Evite acoplar o remetente de uma solicitação ao seu destinatário, dando a mais de um objeto a chance de lidar com a solicitação. Encadeie os objetos receptores e passe a solicitação ao longo da cadeia até que um objeto a trate. Sim Não
Comando Encapsule uma solicitação como um objeto, permitindo assim a parametrização de clientes com diferentes solicitações e o enfileiramento ou registro de solicitações. Ele também permite o suporte de operações reversíveis. Sim Não
Intérprete Dado um idioma, defina uma representação para sua gramática junto com um intérprete que usa a representação para interpretar sentenças no idioma. Sim Não
Iterador Forneça uma maneira de acessar os elementos de um objeto agregado sequencialmente sem expor sua representação subjacente. Sim Sim
Mediador Defina um objeto que encapsula como um conjunto de objetos interage. O mediador promove acoplamento fraco , impedindo que os objetos se refiram explicitamente, e permite que sua interação varie de forma independente. Sim Não
Lembrança Sem violar o encapsulamento, capture e externalize o estado interno de um objeto, permitindo que o objeto seja restaurado a esse estado posteriormente. Sim Não
objeto nulo Evite referências nulas fornecendo um objeto padrão. Não Não
Observer ou Publicar/assinar Defina uma dependência um-para-muitos entre objetos onde uma mudança de estado em um objeto resulta em todos os seus dependentes sendo notificados e atualizados automaticamente. Sim Sim
Servo Defina a funcionalidade comum para um grupo de classes. O padrão de servo também é frequentemente chamado de classe auxiliar ou implementação de classe utilitária para um determinado conjunto de classes. As classes auxiliares geralmente não têm objetos, portanto, elas têm todos os métodos estáticos que agem sobre diferentes tipos de objetos de classe. Não Não
Especificação Lógica de negócios recombinável de maneira booleana . Não Não
Estado Permite que um objeto altere seu comportamento quando seu estado interno muda. O objeto parecerá mudar de classe. Sim Não
Estratégia Definir uma família de algoritmos, encapsular cada um e torná-los intercambiáveis. A estratégia permite que o algoritmo varie independentemente dos clientes que o utilizam. Sim Sim
Método de modelo Defina o esqueleto de um algoritmo em uma operação, adiando algumas etapas para subclasses. O método Template permite que as subclasses redefinam certas etapas de um algoritmo sem alterar a estrutura do algoritmo. Sim Sim
Visitante Representa uma operação a ser executada em instâncias de um conjunto de classes. Visitor permite definir uma nova operação sem alterar as classes dos elementos sobre os quais opera. Sim Não
Interface Fluente Projete uma API para ser encadeada por métodos de modo que seja lida como uma DSL. Cada chamada de método retorna um contexto por meio do qual as próximas chamadas de método lógico são disponibilizadas. Não Não

Padrões de simultaneidade

Nome Descrição Em POSA2 [21] Outro
Objeto ativo Separa a execução do método da invocação do método que reside em seu próprio thread de controle. O objetivo é introduzir a simultaneidade, usando invocação de método assíncrono e um agendador para lidar com solicitações. Sim
hesitação Somente execute uma ação em um objeto quando o objeto estiver em um estado específico. Não
Propriedades de ligação Combinar vários observadores para forçar as propriedades em diferentes objetos a serem sincronizadas ou coordenadas de alguma forma. [22] Não
Kernel de computação O mesmo cálculo muitas vezes em paralelo, diferindo por parâmetros inteiros usados ​​com matemática de ponteiro sem ramificação em matrizes compartilhadas, como multiplicação de matriz otimizada para GPU ou rede neural convolucional . Não
Bloqueio duplamente verificado Reduza a sobrecarga de adquirir um bloqueio testando primeiro o critério de bloqueio (a 'dica de bloqueio') de maneira insegura; somente se isso for bem-sucedido, a lógica de bloqueio real continuará.

Pode ser inseguro quando implementado em algumas combinações de linguagem/hardware. Portanto, às vezes pode ser considerado um antipadrão .

Sim
Assíncrono baseado em evento Aborda problemas com o padrão assíncrono que ocorrem em programas multithread. [23] Não
Suspensão vigiada Gerencia as operações que exigem a aquisição de um bloqueio e a satisfação de uma pré-condição antes que a operação possa ser executada. Não
Juntar Join-pattern fornece uma maneira de escrever programas simultâneos, paralelos e distribuídos por passagem de mensagem. Comparado ao uso de threads e bloqueios, esse é um modelo de programação de alto nível. Não
Trancar Um thread coloca um "bloqueio" em um recurso, impedindo que outros threads o acessem ou modifiquem. [24] Não PoEAA [15]
Padrão de design de mensagens (MDP) Permite o intercâmbio de informações (ou seja, mensagens) entre componentes e aplicativos. Não
Monitorar objeto Um objeto cujos métodos estão sujeitos a exclusão mútua , evitando assim que vários objetos tentem erroneamente usá-lo ao mesmo tempo. Sim
reator Um objeto reator fornece uma interface assíncrona para recursos que devem ser tratados de forma síncrona. Sim
Bloqueio de leitura e gravação Permite acesso simultâneo de leitura a um objeto, mas requer acesso exclusivo para operações de gravação. Um semáforo subjacente pode ser usado para gravação e um mecanismo Copy-on-write pode ou não ser usado. Não
Agendador Controle explicitamente quando os threads podem executar código de thread único. Não
Grupo de discussão Vários threads são criados para executar várias tarefas, que geralmente são organizadas em uma fila. Normalmente, há muito mais tarefas do que threads. Pode ser considerado um caso especial do padrão pool de objetos . Não
Armazenamento específico do encadeamento Memória estática ou "global" local para um thread. Sim
Simultaneidade segura com propriedade exclusiva Evita a necessidade de mecanismos simultâneos de tempo de execução, porque a propriedade exclusiva pode ser comprovada. Esta é uma capacidade notável da linguagem Rust, mas a verificação em tempo de compilação não é o único meio, um programador frequentemente projetará manualmente tais padrões no código - omitindo o uso do mecanismo de bloqueio porque o programador avalia que uma determinada variável nunca vai para serem acessados ​​simultaneamente. Não
Operação atômica da CPU x86 e outras arquiteturas de CPU suportam uma variedade de instruções atômicas que garantem a segurança da memória para modificar e acessar valores primitivos (inteiros). Por exemplo, dois threads podem incrementar um contador com segurança. Esses recursos também podem ser usados ​​para implementar os mecanismos para outros padrões de simultaneidade como acima. A linguagem C# usa a classe Interlocked para esses recursos. Não

Documentação

A documentação de um padrão de projeto descreve o contexto no qual o padrão é usado, as forças dentro do contexto que o padrão procura resolver e a solução sugerida. [25] Não existe um formato padrão único para documentar padrões de projeto. Em vez disso, uma variedade de formatos diferentes foi usada por diferentes autores de padrões. No entanto, de acordo com Martin Fowler , certas formas de padrões tornaram-se mais conhecidas do que outras e, consequentemente, tornaram-se pontos de partida comuns para novos esforços de escrita de padrões. [26] Um exemplo de formato de documentação comumente usado é o usado por Erich Gamma , Richard Helm , Ralph Johnson e John Vlissidesem seu livro Design Patterns . Ele contém as seguintes seções:

  • Nome e classificação do padrão: Um nome descritivo e exclusivo que ajuda na identificação e referência ao padrão.
  • Intenção: Uma descrição do objetivo por trás do padrão e a razão para usá-lo.
  • Também conhecido como: Outros nomes para o padrão.
  • Motivação (Forças): Um cenário que consiste em um problema e um contexto no qual esse padrão pode ser usado.
  • Aplicabilidade: Situações em que este padrão é utilizável; o contexto para o padrão.
  • Estrutura: Uma representação gráfica do padrão. Diagramas de classe e diagramas de interação podem ser usados ​​para essa finalidade.
  • Participantes: Uma listagem das classes e objetos usados ​​no padrão e suas funções no projeto.
  • Colaboração: Uma descrição de como classes e objetos usados ​​no padrão interagem uns com os outros.
  • Consequências: Uma descrição dos resultados, efeitos colaterais e trade-offs causados ​​pelo uso do padrão.
  • Implementação: Uma descrição de uma implementação do padrão; a parte solução do padrão.
  • Código de Amostra: Uma ilustração de como o padrão pode ser usado em uma linguagem de programação.
  • Usos conhecidos: Exemplos de usos reais do padrão.
  • Padrões Relacionados: Outros padrões que possuem alguma relação com o padrão; discussão das diferenças entre o padrão e padrões semelhantes.

Crítica

Foi observado que os padrões de projeto podem ser apenas um sinal de que alguns recursos estão faltando em uma determinada linguagem de programação ( Java ou C++ , por exemplo). Peter Norvig demonstra que 16 dos 23 padrões no livro Design Patterns (que é focado principalmente em C++) são simplificados ou eliminados (via suporte direto à linguagem) em Lisp ou Dylan . [27] Observações relacionadas foram feitas por Hannemann e Kiczales que implementaram vários dos 23 padrões de projeto usando uma linguagem de programação orientada a aspectos(AspectJ) e mostrou que as dependências em nível de código foram removidas das implementações de 17 dos 23 padrões de projeto e que a programação orientada a aspectos poderia simplificar as implementações de padrões de projeto. [28] Veja também o ensaio de Paul Graham "Revenge of the Nerds". [29]

O uso inadequado de padrões pode aumentar desnecessariamente a complexidade. [30]

Veja também

Referências

  1. ^ Smith, Reid (outubro de 1987). Painel sobre metodologia de design . Adendo OOPSLA '87 aos Processos. doi : 10.1145/62138.62151 . Ward alertou contra exigir muita programação no que ele chamou de "alto nível de magos". Ele apontou que uma 'linguagem padrão' escrita pode melhorar significativamente a seleção e aplicação de abstrações. Ele propôs uma 'mudança radical na carga de design e implementação' baseando a nova metodologia em uma adaptação do trabalho de Christopher Alexander em linguagens de padrão e que as linguagens de padrão orientadas à programação desenvolvidas na Tektronix ajudaram significativamente seus esforços de desenvolvimento de software.
  2. ^ Beck, Kent ; Cunningham, Ward (setembro de 1987). Usando Linguagens Padrão para Programa Orientado a Objetos . Oficina OOPSLA '87 sobre Especificação e Design para Programação Orientada a Objetos . Recuperado em 26/05/2006 .
  3. ^ Baroni, Aline Lúcia; Guéhéneuc, Yann-Gaël; Albin-Amiot, Hervé (junho de 2003). "Formalização de Padrões de Projeto". Nantes : École Nationale Supérieure des Techniques Industrielles et des Mines de Nantes. CiteSeerX 10.1.1.62.6466 .  {{cite journal}}:Citar diário requer |journal=( ajuda )
  4. ^ Bispo, Judite. "Padrões de design C# 3.0: use o poder do C# 3.0 para resolver problemas do mundo real" . Livros C# da O'Reilly Media . Recuperado 2012-05-15 . Se você deseja acelerar o desenvolvimento de seus aplicativos .NET, está pronto para os padrões de design C# -- maneiras elegantes, aceitas e comprovadas de lidar com problemas comuns de programação.
  5. ^ Tiako, Pierre F. (31 de março de 2009). "Modelagem formal e especificação de padrões de projeto usando RTPA" . Em Tiako, Pierre F (ed.). Aplicações de Software: Conceitos, Metodologias, Ferramentas e Aplicações: Conceitos, Metodologias, Ferramentas e Aplicações . pág. 636. doi : 10.4018/978-1-60566-060-8 . ISBN 9781605660615.
  6. ^ Meyer, Bertrand ; Arnout, Karine (julho de 2006). "Componentização: o exemplo do visitante" (PDF) . Computador IEEE . 39 (7): 23–30. CiteSeerX 10.1.1.62.6082 . doi : 10.1109/MC.2006.227 . S2CID 15328522 .   
  7. ^ Laakso, Sari A. (16/09/2003). "Coleção de padrões de design de interface do usuário" . Universidade de Helsinque, Departamento de Ciência da Computação . Recuperado 2008-01-31 .
  8. ^ Heer, J.; Agrawala, M. (2006). "Padrões de design de software para visualização de informações" . IEEE Transações em Visualização e Computação Gráfica . 12 (5): 853–60. CiteSeerX 10.1.1.121.4534 . doi : 10.1109/TVCG.2006.178 . PMID 17080809 . S2CID 11634997 .   
  9. ^ Dougherty, Chade; Sayre, Kirk; Seacord, Robert C.; Svoboda, David; Togashi, Kazuya (2009). Padrões de Design Seguros (PDF) . Instituto de Engenharia de Software.
  10. ^ Garfinkel, Simson L. (2005). Princípios e padrões de design para sistemas de computador simultaneamente seguros e utilizáveis ​​(tese de doutorado).
  11. ^ "Yahoo! Biblioteca de padrões de design" . Arquivado do original em 29/02/2008 . Recuperado 2008-01-31 .
  12. ^ "Como projetar seu modelo de negócios como uma startup enxuta?" . 06/01/2010 . Recuperado 2010-01-06 .
  13. Linguagens padrão de programação, anais da conferência (anual, 1994—) [1]
  14. ^ a b c McConnell, Steve (junho de 2004). "Projeto na Construção". Código Completo (2ª ed.). Imprensa Microsoft . pág. 104 . ISBN 978-0-7356-1967-8. Tabela 5.1 Padrões de projeto populares
  15. ^ a b Fowler, Martin (2002). Padrões de Arquitetura de Aplicativo Corporativo . Addison-Wesley . ISBN  978-0-321-12742-6.
  16. ^ C. Martin, Robert (2002). "28. Objeto de extensão" . Desenvolvimento Ágil de Software, Princípios, Padrões e Práticas . pág. 408 . ISBN  978-0135974445.
  17. ^ Alur, Deepak; CRUPI, João; Malks, Dan (2003). Core J2EE Patterns: Melhores Práticas e Estratégias de Design . Prentice Hall . pág. 166. ISBN  978-0-13-142246-9.
  18. ^ Fowler, Martin (2002). Padrões de Arquitetura de Aplicativo Corporativo . Addison-Wesley . pág. 344. ISBN  978-0-321-12742-6.
  19. ^ Bloch, Josué (2008). "Item 37: Use interfaces de marcador para definir tipos" . Java Eficaz (Segunda ed.). Addison-Wesley. pág. 179 . ISBN  978-0-321-35668-0.
  20. ^ "Twin - Um padrão de design para modelagem de herança múltipla" (PDF) .
  21. ^ Schmidt, Douglas C.; Stall, Michael; Rohnert, Hans; Buschmann, Frank (2000). Arquitetura de Software Orientada a Padrões, Volume 2: Padrões para Objetos Simultâneos e em Rede . John Wiley & Filhos. ISBN 978-0-471-60695-6.
  22. ^ Propriedades de encadernação
  23. ^ Nagel, cristão; Evjen, Bill; Glynn, Jay; Watson, Karli; Skinner, Morgan (2008). "Padrão assíncrono baseado em evento". Profissional C# 2008 . Wiley. pp. 570–571. ISBN 978-0-470-19137-8.
  24. ^ Padrão de Bloqueio
  25. ^ Gabriel, Dick . "Uma definição de padrão" . Arquivado do original em 2007-02-09 . Recuperado 2007-03-06 .
  26. ^ Fowler, Martin (2006-08-01). "Escrevendo Padrões de Software" . Recuperado 2007-03-06 .
  27. ^ Norvig, Peter (1998). Padrões de Projeto em Linguagens Dinâmicas .
  28. ^ Hannemann, janeiro ; Kiczales, Gregor (2002). "Implementação de padrões de design em Java e AspectJ" . Proceedings of the 17th ACM SIGPLAN Conference on Object-oriented Programming, Systems, Languages, and Applications - OOPSLA '02 . OOPSLA '02. pág. 161. doi : 10.1145/582419.582436 . ISBN 1581134711.{{cite conference}}: Manutenção CS1: localização ( link )
  29. ^ Graham, Paul (2002). "A Vingança dos Nerds" . Recuperado 2012-08-11 .
  30. ^ McConnell, Steve (2004). Código Completo: Um Manual Prático de Construção de Software, 2ª Edição . pág. 105 .

Leitura adicional

0.062723875045776