Kategóriák: Minden - criação

a Rodrigo Pysklyvicz 5 éve

374

Princípios Desenvolvimento

A aplicação de diferentes padrões de design é fundamental para a criação de sistemas de software robustos e flexíveis. Entre esses padrões, destacam-se os comportamentais, arquiteturais, de criação e estruturais.

Princípios Desenvolvimento

Princípios de Desenvolvimento

Temas

SOLID
OOP
Composição x Herança visual - Rodrigo
Herança & polimorfismo
Padrões Arquiteturais
MVVM - Carlos
MVC
MVP - Carlos
Padrões comportamentais
Visitor
Template Method
Strategy
State - Luan
Observer - James
Memento - Carlos
Mediator - Rodrigo
Iterator
Interpreter - Alexandre
Command
Chain of Responsibility - Wellynton
Padrões estruturais
Proxy
Flyweight - Alexandre
Business Delegate - Wellynton
Façade (ou Facade)
Decorator
Composite - Rodrigo
Bridge - James
Adapter - Luan
Private class data
Padrões de criação
Singleton
Prototype - James
Factory Method - Wellynton
Builder - Carlos
Object pool - Luan
Abstract Factory - Alexandre

Equipe responsável

Aguardando aprovação
Carlos Zocante
Integrantes
Wellynton Diniz
Rodrigo Pysklyvicz
Luan Baleeiro
James Strohhaecker
Alexandre Schmidt

Checklists

Possíveis objeções
"Nem todos os programadores programam usando padrão"

Estamos vivendo uma fase intermediária onde não havia preocupação em aplicar os padrões - com o tempo e treinamento a tendência é que todos passemos a aplicar

"O legado nos limita"

Porém devemos lembrar que sempre iniciamos código novo, e nesse caso podemos aplicar os conceitos que aprendemos

Para código existente isso realmente é um fato - se a empresa autorizar podemos iniciar refatorações

"É mais fácil se fizer de forma mais 'direta'"

Ao reduzirmos o acoplamento conseguimos aumentar consideravelmente o reaproveitamento de código

Ao separarmos melhor as coisas por conceitos como model e visual facilitamos a manutenção

Ao separar as rotinas que se atualizam frequentemente das outras que se lidam muito pouco - diminuímos o risco de futuras alterações implicarem negativamente no sistema

Num primeiro momento é realmente mais fácil, porém trabalhando com as boas práticas ganhamos esses 3 super benefícios:

"Não temos tempo"

Essa questão depende diretamente da cultura atual da empresa

Dimensionamento dos prazos
Fases

Prever tempo destinado a reuniões, aulas, etc

Agendar refatorações futuras

Teste - retorno - o ponto de execução pode depender de condições específicas

Refatorações ou desenvolvimento de recursos - tipo: simples, médio, complexo

Compreender e planejar micro situações em correspondência com as macros

Definir escopo: criação de recursos, novas rotinas ou refatorações

Levantamento de requisitos

Veja "Para Novas Soluções"

Para Novas Soluções
Aproveitar o conhecimento de

Equipe de desenvolvimento

Todas as equipes

Clientes

Outras empresas

Especialistas

Comunidades

Princípio do Baixo Acoplamento

Programar para interfaces e não para implementações

Usar o bom senso na hora de aplicar esse conceito, pois trabalhar 100% orientado a interfaces demanda muita energia e tempo

Quando é evitada... A herança de implementação; A instanciação direta de um objeto dentro de uma outra classe; A injeção de dependência por meio de classes e não de interfaces

2) Ter classes feitas exclusivamente para manipular as interfaces

1) Criar o contrato (interface) Exemplo: TGeraArquivo = interface procecure Execute()

Depender de interfaces torna possível usar qualquer implementação, aumentando assim o reaproveitamento de código e tornando mais simples o entendimento da ligação entre as classes

Vídeo explicativo - https://www.youtube.com/watch?v=D-Bt3sNG0OY
Padrão SOLID - Princípio da Inversão de Dependência

Princípio Aberto/Fechado

Trabalhar com o objeto ao invés de partes dele

Caso a classe não possua propriedades auxiliares como _Descricao ou _Quantidade

Ao invés de criar por exemplo o campo IdProduto e DescricaoProduto na classe TItemVenda, usar o objeto Produto direto

Usar o objeto inteiro é melhor porque ele já possui todas as informações do domínio em questão - evitando assim também o copy/cola de algumas de suas propriedades para outro objeto

Evitar que as classes que contenham implementação sejam herdadas

Quando a Classse pai possui zero implementação

É praticamente impossível na maioria dos casos escrever algo na filha sem saber o que está na pai

Por conta do forte acoplamento com a implementação que está na classe pai

Trabalhar com estruturas abstratas, isto é, com 0% de implementação

Quando não há herança de implementação (somente de estrutura)

O cliente não pode ter nenhum tipo de trabalho com a estrutura

A estrutura não pode ter nenhum tipo de implementação

3) E por último classes que implementam a estrutura citada - esse trabalho é feito por quem chamamos de cliente

2) Ter classes feitas exclusivamente para manipular essas estruturas

1) Usando interfaces ou classes abstratas sem nenhuma implementação - prefira o primeiro. Exemplo: TGeraArquivo = interface procecure Execute()

Separar a programação estrutural da programação da implementação

Regras de ouro dos Design Patterns

Evite herança, prefira composição

Programe voltado a interface e não à implementação

Princípio da Responsabilidade Única

Classes com papel bem definido

O método ter no máximo 20 linhas

A classe ter no máximo 12 métodos - mais do que isso procurar quebrar em classes menores

Caso a classe não misture códigos de diferentes domínios como Model, View, DAO, etc

Caso a classe não possua mais de um motivo para existir

Dividir um problema em domínios menores e criar uma classe para cada um desses domínios

Passar a criar classes e métodos especialistas no que fazem - classes assim são mais fáceis de compreender e dar manutenção

Evitar o uso de Typecast o quanto for possível

Quando os únicos Typecasts encontrados são de tipos primários ou de solução de terceiros como VCL, RTTI e outros.

Usar o Padrão Façade quando há a necessidade de um retorno comum para objetos diferentes entre si.

Evitar o uso de por exemplo: var LPai: TPai; LPai := TFilho.Create(); TFilho(LPai).AlgumMetodo; ...e trabalhar diretamente com o tipo TFilho desde o começo.

Quando a solução é de terceiro como VCL ou RTTI o Typecast se faz necessário, uma vez que somos obrigados a seguir as regras deles

O Typecast usado em soluções criadas por nós prejudica a legibilidade natural do código assim como ocorre com ifs, pois de uma hora para outra o objeto que era uma coisa se transforma em outra

Preferir classes a tipos mais básicos como records ou enumerados
Como saber se tá OK

Caso a classe não use tipos enumerados ou records nem dentro nem fora dela

Como fazer

Exemplo: Ao invés de TTipoPrescricao = (prExame, prMedicamento, prInternacao)... Vem as classes TTipoPrescricaoExame, TTipoPrescricaoMedicamento, TTipoPrescricaoInternacao

Cada tipo enumerado se transforma em uma classe correspondente.

Motivo

Os tipos básicos também nos obrigam a criar condições (ifs) que acabam comprometendo a legibilidade do código.

Uma boa centralização ocorre somente com o uso de classes

Os tipos mais básicos fazem com que a codificação da regra fique de certa forma espalhada

Origem
Boa prática - reaproveitamento de código
Padrão SOLID