Please enable JavaScript.
Coggle requires JavaScript to display documents.
C#: Aplique Princípios SOLID - Coggle Diagram
C#: Aplique Princípios SOLID
Ciclo TDD
Criar a classe vazia
Criar o teste
Adicionar o conteúdo da classe
Testar
Primeiro criar os testes. Depois fazer as regras de negócios
Inversão de Dependência (DIP)
Duas ou mais classes com mesma assinaturas e mesmo comportamento
Abstrair o comportamento usando uma interface
Dependência
->
Inversão
Dependa de abstrações e não de classes concretas
Benefícios: menor impacto de alterações em classes concretas mais importantes. Import e Show no caso exemplo
Classes de negócio não devem despender de classes concretas, mas de interfaces (abstrações)
Padrão Strategy
Isolar em uma classe o padrão de arquivos que deseja chamar (no case)
Neste case: passa o path como argumento para uma classe que decidirá qual classe chamar com base na extensão de arquivo do path
SOLID
Princípio da substituição de Liskov (LSP)
Todo objeto que faça parte de uma hierarquia de classes ou implementações de abstrações precisa ser capaz de ser substituido por algum tipo ancestral ou por alguma abastração
O IApiService é um tipo que implementa o HttpClientPet mas também posso dizer que um objeto HttpClientPet pode ser substituido pelo IApiService. Contrato deve estar firmado (No case).
Principio OPEN/CLOSED (OCP)
software entities (classes, modules, functions, and so on) should be open for extension, but closed for modification. Toda entidade de software deve estar aberta a ampliações e fechada a mudanças. mudanças aplicadas em projetos que seguem o OCP são feitas através da inclusão de novo código e não pela edição de código já existente.A maneira de manter um sistema aberto a ampliação e fechado a mudanças é usando abstrações. Quando declaramos uma interface com comportamentos específicos e bem definidos estamos permitindo que módulos que dependam desta abstração permaneçam fechados a mudanças.
Artigo
,
Documentação
,
Visão geral
The Interface Segregation Principle (ISP)
Interfacese consumidas por classes diferentes devem estar separadas
Código consumidor não deve ter visibilidade sobre métodos que não irão usar.
It states that classes should not be forced to implement interfaces they don't use
Exemplo:
IDisposable
Recurso do C#
Tipo genérico
Criado com IApiService<T>
Deixar o código mais genérico para reaproveitar código
Posso chamar a IApiService<Pet> ou IApiService<Cliente> aproveitado o uso genérico da IApiService
Padrão Template Method
No case IRealizarLeitura é o Template Method.
Ele processa tanto chamadas para Pet como para Cliente
Ele implementa as mesmas regras de verificar se é nulo, montar uma lista e converter uma inha para um objeto
Modelo que tem ações comuns para todo arquivo csv, por exemplo
No exemplo, o template method é o próprio RealizaLeitura() e o ponto distinto é o método abstrato CriarDaLinhaCsv()
Desafio: saber a coberutra ideal dos testes:
Teste de mutação
Striker
- Testando o seu teste
Padrão Chain of Responsability
Padrão Builder
endereços web de APIs ou outros serviços web
credenciais de autenticação/autorização a estes serviços
strings de conexão para acesso a bancos de dados
informações complementares a estes serviços
Dados que fazem parte da configuração de uma aplicação, dos seus serviços e componentes de infraestrutura, dentre outros, devem ser armazenados fora do código.
Envio de e-mail
Artigo - Enviando e-mails com C#
Artigo - Documentação classe SmtpClient
Artigo - Como enviar email programaticamente
User Secrets
Menu gerenciar segredos so usuário
Estas informações sensíveis não ficam no diretório do projeto, mas ficam na máquina do desenvolvedor
Por meio delas podemos armazenar configurações ou dados que não devem ser compartilhados ou versionados junto com o código-fonte do projeto como senhas, chaves de API, tokens,entre outras.
Isolar informações de infraestrutura e configuração de serviços fora do código do projeto
O objetivo é permitir sua mudança sem necessidade de publicar a aplicação
Uso de Configuration Providers e Binding para declarar as fontes dos dados de configuração e vincular aos tipos que serão usados dentro do código