Transcrições
1. 00 Promo: Oi. Bem-vindo ao software do curso, arquiteturas, matéria e princípios sólidos. Vou colocar uma faísca de lesão K de ferimentos Park Dot com, e eles vão deixar você para o curso. Comecei minha carreira. Um suposto alunos graduados participando no concurso Microsoft Imagine Cop. Trabalho com o Dr. Left desde 2003. Eu sou um arquiteto profissional na implementação de software por quase sete anos, principalmente baseado na plataforma DOT net. Sou apaixonado por criar alcance e aplicativos poderosos usando tecnologias modernas. Sou um especialista certificado em aplicativos do Windows em aplicativos de comunicação de serviço pela Microsoft. E aqui está a minha abordagem de ensino. Sem conspiração, sem reclamações, sem derrotar a equipe de gelo no seu tempo. O material do curso é 16 mas abrangente. Constantes importantes são cobertas. Particularmente importante Os tópicos são abordados em profundidade para iniciantes absolutos. Ofereci minha ajuda no Skype de forma totalmente gratuita, se solicitado. Faça este curso e você será definido seus cinco. Solar é um acrônimo, que significa S R. P o c p, L S P e D E F e. Outros cinco Konitz Estes cinco crimes, por sua vez, representam o
princípio de responsabilidade única . Aberto fechado Principal Lisk do Princípio de substituição no reboque. Princípio de segregação facial e dependência. Inverter inferência. Nesses tribunais, você aprende a voar sólidos e meta princípios para que sua aplicação viva um longo saudável vivo. Isso significa que você vai aprender a escrever código de alta qualidade, legível no padrão e confiável. Melhore seus conhecimentos em programas orientados a objetos. Compreendê-los com os princípios em que, sobre o outro princípio de desenvolvimento baseado. Eu entendo os sintomas de defeitos de ouro. Fundamentos aprendidos de princípios sólidos. Saiba como detectar violações de princípios sólidos e como corrigir os problemas. Saiba como os meta princípios e os princípios da Sony estão relacionados entre si e como encontrar o equilíbrio entre eles. Apesar do fato de que See Shop é uma linguagem muito região apresenta, é muito comum ver aplicações mal projetadas e implementadas no mundo real. linguagem de programação por si só não garante que as aplicações arquitetônicas
serão grandes. A fim de projetar e construir software de manutenção, precisamos entender os princípios sobre o desenvolvimento de software. O vídeo, claro, é exatamente sobre como conseguir um software limpo e de manutenção que você provavelmente já machucou com seguinte declaração conhecida mundial. A maioria vai bem Sox, seu curso é tudo sobre como produzir código, o que não é uma droga. Votar desculpa de produzir e bem projetado e bem implementado tempos é o pré-requisito para os outros desenvolvedores para tratá-lo como um profissional decente. Este curso é destinado a desenvolvedores de médio e sênior. Fora do curso. Alguma experiência. Ver loja é obrigatório. Se você é um programador júnior, então eu diria que você tem que ter um mínimo de saúde do Ano da Experiência Real no desenvolvimento empresarial. Se você não sabe como trabalhar em estúdio visual, este curso não é para você. Ainda assim. Há uma abundância de bons exemplos ao longo do discurso para que você aprenda ambos os materiais
práticos radicais . Começando com negócios sólidos. Iremos mais longe ao assunto. Prince passando pelo sólido traz. Você também aprenderá sobre os assuntos relacionados. Em seguida, chegaremos ao problema das contradições entre princípios diferentes. Você aprende sobre as relações entre impressões solares em impressões de metal em geral, você aprende este curso cinco princípios sólidos srp fofoca L S P. Eu falo dia. Estes são os princípios sólidos. Você aprenderá os problemas de fundo que podem ser resolvidos por um princípio particular. Você verá as demonstrações em código, você aprende que elas relacionam presença a todos os princípios aprendendo que sendo você, além disso aprendeu o que é inversão de injeção de dependência do controle. Vejo contêineres como construir um contêiner RC simples. E quais são as implicações arquitetônicas da injeção de dependência? Aqui estão os outros tópicos que você aprendeu neste curso Dry. Não se repita. O diretor mantém o diretor. Mantenha-o simples. Yard estúpido New principal U N vai precisar de meia principal Separação de preocupações doente U. S. Comando princípios de separação consulta a lei fora do medidor e para o princípio do
espanto lista , informações escondidas e encapsulamento AP I Desenvolvimento Traga supor contradições entre sólidas e Yarden contradições entre OCP e jovens O que é arquitetura e design você vai obter tons são muito importantes para conhecer informações no papel e começar a aprender o sólido e metal princípios de construção de sistemas de software.
2. Contorno 01: Oi. Este é o último lugar para diversão de engenheiro de cozimento. E nesta seção, vamos aprender onde estão os princípios. Nós nos referimos aos princípios que vamos falar nesta seção sobre
os princípios da matéria porque eles são as raízes de todos os outros princípios mais concretos aderentes aos quais estamos realmente tentando nos conformar com os princípios da matéria. Vamos começar pela secadora. Não repita o princípio. Você aprende a definição dos cheiros mais comuns de violar o princípio seco. Depois disso, você aprendeu as chaves ou mantê-lo simples. Princípio estúpido. Aqui vamos falar sobre simplicidade e complexidade, complexidade acidental e essencial e como alcançar simplicidade. O próximo meta-princípio de que vamos falar é o jovem eu ou você não vai precisar dele. Está relacionado com o cheiro de complexidade desnecessário e diz respeito às antecipações de
características comuns . Vamos analisar os problemas práticos que enfrentamos e quais outras consequências da implementação de recursos que realmente não precisamos. Depois disso, vamos falar sobre o princípio da meia ou separação de preocupações. Este princípio está subjacente ao incenso. Todos os princípios sólidos. A separação de preocupações é muito importante para alcançar aplicações bem mantidas. Você verá as formas mais comuns de violar a separação de preocupações. Princípio princípio de separação consulta Comando torna mais fácil raciocinar sobre. O código discutirá o mínimo de Demeter, que é o principal conhecimento fora da lista. Separadamente, vamos falar sobre o princípio menos espanto você. Em seguida, vamos tocar o tópico de ocultação de informações e encapsulamento. By the way, vou usar a palavra princípio em vez de princípio matéria nesta seção. Além disso, apenas para economizar algum tempo na próxima palestra, você aprende sobre o princípio seco. Vamos começar.
3. 02 introdução SOLID: Olá, Este é o Engenheiro Spark, e eu vou guiá-lo através do curso antes de investigar quais
são os princípios sólidos e como aplicá-los corretamente. Precisamos entender por que precisamos deles? Então, os diretores são todos sobre projetar software, mas o que é projetado? Como definir o software Design off? Robert C. Martin, em seu livro A Child Principles, Padrões e Práticas em C Shop, afirmou que o design fora do software é o próprio código-fonte. Modern Folder escreveu em seu blawg que a arquitetura é a forma que vai tomar. Por que isso os engenheiros produzem documentos, esquemas que especificam como construir um produto. A única coisa que realmente especifica como o software funciona é o código-fonte. Você pode dizer que o código-fonte é o produto, mas o produto é o programa em execução, não o próprio código-fonte. Olhe para isso a partir da seguinte perspectiva. Qual é a entrada para as placas de circuito de fábrica fora? Diagramas eletrônicos especiais no caso fora do desenvolvimento de software para Have a Factory, que é compilador de ouro, nós alimentamos pelo código-fonte. Um compilador constrói software usando o código-fonte, e isso leva a pensamentos interessantes sobre custos, modelar fora software de construção e,
digamos, casas. Quando construímos uma casa, é muito mais barato criar um bom design na frente, em vez de reconstruir uma casa inteira. Se não gostarmos do resultado, não
é viável reconstruir uma casa a cada vez. Não gostamos do resultado. O oposto podemos dizer sobre o desenvolvimento de software. Podemos construir Bine Aries em um minuto. Grosso modo, grande design inicial no caso de desenvolvimento de software fora é muito mais caro do que desenhar um esboço, construir o software e depois ajustá-lo ao longo do caminho. O processo de desenvolvimento de software é um pouco único porque conduzindo um grande projeto inicial , na verdade não podemos garantir que levemos em conta todos os requisitos possíveis. O software é a substância fluida, e os requisitos tendem a mudar muito rapidamente porque fora de uma natureza tão fluida e
incerta fora dos requisitos de software, precisamos constantemente manter o design o mais limpo possível, dizendo Limpo. Quero dizer, isso pode ser mantido como pudermos para determinar onde o código-fonte está limpo ou não, precisamos marcar fora da ciência de desenvolvedores apodrecendo designer se referem a tal ciência. Isso é cheiro de design. Podemos marcar cinco grandes design, cheiros, rigidez, il idade
francesa, imobilidade, viscosidade e complexidade desnecessária. Vamos defini-los um por um. O software é região. Se o custo de fazer uma única alteração é muito alto, se algo muito simples leva muitas horas para implementar do que o software é região. Para superar esse problema, talvez seja necessário reprojetar o software. A principal fonte de rigidez é o alto acoplamento entre os módulos. Quando os módulos estão firmemente acoplados, então é muito difícil introduzir quaisquer alterações com facilidade. O mais suave é frágil quando pequenas mudanças em um módulo causam aparência caixa em outro, às vezes até mesmo módulos não relacionados. O cheiro também é muitas vezes causado por relações mal projetadas entre módulos, dedo do pé superar a fragilidade. Você precisa isolar dependências. O software está no modelo quando seus componentes não podem ser reutilizados em outros sistemas. Na maioria das vezes, devemos ser capazes de extrair um componente sem muitos esforços e adaptar-se para uso em outro sistema e o que é surpreendido? O cheiro é provavelmente causado pelo acoplamento apertado entre os componentes. Para superar esse cheiro, você precisa dissociar bem os componentes. O mais suave é viscoso ao adicionar uma única característica evoca lidar com toneladas de aspectos, incluindo transporte,
camada, camada, marshalling
de segurança e tais coisas. Na prática, você também pode detectar o cheiro observando o coração para realizar galinhas, checkouts e fusão. E muito provavelmente, o principal motivo para o cheiro é o acoplamento apertado entre os componentes. O mais suave é desnecessariamente complexo quando os desenvolvedores o tempo todo estão tentando prever o futuro. Antecipando mudanças futuras, introdução de pontos excessivos de desenvolvedores de extensão deve se concentrar nos
requisitos atuais . Eles devem construir a arquitetura flexível que pode ser banda para ser capaz de atender a novos requisitos. título não é necessário. Aponta a extensão ainda é uma má prática que leva a qualquer uma dessas complexidades. Você notou que quase todos os cheiros estão relacionados com a gestão de dependências cama. A principal diferença entre as linguagens orientadas a objetos e não orientadas a objetos é que outras linguagens são capazes de tirar proveito do desligamento dinâmico Ao usar
funções virtuais e interfaces, podemos inverter as dependências em línguas o. Quando fazemos uma chamada, não
sabemos qual objeto irá lidar com essa chamada. Isso é devido ao polimorfismo ou despacho dinâmico. Portanto, a chave para alcançar uma boa arquitetura é gerenciar bem as dependências. E aqui chegamos ao ponto em que estamos prontos para falar sobre princípios sólidos. Princípios sólidos são cinco princípios que podem ser referidos como
princípios de gestão da dependência . Há tudo sobre relações e operações entre objetos. Neste volume, vamos mergulhar profundamente nos princípios sólidos. A sigla sólida foi introduzida pela primeira vez por Robert Martin. Um tio k Comprou Solid implica cinco princípios fora do desenvolvimento de software, SRP princípio de responsabilidade única. Estejam abertos também. Princípio fechado é risco de princípio de substituição. Eu falo em princípio de segregação face e o princípio de inversão de dependência i p. Menu destes princípios são baseados no trabalho clássico de Bertrand Meyer. Vamos discutir todos os princípios um por um, olhando para exemplos de design ruim e como corrigi-lo. Aplicando um princípio adequado. Também notaremos a diferença entre as definições de Myers e Martin fora de alguns princípios. O que também é importante para uma compreensão profunda? O que eu também quero enfatizar é que princípios sólidos não estão vinculados a nenhuma tecnologia. Você pode aplicá-los em qualquer linguagem de programação no trabalho de, por exemplo. Outro ponto é que o sólido não é um objetivo por si só. O problema é que o código totalmente sólido é um oxímoro. É impossível escrever software, o que confirma sólido em cada linha. É impossível medir o sólido nous fora da base de código. Sólidos são os cinco princípios que nos ajudam a criar um software melhor. Eles envolvem uma grande quantidade de filosofia, e você pode pensar que isso é ruim. Bem, você pode tratá-lo como um chão, mas na verdade não é. É muito importante sentir essa filosofia de projetar mais suave para se tornar um
desenvolvedor melhor . E neste curso você verá todos os compensações que os desenvolvedores enfrentam aplicando princípios sólidos . Você sentirá a filosofia de projetar software. Ok, você aprendeu os cheiros de design comum e que aplicamos princípios sólidos para remover esses cheiros. Na próxima palestra, vamos mergulhar em princípios sólidos, começando com o esboço fora da seção SRP.
4. 03 declaração de problemas: o princípio de responsabilidade única ou um Sarpy em breve afirma que cada objeto deve ter uma única responsabilidade, e que a responsabilidade deve ser inteiramente encapsulada pela classe. Esta definição é tirada da Wikipédia. É muito difícil de entender. O que isso significa? Por exemplo, as primeiras 2 questões que vêm à minha mente são como definir essas responsabilidades e como calcular o número de responsabilidades fora de uma determinada classe. Tais definições não são muito úteis do ponto de vista prático. Robert Martin, um tio chave Bob, esclareceu esta definição dizendo que nunca deve haver mais de uma razão para uma classe mudar. Soa muito mais claro, embora seja muito precisa de mais esclarecimentos. As responsabilidades de uma classe podem ser tratadas como acesso fora de mudança. Pode ser mais simples compreendê-lo como acesso fora de requisitos em mudança, por exemplo, nos implementos de classe, registro e descontar por conta própria. Então tem pelo menos duas responsabilidades. Nós também pode ver as responsabilidades de uma classe a partir da perspectiva fora de seus usuários qualquer um p I tem seus usuários. Esses usuários são a fonte de mudanças, entendendo que podemos calcular quantos excessos de troca um copo tem. Por exemplo, se a classe lida com um banco de dados, então temos um x de alterações desde DB Architect são aqueles usuários que podem solicitar alterações . Se esse vidro lida com relatórios de aipo também, então você tem que excesso de cenas. Contadores são aqueles que podem solicitar alterações nos relatórios. Aparentemente, quanto mais responsabilidades uma classe tem, mais provável será mudada. Então, aplicando o SRB, queremos separar diferentes preocupações. Uma aula deve fazer uma coisa e fazer bem. By the way, o mesmo princípio pode ser aplicado ao nível dos módulos. Os módulos devem ter apenas uma responsabilidade lógica, modo que o SRP pode ser aplicado em diferentes níveis no nível funcional, nível do
objeto e no nível do módulo. Às vezes encontramos violações SRP no nível de funções eram um fator fora diferentes responsabilidades para óculos, e então nós separamos óculos por suas responsabilidades em diferentes módulos ou uma aparência. Se você deseja que nós discutimos o SRP, mas você pode se perguntar como o problema concreto parece na vida real causada pela
violação SRP . Imagine os problemas que são causados pela violação SRP. Aqui temos uma aula. Olhe para ele quantas responsabilidades ele tem? Vejo pelo menos quatro dependências. Vamos contá-los. O primeiro método, chamado de carga, é responsável por interagir com o terminal bancário. Ele deve saber como inicializar um dispositivo corretamente e enviar um comando correspondente para ele. O próximo método gold Criar Relatório sabe como ralar um relatório sobre a
transação de pagamento . Ele sabe como formatar o dia todo corretamente. Relatórios geralmente são tão complexos que há duas responsabilidades que podem ser escondidas. Uma preocupação separada poderia ser o processo de criação de aeroporto, e a segunda é a própria formatação. Se o processo de criação de um objeto é muito complexo, então muitas vezes nós tratamos como uma preocupação separada e nós virou toe isolar tais responsabilidades extraindo afetar classe er, que sabe todos os detalhes sobre a criação de relatórios. O terceiro método, chamado Traves Relatório, sabe como lidar com o driver de impressoras e como enviar comandos para ele. E, finalmente, o método de pagamento seguro é responsável por interagir com um banco de dados. Para salvar todos os dados sobre uma transação de pagamento, muitas vezes
temos uma responsabilidade oculta. Nesses casos, podemos chamar isso de orquestração de responsabilidade. Muitas vezes precisamos de um objecto de alto nível, que saiba integrar todas as responsabilidades em conjunto. Agora imagine que precisamos alterar o pagamento, processamento e salvar em um banco de dados simultaneamente. Dois programadores diferentes são responsáveis por estas duas partes diferentes do sistema. Infelizmente, estas duas partes diferentes recitam na mesma classe. Como resultado, esses dois programadores precisam mudar a mesma classe
e, em seguida, eles precisarão mesclar suas alterações para concluir um check-in. Além deste problema, tais óculos, que um camelo? Oito muitas responsabilidades são difíceis de entender. Tais óculos se tornam uma grande bola de lama. Um dia ninguém vai entender o que diabos está acontecendo naquele copo. Outro problema é que, por vezes, temos de introduzir mudanças numa única responsabilidade . Digamos que precisamos mudar o processamento de pagamento porque várias responsabilidades re lado nas classes de objeto único que os representam também muito compilado e reimplantado. Hoje em dia, esse problema na maioria dos casos pode parecer não um problema. Mas, por exemplo, se desenvolvermos em C plus
, isso pode causar alguns problemas. No final. A coisa é que tal atitude descuidada para o gerenciamento de dependências leva a uma longa compilação Tempo C plus é muito mais difícil de compilar, então este problema é muito importante Nesses casos. Se tivéssemos isolado essas dependências em diferentes módulos, teríamos necessário para re compilar sob reimplantar apenas um módulo, o módulo, que foi alterado assim foi como harpias violadas responsabilidades. Comecem a KAL oito um com o outro. O que significa que eles se acoplam? O que precisamos nos esforçar para fazer é reunir todas as mesmas responsabilidades e separar umas das outras, aquelas que são diferentes. Quando reunimos as mesmas responsabilidades, procuramos alcançar a chamada elevada coesão. Quando separamos diferentes responsabilidades, tentamos alcançar um baixo acoplamento ao nível das funções. Coesão significa o seguinte um conjunto de funções e em face é considerado coeso. Quando cada função está intimamente relacionada com outra, acoplamento indica como os módulos dependentes estão no funcionamento interno uns dos outros. Módulos fortemente acoplados dependem extensivamente do estado específico uns dos outros, compartilhando variáveis e muitos tipos. Módulos frouxamente acoplados são bastante independentes. Eles têm alguns olhos bem chamados AP e compartilham uma quantidade limitada fora ou nenhum dado em tudo. Ok, vamos olhar para o problema de uma violação Sarpy no Visual Studio em outro exemplo.
5. 04 Demonstração do problema: esta palestra é intitulada Ellis Be Violation Demo. Consideremos um exemplo clássico de Phyllis P. Violação. Eu amo este exemplo por duas razões. O 1º 1 é que ele realmente demonstra a violação L S P, e esse motivo é óbvio. E a segunda razão é que ele mostra que a programação orientada a objetos muitas vezes pode
mapear diretamente as relações entre objetos no mundo real para o mesmo modelo fora das relações entre eles em código. Um grande número de desenvolvedores pensam que escrever código na linguagem Hopi, eles estão modelando problemas de domínio do mundo aéreo. E, em parte, isso é verdade. Mas as relações do mundo real entre objetos às vezes podem ser móveis diretamente na
linguagem Opie . Aqui está uma das declarações ingênuas esperanças óculos infantis. Implementar é uma relação com classes baseadas. Por exemplo, cão é um gato animal é um animal, então podemos criar três classes. Animal é a classe base, e os outros dois são herdeiros. Infelizmente, às vezes esse tipo de design não funciona como esperado, e você verá isso em um minuto. Então vamos refletir as relações entre duas noções de mundo riel em código. Queremos implementar um retângulo e quadrado ser capaz de calcular suas áreas. Tenho certeza que concordará comigo que na Praça do Mundo existe um caso especial fora do retângulo . São outros porque o quadrado é um retângulo com lados iguais. Certo, vamos mudar para o estúdio visual. Vamos criar um retângulo e quadrado. Eu criei a classe retangular, que tem duas propriedades com e altura, e o quadrado, que herda de sua classe emaranhado. Separadamente, vou criar a classe, que é responsável por calcular áreas dessas formas. Parece bem. Do primeiro lado. Vou fingir que sou um cliente e quero criar duas formas e calcular suas áreas. Para isso, vou implementar o método principal onde todas as coisas vão acontecer que primeiro, eu vou apenas criar um retângulo com igual a dois e ocultar igual a cinco. Depois disso, chamarei o método de ângulo correto ST IC Cal e obterei o resultado, e também enviarei o resultado para o console. Agora eu quero criar um quadrado. Espere um minuto. O que diabos é isso? Como um quadrado pode conter lados de diferentes comprimentos. Eu nem vou executar o programa, vez que é óbvio que algo está errado aqui com uma pilha de quadrado permite definir diferentes comprimento para largura e altura. Este design viola claramente a lista de substituição. O quadrado principal não é substituto hable para retângulo retângulo implementa a variante in , que afirma que a largura e a altura podem estar desligadas. Diferente Praça Terra tem que implementar outro em variante que afirma que largura e altura têm que ser iguais. Eu intencionalmente omito isso. Na verdade, eles também têm que ser maiores ou iguais a zero. Há outro problema que está se escondendo aqui. Muito provavelmente, você precisaria criar métodos que tomam retângulo como um parâmetro e implementar alguma lógica
de negócios. No caso de calcular a era, esse método poderia se parecer com isso. Este método verifica o tipo do parâmetro aceito e executar o
algoritmo de cálculo apropriado . O que você acha? É uma boa maneira de definir métodos em toda a base de código que têm que trabalhar com retângulos? Não se assemelha a algo que já vimos antes? Sim, fato, isso é uma violação do princípio de fechamento aberto. Este método está aberto para modificação. O que acontecerá se introduzirmos uma nova forma? Correto. Teremos que modificar. Essa é a declaração que este exemplo de violação de Gillespie é uma violação oculta fora da OCP. Na próxima palestra, veremos como corrigir esse problema
6. 05 Refactoring para um design melhor: Obviamente, precisamos fazer impossível definir diferentes distâncias de comprimento para um quadrado para corrigir o problema. Por enquanto, as expectativas dos clientes quadrados estão quebradas. O ar, uma classe calculadora agora demonstram que há um problema fora dados separados e comportamento . Os algoritmos de cálculo são separados do retângulo e dos óculos quadrados, que possuem os dados necessários para os cálculos. A calculadora de área não pode existir sem retângulo e quadrado. Então, por que o comportamento foi afastado do retângulo e quadrada e quadrada por agora, obviamente falta de coesão para curar a doença, onde sempre deve construir abstrações adequadas. O que queremos obstruir é a lógica comercial do cálculo da área. Cada forma tem seu próprio algoritmo fora de cálculo. A área. É muito melhor tornar o comportamento compartilhado em vez de dados. Vamos obstruir o método de cálculo da área introduzindo a interface em forma de I. Quero que o retângulo e o quadrado herdem da forma do olho. Implementando seus próprios algoritmos, Square agora define sua própria propriedade chamada comprimento lateral. Agora um cliente não pode usar mal. É um P I. Aqui está um exemplo de um cliente em caso de retângulo chamando para calcular a área, Um cliente dará a área fora de um retângulo, enquanto em caso de quadrado, um cliente irá obter a área de um quadrado. O cliente pode definir diferentes tamanhos, largura e altura para um quadrado. Ótima. Na próxima palestra, vamos olhar para outras maneiras fora É violação.
7. 06 mais exemplos de Violações de SRP: Aqui temos um método chamado Get Reppert no corpo. Podemos ver que ele reúne alguns dados estatísticos,
em seguida, cria strings formatadas e colocá-los juntos. Como você acha? Esse método viola o SRP? Com este método viola claramente o SRP. Tem duas responsabilidades. O 1º 1 coletando os dados estatísticos e o 2º 1 é formatação. Programadores júnior muitas vezes faz a responsabilidade de formatação com lógica de negócios fora do curso. Às vezes, se tivermos certeza de 99% que a formatação nunca será alterada e não interfere com o outro resfriado. Podemos deixar essas cidades código s, mas mais provável seria melhor, pelo menos, extrair formatação em um método separado. Vejamos outro caso. Aqui temos o dispositivo de alarme. Ele verifica através de portas seriais tentando encontrar o dispositivo. E se ele encontrá-lo, ele define um estado global definindo o alarme pode ser usado propriedade. Como você acha? Esse método viola o SRP? Mas esse método viola claramente o SRP. Faz é que a política ou lógica de negócios com a mecânica lembrar que a
política de alto nível deve ser dissociada dos detalhes de baixo nível que poderíamos re fator-lo através da introdução uma classe especial que é responsável por interagir com o estado global. Esse vidro pode receber notificações por eventos ou qualquer outra forma apropriada. Vejamos o próximo caso. Aqui temos o método chamado desenhar Rectangle. Ele calcula onde desenhar um retângulo,
em seguida, escolhe um refrigerador e desenha o retângulo sentindo-o com essa cor. Como você acha? Esse método viola o SRP? Este caso é mais complicado que os anteriores. Os exemplos anteriores demonstram cheiros muito populares de violar o SRP. É mais difícil determinar suas responsabilidades aqui. O número de responsabilidades factuais sempre depende dos usuários, outros atores ou usuários que possam estar interessados em gerenciar a cor. Se houver tais usuários, então talvez seja melhor separar a responsabilidade de escolher um chamador. Uma questão interessante separada é se a criação muitas vezes objeto é uma responsabilidade ou não. Não vamos responder a esta pergunta nesta seção. Vamos mantê-lo para a seção sobre D. I. P. No final, eu também quero pelo menos algumas violações comuns de SRP primeiro, misturando lógica e infra-estrutura quando a lógica de negócios é misturada com visualizações ou um persistência. Camada um vidro ou um módulo, serve diferentes camadas, calcula renda e envia e-mails, Bar diz XML e analisar os resultados antes de ir mais longe. Só quero passar por uma função que enfrentei na prática. Esta função tem cerca de 5000 linhas de comprimento. Consiste fora caso interruptor, e se declarações, ele depende deles massivamente. Este é realmente um inferno e um exemplo extremo. Off violação SRP. Queria mostrar-lhe este exemplo só por diversão. A maioria fora desenvolvedores não acreditam em mim quando eu digo que eu vi tal função. Não existem tais funções, e os desenvolvedores que escrevem tais funções também existem. Como você pode imaginar, na próxima palestra, eu quero dizer algumas palavras sobre padrões projetados relacionados ao SRP.
8. 07 padrões relacionados de SRP: Às vezes aplicamos o SRP ao refletor além de um sistema, e acabamos com muitas classes pequenas. Clientes fora de tal A. Eu posso lutar para entender toda a parte do sistema porque eles precisam
entender suas relações entre todos aqueles óculos de fumaça. Não é tão ruim quanto parece. Como já disse, há sempre uma troca entre diferentes soluções em tais casos. Portanto, padrão da
meia pode vir ao resgate. Envolve todos esses óculos pequenos, apenas delegando todas as responsabilidades a eles. Não faz da fachada um violador do SRP. A única responsabilidade de tal fachada é reunir a funcionalidade exigida pelo cliente . Pode parecer que viola este R P, já que veremos as responsabilidades de diferentes camadas refletidas no FBI fora da fachada. Mas como eu disse, agregar a funcionalidade que permite resolver um único problema de clientes não é ruim. Simplifica o processo de interação com o sistema da perspectiva do cliente, e isso é tudo. Nada mais. Existem dois milhões de razões para usar a fachada. Melhor fornecer para um cliente, um simples A p I para interação com um conjunto de objetos complexos e fornecer para um cliente um FBI
mais limpo para interação com mal projetado A P I. Às vezes, é muito mais fácil de implementar se Assad, em vez de um reescrever uma parte mal projetado fora de um sistema. E isso é o que o segundo ponto é sobre a partir do SRP é perspectiva. Estamos interessados no exemplo, o que demonstra a primeira razão para usar melhor a fachada. Aqui você pode ver um diagrama, que demonstra um exemplo da fachada. -Melhor. Você pode ver aqui que a classe de fachada de compra depende de todas as outras classes que contém ou, em outras palavras, envolve todas essas classes. As entidades encapsuladas não precisam ser classes. Podem ser interfaces também. Então imagine que inicialmente um cliente era dependente de todos esses óculos. Introduzimos a fachada para simplificar o processo de indireção com o sistema. Se um cliente depende do na fachada, ele não precisa interagir diretamente com muitas classes. Vamos mudar para o Visual Studio, onde mostrarei este exemplo em código. Aqui está um exemplo. Digamos que temos um cliente que usa nosso sistema para vender produtos da loja on-line, então o código do cliente se parece com isso. Ele cria um objeto de cliente usando o método ST Ick. Encontrar passagem do cliente significa que o cliente i d. Depois
disso, ele cria uma carga através do QI estado. Encontrar método fora da classe de ações, passando no bom i D. Em seguida, ele obtém as informações sobre o cartão de crédito do cliente, cria o gateway do banco e chama o cartão de cobrança passando parâmetros necessários. Aposto que esse processo de indireção parece mesmo uma zombaria. É nosso dever simplesmente arquivar vidas de nossos clientes para que possamos criar uma fachada que esconda todos esses detalhes do processamento de uma compra que eu criei aqui. A classe de fachada de compra, que expõe um único método. Este método requer dois parâmetros inteiros e esconde todos os detalhes dentro de seu corpo. Agora, um cliente não precisa saber sobre todos os óculos e como interagir com eles, quais métodos chamar. A única coisa que o cliente deve saber é que ele pode simplesmente grande se Assad e chamou um método para alcançar o objetivo. Isso é tudo. Existem muitos padrões que estão relacionados com um decorador Sarpy e quartos compostos
também estão muito intimamente relacionados com a sua Sarpy, acordo com a definição do Gang of Four livro compósito padrão permite compor objetos em estruturas em árvore para representar hierarquias inteiras de parte. Patrono composto. Vamos dar uma olhada. Trate objetos individuais e composições fora de objetos uniformemente. De acordo com o mesmo livro. O padrão decorador permite que o comportamento seja adicionado a um objeto individual, estática
ou dinamicamente, sem afetar o comportamento de outros objetos da mesma classe. O padrão decorador é muitas vezes útil para aderir ao princípio de responsabilidade única pois permite que a funcionalidade seja dividida entre classes com áreas únicas de preocupação. Não vamos discutir a presença de design neste curso profundamente, então eu posso apenas recomendar algumas fontes para procurá-lo para obter uma compreensão mais profunda dos
veteranos de design e sua relação com princípios sólidos.
9. 08 Conclusão: esta palestra é intitulada Conclusão. O principal que discutimos ao longo desta seção foi a interface segregação príncipe ou eu falo em camisa, há P tem uma definição simples. Os clientes não devem ser forçados a depender de métodos que não usam. Portanto, essa definição implica que você tem que se esforçar para grandes, pequenas, coesas e focadas interfaces. Claro, diferentes clientes podem usar apenas um subconjunto de membros do FBI de que dependem. A menos que AP, eu começo a crescer transformando em uma interface muito gorda com membros não relacionados uns aos outros , onde, quando métodos semelhantes, mas diferentes parecem satisfazer os requisitos de diferentes clientes . Uma forma típica de violação que você viu, era quando uma interface era muito ampla. O que levou a alguns cheiros como implementador lance não implementado exceção ou clientes têm que
ver toda a massa na inteligência pensando fora o que eles realmente precisam usar como
discutimos , existem várias maneiras de lidar com eu falo violações. Às vezes, basta extrair uma interface separada de uma gordura e usá-la quando apropriado. Às vezes você precisa sair com uma fachada que se esconde irrelevante. Membros da AP I. Às vezes você precisa aplicar um padrão de adaptador, especialmente se você não possui a interface fat, e assim você não pode modificar seu código-fonte. A adesão inteligente ao princípio da segregação da interface torna uma aplicação mais fácil manter o que é extremamente valioso, especialmente a longo prazo. Abusando eu falo você pode acabar com tons. Off to small interface é o que os torna mais difícil de usar por clientes antigos. Este é um cheiro conhecido como anti gelo. Seja assim que chegamos ao final desta seção. Foi uma investigação interessante. Mas há um outro princípio à nossa espera, o princípio da inversão da dependência. A próxima seção é dedicada ao
D.I.P. D.I.P. D.I.P. vamos direto ao assunto.
10. Contorno 01: Oi. Este é o último lugar para diversão de engenheiro de cozimento. E nesta seção, vamos aprender onde estão os princípios. Nós nos referimos aos princípios que vamos falar nesta seção sobre
os princípios da matéria porque eles são as raízes de todos os outros princípios mais concretos aderentes aos quais estamos realmente tentando nos conformar com os princípios da matéria. Vamos começar pela secadora. Não repita o princípio. Você aprende a definição dos cheiros mais comuns de violar o princípio seco. Depois disso, você aprendeu as chaves ou mantê-lo simples. Princípio estúpido. Aqui vamos falar sobre simplicidade e complexidade, complexidade acidental e essencial e como alcançar simplicidade. O próximo meta-princípio de que vamos falar é o jovem eu ou você não vai precisar dele. Está relacionado com o cheiro de complexidade desnecessário e diz respeito às antecipações de
características comuns . Vamos analisar os problemas práticos que enfrentamos e quais outras consequências da implementação de recursos que realmente não precisamos. Depois disso, vamos falar sobre o princípio da meia ou separação de preocupações. Este princípio está subjacente ao incenso. Todos os princípios sólidos. A separação de preocupações é muito importante para alcançar aplicações bem mantidas. Você verá as formas mais comuns de violar a separação de preocupações. Princípio princípio de separação consulta Comando torna mais fácil raciocinar sobre. O código discutirá o mínimo de Demeter, que é o principal conhecimento fora da lista. Separadamente, vamos falar sobre o princípio menos espanto você. Em seguida, vamos tocar o tópico de ocultação de informações e encapsulamento. By the way, vou usar a palavra princípio em vez de princípio matéria nesta seção. Além disso, apenas para economizar algum tempo na próxima palestra, você aprende sobre o princípio seco. Vamos começar.
11. Definição 02 de OCP: esta palestra é intitulada Declaração de Problema. O segundo princípio sobre o qual vamos falar é o princípio do fechamento aberto. Se olharmos para a Wikipédia, veremos a seguinte definição. O princípio de fechamento aberto afirma que entidades de software, óculos ,
módulos, funções etc devem estar abertas para extensão, mas fechadas para modificação. O que significa, em essência, é que quando precisamos introduzir uma mudança, não
devemos aprofundar o sistema e mudar seu comportamento. Ao alterar esses fins das classes, devemos ser capazes de introduzir uma alteração adicionando código e não alterando o software existente , que permite alterações introduzindo novas classes em vez de alterar a fonte existente está aberto para extensão e fechado para modificação. Como alterar o comportamento sem alterar a base de código. A resposta é simples. Despacho dinâmico ou pólen. Mais taxas que podemos conseguir muito flexível, projetado aproveitando a programação orientada a objetos de energia off. Na prática, isso significa que precisamos confiar em abstrações em vez de
implementações concretas ou diretas , até mesmo ver loja. Nós dependeríamos em rostos e óculos abstratos. OK, mas qual é o problema com a alteração do código existente? Por que precisamos aderir ao princípio aberto e
próximo? A primeira razão é que há uma grande chance de introduzir caixa durante o
processo de modificação . É muito mais fácil de entrar. Use um bug, modificando algo que é complexo e já existe. Planeje introduzir um novo código de cabeçalho de bug. A segunda razão é irrelevante, e é quase sempre relevante quando você está tentando modificar o comportamento de um FBI, que já está em uso por muitos clientes. O primeiro perigo aqui usado para mudar o comportamento esperado pelos clientes. Imagine que existem 1000 clientes de um método que retorna 100 em caso de falha e que os clientes têm alguma lógica de compensação para esse caso. Imagine, então que você modificou o comportamento do método de qual desses 1000 clientes dependem. As consequências são dramáticas. Eu rezaria para o desenvolvedor que decidiu introduzir tal mudança, que quebra o código fora 1000 clientes. O segundo perigo é modificar as assinaturas do FBI. Tais modificações quebram imediatamente todos os clientes dependentes. Acredite em mim, os clientes não agradecerão por tais modificações. By the way, quebrar alterações também pode causar efeitos ondulantes porque pode existir centenas de clientes que dependem de outros clientes que dependem do seu código. Modificar o comportamento comendo seu código está de acordo com o que os clientes pensam quando pedem novos recursos. Quando os clientes pedem um novo recurso, eles pensam que os recursos serão adicionados. Eles não pensam que os desenvolvedores vão modificar qualquer coisa. A ideia pode parecer ridícula desde a primeira vista. De fato. É possível escrever Go que nunca mais será modificado? Fora do curso. Isso não é possível na prática. Bem, teoricamente, é possível escrever todo o código dessa maneira, mas não é prático na programação. Muitas vezes estabelecemos alguns objetivos ideais que podem ser alcançados, por exemplo, que se esforçam para escrever Ouro correto. Teoricamente, podemos escrever código que a correção, que pode ser verificada estaticamente. Infelizmente, em 99% dos casos, esse processo de desenvolvimento é tão caro que eu quero é tampado touro fora investir tanto dinheiro, outro ponto, o que é óbvio. Mas eu preciso mencionar que é que nós absolutamente deve modificar o código existente se ele contém um bug. Então, a fixação de volta está bem do ponto de vista do princípio de fechamento aberto. Vamos dar um passo atrás e olhar para 1988 1988 é o ano em que Bertrand Meyer descreveu OCP pela primeira vez, Meyer tratou OCP um pouco diferente do Tio Bob. OCP de Marius Point of View, foi essencial, um equivalente ao padrão de variação protegido. O padrão de variação de proteção significa que os pontos a seguir identificam fora
da variação prevista e criam uma interface estável em torno deles. Falando aqui sobre uma interface que não precisamos da loja C na construção facial. Terminar para Face implica qualquer P. I. Uma classe tem sua própria interface, que é representada pelo seu público. A P I. Podemos notar aqui uma sutil diferença entre as definições de Marte e Martin. Definição Myers é mais sobre compatibilidade com versões anteriores no nível A P R. Então, se as mudanças não quebram a compatibilidade com versões anteriores, embora, Sippy é Matt. Quando exatamente podemos precisar mudar o comportamento de mudar a interface. Por exemplo, quando um novo cliente aparece, que requer um comportamento muito semelhante, mas um pouco diferente, o último ponto que eu quero abordar é o princípio de escolha única intimamente relacionado com o princípio de
fechamento aberto . Eu prefiro nomear este princípio o princípio de fonte única e você entende por que em breve , Vamos imaginar o caso quando precisamos decidir qual implementador criar. Dependendo de um argumento para resolver esses problemas, muitas vezes
confiamos melhor na fábrica. Aqui está um exemplo. Como você vê aqui, temos um método fator que tira um parâmetro fora brincadeira. Modelo Nall em admiração. Dependendo desse parâmetro, o método factor cria uma implementação correspondente fora da interface I ban terminal. Esse método fatorial viola o princípio de fechamento aberto? Claro que sim. Se lançarmos uma nova implementação fora da interface do terminal do banco olho, vamos modificar este ouro adicionando na declaração do Reino Unido, Como podemos resolver o problema? Aderindo ao princípio de fechamento aberto, podemos criar uma fábrica da fábrica de terminais bancários, mas que criam esse fator desta fábrica em algum lugar. No final, precisamos selecionar a implementação apropriada e criar a instância. Podemos, em parte, resolver o problema introduzindo um recipiente gelado, mas isso apenas irá mover o problema. Ele não resolve o problema inteiramente se você não está familiarizado com a noção de
injeção de dependência e eu vi recipientes como uma nota lateral, eu recomendo que você para livros. O 1º 1 é da Biblioteca Back Bob, que é nomeado Mastering Inject for Dependency Injection e outro que é um best-seller
absoluto escrito por Mark Semen Dependency Injection em dot net. Então o diretor fora de uma única escolha soa assim. Sempre que o sistema de software deve suportar um conjunto de alternativas, um e apenas um módulo no sistema deve saber a sua lista exaustiva. Sim, estamos violando esses canudinhos por ter tal implementação do método fatorial. Mas não há sentido de tentar empurrar a fofoca ainda mais por qualquer meio. Devemos entender que, nesses casos, tudo o que precisamos é isolar essa responsabilidade em um único módulo, e somente esse módulo deve ser alterado em caso de introdução de novas implementações. Ok, vamos olhar para o problema fora da violação de fofocas e como corrigi-lo em nosso amado
estúdio visual .
12. 03 Demonstração do problema: Esta palestra é intitulada Ice Be Violation Dama um. Eu quero mostrar a você Ariel Case da minha prática, que estava relacionado com o problema fora em segregação rosto. Eu tenho trabalhado muito com dispositivos,
e uma vez que eu enfrentei o seguinte caso antes de conceder, Eu quero dizer que eu gosto de dar exemplos aos alunos que refletem toda a imagem do caso do mundo
aéreo. Então eu vou descrever todos os detalhes relacionados ao problema porque eu acho que isso ajuda a entender o material muito melhor. Então, no nível superior, temos uma aplicação monolítica WBF, que funciona em terminais de serviço pontuais. Esses terminais permitem que as pessoas compram bilhetes em trens suburbanos. Essa aplicação permite aos utilizadores comprar bilhetes através de cartões de crédito. Assim, o aplicativo tem que trabalhar com terminais bancários. De alguma forma, devido a algumas razões comerciais, havia vários modelos de terminais bancários integrados para passar terminais, então todos eles tiveram que ser suportados. A interpretação com terminais bancários não é direta. Os produtores de terminais de proibição fornecem seus próprios aplicativos através dos quais nosso aplicativo pode trabalhar com seus terminais bancários. Seus aplicativos são implementados como vêm servidores. Se você não sabe o que é um servidor com apenas pense nele como um
serviço executável independente . O diagrama reflete o fluxo de operações. Vamos ver o código. Há o mínimo de operações desligadas, que são suportadas por qualquer terminal bancário possível. É por isso que eu defini a interface do terminal Eye Bank, que reflete o B I fornecido pelos serviços que a Inter operam
diretamente com terminais bancários . Agora eu tenho três implementações fora da interface do terminal do banco de olhos, Zap Terminal, seu próprio terminal e terminal PDQ. Estou inserido na implementação rial, uma vez que isso complicaria muito o exemplo. E não há nenhuma intenção de mostrar a você as entranhas e detalhes de baixo nível. E agora descreverei o problema que surgiu. O problema é que os terminais bancários são diferentes. O terminal algum é uma solução de caixa preta que fisicamente é uma caixa que por conta própria funciona com cartão de crédito em atraso. Grandes leitores de cartões de identificação são aqueles dispositivos que aceitam o seu cartão, ler o barato ou uma faixa magnética e distribuir cartão de volta para você. Então seu próprio terminal não expõe cara para Inter operando com leitores de cartão porque o aplicativo de
serviço define automaticamente coisas antigas e acessórias ao mesmo tempo, os outros dois terminais bancários, PDQ Terminal e Zap Terminal don não assumir a responsabilidade por Inter desfilando com leitores de cartões automaticamente. Pelo contrário, eles delegam essa responsabilidade a um cliente, expondo um P I para interdesfilar com leitores de cartões. Então, no primeiro caso, nosso aplicativo não precisa fazer nada. Enquanto nos outros dois casos são aplicação tem que mostrar uma janela para postar engenheiros de
manutenção terminal para fornecer a capacidade de configurar os dispositivos de terminal do banco corretamente. Vejamos a View Model Class, que é um apresentador para essa janela, que permite aos engenheiros de manutenção configurar os dispositivos de terminais bancários. A janela tem quatro botões, que permitem testar se o contato ou contato com os leitores estão em uma determinada porta. E para encontrá-los através da varredura de todas as portas disponíveis no sistema, precisamos passar os leitores de cartão Communicator of Your Models, Constructor Independence, que é capaz de testar e procurar leitores de cartão em portas. Agora pergunte a si mesmo, o que você faria para resolver o problema? As maneiras simples de adicionar assinaturas de método diretamente no terminal do banco de olhos? Vamos fazer isso e ver o que vai acontecer. Ok, já que temos três implementador Z quando você implementar o apenas editar um Prime Members, - huh ? O que vamos fazer aqui Zone Terminal serviço não fornece em um grito para se comunicar com leitores de cartão aparentemente, precisamos lançar, não suportadas exceções dos membros implementados. Este caso não te lembra alguma coisa? Algo que vimos na seção anterior? Fora do curso. Esta é uma violação fora da lista de princípio de substituição. Mas o que estamos falando é do principal de segregação da interface, não estamos? Sim, estamos. A questão é que, como eu disse antes, todos os princípios estão relacionados um com o outro. Às vezes eles têm relacionamentos escondidos. Neste caso particular, acabamos com sua violação wispy como conseqüência, fora gelo ser violação se ficarmos com a solução atual e exigimos a
interface terminal ibon como um parâmetro fora do comunicador de leitores de cartão de seu construtor de modelos. Um dia alguém passará o terminal de zona para o construtor
e, em seguida, o usuário receberá uma exceção depois de clicar no botão de teste ou pesquisa
na janela. Então, se quisermos evitar eventos tão infelizes, precisamos reconhecer o fato de que a interface do coronel do banco de olhos é muito gorda. Ele contém membros AP I excessivos. OK, na próxima palestra, vamos refletir rapidamente o problema.
13. 04 Refatoração para um design melhor: na palestra anterior foram concluídos que a interface coronel Banco olho é muito gordo, a manjedoura e duplo senhor. A técnica de fatoração, que geralmente se aplica para aderir ao SP, é que criamos interfaces pequenas e
isoladas que representam responsabilidades concretas bem definidas. Neste caso específico, temos de separar a responsabilidade que diz respeito à Inter operando com
leitores de cartões . Então eu vou fazer isso. Agora. Devemos implementar esta nova interface de nossos dois modelos fora do Terminal Bancário, que na verdade pode inter operar com leitores de cartões. PDQ Terminal já implementar esta interface e zip terminal também. Ótima. Agora podemos exigir que os leitores de cartão i cabo Comunidade na cara nos modelos vista. Construtor. Ótima. Não há mais chance de alguém passar por uma instância inapropriada que não pode trabalhar com leitores de cartões. E, a propósito, agora é muito mais compreensível o que um membro principal usar aqui. Uma vez que temos uma interface de um propósito aqui, esta visão como um cliente fora da interface não deve ser incomodada por membros excessivos AP I
do terminal Eye Bank pensando fora de seu papel. Agora tudo está em suas prateleiras. Ao jogar o SP, alcançamos o baixo acoplamento entre métodos que são diferentes por seu significado, e assim alcançamos alta coesão entre eles em interfaces segregadas. Na próxima palestra, veremos outro caso de violação mal-humorada.
14. Padrões relacionados de OCP: Esta palestra é intitulada
O.C. O.C. B. padrões
relacionados. Os dois padrões projetados comumente usados para aderir ao
modelo
O.C. O.C. P. R. P.
R., método e estratégia. Droga Plett Método e estratégia são os chamados padrões de design comportamental. O método template é um veterano que ainda não discutimos. O padrão de método de modelo é útil em tais cenários quando há um algoritmo, e alguma pequena parte desse algoritmo pode muito mais uma vez antes. Define modelo método padrão s definir este esqueleto muitas vezes algoritmo em uma operação adiando alguns passos para sub óculos. Método do modelo. Vamos subclasses redefinir certos passos, muitas vezes algoritmo sem alterar a estrutura de algoritmos. Vejamos o exemplo simples no código. Aqui você tem uma classe baseada abstrata que define o algoritmo fora de processamento de transações. O algoritmo consiste em três etapas. Retirar dinheiro, calcular bônus e enviar saudações. Depois disso, temos de herdeiros que implementam esse algoritmo. Este padrão permite declarar um algoritmo na classe base, criando um ponto de extensão, já que podemos implementar quantas implementações fora desse algoritmo quisermos. O modelo melhor e pode ser implementado com uma implementação padrão fora de
etapas algorítmicas na classe pai, removendo a palavra G abstrata da declaração de classe e fazendo métodos virtualmente em vez de abstrata. Na verdade, podemos codificar uma implementação padrão, mantendo a classe pai abstrata apenas transformando métodos algorítmicos intra virtual em vez de abstrato. Não somos obrigados a remover o AB protegido da declaração de classe para ter uma
implementação padrão . O padrão do método de modelo cria um ponto de extensão para a implementação de vários algoritmos. É assim que você pode aderir às fofocas. Nesses casos. Vejamos o diagrama do padrão de estratégia. Este diagrama demonstra como podemos implementar um classificador com um padrão de estratégia. O classificador leva a estratégia uma interface que define o método de classificação. Há três implementações fora dessa interface. O 1º 1 implementa a classificação de bolha, a segunda classificação rápida e a última classificação de seleção. O código de clientes usará a classificação e deve decidir quais estratégias deseja usar para
executar a classificação. Nós não vamos olhar um ting exemplos em código, que já vimos como poderíamos usar o padrão de estratégia, a fim de desligar implementações, eu posso operar com dinheiro ou eu posso pagar com um cartão de crédito em rostos neste R. Seção P. Então aqui está a definição do padrão de estratégia. O padrão de estratégia permite que o comportamento de algoritmos seja selecionado em tempo de execução. O padrão de estratégia define uma família fora de algoritmos, encapsular cada algoritmo e torna os algoritmos intercambiáveis dentro dessa família. Portanto, muitas vezes temos duas maneiras de definir obstruções. Na loja Si, podemos confiar em classes absurdas ou em interfaces, como escolher entre eles. Interfaces são feitas de pedra. Eles podem ser facilmente alterados sem quebrar clientes existentes ao mesmo tempo em rostos. Um motivo extensível por um cliente de Cline pode estender um link para face por métodos de extensão. E, a propósito, se um cliente quiser implementar uma interface em uma classe que já herda de outra classe, cliente pode facilmente fazer isso. Um cliente não poderia fazer isso com uma classe abstrata. Em vez disso, muitas vezes interface. Desde herança múltipla em C shop é depreciada, qualquer classe pode implementar suas muitas interfaces como ele quer, então inventar e interface é mais flexível do ponto de vista do cliente. Infelizmente, uma interface é mais regente. Do ponto de vista dos desenvolvedores, ele pode ser facilmente alterado, e não suporta qualquer tipo de reutilização. Classes abstratas suportam a reutilização. Eles suportam encapsulamento e podem ser estendidos facilmente sem quebrar os clientes existentes. Como resultado, uma classe abstrata é flexível da perspectiva dos desenvolvedores e, ao mesmo tempo, mais região da perspectiva do cliente, uma vez que a herança múltipla é depreciada. Com tudo o que disse, podemos concluir a interessante regra de ouro usado óculos abstratos para a construção de olhos
AP internos e usar interfaces para fornecer pontos externos de extensão. Lembre-se, isso não é um dogma. Esta é uma regra de recordação, por exemplo, que Basile fornece coleção I. Eu menos notifico propriedade alterada e desliga outras interfaces. Isso é feito assim porque eles estendem a capacidade a partir da perspectiva do cliente, é mais importante nestes casos. Na palestra onde fizemos sua fatoração, eu disse que uma classe do Napster com várias implementações leva a uma situação em que é difícil adicionar novas operações, já que você terá que implementá-las em cada classe. Há outro problema. E se quisermos oferecer aos nossos clientes uma oportunidade de definir operações por conta própria ? Nesse caso, você pode estar interessado em aplicar o padrão projetado pelo visitante. Olhe para o diagrama. O padrão do visitante é bastante difícil de entender, especialmente apenas olhando para um diagrama. Em suma, o padrão de visitante permite definir uma operação que pode ser executada em qualquer classe fora de uma determinada hierarquia sem modificar classes dessa hierarquia. Vejamos um exemplo no estúdio visual. Da última vez que saímos com o seguinte design, extraímos a interface do dispositivo I para abstrair a maneira como os dispositivos operam. Aqui temos o bom método. Depois disso, criamos para implementador indo dispensador Cube para e Bill dispensador E C D. M. Vamos dizer que queremos adicionar operações no lado do cliente, e o cliente não tem acesso à interface do dispositivo olho. Para isso, aplicaremos o padrão de visitante antes de implementá-lo melhor. Vamos criar uma propriedade de porta aqui e o mesmo na coop dispensador de moedas. Por enquanto, podemos implementar os vistos ou padrão. Bem, isso é ótimo que eu dispositivo interface visitante, que expõe métodos de visita para todos os modelos de dispositivos. Agora podemos implementar a classe base para dispositivos para passar suas instâncias para o visitante. Agora eu quero adicionar um novo comando para isso. No começo eu tinha a classe de visitante de comando próximo que implementa o novo recurso para não usar esse visitante. Eu também criaria um método de extensão na classe de dispositivo como este. Agora, o casaco dos clientes pode facilmente usar o novo comando de roupas em qualquer dispositivo, e
agora tudo funciona bem. e Este é um padrão muito poderoso, que permite que você crie um design flexível. Se você espera a extensão dos tipos do que o mais
provável, seria melhor ficar com uma hierarquia clássica. Nós inventamos a primeira ou a fábrica. Pelo contrário, se você espera que a hierarquia não é volátil e as operações vão ser implementadas pelos clientes, então o padrão de visitante é o caminho a seguir. Adicionar novos tipos ao visitante pode ser problemático na próxima palestra. Vamos resumir o que aprendemos sobre a OCP e tentar descrever brevemente os cheiros
comuns da violação da OCP
15. 06 cass de violação comum: o cheiro mais comum fora violação fofoca é a aparência de muitos ramos condicionais , seja com if else ou com declarações caso switch. Geralmente, você tem três abordagens comuns para aderir às sequências de manipulação de construção S a p com delegados, que são naturalmente as implementações fora da cadeia de padrão de responsabilidade. Procure a cadeia de responsabilidade quarto. O espectro é quase construído com eventos na plataforma dot net, então nós usá-lo quando precisamos passar uma mensagem e lidar com ela por vários manipuladores. A cadeia de responsabilidade fornece a maneira de implementar isso de uma maneira frouxamente acoplada . Caso contrário, você pode acabar com objetos acoplados. Outra maneira é confiar em uma herança clássica com um padrão de método de modelo, ou implementar um padrão de visitante. Se você precisar fornecer a capacidade de um cliente definir operações, a última maneira é confiar em uma composição e não em herança. Muito provavelmente, você confiará na estratégia melhor para implementar uma composição. Lembre-se de que a composição geralmente é mais preferida do que a herança clássica. Ok, na próxima palestra, vamos resumir o que aprendemos nesta seção
16. 07 Conclusão: Esta palestra é intitulada Conclusão. O princípio de fechamento aberto é tudo sobre mudanças. Seguindo o OCP, você pode alcançar todos os projetos flexíveis que estão prontos para introduzir novos recursos sem problemas. Para alcançar o design flexível, ele deve ser aberto para extensão e fechado para uma modificação, modo que as partes que mudam mais frequentemente do sistema precisam ser isoladas. Uma coisa muito importante é que precisamos isolar uma responsabilidade para criar objetos em um único módulo e Onley esse módulo deve ser alterado em caso de introdução de novas implementações. Este princípio é chamado de princípio de escolha única. Você aprendeu que pode aderir ao OCP aproveitando as classes abstratas de desligamento para interfaces. Os padrões projetados mais comuns que aplicamos para aderir ao LCP são o modelo, método e estratégia. Você aprendeu que uma interface é mais flexível do ponto de vista do cliente. Enquanto uma busca abstrata é mais flexível do ponto de desenvolvedores fora de você. Também aprendemos que não temos à nossa disposição quaisquer ferramentas mágicas que nos permitam
proteger-nos completamente de todas as possíveis mudanças, e isso não significa que devamos começar a criar toneladas de extensões, pontos antecipando mudanças no futuro em toda a base de código. Para superar o problema, estamos tentando usar o chamado design gile. Parabéns. Você chegou ao fim da seção OCP na próxima seção. Vamos olhar para a lista de princípios de substituição, aparentemente o mais difícil de entender príncipe entre princípios sólidos.
17. Contorno 01: Oi. Este é o último lugar para diversão de engenheiro de cozimento. E nesta seção, vamos aprender onde estão os princípios. Nós nos referimos aos princípios que vamos falar nesta seção sobre
os princípios da matéria porque eles são as raízes de todos os outros princípios mais concretos aderentes aos quais estamos realmente tentando nos conformar com os princípios da matéria. Vamos começar pela secadora. Não repita o princípio. Você aprende a definição dos cheiros mais comuns de violar o princípio seco. Depois disso, você aprendeu as chaves ou mantê-lo simples. Princípio estúpido. Aqui vamos falar sobre simplicidade e complexidade, complexidade acidental e essencial e como alcançar simplicidade. O próximo meta-princípio de que vamos falar é o jovem eu ou você não vai precisar dele. Está relacionado com o cheiro de complexidade desnecessário e diz respeito às antecipações de
características comuns . Vamos analisar os problemas práticos que enfrentamos e quais outras consequências da implementação de recursos que realmente não precisamos. Depois disso, vamos falar sobre o princípio da meia ou separação de preocupações. Este princípio está subjacente ao incenso. Todos os princípios sólidos. A separação de preocupações é muito importante para alcançar aplicações bem mantidas. Você verá as formas mais comuns de violar a separação de preocupações. Princípio princípio de separação consulta Comando torna mais fácil raciocinar sobre. O código discutirá o mínimo de Demeter, que é o principal conhecimento fora da lista. Separadamente, vamos falar sobre o princípio menos espanto você. Em seguida, vamos tocar o tópico de ocultação de informações e encapsulamento. By the way, vou usar a palavra princípio em vez de princípio matéria nesta seção. Além disso, apenas para economizar algum tempo na próxima palestra, você aprende sobre o princípio seco. Vamos começar.
18. Definição 02 de LSP: esta palestra é intitulada Declaração de Problema. A definição oficial de Barbara Liska fora da lista de principal de substituição soa assim se s é um subtipo fora da equipe do que objetos fora do tipo T pode ser substituído por objetos fora do tipo s sem quebrar o programa. Não é muito difícil entender o que esta definição significa, mas vou citar a definição do L S P do livro do Tio Bob. Princípios ágeis, Padrões e Práticas em C sharp Apenas no caso de encontrarmos lá
a seguinte definição fora da lista de princípio de substituição a lista de princípios de substituição afirma que subtipos devem ser substituídos ble para sua base tipos. By the way, Barbara Lisk off é uma cientista que descreveu este princípio em 1988. O artigo original foi escrito na Grécia e foi muito difícil de entender e aplicar programação orientada a
objetos na prática. Vamos tentar esclarecer o que ele significa para os desenvolvedores na prática. O que significa ser substituído por uma classe? Vamos fingir que temos um cliente que usa o FBI fora da interface para que haja dois. Ele é implementado pelas classes A e C Classe C pode ser considerado substituto hable para classe A se o cliente não observar qualquer diferença usando a classe C em vez de A. A partir da perspectiva do cliente, um cliente não deve experimentar comportamento diferente usando herdeiros diferentes da mesma classe
base ou uma interface. Na verdade, o L S P está fortemente relacionado com suas linguagens orientadas a objetos. Permita-nos usar herança. Se o Be do Glenn herda de A, então podemos usar B S A. Mas podemos usar um SB. Assim, os clientes fora de um podem usar tanto A e B, mesmo que eles não saibam nada sobre ser. Isto é o básico do polimorfismo. Apesar disso, os desenvolvedores básicos o tempo todo. Eu violei a lógica de tal relação, a
propósito, como observação, quero lembrá-lo de que não é necessário ter um mecanismo como a herança para
modelar tais relações entre objetos. Em linguagens digitadas dinamicamente, usamos a chamada escrita escura. Se um pássaro nada como um pato, ele grata como um pato. Então chamei o anúncio de pato. É por isso que o termo “digitação de pato “apareceu dinamicamente. Idiomas digitados não sabem se temos permissão para chamar um determinado método ou não. O tempo de execução verifica. Se um objeto pode responder a uma mensagem dizendo uma mensagem, quero dizer uma chamada para o método, já que em linguagens de texto dinamicamente, é melhor dizer Enviar uma mensagem em vez de chamar um método. Vamos voltar ao tópico principal. Há duas maneiras de quebrar a habilidade substituto. Violar contrato e violar variantes de co variância ou controle. Para um número significativo de desenvolvedores, não está claro o que isso significa? Por isso, requer mais esclarecimentos. Sem compreensão, esses conceitos fundamentais não serão capazes de projetar tipos que não violem sua fala . Cedo ou tarde, você vai esbarrar nos problemas horríveis causados por, oh violação de velocidade. Então mantenha os pacientes e vamos começar com os contratos na próxima palestra.
19. 03 contratos: Esta palestra é intitulada Contratos. Programming to Contracts foi elaborado por Burton Meyer em seu livro clássico, Object Oriented Software Construction. Ele descreveu as vantagens da programação para contratos. Ele até saiu com toda a nova linguagem chamada Eiffel, que foi construída com a programação para contratos em mente. Então, qual é o contrato? Muitos desenvolvedores faz as noções fora de uma interface eo contrato. A declaração torna-se mais convincente com o fato de que na WC, se tratarmos interfaces e contratos igualmente em W. C. F. um contrato de serviço só pode ser representado por uma interface no mundo real, incluindo o mundo real. Fora da programação, os contratos têm alguma carga semântica. Normalmente, eles determinam algum tipo de relações entre as pessoas, escreve objetos e assim por diante em rostos não têm qualquer carga semântica. Eles não determinam nada exceto assinaturas, mas as assinaturas não suportam nenhuma carga semântica significativa. Uma interface representa apenas uma forma. Assim, interfaces não são contratos. Aqui está um exemplo de um contrato fornecido por Christophe Kulina. Este contrato diz que quando um item é adicionado à coleção, as propriedades de contagem incriminadas por um. Além disso, este contrato está bloqueado para todos os subtipos. Então, um contrato de um método constitui fora das seguintes partes. Valores ou tipos de entrada aceitáveis e inaceitáveis e seus significados. Retorna valores ou tipos e seus significados. Erro e condição de exceção, valores ou tipos que podem uma cura e seus significados, efeitos
colaterais, pré-condições, condições pós. E em variância da perspectiva de aprendizagem, estamos mais interessados em condições prévias, condições postagem e em variância para condições. Off uma função é o set off requisitos. Uma função se aplica aos parâmetros de entrada e às vezes ao estado do objeto ao qual essa função pertence. Tenho um exemplo simples da minha própria prática. Facilita o curso, simplificado e apresentado em uma forma fora de um esqueleto por uma questão de simplicidade. Aqui tem dois modelos diferentes de terminais bancários. Ambos os modelos derivam da interface do terminal do banco de olhos, que define a operação de pagamento do processo. Estes terminais compartilham uma quantidade significativa de lógica de negócios, e eles têm interfaces muito semelhantes, então os desenvolvedores decidiram juntar-se a eles, introduzindo que eu banco interface terminal. Infelizmente, ambos os terminais têm seus próprios gateways de pagamento com interfaces diferentes. Um requer um único i d para ser gerado pelo cliente, enquanto outro não faz com que os desenvolvedores
universais A P. I. I.apenas lançaram um único método com dois parâmetros. A implementação fora do primeiro terminal apenas ignora o segundo parâmetro, enquanto o segundo verifica o I D. exclusivo E se é agora ou espaço certo, ele lança a exceção argumento. Um cliente, que trabalhou com o primeiro terminal, não espera tal comportamento trabalhando com o 2º 1 Isso acontece porque o segundo herdeiro fortalece as pré-condições. O primeiro terminal aceita o único I D, que pode ser igual a qualquer valor. Não foram aplicadas restrições. O corolário é que um cliente tem que estar ciente de diferentes comportamentos destes
terminais Ben . Os clientes que trabalharam com o primeiro terminal não esperariam exceções. Trabalhando com o 2º 1 passando agora como um único i d. A hierarquia não só viola sua WASpy fortalecendo as pré-condições, mas também viola eles uma velocidade enfraquecendo as condições de postagem o primeiro terminal retorna O resultado código off tipo você termina o que significa que o código de resposta é igual ou maior que zero? No segundo caso, o código de resultado pode ser menor que zero fora do curso. No segundo caso, a lógica interna do gateway de pagamento, minha garantia de que ele retorna apenas códigos que são iguais ou maiores que zero, mas fingir que ele não fornece tais garantias. Os desenvolvedores queriam implantar a interface universal, então eles definiram o pagamento do processo. É um método que retorna um inteiro. Aqui vemos que o primeiro terminal retorna um final você, mas ele tem que lançá-lo ponta dedo do pé para satisfazer a interface Muitas vezes. Nesses casos, os clientes estão cientes das garantias fornecidas por um dos implementadores. Por exemplo, neste caso, o método diz explicitamente nos comandos que a resposta retornada é sempre positiva. O segundo terminal enfraquece as condições de postagem em comparação com o primeiro terminal. É por isso que os desenvolvedores tiveram que definir o método de pagamento do processo com o
tipo de retorno do ensaio inteiro . Eles tentam fazer uma interface universal falhar porque os clientes precisam saber os
detalhes internos . No final, eles sabem que o primeiro modelo realmente garante que ele retorna. Códigos positivos, apesar da assinatura não refletem isso. A ideia geral é que, ao enfraquecer as condições postais, os herdeiros estendem o possível resultado de uma função. Como resultado, os clientes enfrentam situações inesperadas ou eles no final têm que entender diferentes casos e tratá-los de uma maneira específica você pode escrever contratos na plataforma dot net em C shop com uma biblioteca especial chamada code contratos. Não surpreendentemente, usando contratos de código, você pode aproveitar a verificação de código de desligamento declarado na correção devido a alguns
problemas práticos e problemas relacionados à má implementação fora da biblioteca de contratos de código. Não é uma abordagem muito popular. Hoje em dia, por exemplo, chamados contratos trabalhar muito lento em grandes soluções. E esta é apenas uma das razões pela qual esta biblioteca está fora do alcance das pontuações. Então, se você estiver interessado em contratos de código, você pode apenas Google para isso. Outro problema que eu quero demonstrar está relacionado com a violação fora em variância em um exemplo
clássico na próxima palestra.
20. 04 Demonstração do problema: esta palestra é intitulada Ellis Be Violation Demo. Consideremos um exemplo clássico de Phyllis P. Violação. Eu amo este exemplo por duas razões. O 1º 1 é que ele realmente demonstra a violação L S P, e esse motivo é óbvio. E a segunda razão é que ele mostra que a programação orientada a objetos muitas vezes pode
mapear diretamente as relações entre objetos no mundo real para o mesmo modelo fora das relações entre eles em código. Um grande número de desenvolvedores pensam que escrever código na linguagem Hopi, eles estão modelando problemas de domínio do mundo aéreo. E, em parte, isso é verdade. Mas as relações do mundo real entre objetos às vezes podem ser móveis diretamente na
linguagem Opie . Aqui está uma das declarações ingênuas esperanças óculos infantis. Implementar é uma relação com classes baseadas. Por exemplo, cão é um gato animal é um animal, então podemos criar três classes. Animal é a classe base, e os outros dois são herdeiros. Infelizmente, às vezes esse tipo de design não funciona como esperado, e você verá isso em um minuto. Então vamos refletir as relações entre duas noções de mundo riel em código. Queremos implementar um retângulo e quadrado ser capaz de calcular suas áreas. Tenho certeza que concordará comigo que na Praça do Mundo existe um caso especial fora do retângulo . São outros porque o quadrado é um retângulo com lados iguais. Certo, vamos mudar para o estúdio visual. Vamos criar um retângulo e quadrado. Eu criei a classe retangular, que tem duas propriedades com e altura, e o quadrado, que herda de sua classe emaranhado. Separadamente, vou criar a classe, que é responsável por calcular áreas dessas formas. Parece bem. Do primeiro lado. Vou fingir que sou um cliente e quero criar duas formas e calcular suas áreas. Para isso, vou implementar o método principal onde todas as coisas vão acontecer que primeiro, eu vou apenas criar um retângulo com igual a dois e ocultar igual a cinco. Depois disso, chamarei o método de ângulo correto ST IC Cal e obterei o resultado, e também enviarei o resultado para o console. Agora eu quero criar um quadrado. Espere um minuto. O que diabos é isso? Como um quadrado pode conter lados de diferentes comprimentos. Eu nem vou executar o programa, vez que é óbvio que algo está errado aqui com uma pilha de quadrado permite definir diferentes comprimento para largura e altura. Este design viola claramente a lista de substituição. O quadrado principal não é substituto hable para retângulo retângulo implementa a variante in , que afirma que a largura e a altura podem estar desligadas. Diferente Praça Terra tem que implementar outro em variante que afirma que largura e altura têm que ser iguais. Eu intencionalmente omito isso. Na verdade, eles também têm que ser maiores ou iguais a zero. Há outro problema que está se escondendo aqui. Muito provavelmente, você precisaria criar métodos que tomam retângulo como um parâmetro e implementar alguma lógica
de negócios. No caso de calcular a era, esse método poderia se parecer com isso. Este método verifica o tipo do parâmetro aceito e executar o
algoritmo de cálculo apropriado . O que você acha? É uma boa maneira de definir métodos em toda a base de código que têm que trabalhar com retângulos? Não se assemelha a algo que já vimos antes? Sim, fato, isso é uma violação do princípio de fechamento aberto. Este método está aberto para modificação. O que acontecerá se introduzirmos uma nova forma? Correto. Teremos que modificar. Essa é a declaração que este exemplo de violação de Gillespie é uma violação oculta fora da OCP. Na próxima palestra, veremos como corrigir esse problema
21. 05 Refactoring para um design melhor: Obviamente, precisamos fazer impossível definir diferentes distâncias de comprimento para um quadrado para corrigir o problema. Por enquanto, as expectativas dos clientes quadrados estão quebradas. O ar, uma classe calculadora agora demonstram que há um problema fora dados separados e comportamento . Os algoritmos de cálculo são separados do retângulo e dos óculos quadrados, que possuem os dados necessários para os cálculos. A calculadora de área não pode existir sem retângulo e quadrado. Então, por que o comportamento foi afastado do retângulo e quadrada e quadrada por agora, obviamente falta de coesão para curar a doença, onde sempre deve construir abstrações adequadas. O que queremos obstruir é a lógica comercial do cálculo da área. Cada forma tem seu próprio algoritmo fora de cálculo. A área. É muito melhor tornar o comportamento compartilhado em vez de dados. Vamos obstruir o método de cálculo da área introduzindo a interface em forma de I. Quero que o retângulo e o quadrado herdem da forma do olho. Implementando seus próprios algoritmos, Square agora define sua própria propriedade chamada comprimento lateral. Agora um cliente não pode usar mal. É um P I. Aqui está um exemplo de um cliente em caso de retângulo chamando para calcular a área, Um cliente dará a área fora de um retângulo, enquanto em caso de quadrado, um cliente irá obter a área de um quadrado. O cliente pode definir diferentes tamanhos, largura e altura para um quadrado. Ótima. Na próxima palestra, vamos olhar para outras maneiras fora É violação.
22. 06 mais exemplos de Violações de LSP: esta palestra é intitulada Mais Exemplos Off L S P violação. Estamos metidos a discussão fora de um tópico muito importante. Variance Variance é um conceito muito complicado. Então, vamos apenas tocar neste tópico. Apesar de estar relacionado com a variância L S P é a noção que descreve a
conformidade dos tipos . Ela se estende a duas noções, coerência e contra variância. Assumindo que o tipo A enlatado o elenco para o tipo B Tipo X é co variante no caso X fora de um enlatado o elenco dois x off b, por exemplo. Eu emprestado fluxo pode porque para a minha barra fora do objeto este trecho de ouro mostra que s é chamado Aaron também. Oh, aqui está um exemplo simples que demonstrou o problema de lançar como humano teria a seguinte hierarquia de classe o animal de vidro base e os herdeiros cão e gato e uma nave implementação
genérica fora da pilha. O código a seguir não irá compilar em C shop c afiada d proc oitos isso para evitar a possibilidade de escrever o seguinte código que estamos tentando aqui para adicionar gatos a cães Um aumento na loja
C são variante co por causa de razões históricas. Portanto, o código a seguir será compilado e a violação fora do L S P será detectada Onley no tempo de execução. Haverá uma exceção. A partir da loja C para interfaces genéricas. Permitir variantes através de palavras-chave especiais dentro e fora classes genéricas. Ao mesmo tempo, não permita variantes. A palavra-chave out garante que dentro da implementação fora dessa interface, um parâmetro genérico só pode ser usado nas instruções return. Resolve o problema que vimos com a adição de um gato a uma pilha de cães. Isso pode ser expresso como no trecho a seguir. Mesmo a classe pilha do exemplo anterior implementar esta interface do que o seguinte código irá compilar e ser absolutamente correto. Pelo contrário, podemos usar a palavra-chave in para garantir que o parâmetro genérico é usado apenas como a entrada. Aqui está o trecho de código, que demonstrou a idéia se o vidro de pilha implementa esta interface do que o seguinte código irá compilar e ser absolutamente correto. Outro exemplo que eu quero mostrar vem do Basile fora do framework dot net. Também é um exemplo bem conhecido da violação do SP. Há uma interface genérica chamada coleção I, muitas vezes definido no BCL. A parada deriva do inumerável de chá, e define os seguintes métodos. Adicione claro. Contém cópia, também. Remova. Há uma classe aérea de cirurgiões chamada Read Only Collection fora da equipe, que deriva da coleção I da equipe. Sim, você pode adivinhar a partir do nome fora da coleção somente leitura off T. Ele implementa uma coleção que não pode ser alterada após a inicialização, ao mesmo tempo, leitura única coleção Off T deriva da coleção I de chá. O que significa que ele deve suportar todas as operações definidas nesse pai, uma interface genérica. Uma segunda sequência, a coleção só de leitura tem que implementar, adicionar métodos claros e remover de alguma forma, mas como é suposto implementá-los, tendo em conta que essas operações são dip localizado para executar em apenas leitura fora do curso, não
há nenhuma maneira significativa de resolver este problema. Então lá ele só coleção apenas joga. Eles não são suportados. Exceção a esses métodos de modificação. Ele viola claramente a lista de princípio de substituição, uma vez que os clientes que trabalham com a minha coleção de chá não esperam tal comportamento. E isso é lógico porque outras implementações fora I coleção de chá, como uma lista de chá não jogar não é suportado exceção. Eles só funcionam é esperado de uma classe que expõe métodos de modificação. Lançando, exceção
não suportada é um forte cheiro fora l S P violação. Outro cheiro que indica que a violação L S P demonstra a si mesmo aparecendo fora
muitos moldes para baixo na base de código. Se um cliente está constantemente verificando os tipos reais de classes ou interfaces baseadas, isso significa automaticamente que um cliente está preocupado com implementador diferente. Zobaie. Alguma razão significa que um clã conhece alguns detalhes internos sobre a
construção da hierarquia de objetos . O cheiro é uma conseqüência da violação SP Um exemplo de tal cheiro que você viu
na palestra onde discutimos as relações entre quadrado e retângulo. O trecho de código no slide também demonstra esse problema. Custos baixos nem sempre são a indicação de violações da controladora de armazenamento. É permitido abafar um tipo. Se você tem certeza absoluta sobre o tipo, você precisa baixar para considerar o exemplo a seguir. Por exemplo, se tivermos certeza absoluta de que esta função é chamada apenas com um I d fora de um
cliente privilegiado , então podemos baixar livremente o objeto retornado do repositório e executar uma operação desse tipo de downcast, apenas por assim dizer, lembra o compilador que o tipo rial é cliente privilegiado. Na próxima palestra, marcaremos alguns cheiros comuns que indicam que analistas são violação.
23. 07 cheiras comuns de violação de LSP: esta palestra é intitulada Common Smells Off LS Be Violation. Vamos resumir os cheiros comuns que podemos enfrentar, que indicam que Bayliss é uma violação. Primeiro de tudo, se um método lança então não suportado exceção de seu corpo e outra noção, que descreve este caso é a noção fora assim chamado legado recusado. O significado é que a busca infantil herda algo, mas não sabe o que fazer com o legado herdado e recusa-o lançando exceções do que não suportadas. Outra forma do mesmo legado recusado é quando um método tem uma inter implementação. Este é o mesmo caso. A única diferença é que um método recusa legado não tão veementemente, e outras preocupações de cheiro para baixo moldes para baixo significam que um cliente tem que saber
detalhes internos da obstrução. Depende disso. Aqui estão algumas dicas para se conformar com l S B. Tente manter em sua mente o dizer não pergunte princípio, que significa, em essência, que o código de clientes deve ser capaz de apenas passar mensagens sem pensar em qualquer detalhes internos do colaborador. Idealmente, os clientes não devem ser incomodados verificando quaisquer condições. Lembre-se que l S P violação é muitas vezes econ seqüência off OCP ou violação SP. Vamos falar sobre o princípio de segregação de interface na próxima seção, então basta levar em conta por agora esse fato Em tais casos, corrigir a causa raiz leva a uma correção automática da violação L S P. Se você tem duas classes que compartilham alguma lógica e eles não são substituto Hable, então pense em criar uma nova classe base para esses dois óculos. Em seguida, herdar essas duas classes de uma classe base e garantir que seu substituto hable a nova classe base. Na próxima palestra, tiraremos uma conclusão.
24. 08 Conclusão: esta palestra é intitulada Conclusão. O principal que discutimos ao longo desta seção foi a interface segregação príncipe ou eu falo em camisa, há P tem uma definição simples. Os clientes não devem ser forçados a depender de métodos que não usam. Portanto, essa definição implica que você tem que se esforçar para grandes, pequenas, coesas e focadas interfaces. Claro, diferentes clientes podem usar apenas um subconjunto de membros do FBI de que dependem. A menos que AP, eu começo a crescer transformando em uma interface muito gorda com membros não relacionados uns aos outros , onde, quando métodos semelhantes, mas diferentes parecem satisfazer os requisitos de diferentes clientes . Uma forma típica de violação que você viu, era quando uma interface era muito ampla. O que levou a alguns cheiros como implementador lance não implementado exceção ou clientes têm que
ver toda a massa na inteligência pensando fora o que eles realmente precisam usar como
discutimos , existem várias maneiras de lidar com eu falo violações. Às vezes, basta extrair uma interface separada de uma gordura e usá-la quando apropriado. Às vezes você precisa sair com uma fachada que se esconde irrelevante. Membros da AP I. Às vezes você precisa aplicar um padrão de adaptador, especialmente se você não possui a interface fat, e assim você não pode modificar seu código-fonte. A adesão inteligente ao princípio da segregação da interface torna uma aplicação mais fácil manter o que é extremamente valioso, especialmente a longo prazo. Abusando eu falo você pode acabar com tons. Off to small interface é o que os torna mais difícil de usar por clientes antigos. Este é um cheiro conhecido como anti gelo. Seja assim que chegamos ao final desta seção. Foi uma investigação interessante. Mas há um outro princípio à nossa espera, o princípio da inversão da dependência. A próxima seção é dedicada ao
D.I.P. D.I.P. D.I.P. vamos direto ao assunto.
25. Contorno 01: Oi. Este é o último lugar para diversão de engenheiro de cozimento. E nesta seção, vamos aprender onde estão os princípios. Nós nos referimos aos princípios que vamos falar nesta seção sobre
os princípios da matéria porque eles são as raízes de todos os outros princípios mais concretos aderentes aos quais estamos realmente tentando nos conformar com os princípios da matéria. Vamos começar pela secadora. Não repita o princípio. Você aprende a definição dos cheiros mais comuns de violar o princípio seco. Depois disso, você aprendeu as chaves ou mantê-lo simples. Princípio estúpido. Aqui vamos falar sobre simplicidade e complexidade, complexidade acidental e essencial e como alcançar simplicidade. O próximo meta-princípio de que vamos falar é o jovem eu ou você não vai precisar dele. Está relacionado com o cheiro de complexidade desnecessário e diz respeito às antecipações de
características comuns . Vamos analisar os problemas práticos que enfrentamos e quais outras consequências da implementação de recursos que realmente não precisamos. Depois disso, vamos falar sobre o princípio da meia ou separação de preocupações. Este princípio está subjacente ao incenso. Todos os princípios sólidos. A separação de preocupações é muito importante para alcançar aplicações bem mantidas. Você verá as formas mais comuns de violar a separação de preocupações. Princípio princípio de separação consulta Comando torna mais fácil raciocinar sobre. O código discutirá o mínimo de Demeter, que é o principal conhecimento fora da lista. Separadamente, vamos falar sobre o princípio menos espanto você. Em seguida, vamos tocar o tópico de ocultação de informações e encapsulamento. By the way, vou usar a palavra princípio em vez de princípio matéria nesta seção. Além disso, apenas para economizar algum tempo na próxima palestra, você aprende sobre o princípio seco. Vamos começar.
26. Definição 02 de ISP: esta palestra é intitulada Declaração de Problema. Antes de dar uma definição, quero dizer algumas guerras sobre o que queremos dizer aqui. Pela palavra interface. Fora do curso. Into Face é uma palavra-chave reservada em C shop, que permite declarar um non. Tal construção define um FBI como forma, que tem de ser implementada por herdeiros dessa interface. Ao mesmo tempo, não
é necessário implementar uma interface para expor uma interface. O que quero dizer é que óculos que não implementam qualquer interface têm sua própria interface é composta de membros visíveis publicamente. O conjunto de membros públicos de um vidro representa a interface dessa classe. Então, simplesmente colocar, e interface é o que os clientes vêem e usam uma grande definição simples off. O princípio da segregação da interface foi dado no livro. Você já ouviu fora na cadeia princípios, padrões e práticas em C shop. Então a definição é a interface. princípio da segregação afirma que os clientes não devem ser forçados a depender de métodos que não usam. Uma conclusão simples que podemos tirar desta definição é que você deve preferir interfaces pequenas coesas a interfaces de gordura apenas no caso. Vou lembrá-lo que coeso significa que apenas membros de um P I estão logicamente relacionados uns com os outros. É sempre útil olhar para uma imagem, o que ilustra o problema. E, claro, isso também é uma chance de se divertir. Olhe para esta ilustração. Este monstro quer comer. E é por isso que diz que se eu precisar de comida, então significa que eu quero comer alguma comida, não candelabros leves ou talheres de layout. Isso obviamente implica que se você tem uma interface pública chamada, Eu exijo comida, seria bobagem ter métodos como aeronaves almoço ou matar personagem exposto pela interface. Aqui está uma nota histórica interessante sobre o que eu falo. Tenho certeza que eu Speed foi usado pela primeira vez há muito tempo antes de Robert Martin, mas a primeira formulação pública pertence Toa Robert C. Martin, um k Tio Bob. Ele se inscreveu lá, fala pela primeira vez, bem consultando para Xerox. Xerox criou um novo sistema de impressora que poderia executar uma variedade de tarefas como grampeamento e fax. O software para esse sistema foi criado a partir do zero. À medida que o software crescia, fazer modificações tornou-se cada vez mais difícil, de modo que até mesmo a menor mudança
levaria um ciclo de reimplantação, muitas vezes o nosso, o que tornou o desenvolvimento quase impossível. O ciclo de reimplantação levou tanto tempo porque naquela época não havia nenhum trabalho de compra ver . Essas linguagens compiladas muito rápido o que não podemos dizer sobre C mais, por exemplo, um design ruim de um programa C mais pode levar a um tempo significativo de exaltação de compilação. As consequências são dramáticas. Vamos voltar à história. O problema de design era que uma única classe de trabalho era usada por quase todas as tarefas. Sempre que um trabalho de trazer ou um trabalho de grampeamento precisava ser executado, uma chamada foi feita para a classe de trabalho. Isso resultou no vidro de fato, com multidões off método específico para uma variedade de clientes diferentes. Por causa desse design, um trabalho de grampo saberia sobre todos os métodos fora do trabalho de impressão, mesmo que não houvesse uso para eles para resolver o problema. Tio Bob surgiu com uma idéia que é chamado para o princípio da segregação facial. Hoje, o
Tio Bo criou e precisa enfrentar a camada entre o vidro de trabalho e seus clientes, usando o princípio de inversão de dependência que vamos falar na próxima
seção em vez de ter um grande copo de trabalho, uma interface de trabalho de grampo ou uma interface de trabalho de impressão foi criada que seria usada pelas classes de
grampo ou impressão, respectivamente. Chamando métodos fora do vidro de trabalho. Portanto, um em face foi criado para cada tipo de trabalho, que foram todos implementados pela classe de trabalho de modo a segregação face. principais violações resultam em classes que dependem de coisas que não precisam, aumentando o acoplamento e reduzindo a flexibilidade e mantendo a capacidade. Na próxima palestra, olhamos mais de perto para o problema fora da violação de gelo P.
27. 03 Demonstração do problema: Esta palestra é intitulada Ice Be Violation Dama um. Eu quero mostrar a você Ariel Case da minha prática, que estava relacionado com o problema fora em segregação rosto. Eu tenho trabalhado muito com dispositivos,
e uma vez que eu enfrentei o seguinte caso antes de conceder, Eu quero dizer que eu gosto de dar exemplos aos alunos que refletem toda a imagem do caso do mundo
aéreo. Então eu vou descrever todos os detalhes relacionados ao problema porque eu acho que isso ajuda a entender o material muito melhor. Então, no nível superior, temos uma aplicação monolítica WBF, que funciona em terminais de serviço pontuais. Esses terminais permitem que as pessoas compram bilhetes em trens suburbanos. Essa aplicação permite aos utilizadores comprar bilhetes através de cartões de crédito. Assim, o aplicativo tem que trabalhar com terminais bancários. De alguma forma, devido a algumas razões comerciais, havia vários modelos de terminais bancários integrados para passar terminais, então todos eles tiveram que ser suportados. A interpretação com terminais bancários não é direta. Os produtores de terminais de proibição fornecem seus próprios aplicativos através dos quais nosso aplicativo pode trabalhar com seus terminais bancários. Seus aplicativos são implementados como vêm servidores. Se você não sabe o que é um servidor com apenas pense nele como um
serviço executável independente . O diagrama reflete o fluxo de operações. Vamos ver o código. Há o mínimo de operações desligadas, que são suportadas por qualquer terminal bancário possível. É por isso que eu defini a interface do terminal Eye Bank, que reflete o B I fornecido pelos serviços que a Inter operam
diretamente com terminais bancários . Agora eu tenho três implementações fora da interface do terminal do banco de olhos, Zap Terminal, seu próprio terminal e terminal PDQ. Estou inserido na implementação rial, uma vez que isso complicaria muito o exemplo. E não há nenhuma intenção de mostrar a você as entranhas e detalhes de baixo nível. E agora descreverei o problema que surgiu. O problema é que os terminais bancários são diferentes. O terminal algum é uma solução de caixa preta que fisicamente é uma caixa que por conta própria funciona com cartão de crédito em atraso. Grandes leitores de cartões de identificação são aqueles dispositivos que aceitam o seu cartão, ler o barato ou uma faixa magnética e distribuir cartão de volta para você. Então seu próprio terminal não expõe cara para Inter operando com leitores de cartão porque o aplicativo de
serviço define automaticamente coisas antigas e acessórias ao mesmo tempo, os outros dois terminais bancários, PDQ Terminal e Zap Terminal don não assumir a responsabilidade por Inter desfilando com leitores de cartões automaticamente. Pelo contrário, eles delegam essa responsabilidade a um cliente, expondo um P I para interdesfilar com leitores de cartões. Então, no primeiro caso, nosso aplicativo não precisa fazer nada. Enquanto nos outros dois casos são aplicação tem que mostrar uma janela para postar engenheiros de
manutenção terminal para fornecer a capacidade de configurar os dispositivos de terminal do banco corretamente. Vejamos a View Model Class, que é um apresentador para essa janela, que permite aos engenheiros de manutenção configurar os dispositivos de terminais bancários. A janela tem quatro botões, que permitem testar se o contato ou contato com os leitores estão em uma determinada porta. E para encontrá-los através da varredura de todas as portas disponíveis no sistema, precisamos passar os leitores de cartão Communicator of Your Models, Constructor Independence, que é capaz de testar e procurar leitores de cartão em portas. Agora pergunte a si mesmo, o que você faria para resolver o problema? As maneiras simples de adicionar assinaturas de método diretamente no terminal do banco de olhos? Vamos fazer isso e ver o que vai acontecer. Ok, já que temos três implementador Z quando você implementar o apenas editar um Prime Members, - huh ? O que vamos fazer aqui Zone Terminal serviço não fornece em um grito para se comunicar com leitores de cartão aparentemente, precisamos lançar, não suportadas exceções dos membros implementados. Este caso não te lembra alguma coisa? Algo que vimos na seção anterior? Fora do curso. Esta é uma violação fora da lista de princípio de substituição. Mas o que estamos falando é do principal de segregação da interface, não estamos? Sim, estamos. A questão é que, como eu disse antes, todos os princípios estão relacionados um com o outro. Às vezes eles têm relacionamentos escondidos. Neste caso particular, acabamos com sua violação wispy como conseqüência, fora gelo ser violação se ficarmos com a solução atual e exigimos a
interface terminal ibon como um parâmetro fora do comunicador de leitores de cartão de seu construtor de modelos. Um dia alguém passará o terminal de zona para o construtor
e, em seguida, o usuário receberá uma exceção depois de clicar no botão de teste ou pesquisa
na janela. Então, se quisermos evitar eventos tão infelizes, precisamos reconhecer o fato de que a interface do coronel do banco de olhos é muito gorda. Ele contém membros AP I excessivos. OK, na próxima palestra, vamos refletir rapidamente o problema.
28. 04 Refatoração para um design melhor: na palestra anterior foram concluídos que a interface coronel Banco olho é muito gordo, a manjedoura e duplo senhor. A técnica de fatoração, que geralmente se aplica para aderir ao SP, é que criamos interfaces pequenas e
isoladas que representam responsabilidades concretas bem definidas. Neste caso específico, temos de separar a responsabilidade que diz respeito à Inter operando com
leitores de cartões . Então eu vou fazer isso. Agora. Devemos implementar esta nova interface de nossos dois modelos fora do Terminal Bancário, que na verdade pode inter operar com leitores de cartões. PDQ Terminal já implementar esta interface e zip terminal também. Ótima. Agora podemos exigir que os leitores de cartão i cabo Comunidade na cara nos modelos vista. Construtor. Ótima. Não há mais chance de alguém passar por uma instância inapropriada que não pode trabalhar com leitores de cartões. E, a propósito, agora é muito mais compreensível o que um membro principal usar aqui. Uma vez que temos uma interface de um propósito aqui, esta visão como um cliente fora da interface não deve ser incomodada por membros excessivos AP I
do terminal Eye Bank pensando fora de seu papel. Agora tudo está em suas prateleiras. Ao jogar o SP, alcançamos o baixo acoplamento entre métodos que são diferentes por seu significado, e assim alcançamos alta coesão entre eles em interfaces segregadas. Na próxima palestra, veremos outro caso de violação mal-humorada.
29. 05 demonstração do problema: No caso anterior, o implementador muitas vezes interage muito de você. Usou algo que não deveria saber. É por isso que ele não poderia implementar alguns membros corretamente. Assim, a existência de um problema tem Lloreda sido óbvio no nível fora em face implementer. Muitas vezes, o problema é mais profundo. Quando o problema se mostrar no Lee no nível do cliente do implementador, considere o exemplo a seguir. Eu tenho uma classe de configuração aqui que é implementado s ordenar um singleton. É construtor é fechado e ele só pode ser criado pelo método inicializado. Usado para serializar é um arquivo de configuração XML. Não surpreendentemente, teria uma classe que utiliza esta configuração aplicativo. Aqui temos o vidro de relatório que implementa alguma lógica de negócios fora da geração de relatórios. Atualmente depende diretamente do vidro de conflito. Por causa disso, não
podemos facilmente escrever um teste de unidade para a classe de relatório. O que só pode fazer é escrever um teste de integração que lida com arquivo de configuração XML, configurando-o corretamente. O que podemos fazer é obstruir a classe de configuração, mas introduzindo uma interface, vamos extrair uma interface e eu vou extrair todos os membros públicos. Agora podemos solicitar esta interface para ser passado no construtor fora da
classe relatório . Agora podemos escrever um teste sindical. O que há de errado com este teste? Eu assento todas as propriedades, mesmo aquelas que não são exigidas pela lógica interna do relatório. Vidro. Podias perguntar-me porquê. Eu realmente disse todas as propriedades que eu poderia definir apenas aqueles que são necessários em parte seu direito. Isso resolveria o problema com o excesso de ouro. Mas imagine que existem toneladas de propriedades como no arquivo de configuração do mundo real. Alguns deles até têm nomes semelhantes escrevendo uma unidade melhor. Você estaria tão certo de que você definiu todas as propriedades exigidas pela missão em teste? Não, você não faria. Você verá constantemente toda essa massa na inteligência perguntando a si mesmo se essa classe requer isso ou outra propriedade a ser dita. A única maneira de se livrar da massa e tornar o código claro e limpo é aplicar o princípio de segregação da
interface para resolver o problema. Vamos aplicar o Eu falo na próxima palestra
30. 06 Refatoração para um design melhor: para curar a doença. Nós deveríamos. Cigarro deu a interface de configuração. O relatório. Glass deve conhecer apenas a parte da configuração relacionada à geração de relatórios. Vamos extrair essa parte em interface separada e nós pedimos esta interface para o passado nos relatórios Glass Constructor. Agora, a classe de relatório está ciente apenas das coisas que são relevantes para os relatórios. Lógica de negócios. Vamos implementar o teste de unidade agora. Ótima. Agora não precisamos pensar em Forell e outras coisas que este teste é simples, limpo e compreensível. Na próxima palestra, aprenderemos o cheiro comum Bastam violações P. Quais correções podemos aplicar e quais os clientes de design relacionados com o Eu falo Temos à
nossa disposição ?
31. 07 cheiradores, correções e padrões relacionados: esta palestra é intitulada Common Smells Fixe padrões relacionados. Então vamos falar sobre cheiros comuns, que indicam que o seu frio violou o princípio de segregação de interface. No primeiro exemplo, você viu um cheiro que era semelhante à violação fora. A lista de princípio de substituição que podemos nos referir a este cheiro é degenerar a implementação fora em métodos de rosto. Se um método que percorre um método fora de um vidro base ou implementa um método herdado de uma interface lança uma exceção, provavelmente não implementado exceção ou simplesmente não faz nada. O que é chamado de implementação degenerativa que indica que eu velocidade pode ser violada. Isso é lógico, vez que há uma chance muito alta de que um cliente fora de tal vidro não quer saber sobre essa matemática ele e não quer usá-lo ao mesmo tempo. Isto é uma indicação de violação de velocidade. Visto que tal busca não pode atuar como uma substituição para o vidro base ou uma interface. Às vezes, em tais casos, houve violação é a causa raiz do problema. Mas muitas vezes sua causa é a violação do gelo. Seja assim que você deve estudar seu caso particular e descobrir o que causa o problema. Outro cheiro, que você viu na segunda demonstração, pode ser descrito como o caso quando um cliente chamado faz referência a uma classe, mas usa apenas uma pequena parte fora. É um P. I. Obviamente indica que há um haitiano local entre esses óculos. Isso deve sugerir que algo está errado aqui, e você precisa parar a investigação do problema. Muitas vezes você vai descobrir que o problema se esconde atrás das duas gorduras em rostos. Para corrigir o problema, você deve segregar adequadamente essa interface. Outro sub-caso aqui é que quando você vê uma interface fat, mas você não possui, você pode alterar a interface porque você não pode modificar seu código-fonte. Nesse caso, pode ser útil aplicar se Assad melhor. Você viu o aplicativo fora deste padrão na seção SRP. No caso de violação mal-humorada, usamos fachada para reduzir a largura de óculos gordos, um p I. Se você tem uma interface gorda e é um P, eu não sou compatível com uma interface do lado do cliente. Quando você tenta usá-lo, então você pode achar que também existe a possibilidade de aplicar o adaptador melhor. Primeiro, vejamos o padrão do adaptador. Geralmente, o que é um padrão de Deborah? De acordo com o livro Gang of Four Adjunto Pattern destina-se a converter a interface de um copo em nada para enfrentar os clientes. adaptador espera permite que os óculos trabalhem juntos que não poderiam de outra forma. Devido a interfaces incompatíveis, este slide demonstra que um caso de um adaptador pode ser aplicado. Imagine que no início ter o cliente, que depende da interface do lutador. Por outro lado, temos a Classe Mágico, que expõe três membros incompatíveis com a interface de caça. Se quisermos usar o Assistente através da interface do lutador, precisamos introduzir um adaptador assistente, que implementa a interface do lutador e usa internamente o Assistente. Adapta-lo no nosso caso, quando falamos sobre eles para enfrentar o princípio de segregação. Não temos um problema clássico quando o adaptador é normalmente aplicado porque não lidamos com incompatíveis em rostos. No nosso caso, as interfaces não são incompatíveis. Um é muito gordo para o outro. No entanto, o quarto adaptador também pode ser aplicado no nosso caso também. Vejamos o código e o estúdio visual, que demonstra este caso aplicando o padrão do adaptador para aderir ao que falo. Eu não saí com um caso real, então vou te mostrar um exemplo completamente sintético. Aqui está o caso. No início, você vê que temos a interface Eye Wide, que define quatro métodos A, B, C e D. Os clientes Cold quer ver apenas os métodos A e B. Para aplicar o padrão adjunto, nós pode definir uma interface estreita I separada, que define nos métodos A e B. O adaptador em si vai implementar que eu estreitar interface enquanto ele aceita a interface de
largura dos olhos . Instância no construtor como a implementação fora A e B métodos adaptador apenas delega a responsabilidade para a interface olho largo. Instância, o ouro dos clientes agora pode confiar na interface estreita A. Tomando a instância no construtor. Podemos passar na instância do adaptador, eo cliente terá o acesso apenas dois métodos A e B. Isto é como o padrão adaptador pode ser aplicado para aderir ao gelo ser Há outro caso
complicado relacionado com o padrão adaptador. Digamos que temos uma bolsa de classe Páscoa, que é diretamente usada por muitos clientes. E agora digamos que novos clientes exigem um novo método na bolsa Páscoa, e eles dependerão apenas desse método. Então podemos fazer o seguinte agora. Os clientes antigos podem usar o por irmã como eles usaram antes, e eles não verão o novo método. Enquanto novos clientes vão ver apenas do que você método esta implementação fora da interface é chamada de Implementação Explícita. Você pode chamar esse método apenas através da interface, modo que o código de clientes a seguir irá compilar. Vamos voltar para os slides. A maneira geral de corrigir um problema com uma interface de gordura é criar, e há interface com apenas métodos absolutamente necessários nele. Em seguida, faça com que a interface Fed implemente sua nova interface e, em seguida, use essa nova interface no código do cliente, que não precisa saber sobre membros AP I irrelevantes fora de uma interface fat. Isso é exatamente o que fizemos na segunda linha,
fatorando Dama enquanto corrige o problema com a configuração. E o último ponto aqui que eu quero abordar é que você não deve travar todas as suas interfaces em um único método em rostos só porque isso vai tornar a violação ice P impossível. Ele Blinder afetam técnicas Oring somente quando você sente que há um pai técnico parou para aparecer aqui e ali ou se um pai técnico ainda não começou a se espalhar. Mas você sabe com certeza que vai se você não consertar a violação do gelo P. A última dica que eu quero dizer sobre diz respeito ao gerenciamento de dependência em um nível binário. Então, o profundo é que é melhor sempre que possível manter a interface dentro da
montagem do cliente . Torna mais fácil mudar a interface. Se algo estiver errado, um cliente será capaz de alterar a interface exatamente como ele quer, em vez de implementar qualquer adaptador. Ok, isso é ótimo. Chegamos ao fim da seção. Na próxima palestra, concluiremos o que você aprendeu nesta seção.
32. 08 Conclusão: esta palestra é intitulada Conclusão. O principal que discutimos ao longo desta seção foi a interface segregação príncipe ou eu falo em camisa, há P tem uma definição simples. Os clientes não devem ser forçados a depender de métodos que não usam. Portanto, essa definição implica que você tem que se esforçar para grandes, pequenas, coesas e focadas interfaces. Claro, diferentes clientes podem usar apenas um subconjunto de membros do FBI de que dependem. A menos que AP, eu começo a crescer transformando em uma interface muito gorda com membros não relacionados uns aos outros , onde, quando métodos semelhantes, mas diferentes parecem satisfazer os requisitos de diferentes clientes . Uma forma típica de violação que você viu, era quando uma interface era muito ampla. O que levou a alguns cheiros como implementador lance não implementado exceção ou clientes têm que
ver toda a massa na inteligência pensando fora o que eles realmente precisam usar como
discutimos , existem várias maneiras de lidar com eu falo violações. Às vezes, basta extrair uma interface separada de uma gordura e usá-la quando apropriado. Às vezes você precisa sair com uma fachada que se esconde irrelevante. Membros da AP I. Às vezes você precisa aplicar um padrão de adaptador, especialmente se você não possui a interface fat, e assim você não pode modificar seu código-fonte. A adesão inteligente ao princípio da segregação da interface torna uma aplicação mais fácil manter o que é extremamente valioso, especialmente a longo prazo. Abusando eu falo você pode acabar com tons. Off to small interface é o que os torna mais difícil de usar por clientes antigos. Este é um cheiro conhecido como anti gelo. Seja assim que chegamos ao final desta seção. Foi uma investigação interessante. Mas há um outro princípio à nossa espera, o princípio da inversão da dependência. A próxima seção é dedicada ao
D.I.P. D.I.P. D.I.P. vamos direto ao assunto.
33. Contorno 01: Oi. Este é o último lugar para diversão de engenheiro de cozimento. E nesta seção, vamos aprender onde estão os princípios. Nós nos referimos aos princípios que vamos falar nesta seção sobre
os princípios da matéria porque eles são as raízes de todos os outros princípios mais concretos aderentes aos quais estamos realmente tentando nos conformar com os princípios da matéria. Vamos começar pela secadora. Não repita o princípio. Você aprende a definição dos cheiros mais comuns de violar o princípio seco. Depois disso, você aprendeu as chaves ou mantê-lo simples. Princípio estúpido. Aqui vamos falar sobre simplicidade e complexidade, complexidade acidental e essencial e como alcançar simplicidade. O próximo meta-princípio de que vamos falar é o jovem eu ou você não vai precisar dele. Está relacionado com o cheiro de complexidade desnecessário e diz respeito às antecipações de
características comuns . Vamos analisar os problemas práticos que enfrentamos e quais outras consequências da implementação de recursos que realmente não precisamos. Depois disso, vamos falar sobre o princípio da meia ou separação de preocupações. Este princípio está subjacente ao incenso. Todos os princípios sólidos. A separação de preocupações é muito importante para alcançar aplicações bem mantidas. Você verá as formas mais comuns de violar a separação de preocupações. Princípio princípio de separação consulta Comando torna mais fácil raciocinar sobre. O código discutirá o mínimo de Demeter, que é o principal conhecimento fora da lista. Separadamente, vamos falar sobre o princípio menos espanto você. Em seguida, vamos tocar o tópico de ocultação de informações e encapsulamento. By the way, vou usar a palavra princípio em vez de princípio matéria nesta seção. Além disso, apenas para economizar algum tempo na próxima palestra, você aprende sobre o princípio seco. Vamos começar.
34. Definição de DIP: Esta palestra é intitulada Definição Off the A P. O princípio da inversão da dependência é tudo sobre a dissociação. Isto é muito importante, por isso vou lembrar-te o que é o acoplamento. O acoplamento indica como os módulos dependentes estão no funcionamento interno uns dos outros. Módulos fortemente acoplados dependem extensivamente do estado específico uns dos outros, compartilhando variáveis e muitos tipos de módulos frouxamente acoplados são bastante independentes. Eles têm alguns olhos AP bem definidos e compartilham uma quantidade limitada fora ou nenhum dado em tudo. Então o acoplamento é o que estava tentando é o processo de alcançar os
módulos frouxamente acoplados . Você pode entender os módulos aqui, tanto como as classes foram felicidade Assam. O D I P é aplicável a níveis diferentes no nível do código-fonte no nível binário. Se você olhar para a Wikipédia, você verá que o baixo acoplamento é muitas vezes um sinal de saída. Um sistema de computador bem estruturado eo bom design e quando combinado com alta coesão , suporta as meninas gerais fora maior irritabilidade e manter capacidade Bem dito de fato. Então, qual é a definição formal? De acordo com os princípios,
padrões e práticas infantis em Souchard pelo tio Bob, módulos de
alto nível não devem depender de módulos de baixo nível. Ambos devem depender de abstrações. As abstrações não devem depender de detalhes. Os detalhes devem depender de abstrações. Parece que esta é uma definição com dois níveis. O primeiro nível diz respeito aos módulos e o segundo diz respeito às abstrações. , esta é uma grande definição No entanto, esta é uma grande definição. É sempre Ele requer alguns esclarecimentos adicionais, uma vez que é muito difícil de aplicar na prática. Esse conselho é sem ver nenhum exemplo prático. Quero mostrar-vos uma fotografia que demonstre a vida real. Dado o soquete da lâmpada e um soldado. Uma pergunta. Levante-se. Você soltaria uma lâmpada diretamente na fiação elétrica de uma parede? Se você fizer isso, você só será capaz de usar esse soquete para aquela lâmpada porque eles são, por assim dizer, bem acoplados. Para corrigir o problema, precisamos sair com um plugue padrão, que você pode ver na imagem pequena direita. Se todos os dispositivos implementarem esse plugue
, eles podem bloquear o soquete. O mesmo é verdadeiro para dependências e código. As políticas de alto nível não devem depender diretamente de detalhes de baixo nível no caso de quatro dispositivos de
imagem não são soquetes diretamente dependentes. Você pode encontrar uma exceção de quase todas as regras. Então olhe para esta foto. Este é um hotel barato onde o secador de cabelo é ligado diretamente à tomada. Mas neste caso, isso é feito intencionalmente, e na verdade é significativo. A intenção neste caso é defender o secador de ladrões novamente. Este é um caso raro nesta palestra. Mencionamos a noção de dependência. Na próxima palestra, analisaremos as dependências mais de perto.
35. 03 dependências 01: Esta palestra é intitulada Dependências, Vamos definir o que queremos dizer com uma dependência. Existem vários tipos de dependências na estrutura em folhas de terceiro corpo, sistemas
externos como banco de dados do sistema de arquivos ou qualquer recurso do sistema e dependência costurada em um tipo
personalizado construído sobre a estrutura dotnet. Nesta seção, o tipo mais importante de dependências para nós são as dependências de tipos personalizados que são desenvolvidos por nós. Por exemplo, aqui no slide, o vidro pessoa depende da classe repositório pessoal. Uma pessoa não pode fornecer seus recursos sem depender da classe de repositório pessoal. O repositório pessoal é uma classe de baixo nível que o Inter opera com um banco de dados, enquanto a pessoa é o objeto de domínio de alto nível. Então, neste caso particular, o objeto de alto nível depende do objeto de baixo nível. Tal caso está alinhado com a forma como os iniciantes constroem software. Tradicionalmente, este é um alto nível de você em um aplicativo clássico, com três lágrimas no topo, temos uma interface de usuário. Uma interface de usuário chama um p I fora de objetos que implementam objetos de lógica de negócios que implementam lógica de negócios, chamam o cara fora de baixo nível objetos de infra-estrutura que implementam em operação com um banco de dados, serviço Web externo e assim por diante. O que há de errado com as relações entre camadas neste diagrama? Sabe o que é? O problema é que objetos de alto nível fora da camada de domínio dependem diretamente de
objetos de baixo nível da camada de infra-estrutura. A lâmpada é soldada ao soquete como um vício. O que você faria se um requisito para mudar o sistema de gerenciamento de banco de dados entrar em jogo ? É difícil como o inferno substituir uma dependência. Se houver um acoplamento apertado entre as dependências,
as partes que mudam mais frequentemente recitam em limites fora de uma interface de usuário do sistema e coisas
relacionadas ao banco de dados são irrelevantes do ponto de vista do domínio, então a lógica do domínio deve ser independente de coisas irrelevantes. Para corrigir o problema, precisamos reverter a dependência que aponta para a camada infraestrutural. Neste exemplo, vou mostrar-lhe como podemos dissociar uma obstrução de outra. Uma teoria fundamental. engenharia de software Mawf afirma que podemos resolver qualquer problema introduzindo um
nível extra de indireção. Então vamos fazer exatamente isso com a pessoa do casal do repositório. Aqui está o slide, que reflete as mudanças feitas por uma fatoração mais simples que muitas vezes nos referimos
a interfaces como parece, essas cenas nos permitem injetar qualquer dependência que queremos. Qual fora do curso implementa essa interface? Esta é uma técnica simples mas poderosa para inverter as dependências, alcançando um baixo acoplamento entre os componentes. Outro aspecto interessante. Preocupações em torno do tempo e tempo de compilação. Dependências. Olhe para o diagrama aqui. Tenha um módulo A que vai função F no módulo. Seja através da interface quando usamos polimorfismo criando uma interface, inserindo-a entre o módulo A e o módulo B. Nós acabamos com esse módulo A tem dependência em torno do tempo em B, mas ele não tem uma dependência compilar sobre ele. Podemos compilar mais Jewel A. se quisermos. Sem a sua compilação de módulo sendo em linguagens como C Plus plus, ajuda a reduzir significativamente a quantidade de tempo de compilação. Esse foi o básico do que as dependências estão em. A próxima palestra analisará mais de perto dois tipos principais de dependências
36. 04 Dependências Volatile e estáveis: mas esta palestra é intitulada Dependências Voláteis e Estáveis. Na palestra anterior, você viu em um exemplo simples como inverter a dependência no repositório, introduzindo uma camada fora na direção de uma pergunta lógica, que vem à mente diz respeito a quais dependências devem chicotes rastreados. E para responder a esta pergunta, a primeira coisa que precisamos fazer é perceber que todas as dependências podem ser divididas em dois campos. Será que um bloco e dependências estáveis vamos definir dependências voláteis ou, em outras palavras, instáveis? De acordo com Mark sêmen, uma dependência deve ser considerada volátil. Se qualquer um dos seguintes critérios for verdadeiro, a dependência depende do ambiente, forçando o refrigerador a configurar esse ambiente. Um exemplo clássico seria uma dependência em um banco de dados ou qualquer tipo que implique em reparação com um banco de dados. Quaisquer outros sistemas externos, como servidores Web, também se enquadram nesta categoria. A dependência ainda não existe e ainda está em desenvolvimento. Este é um negócio regular quando queremos escrever código,
que, que, entre outras coisas, inter operar com um objeto em existência. Neste ponto, nós não queremos esperar que o objeto seja escrito, então nós somos apenas introduzidos uma costura, que reflete o A P I desse objeto e fazer chamadas através dessa cena. A dependência, que não está instalada em todas as máquinas fora dos desenvolvedores e a dependência, tem um comportamento stick de menos de 10 minutos. Ele pode depender do dia agora geração de números aleatórios e instável semelhante por sua natureza . Coisas em geral. Podemos definir dependências estáveis como dependência é que não são voláteis. Pode parecer estranho, mas é bastante simples e útil, então vamos ficar com a definição. Dependências voláteis são aquelas que querem abstrair através da introdução de níveis de direção. Como eles são instáveis, pelo menos
precisamos ter uma maneira de substituí-los por testes duplos em testes unitários. Caso contrário, podemos acabar com a aplicação BLE não testada. Lembre-se que você pode tratar um aplicativo testável até que seu projeto permite escrever
testes de união . Se um aplicativo permite apenas testes de integração, ele deve ser considerado ble não testado. Vamos elaborar o tópico da dieta ser aprendendo termos muito próximos. Eu o. C e D I.
Falaremos sobre eles na próxima palestra
37. 05 definições de IoC e DI: esta palestra é intitulada Definições Off Fire C e D I. Na palestra onde discutimos a noção de dependências, vimos este diagrama. Se você olhar mais de perto, você vai notar que Mogul A tem um relacionamento fora da composição com a interface. Significa que precisamos injetar o módulo B como o implementador dessa interface. De alguma forma, este exemplo demonstra o que é dependência. Dependência da injeção A injeção é uma das noções mais importantes usarão ao longo desta seção. Então vamos separar dependência, injeção e dependência princípio de inversão para evitar mal-entendidos fora estes intimamente relacionados uns com os outros conceitos. Na verdade, há outro termo geral na versão do controle, e você também deve entender a diferença entre esses termos e os dois anteriores que falamos. Então vamos dar definições para esses termos, e vamos começar a partir do COI. Inversão de Controle é um termo muito geral, que reflete o motile off relações entre um cooler e um collie. Um fluxo clássico de controle implica que um cliente tem um controle total sobre o ambiente e sequencia chamadas para métodos de biblioteca. A inversão do controle implica que Macaulay podemos implicar qualquer método de biblioteca quando dizemos chamada. Assuma o controle sobre alguns resfriados entre a cor e o chamado. A forma mais simples de uma nova versão do controle é as costas frias. A idéia principal de um retorno de chamada é fornecer uma maneira para uma chamada chamar uma cor de volta. Então é por isso que há uma diferença muito importante entre as bibliotecas regulares e frameworks. Frameworks governam o cliente. Estruturas de revestimento fornecem blocos que têm de ser apenas campo pelos clientes. As estruturas também têm o controle sobre o meio ambiente. Esta é a inversão do controle na dependência da ação. Princípio de inversão é uma versão mais detalhada fora da inversão da noção de controle D. I. P. Concretizar é que os módulos de alto nível não devem depender de módulos de baixo nível e assim por diante. A inversão do controlo é uma questão de princípio. Em certo sentido, de acordo com a definição da injeção de dependência dada por Mark Semen em seu livro Dependência Injecção em dot net, que Air Command para você muito. Injeção de dependência é um conjunto de princípios e padrões de design de software que nos permitem
desenvolver código frouxamente acoplado. Ao mesmo tempo, você precisa entender que eu vi pode existir sem d I COI é possível sem morrer porque podemos mudar a implementação, contando com subclasse ing, por exemplo, jogando o padrão de modelo que foi discutido anteriormente. No entanto, a principal maneira de realizar a inversão do controle é responder
técnicas de injeção de dependência . Na próxima palestra, você verá um exemplo de violação do dia P.
38. Demonstração de violação do DIP: Aqui está uma dama simples, que demonstra a essência de um problema. Neste caso, você tem uma classe chamada Verificador de divergência, e aqui está o que você tem para dispositivos físicos, que são representados por duas classes, encontro e registro fiscal. Este é um caso da minha prática na Rússia. Quando vendemos qualquer coisa, precisamos registrar a operação de venda em um dispositivo especial chamado Registro Fiscal. ER, no meu caso, terá um dispositivo separado que executa operações de criptografia e descriptografia e ,
infelizmente, tem que dobrar a responsabilidade de um registro fiscal, mantendo todos os detalhes sobre células em segurança. Como conseqüência, precisamos verificar periodicamente se não há divergência entre os contadores fora de um
registro fiscal e esse dispositivo especial representado aqui pela classe contadora para realizar a verificação. Implementei esta aula agora mesmo. Esta busca logicamente tem dependências. Depende de um contador e registro fiscal. ER, essas classes diretamente falou com dispositivos físicos no mundo real, o verificador de divergência do jogo expôs mais de um método público, mas neste caso, é suficiente ter o único que este método realmente verifica. Se houver uma divergência entre contadores fora de dois dispositivos. Este método usa ambas as dependências. É preciso dois contadores de um dispositivo e logicamente mesmos contadores de outro dispositivo, mas então ele apenas verifica. Se os valores correspondentes são iguais, digamos que queremos escrever um teste de unidade para o método de divergência cabeças. Como vamos fazer isso com o design atual, não
há como escrever um teste de união para ganhar divergência. Classe Checker está firmemente acoplado ao contador e registro fiscal. ER, essas dependências são instáveis ou voláteis, uma vez que representam dispositivos físicos riel. Os dispositivos físicos são sempre inclinados dedo do pé instável cabelo ba. É por isso que não podemos escrever testes fidedignos de unidade. Na próxima palestra, veremos três maneiras de aplicar injeção de dependência para corrigir o problema.
39. 07 Refatoração para uma melhor injeção de dependência para dependência: A causa raiz do projeto testável da ONU neste caso é que esta classe é desonesta. Mente para seus clientes. Mentira sobre o fato de que tem que ser. Dependência é escondê-los. A de primeira maneiradecorrigir o problema é fazer com que a dependência seja visível. Existem três principais maneiras de realizar essa injeção Construtor, injeção propriedade e injeção de método. Injeção de construtor é quando as dependências de solicitação a serem passadas através do construtor. Então o refletor óbvio e pode ser feito é isso. A primeira coisa que precisamos fazer é criar uma cena que servirá como um limite entre a lógica principal e os dispositivos externos. Agora podemos continuar o nosso processo de re factoring. Agora, um cliente não pode criar o ganho caro contra o Checker sem pensar em dependências. Um cliente os vê e tem que decidir o que Passan. A responsabilidade é transferida para o lado do cliente e isso é bom. Agora podemos escrever um teste de unidade substituindo essas dependências por duplas de teste que estão sob um controle
total de código de clientes. Antes de escrever um teste unitário. Olhe para as outras duas opções de injeção de propriedade e injeção de método. Em primeiro lugar, vamos ver como chamado Luke falta com uma injeção de propriedade. - A diferença entre esta opção e a anterior é que o código do cliente pode redefinir a dependência sempre que quiser ao mesmo tempo. Do ponto de vista, um cliente agora pode criar o verificador de divergência ganho e esquecer de definir as dependências. Depois disso, ele pode chamar que tem divergência, método e face do que outra exceção de referência. Isso significa que o encapsulamento desta classe está quebrado. Ele não fornece garantias de que seus métodos funcionarão como esperado. Outra opção é solicitar as dependências no método onde elas são necessárias. Pode parecer um pouco estranho, mas é uma opção absolutamente válida. Nesse caso, o código de clientes não terá conhecimento de quaisquer dependências até que ele chame o método. Este experimento preserva o encapsulamento. Ele fornece garantias de que eles têm divergência. O método funciona como esperado. Em qualquer caso. Vamos escrever um teste de unidade, que valida a correção do
graude método de divergência cabeças grau . A morte passa. Nesta palestra, você viu um exemplo simples de aplicar as técnicas de injeção de dependência lá de fato, realmente simples. Em exemplos maiores, as técnicas permanecerão as mesmas antes de continuar. Eu quero dar um resumo sobre as técnicas de três dias que acabamos de aplicar na próxima palestra
40. Técnicas de DI do 08: Esta palestra é intitulada D. I. Técnicas. Injeção de construtor implica que as dependências estão indo para ser passado através do construtor. O aspecto mais benéfico da injeção do construtor é que ele protege a variância
do objeto que o objeto deseja. Criar sempre será um estado inválido. No entanto, você deve estar ciente das seguintes possíveis armadilhas. Em sistemas grandes, injeção
de construtor tende a um camelo. Oito muitas dependências. Você pode ver mais de três dependências solicitadas via construtor. No entanto, esta não é a desvantagem da injeção do construtor em si. Muito provavelmente, este é um sorriso de violar este R P. No caso de um construtor exigir que mais de três ou quatro dependências sejam passadas, considere a possibilidade de extrair quaisquer responsabilidades em classes separadas. Às vezes acontece que várias dependências tendem a ser passadas juntas. Aqui está um trecho de código, que mostra que se o seu modelo tem dependências e imagine que muitos outros
modelos de visualização também têm as mesmas dependências. Nesses casos, seria sábio para criar um objeto recipiente para eles e exigir que recipiente objeto para ser melhor nos construtores. Parece que não tem efeito, mas é sempre uma boa idéia juntar objetos que vão juntos em muitos casos. Um dia você quer introduzir uma validação personalizada importada, que está relacionado, disse as dependências ou algo assim, no entanto mais provável do que para parâmetros é o cheiro deste Artie violações, Eu disse. Portanto, dê uma olhada mais de perto nas responsabilidades de uma classe que requer tantas dependências. Outro caso interessante dizia respeito a isso, por assim dizer. dependência não obrigatória é como um madeireiro. É uma solução válida para expor vários construtores, alguns off que disse que as implementações padrão fora das dependências. Você pode ver aqui um exemplo. Neste caso, você pode substituir no teste de unidade o I A logger Por um maldito, é o dobro que ele não faz nada enquanto no código de produção, os clientes podem simplesmente usar o construtor padrão, já que na maioria dos casos, ninguém se importa com os mecanismos de registro. Outro belo que você pode tropeçar é que tais frameworks, como a estrutura de entidade ou outros mapeadores relacionais de objeto, podem exigir de objetos para ter um construtor padrão público. Nesse caso, você será forçado a expor a construção padrão pública. Caso contrário, você receberá uma exceção no tempo redondo. Claro, você pode considerar escrever um wrapper em torno de tal objeto, que fica muito perto de um limite de um sistema, preservando
assim o encapsulamento. Se uma determinada dependência é usado apenas um único método,
em seguida, considere remover essa dependência do construtor e solicitado como um argumento
do método que certamente precisa dele e não pode fornecê-lo serve sem ele. Em outras palavras, considerar usar o método injeção de propriedade implica expor as dependências através de propriedades com setters públicos. Ele permite substituir a dependência durante todo o tempo de vida do objeto. A flexibilidade é a principal vantagem. , neste caso No entanto, neste caso, as desvantagens são tão pesadas que devemos esforçar-nos por confiar nesta forma de injectar Onley em caso de não-obrigação. Independência é tão Slager. Nesses casos, sempre deve
haver implementação padrão fora da dependência, e ele deve ser definido em um construtor padrão ou direito na propriedade. Você vê o exemplo no slide? Este adicional dourado depende da loja do mar. Seis recurso off inicialização da propriedade. Em qualquer outro caso, você deve evitar a injeção de propriedade, vez que facilmente pode quebrar o encapsulamento fora de uma classe e fazer a dependência está escondida. Independência é exposta como propriedades estão escondidas porque ninguém é obrigado a lembrar todos
os detalhes internos de um método de classe. A injeção é uma técnica interessante. Dependências, que são propriedades de fogo definido, ou construtores, são geralmente usadas por muitos métodos durante toda a vida útil do objeto. No entanto, às vezes e lee implementação variam de uma chamada para outra chamada ou se o método é estático, por exemplo, a conversão de uma moeda para outra requer um objeto que obtém a taxa. Um exemplo semelhante é o provedor de formato I, que é necessário em métodos como barras duplas. No entanto, pense duas vezes antes de implementar o método de injeção. Se você quiser passar uma dependência diretamente para uma matemática. Só porque Onley esse método entre 20 outros métodos usa essa dependência, então isso é um cheiro de uma violação xaropia, talvez uma responsabilidade separada escondida dentro do vidro. Outro problema com essa abordagem é que os contêineres do COI não podem injetar automaticamente as dependências. Dois métodos que vejo contêineres são ferramentas que ajudaram a automatizar o processo de
injeção de dependência , e vamos discuti-lo mais adiante nesta seção. Ok, agora temos a idéia de injeção de dependência e três técnicas principais. Estas técnicas simples têm implicações fundamentais fora do curso. No rial, coisas
vivas podem ser um pouco mais difíceis do que vendia esta palestra. Os problemas, a beleza, o nível arquitetônico. Vamos falar sobre implicações arquitetônicas da inversão da
injeção de controle da Independência na próxima palestra.
41. 09 implicações arquitetônicas: esta palestra é intitulada Implicações Arquitetônicas. Inversor Dependência é o meio pelo qual criamos limites entre módulos de software . Quando queremos criar um limite, escolhemos quais dependências inverter contra o fluxo de controle. Então todos eles apontam na mesma direção através dos limites, como neste slide fora do caminho que criamos golpes. Um plug in é um módulo que é chamado anonimamente por outro módulo. Em outras palavras, do colar não tem idéia de quem ou o que ele está chamando neste caso. O módulo que ele não sabe que ele chama o módulo. Sendo golpes podem ser implantados de forma independente e, além disso, eles desenvolvem de forma independente um ble. Dividimos o sistema por limites e depois invertemos. A dependência é que cruzou esses limites, então golpes definindo os limites do seu sistema. O antigo modelo de construção de sistemas de software com três níveis é que o móvel centrado em dados em tais arquiteturas do banco de dados e que o esquema é o centro do sistema. Ele dirige todas as outras partes do sistema. Falando francamente, esta abordagem ainda está viva e, por vezes, pode ser benéfica. Mas agora os dias estavam inclinados a tratar base de dados e suas ferramentas de I s, que podem ser substituídas em arquiteturas centradas em dados. Uma parte significativa da lógica principal vai ser implementada no site do banco de dados para que ele será implementado em procedimentos armazenados com uma linguagem como sequela. O principal problema com esta abordagem é que o processamento de dados linguagens relacionadas como Sequel , que são muito eficientes no processamento fora dos alunos, não
foram projetados para implementar lógica de negócios, pelo menos, partes significativas da lógica de negócios . Linguagens relacionadas ao banco de dados são muito pobres em recursos que permitiram a motile relacionamentos entre objetos de domínio. Esta é uma das principais razões pelas quais a comunidade mundial de desenvolvedores mudou para outra abordagem em que o banco de dados é tratado como um detalhe de baixo nível. E aqui chegamos ao ponto em que continuamos a analisar as implicações da arquitetura com base em plugins. Aqui está um diagrama onde o domínio está no centro. Quando tratamos banco de dados e você ferramentas sábias, que são principalmente irrelevantes, chegamos com a idéia de que o núcleo da aplicação fina é a lógica do domínio. lógica da demanda é a parte mais estável do sistema. Parece que as políticas de domínio mudaram relativamente raras. Por exemplo, a parte certa muda muito mais frequentemente. Observe que todas as dependências apontam para o domínio. Se você ampliar este diagrama, assumindo que esses tocos grandes são compostos de muitos objetos, você terá o diagrama a seguir. Tenho este diagrama do quarteirão de Mark Semen. Notei que toda a dependência ainda aponta para o centro fora da aplicação. Se você inserir as camadas deste diagrama, você terminará com o seguinte. Este diagrama descreve o que as arquiteturas chamam de arquitetura cebola. Existem outras noções semelhantes, como arquitetura hexagonal e portas e adaptadores. Arquitetura. Todos estes termos significam essencialmente o mesmo. São todos os mesmos portos. Todos esses parece que introduzimos através da extração em rostos e adaptadores são plugins, que vêm do limite de um sistema em grandes sistemas. O gráfico de dependências é muito grande, embora você deve se esforçar para manter o gráfico s mais plano possível, mesmo se você manter o gráfico plano. Você também pode enfrentar o problema ao controlar o tempo de vida das dependências. Isso leva a uma pergunta interessante. Quem é responsável por manter o controle sobre as dependências instância, ver ação em sua vida e, em seguida, jurou é óbvio. Qualquer aplicativo começa a partir do método principal. Os desenvolvedores geralmente se referem ao Maine como não a um ponto de entrada físico, mas a um ponto de infra-estrutura onde todas as relações entre dependências devem ser configuradas. A idéia de configurar todas as dependências em um único lugar no Maine realmente está de acordo com o princípio de escolha única que foi discutido na seção OCP. Maine é o único lugar que sabe tudo sobre as penalidades em seus relacionamentos . Isso não significa necessariamente que todas as dependências serão inst enshi ated no Maine. Alguns deles podem ser exemplo que ela odiava no Maine. Na verdade, o outro será criado automaticamente no tempo de execução, acordo com a configuração feita na partição principal. Nesta palestra, descobrimos que o principal é o ponto infraestrutural onde estabelecemos todas as dependências. Agora precisamos entender como configurá-los na prática. Na próxima palestra, olharemos mais de perto a pureza. Eu e eu vemos contêineres. Eles estão relacionados a duas técnicas principais que permitem configurar as dependências e
injetá-las corretamente
42. 10 pinças do CITE e IoC: Esta palestra é intitulada Pure D I e eu vi contêineres. Esperemos que agora você entenda as possíveis dificuldades que você pode enfrentar aplicando as
técnicas de injeção de dependência . Basicamente, existem duas maneiras de lidar com injeção de dependência. O 1º 1 é criar manualmente todas as dependências e dependências fora das dependências e injetá-las explicitamente chamando o novo operador passando no construtor. Todas as dependências necessárias Mark Semen, referiu-se a estas abordagem manual quanto à chamada morte do homem pobre em 2014 Mark aparentemente aposentado este termo, substituindo-o por um novo termo puro morrer. A razão foi que o D I do pobre homem parecia um pouco depreciativo ou menos atraente. Ele também não comunicou a mensagem que morrem sem um D.
Um recipiente é, em muitos casos, melhor do que o olho dentro do recipiente IRC. Pelo contrário, parecia que não é tão bom. Foi uma citação do bloco Mark Seamans, Bost. Vou mostrar-lhe um exemplo de morrer puro de um pedido de reserva ou escrito por Mark Semen. Você pode ver aqui nos principais lotes de código. Este é um exemplo trivial conhecido, que demonstra o quão difícil pode ser configurar e rastrear todas as dependências manualmente, contando com um D I. É por isso que temos contêineres de IRC de pleno direito. Vamos voltar aos slides a segunda maneira de lidar com os olhos para confiar em um
recipiente COI . Então, o que é um contêiner IRC ou um contêiner D I? Em outras palavras, vejo recipiente é um quadro que ajuda a aplicar dependência. Injeção. Esta é a principal característica do recipiente de gelo Fannie. Vejo que o contêiner injeta dependências automaticamente fora do curso, os contêineres fornecem a
capacidade de configurá-los configurando essas dependências. Então, quando o código de clientes pede a um contêiner para resolver uma dependência específica, um contêiner sabe como criar essa dependência. Ele sabe como criar as dependências fora que as dependências soldado coercivamente cria Alden dependência acessório é até que ele cria. Eles pediram um. No slide, você pode ver um diagrama de dependências de tipo. Imagine que fazemos uma chamada para Nizer Container para resolver o principal do seu modelo. Em outras palavras, queremos de uma enfermeira um contêiner para obter uma instância fora do principal de sua classe móvel. O principal da sua classe média depende do cliente I na cara. Ele pega essa interface no Construtor. Então, para criar o modelo de visão principal, o contêiner COI procurará mais longe Para descobrir como resolver a interface do cliente I, o contêiner encontrará a classe do cliente que implementa essa interface do cliente, modo que o contêiner tentará criar a busca do cliente. fim de criar a classe de cliente, o contêiner tem que passar para o seu construtor que eu repositório de clientes uma vez que a
classe de cliente depende desta interface para resolver o repositório de clientes I, COI continuará a cavar mais fundo e encontre o implementador dessa interface. Ele descobrirá que eu interface do cliente pode ser resolvido pelo repositório do cliente. Mas para criar o repositório do cliente o contêiner e precisa resolver o I. D ser Gateway parece que o repositório do cliente depende dele e finalmente morre. O contêiner irá criar o gateway de banco de dados e depois que o contêiner irá criar
repositório do cliente do que o cliente e, em seguida, o principal do seu modelo. Então é assim que nossos contêineres marítimos um lee recursivo resolveram dependências. Este diagrama não mostra o contêiner COI propriamente dito. Se colocarmos aqui, há uma classe de contêineres. Dependerá de todos esses tipos. Tem que saber sobre todas as dependências. É o trabalho do contêiner, sua responsabilidade. Na próxima palestra, eu quero demonstrar rapidamente como construir uma implementação ingênua a partir de um
recipiente COI simples para esclarecer o mecanismo básico de como eles funcionam.
43. 11 Criação de um recipiente de IoC simples: Vamos implementar um recipiente muito simples que eu vejo. No início, vou definir um mapa entre tipos. Este mapa conterá relações de 1 a 1 entre dependências. Aqui está fora do curso. Precisamos expor um método público que permita aos clientes registrar dependências. Este é um método genérico que leva dois tipos e adicioná-los ao nosso mapa. Não há mais nada para explicar. Vamos criar um método público para resolver dependências. Este método também é genérico. O parâmetro T é o tipo que um cliente deseja ser resolvido. Este método chama outro método que será privado e implementar toda a lógica fora do recipiente. Aqui temos o tipo correspondente do mapa. Se não o encontrarmos, lançamos uma exceção. Observe que temos um tipo. Esta não é uma instância fora de um tipo. É o descritor. Vejo contêineres usados um reflexo pesado. Sem reflexão. É impossível analisar dependências de tipo e criá-las corretamente, tendo um tipo que podemos solicitar. São construtores. Implementamos um recipiente COI muito simples. Então, por uma questão de simplicidade, eu apenas obter o primeiro construtor de um tipo tendo descritor fora de um tipo que podemos solicitar seus parâmetros. Se não houver parâmetros, basta criar uma instância fora de uma dependência e retorná-la. Caso contrário, precisamos resolvê-los. Lee recursivo. Então nós precisamos fazer o seguinte este frio recursivo Lee tenta resolver todos os parâmetros
construtores. No final, queremos criar uma instância fora de uma dependência, então vamos chamar o construtor passando os parâmetros. Aqui vamos nós. Confie em mim, Este é um recipiente RC muito simples. Nada mais, nada menos. Vamos tentar usá-lo. Digamos que queremos resolver o modelo de visão principal. Eu te mostrei no diagrama na palestra anterior. Antes de resolver o principal que você modelo, temos que configurar o recipiente COI. Então estamos registrados. Dependência é um por um, modelo de visão
principal é mapeado para si mesmo em rostos são mapeados para o implementador correspondente Z. Depois disso, podemos resolver o grau de modelo de visão principal. Eu disse um ponto de ruptura e leva a reduzir o programa para garantir que tudo funcione bem. Sim, você pode ver onde é o ponto de freio. E se eu passar o ponteiro do mouse sobre a instância do modelo de exibição principal. Vejo que foi criado com sucesso. Tudo funciona bem. Então essa foi a essência de qualquer um. Vejo contêineres. Na próxima palestra, vou mostrar-lhe um aplicativo que é construído com recipiente NRC para demonstrar como cenários
do mundo real pode parecer.
44. 12 Demonstração de um aplicativo do mundo real: aqui são implementados um aplicativo simples que permite gerenciar os alunos menos fora. A solução consiste em vários projetos. O gerente de estudantes é um aplicativo WP F que contém pontos de vista, e eu vejo bootstrapping recipiente. Se você quiser mais granularidade, você pode manter a face bootstrapping em um conjunto separado. Quadro indiano é o quadro que suporta o padrão MVV n e, neste caso fornece um simples olhos, um recipiente. Vamos olhar para o aplicativo foram de perto este aplicativo suporta operações de multidão simples . Esta é uma aplicação WP F e é implementada com eles V V M Padrão. Isso implica melhor que três partes visão móvel e via visualizações móveis são representados por
arquivos de exemplo . Então views representam a razão por que cada um de vocês tem um modelo de exibição correspondente nomeado em conformidade. Por exemplo, a exibição principal tem o principal correspondente do seu modelo. Os elementos são vinculados a propriedades e métodos fora de um modelo de exibição correspondente. Isto é conseguido através de um mecanismo especial em WP F chamado de ligação de dados. Por exemplo, se o usuário clicar no botão adicionar na exibição principal, essa chamada será tratada pelo método de estudante do anúncio, que pertence ao modelo de exibição principal. A replicação é criada com a ajuda de uma pequena estrutura, que eu também escrevi por mim mesmo para demonstrar como as estruturas fornecem. Esses parece para escurece notar que o modelo de visão principal requer três argumentos para ser passado via construtor. A primeira dependência é a interface, que permite realizar operações de multidão sobre os alunos. O banco de dados, neste caso, é representado por um arquivo XML. Por uma questão de simplicidade, eu não tenho agregador permite passar mensagens entre quaisquer componentes fora de um sistema. Mais uma vez, estes pormenores não são muito importantes para a nossa discussão. A última dependência representa uma cena fornecida pela estrutura que permite abrir e fechar novas visualizações a partir de modelos de visualização dentro. Quando você cria um aplicativo baseado em esquecimento, você precisa conectar exibições e remodelar. De alguma forma, uma maneira importante é em vez disso, ela comeu uma vista e, em seguida, de você modelo e outra é o oposto. No primeiro criativo você modelar e, em seguida, localizar, e em vez disso, ela comeu uma visão correspondente. Nossa estrutura suporta ambos os modelos. Vejamos agora o framework e como nosso aplicativo está recebendo bootstrap. Este quadro. É a estrutura que permite conectar automaticamente seus modelos, conectando-os a visualizações para fornecer esse recurso. Um framer tem que saber quais assemblies verificar através da pesquisa de um correspondente do seu modelo. A pesquisa é baseada na convenção de nomenclatura. Se uma visão principal foi criada, então uma estrutura procurará um homem do seu modelo nos assemblies. Adicionado a este arrendado pelo aplicativo que se baseia neste quadro. Aqui está o pedaço fora de ouro, que verifica através de assemblies e procura por um modelo de visão e agora a parte mais relevante sobre o nosso tópico. A base de bootstrap ER é uma grande aparência que nos expõe um vidro abstrato que tem de ser implementado no off principal. O aplicativo que quer confiar no quadro este parecer, permite quadro toe resolver automaticamente dependências e g. Criar e inserir interfaces Zoff implementador. assemblies selecionados devem ser substituídos pelo cliente. Ele deve retornar uma lista completa fora assemblies que continham dependências. Mas eles recebem instância, é um método abstrato que será usado pela estrutura para resolver as dependências. Portanto, um cliente deve substituir este método usando um contêiner IRC que ele deseja usar configure para no tempo e configure para tempo de design deve configurar o contêiner ice e eles têm que
ser escritos por um cliente. O método principal de um cliente deve chamar um método de início que configura a estrutura. Este método configura todas as coisas internas fora de uma estrutura. E, em seguida, você também pode notar que o método off resolução é atribuído a um estado de
campo público fora da classe COI. Essa classe representa um localizador de serviço. Com esta classe, você pode solicitar o resultado para dependência de qualquer lugar que você quiser. Isso é necessário porque há um par de lugares no quadro onde esse método é usado. Caso contrário, a estrutura não teria acesso ao mecanismo fora da penalidade. Resolvendo o fornecimento pelo cliente. Lembre-se de que você deve chamar o contêiner apenas a partir do código infraestrutural. Se você chamar explicitamente o código de clientes visto pelo ar, provavelmente
você deve ocultar as dependências. Vejamos o lado do cliente. Receitas recusadas da base de stripper do barco. Ele usa o antigo e poderoso recipiente RC chamado Castell Windsor. O contêiner Windsor é definido como um campo. As montagens selecionadas retornam às montagens,
montagens fora de uso e exibem modelos. A instância configure em torno do tempo sombra o contêiner,
mas, em seguida, ele registra a primeira dependência usando o AP Windsors, eu vou dizer que se um contêiner será solicitado para resolver o provedor de dados I do estudante, ele deve passar o provedor XML Students como a implementação da interface genérica. Além disso, dizemos que a criação do provedor XML estudantes um recipiente deve passar os alunos rap sobre XML String como um argumento para o construtor. Eu tenho Integra, Gator e eu gerenciador de janelas são registrados depois. Estão registrados da mesma forma, exceto um detalhe que diz respeito à vida deles. O método Lifestyle Singleton garante que o implementador Zoff essas interfaces serão criadas uma vez e depois disso, a mesma instância será passada em todos os lugares. Eu não tenho agregador ou eu gerenciador de janelas que eu pedi. Então eles são escolhidos e eles vão deixar durante toda a vida fora do aplicativo até que o domínio dos aplicativos seja descarregado. No final, há uma chamada para o registro de seu método de modelos. Olhe para ele. Este método adiciona ao recipiente todas as classes cujo nome termina no modelo de exibição. É assim que a arquitetura com plugins e os rappers é implementada para entender em torno do fluxo de execução de tempo. Vou mostrar-lhe o seguinte modelo de aplicação de diagrama é definido pela estrutura de par W. Ele define um evento de inicialização. Esse aplicativo se inscreve e o manipulador pode ser tratado como o ponto de entrada ou o método
principal. Este manipulador cria o bootstrap ER, que herda da base stripper, definido na nossa pequena que herda da base stripper,
definido na nossa pequenaestrutura
Vivian. E vai o método de início. O método de início chama a configuração em torno do tempo leva ao processo de configuração do
recipiente gelado . O Castell Windsor em nossa aplicação WP de fornece o ponto onde dissemos a primeira visão que tem de ser aberta. Só não te mostrei. Eu disse isso para uma infra-estrutura especial de vista shell Yukol. Esta exibição é um controle de usuário que custa outras exibições. Prateleira Você usa um mecanismo especial de fiação automática, modelos
off view fornecidos pelo quadro indiano. Uma vez que todas as dependências e todas as assembléias são bem conhecidas para o quadro indiano, é um pouco Cades. A prateleira seu modelo e criou por que há um recipiente. O show do seu modelo cria automaticamente o principal do seu modelo de I I C, e as visualizações correspondentes criadas através do mecanismo especial WBF fora modelos de dados. Está tudo bem para usar estão vendo a prateleira do seu modelo. Uma vez que este do seu modelo é uma infraestrutura pura, ele é responsável apenas por alternar as exibições em cima de uma vista shell. Neste ponto, o aplicativo é iniciado e a janela principal é visível para o usuário. Agora, quando o usuário clica em, por exemplo, no aluno em Parton, o modelo View chama o gerenciador de janela I, que é uma parte da estrutura indiana, passando para o tipo fora de um modelo de exibição. A vista correspondente fora, que tem de ser aberta no caso off no aluno lá seria passado o aluno editar do seu modelo. E aqui o moldura entra em jogo. Ele cria o modelo de exibição solicitado. Por que eu vi, em seguida, ele localiza o tipo de vista e cria-lo. Depois disso, ele conecta o modelo de exibição para revisão, definindo o contexto de dados fora do modo de exibição a instância de
modelos de exibição . Finalmente, o quadro chama o W pay for method show na janela para torná-lo visível. Aqui está o fluxo de execução. Observe como as estruturas fornecem muitas portas para o ouro dos clientes, que diz que elas são feitas por adaptadores implementados no lado do cliente. O código de clientes define a lógica de negócios Framer faz seu próprio trabalho, fornecendo todos os recursos de infra-estrutura
necessários. Seu contêiner marítimo assume a responsabilidade de criar dependências e gerenciar sua vida útil. Cada parte faz o seu próprio trabalho. Muito agradável. Se você quiser alterar o mecanismo de persistência, nenhum problema Apenas implementado eu provedor de dados e configurar o I. C s u precisa e você está feito. Sem problemas. Esta demonstração mostra como aplicações do mundo real talvez estrutura você perdoar, Lou o ouro fonte desta aplicação e começou este exemplo em seu próprio combustível três. Para desmascarar o aplicativo e olhar para fora é construído em profundidade antes de ir para a conclusão. Vamos resumir o que aprendemos a marcar alguns cheiros comuns à violação do JP.
45. 13 cascos de as violações de DIP: Esta palestra é intitulada “Cheiros Comuns da Violação AP”. Todos os cheiros comuns da violação do dia P tomam suas raízes da definição do dia p. O I P afirma claramente que as políticas de alto nível não devem depender de detalhes de baixo nível,
Assim, os cheiros comuns são os seguintes. Um fechamento cria explicitamente uma ou mais dependências ocultando-os de um cliente. Uma classe usa dependência não determinística é como dia ou aleatório. Existem maneiras para o casal tais dependências, que muitas vezes vêm do próprio quadro dotnet. Uma maneira é criar uma classe que trabalha com dependências não determinísticas e cobri-la por testes de integração. E outra opção é criar algum tipo de adaptador fora. Quero dizer, criar sua própria interface e implementado em uma classe personalizada, que usa dependências não determinísticas. Em seguida, você pode usar essa interface personalizada no código de produção e substituída por duplas de teste , que estão sob seu controle Em testes de unidade, uma classe usa dependências declaradas com muita frequência. São os únicos vigaristas do Singleton. Muito difícil. Dependências declaradas de uma classe também estão ocultas de um cliente,
portanto, se um estado de dependência não foi instância adequada, criado que uma classe provavelmente se comportará incorretamente lançando exceções. E isso obriga os clientes a se lembrarem de dependências ocultas o tempo todo. Isso é quase sempre uma coisa ruim. A idéia principal de remover os cheiros D I. P é que você precisa extrair uma camada fora em direção em Make the Class, que, enquanto é o D I p dependente dessa camada fora na direção. Outro princípio, que muitas vezes ajuda, é o princípio da responsabilidade única. Aderir ao SRP muitas vezes ajuda a evitar a extração de interfaces inúteis. Na próxima palestra, vamos resumir o que aprendemos nesta seção.
46. 14 Conclusão: Esta palestra é intitulada Conclusão. Na seção que você aprendeu o que é dia a ser implica que as políticas de alto nível
não devem depender de detalhes de baixo nível. Existem dois tipos principais de dependência é estável e instável ou volátil. Dependências instáveis são aquelas às quais não aplicaremos a inversão do controle. Que inversão da injeção de independência de controle são e como essas noções estão relacionadas com o D. I P e uns com os outros. Três técnicas de injeção de construtor de injeção de dependência, que devem ser usadas em 95% dos casos, e injeção de propriedade e método que aderindo ao D. I P. leva a um plug in arquitetura, que é comumente referida como a arquitetura de portas e adaptadores. Isso nos levou a uma conclusão de que deveria haver um único lugar que saiba tudo sobre aplicação, dependências e seus relacionamentos, e este lugar é feito. Também aprendemos que a injeção de dependência manual pode se tornar tediosa e é por isso que vejo contêineres existirem, o que ajuda a simplificar a injeção de dependência. Em casos difíceis, você aprende a construir um recipiente gelado simples, e você viu um exemplo de um aplicativo do mundo real que depende de um recipiente gelado e instala-o no Maine. E também resumimos o que o comum cheira à violação do Diaby existe e como
corrigi-los . Esta seção é a última neste volume, que cobre o último principal fora da sigla sólida. No próximo volume, discutiremos os princípios da matéria e como eles estão relacionados a princípios sólidos. Estarei esperando por você na próxima seção. Obrigado por assistir.
47. Contorno 01: Oi. Este é o último lugar para diversão de engenheiro de cozimento. E nesta seção, vamos aprender onde estão os princípios. Nós nos referimos aos princípios que vamos falar nesta seção sobre
os princípios da matéria porque eles são as raízes de todos os outros princípios mais concretos aderentes aos quais estamos realmente tentando nos conformar com os princípios da matéria. Vamos começar pela secadora. Não repita o princípio. Você aprende a definição dos cheiros mais comuns de violar o princípio seco. Depois disso, você aprendeu as chaves ou mantê-lo simples. Princípio estúpido. Aqui vamos falar sobre simplicidade e complexidade, complexidade acidental e essencial e como alcançar simplicidade. O próximo meta-princípio de que vamos falar é o jovem eu ou você não vai precisar dele. Está relacionado com o cheiro de complexidade desnecessário e diz respeito às antecipações de
características comuns . Vamos analisar os problemas práticos que enfrentamos e quais outras consequências da implementação de recursos que realmente não precisamos. Depois disso, vamos falar sobre o princípio da meia ou separação de preocupações. Este princípio está subjacente ao incenso. Todos os princípios sólidos. A separação de preocupações é muito importante para alcançar aplicações bem mantidas. Você verá as formas mais comuns de violar a separação de preocupações. Princípio princípio de separação consulta Comando torna mais fácil raciocinar sobre. O código discutirá o mínimo de Demeter, que é o principal conhecimento fora da lista. Separadamente, vamos falar sobre o princípio menos espanto você. Em seguida, vamos tocar o tópico de ocultação de informações e encapsulamento. By the way, vou usar a palavra princípio em vez de princípio matéria nesta seção. Além disso, apenas para economizar algum tempo na próxima palestra, você aprende sobre o princípio seco. Vamos começar.
48. 02 DRY: esta palestra é intitulada Princípio Seco. Um número substancial de caixa em software são causados por código repetitivo. Se você tem 10 funções que fazem o mesmo, e você precisa mudar o comportamento de tal função, você terá que modificar todas as 10 funções. Então a definição fora do princípio seco foi formulada em um famoso livro, O Programador Pragmático de Andy Hunt e Dave Thomas. E parece assim. Cada pedaço fora do conhecimento deve ter uma única representação inequívoca no sistema. Este princípio diz respeito a todos os diferentes aspectos fora do software que pode ser aplicado a qualquer código de
programação ou esquema de banco de dados ou qualquer outra coisa, incluindo documentação das formas mais comuns de violar o princípio seco são os seguindo strings mágicas ou quaisquer outros valores mágicos, lógica
duplicada em vários locais e dar repetido do que lógica ou vários casos de switch espalhados por toda a base de código? Vejamos exemplos. Olhe para este exemplo. Você não recebe a resposta de um dispositivo, então comparamos os resultados com 188. Tais valores mágicos tendem a se espalhar sobre uma classe que a Inter opera com o dispositivo. É assim que a duplicação aparece. Um lado da duplicação que sabe o que 188 significa entender o significado do código? Precisamos ler a documentação. Não seria bom definir uma constante com um nome significativo? Esta constante agora pode ser usada em todos os lugares que precisamos. Agora está claro o que significa 188. Isso significa que não há conexão com o dispositivo. Aqui está outro exemplo. A situação semelhante aqui Vemos que os valores mágicos começaram a se espalhar além do fato que é absolutamente impossível entender o que está acontecendo aqui. E o local de mergulho pode levar a consequências infelizes. Por exemplo, se um dos valores duplicados vai ser alterado, então você vai mudar esses valores em todos os lugares. Foi usado para corrigir o problema. Podemos aplicar a mesma técnica definindo valores constantes que se tornam as fontes únicas fora da mudança. Eu defini valores constantes apenas para valores duplicados, mas provavelmente eu faria o mesmo para todos os outros valores. Agora é evidente que os comandos em primeiro lugar inicializam um dispositivo do que enviam um comando, e depois disso, fecharam o dispositivo. Aqui está o mesmo exemplo. O que há de errado aqui? Corrigimos os números mágicos duplicados, mas o que pode ser melhorado. Além disso, temos a lógica duplicada aqui, e não é para falar que pode aparecer 10 novos métodos com o mesmo padrão off
comandos enviados . Veja como podemos refleti-la. Este casaco eu extraí um método que remove a lógica duplicada, tomando a responsabilidade fora, embrulhando comandos reais por inicialização e encerramento. Os benefícios podem não ser outros, mas no caso de mais de três métodos, benefícios se tornariam deste. Este é um exemplo simples de lógica duplicada. Há um caso muito mais interessante relacionado à lógica duplicada. A questão é, isso
é verdade? Essa lógica duplicada é sempre uma coisa ruim, e então, senhor é bem interessante. Imagine que você desenvolva três aplicativos que pertenciam ao mesmo domínio. Logicamente, tais aplicativos teriam semelhanças significativas na funcionalidade que implementam. Este fato leva logicamente a um desejo natural de criar uma biblioteca compartilhada, que contém partes fora da funcionalidade. Isso é o mesmo para todas as três aplicações. Como você se lembra, cada pedaço de conhecimento deve ter uma única representação inequívoca no sistema. Então, se você implementar o mesmo conhecimento funcional três vezes quer para cada aplicação, então aparentemente você viola o princípio seco? Sim. Agora vamos considerar o seguinte caso. Da minha prática, tivemos três aplicações que compartilhavam a lógica da seguinte função. Aqui temos uma classe com três propriedades e a função que verifica dar o cartão é válido por algum tempo. Esta função funcionou bem para todos os três aplicativos, mas um dia um dos aplicativos mudou. Os requisitos são necessários para verificar o primeiro nome e menos nome também. Implementar outra função para essa aplicação específica seria considerada uma violação do princípio da unidade. Assim, foi tomada a decisão de introduzir uma bandeira de touro. E aqui está a segunda versão da mesma função. Legal. Preservamos a capacidade de usar a mesma função em toda a base de código. A paz se acalmou e continuamos nosso trabalho por algum tempo. Tudo estava bem até um dia quando Boss disse que há outro requisito da terceira aplicação. A terceira aplicação agora pode permitir que as ideias tenham mais de 10 caracteres para preservar a capacidade de usar a mesma funcionalidade sobre a base de código que introduziu uma nova bandeira Boland. Aqui está como a nova versão dessa função parecia. Sim, sim, eu sei que essa função se transformou em Riel Mass, e isso é só o começo. Se você começar a aplicar princípios sólidos e todas as práticas recomendadas para evitar essa massa, muitas vezes
você acabará com uma implementação separada para cada aplicativo. Muitas vezes nem sempre. Mas muitas vezes é melhor não compartilhar sua lógica entre aplicativos. É melhor expandir essa lógica separadamente, pelo
menos até ter certeza absoluta de que pode mesclar as mesmas implementações. Na verdade, há casos em que temos 100% de certeza de que a lógica comercial específica nunca mudará. Ou a probabilidade de mudanças é extremamente baixa. Se a semântica for diferente, não mescle o código, que se parece com código duplicado. Vejamos outro caso quando a duplicação não é, na verdade, uma duplicação. Aqui está um exemplo, a
propósito, este exemplo também é da minha própria prática. As perguntas são nomeadas de forma diferente. Você tem duas classes que eram presidente, dispositivos
diferentes. Ambos têm as mesmas propriedades de dados. Um desenvolvedor júnior de nossa equipe decidiu que isso viola claramente o princípio seco, então ele decidiu extrair as mesmas propriedades de dados em vidro baseado. Ele saiu com a versão refletida deste código. Aqui está o vidro do dispositivo, que contém as propriedades duplicadas. Agora, todos os dispositivos herdarão do vidro e o princípio seco é Matt. Infelizmente, essa foi uma má decisão e existem várias razões. A primeira razão é que é difícil acreditar que todos os dispositivos compartilhem as mesmas propriedades. Tenho certeza que L S P é violado por esta fábrica. A segunda razão é que agora temos um forte acoplamento entre classe baseada e herdeiros . E, na verdade, eu não vejo onde os benefícios de tal herança são amigáveis. É um caso muito raro quando herança de dados é uma boa ideia. Você sabe, todas as línguas, objetos são compostos de funções públicas. Os dados devem estar ocultos. A terceira razão é que a primeira intenção estava errada. Não houve nenhuma duplicação. O fato de que os objetos do dedo do pé têm as mesmas propriedades de dados não os torna semelhantes. O que torna o objeto semelhante é seu comportamento. Portanto, não há necessidade de acoplar objetos que têm semântica diferente. Vladimir Horcoff até saiu com a noção de herança de utilidade pública. Vladimir Horcoff, há uber fora deste curso de vídeo mesmo saiu com a noção de herança de utilidade pública, este exemplo demonstra exatamente que a técnica do mal. No slide, você pode ver a referência ao bloco com chefe sobre herança de utilitários. Dê uma olhada neste código aqui tem uma enumeração fora de formas e a classe Visualize ER, que define as operações do dedo do pé. Existem apenas duas operações apenas por uma questão de simplicidade. No cenário do mundo real, haveria muitas classes que usavam isso em ... orações e dezenas de métodos preenchidos por casos de troca. Então, quais casos sobre o mesmo em admiração, que estão espalhados por toda a base de código, é um dos piores pesadelos. Você pode vida sênior quando algum tipo de aspecto de comportamento muda em relação a uma da enumeração de Alice. Você tem que encontrar todos os lugares no sistema onde os casos de switch são implementados e alterar os pedaços de código correspondentes. Se você adicionar uma forma, você terá que encontrar todos os lugares com casos de alternância e modificá-los, adicionando casos para essa nova forma. Esta é uma verdadeira duplicação do mal. Como corrigir o problema. O princípio do fechamento aberto é a resposta. Você pode definir o vidro base e transformar os valores de enumeração em herdeiros representados por classes. Se algo mudar, você tem um único lugar onde você precisa fazer essa mudança. Agora o código do cliente pode apenas confiar no vidro forma base. Não há casos de troca espalhados por toda a base de código. Lembre-se que a repetição e a lógica exigem abstração. Ótimo. Na próxima palestra, estudaremos o princípio do beijo.
49. 03 KISS: esta palestra é intitulada Princípio do Beijo. Ouviu o depoimento de Albert Einstein? Faça tudo o mais simples possível, mas não mais simples. Esta afirmação é a essência do princípio do beijo. Beijar significa manter isso simples, estúpido. Quanto mais um sistema complexo, mais possibilidade que ele pode quebrar. Portanto, simplicidade deve ser um objetivo chave no design e na complexidade do assessor deve ser evitado enquanto jovem me você não vai precisar dele. Princípio é sobre a remoção de um beijo assentador casaco é tudo sobre como fazer a
implementação o mais simples possível. Então a afirmação deste princípio é uma solução simples é melhor do que uma complexa,
mesmo que a solução pareça estúpida, o princípio é profundamente filosófico de fato, apenas tentando chegar a uma verdadeira definição fora da simplicidade, como definir e medir a simplicidade a definição direta seria a seguinte simplesmente cidades o estado de qualidade de ser simples. Você não acha que essa definição não foi útil? Eu faço. O que significa ser simples? Aparentemente, a única maneira que podemos tratar a simplicidade no software é que algo que é fácil de entender ou explicar, Pode ser considerado simples. Em contraste com algo complicado. É muito difícil e às vezes até impossível encontrar uma solução simples que resolva um problema difícil. A complexidade fora da implementação tende a crescer junto com o número crescente de requisitos , modo que a sensação de falta de simplicidade é relativa. A principal técnica que usamos para lutar com a complexidade é a decomposição, e a propósito, a composição é o aspecto, que está fortemente relacionado com quase todos os princípios sólidos. Aderindo ao SRP, aplicamos a composição aos objetos ou módulos acoplados, confirmando com a fofoca nem sempre, mas muitas vezes envolve também a composição, especialmente quando precisamos criar um novo tipo de fonte isolado de mudança na segregação facial. Princípio é tudo sobre a composição. Dependência na versão é tudo sobre tornar o mundo do sistema muito composto. A lista de princípio de substituição é principalmente sobre como evitar a decomposição da aposta assim da alma. Os princípios visam alcançar soluções o mais simples possível. Por outro lado, abusar de princípios sólidos sempre leva a cabo a complexidade acessória. Esta é a verdadeira manifestação da unidade e luta contra a lei oposta. Ela se assemelha a mim, uma erva chamada valor. Aaron Valerie tem qualidades sedativas,
então, quando você toma o Lear na medicina Aceh, você espera ficar mais calmo ao mesmo tempo. É um fato bem conhecido que se você tirar muito fora enquanto estiver dentro, isso causará o sentimento de ansiedade. O fato será o oposto. O problema fora da simplicidade relativa nous nos leva a duas noções relacionadas. Complexidade acidental e essencial. Eu disse anteriormente que sistemas complexos são realmente complexos e você não pode fazer nada sobre isso . Você não pode implementar o software do sistema bancário e esperar que ele será um simples como um solitário. A complexidade imposta pelo próprio domínio é chamada de complexidade essencial. A complexidade essencial não pode ser reduzida de forma alguma. A única maneira de reduzir a complexidade essencial é quando as regras de domínio mudam na direção da simplicidade. Infelizmente, você mal pode impor tais mudanças. complexidade acidental é a complexidade das nossas soluções, que se destinam a resolver os problemas fora do domínio pelo qual somos responsáveis. A complexidade acidental é os desenvolvedores. O design da otimização do software está relacionado à complexidade acidental. Beijo é princípio filosófico fundamental, possamos marcar as seguintes regras, que é claro, não
são dogmas. Prefiro composição ao invés de herança possível. Fique com Ellison, que deu declarações até ver que você precisa introduzir polimorfismo, evite trazer para a otimização em 90% dos casos. Soluções mais lentas funcionam rápido o suficiente Exceções desta regra é quando você sabe com certeza que você está trabalhando em um software muito complexo, um dos principais aspectos dos desejos. O desempenho quando o desempenho é absolutamente crítico. Óculos menores e métodos menores são massa. O melhor método é um forro único, o Google. Para a técnica, que é chamado de extrativo você cair, que é sobre métodos re fatoração. Não se apresse para extrair classes utilitárias para métodos privados que são usados a partir de um único lugar dentro da classe. Deixe suas cidades até que haja outras partes do código. Exigirá esse método também. Não escreva perímetro levantado. Métodos gerais preferem métodos que resolvam um problema específico. Dividir e conquistar. Este é um principal destinado a resolver problemas complexos. Divida o problema em problemas menores e resolva-os um por um. Esforce-se para evitar comentários. Comentários significam que você falhou tentando expressar a intenção em linguagem de programação, tipos de irmãos
certos, e não tenha medo de jogá-los fora. Mantenha o número de fantasias que resolvem um problema aproximadamente de 5 a 7 humanos. A mente não é boa em manter a memória. Moderno sete coisas simultaneamente, Trabalhando
constantemente. Simplificando sua base de código. Tio Bob Martin até sugere uma regra que antes de fazer um check in, você deve sempre se perguntar se a base de código é melhor do que era antes check-in. Esta é a regra de um escoteiro. Otimização é a principal desculpa para escrever código complexo, mas esforçar-se para manter a quantidade de ouro mais perto de cinco ou 10% da base de código, não mais. Otimize somente se tiver certeza absoluta de que há um problema de desempenho. Não meça o desempenho pelo seu Eu confio em ferramentas especiais para rastrear o desempenho . Lembre-se que existem dois valores fora do software. O 1º 1 é que o software deve funcionar corretamente, e o 2º 1 é que o software deve ser projetado bem, e o 2º 1 é muito mais difícil de alcançá-los. O 1º 1 na maioria dos casos. O próximo diretor sobre o qual vamos falar é o princípio jovem, que significa u n Vai precisar Este princípio é semelhante ao princípio do beijo. Na próxima palestra, você descobre qual é a diferença entre esses dois princípios e o que Yogi significa na prática?
50. 04 YAGNI: esta palestra é intitulada Princípio de Yardeni. As pessoas do Poder estão sempre à procura de maneiras de tornar tudo ao seu redor tão poderoso. É possível que os desenvolvedores também são pessoas, e eles também tendem a tornar todo o código do programa tão geral quanto ele pode ser. Por exemplo, quando um desenvolvedor de software tem a tarefa de criar uma biblioteca simples para gerar relatórios de resultados de
renda simples , ele permitirá que toda a biblioteca de propósito geral para gerar quaisquer
relatórios financeiros possíveis . Preciso analisar um par de valor chave de um personalizado comprando um reformador. O que eu estou fazendo? Correto. Estou escrevendo todo o maldito espardeador com todos os casos possíveis. Sim, Agni significa que você não vai precisar de tudo isso é sobre evitar a engenharia excessiva, ele Agnese fortemente relacionado com o que discutimos anteriormente no curso. Você se lembra do cheiro chamado Complexidade Desnecessária? Sim, Detail diz que devemos evitar este cheiro. Você se lembra da nossa palestra sobre antecipação das próximas mudanças? Antecipando mudanças futuras, os desenvolvedores começam a introduzir pontos de extensão. O problema é que pode acontecer que todos esses pontos de extensão nunca sejam usados. Os pontos de extensão têm o seu custo. Eles não são livres. Eles tornam os sistemas mais complexos e, portanto, mais difíceis de entender. Sim, Guineas. Princípio filosófico. Não há critério bem definido, que permita medir a limpeza jovem do sistema. Se você olhar para a Wikipédia, você verá que Young é um principal fora da programação extrema, ou XP. Em suma, isso afirma que os programadores não devem adicionar funcionalidade até que seja considerado necessário. Como um tipo de desenvolvimento de software federal, extrema programação defende lançamentos freqüentes ciclos de desenvolvimento segurados, que se destina a melhorar a produtividade e introduziu pontos de verificação nos quais novos
requisitos do cliente podem ser adotados . XP, co-fundador em Jeffries, escreveu. Sempre implemente coisas quando você realmente precisa delas. Nunca. Quando você só para ver que você precisa deles, você tem joelhos. O princípio por trás da prática de XP faz a coisa mais simples que poderia funcionar. Outro conceito interessante, que também está fortemente relacionado com o Young Me é chamado Pior é Melhor. Também conhecido seu estilo New Jersey em relação ao desenvolvimento de software. Pior é melhor implica um modelo de design e implementação de software, que tem as seguintes características. Simplesmente sentado, o design deve ser simples, tanto uma implementação quanto uma interface. É mais importante que a implementação seja simples do que a interface. Simplicidade é a consideração mais importante na correção do design. O design deve estar correto em todos os aspectos observáveis, mas é um pouco melhor ser simples do que correto. A consistência que eles projetam não deve ser excessivamente inconsistente. A consistência pode ser sacrificada pela simplicidade em alguns casos, mas é melhor descartar as partes do projeto que lidam com circunstâncias
menos comuns do que introduzir complexidade ou inconsistência e integridade da implementação. O design deve abranger tantas situações importantes quanto é prático. Todos os casos razoavelmente esperados devem ser abrangidos. A integridade pode ser sacrificada em favor de qualquer outra qualidade. Na verdade, completude deve ser sacrificada sempre que a simplicidade da implementação. Joe pard ized consistência pode ser sacrificado para alcançar a completude se as simplicidades retidas, especialmente inútil é a consistência fora da interface. Há um problema com todos os princípios da matéria. Os resíduos que podemos segui-los e aplicar na prática são vagos. A única coisa que podemos fazer é discutir o nome do jovem ou detalhes. Mas, no final, nossa discussão também conterá coisas tão difíceis de medir como a complexidade do software. Por exemplo, considere a seguinte frase de um bloco fora. Martin o seguiu. Esta é uma boa frase, o que deixa claro o significado fora. Sim, Agni, mas ainda não é tão fácil aplicar na prática. Aqui está a frase. Se você fizer algo para uma necessidade futura que não aumente a complexidade do software, então não há razão para invocar sua acne. Mas a complexidade do software, surge
a questão. Como diabos eu vou estimar o complexo nous antes de olhar para alguns exemplos
de jogo? O princípio também quer ficar de que você não deve aderir a quaisquer princípios cegamente. Por exemplo, se você aderir cegamente ao jovem eu, você vai acabar com esses frio organizado e enfrentará mais cedo ou mais tarde a necessidade realizar um trabalho massivamente. Portanto, você tem que confiar fortemente em várias outras práticas, como continua para fatoração, continua testes de unidade automatizados e continua a integração para evitar consequências negativas. A Agni depende de práticas de apoio, e isso é afirmado na definição original. Em programação extrema. Vamos considerar dois casos quando pudermos nos candidatar. Sim, Agni, vou ligar para o primeiro caso de alto nível um. No segundo caso, vou chamar um nível baixo. Imagine a situação que uma equipe está trabalhando no sistema de pagamento, que Inter opera com muitos dispositivos, como indo dispensadores, Bilic, sapadores e assim por diante. Pode haver muitos modelos de qualquer tipo desses dispositivos. Trabalhando em uma versão atual, você precisa implementar um driver para Inter operando com modelos e fora de um dispensador de contas. Ao mesmo tempo, um gerente de projeto espera que em quatro meses eles precisarão suportar o modelo Y de um dispensador de
contas. É uma tentação implementar esse modelo esperado em paralelo com o modelo Z, para evitar a troca de tarefas no futuro. E a propósito, seria ótimo dizer a Boston o futuro. Vamos anotar quando chegar a hora de implementar o modelo branco. Decidir implementar tais características presuntivas é uma violação clássica fora do
princípio Agni . Você percebe o possível desperdício financeiro no caso de que o motile nunca será necessário para ser implementado? O custo de Butte é composto por todos os esforços gastos em analisar a programação e testar esse recurso agora inútil. Ok, imagine que o gerente de projeto estava certo sobre esse recurso. Você acha que não há custo de tal decisão? A coisa é que a implementação desse recurso esperado você ainda Tempo, que poderia ser gasto em outros recursos realmente necessários. Este é um atraso de custo fora, vez que outros recursos serão adiados. O atraso será igual ao tempo gasto na implementação desse recurso esperado. E isso não quer dizer que você inicialmente poderia estar errado, e esse recurso nunca poderia ser necessário. E isso não é então, e outros custos de implementação de recursos foram antecipados estar em demanda no futuro
usando uma bola de cristal para adivinhação. A costa está ao largo de Clery? Muitas vezes, código
adicional torna o sistema difícil de entender, manter e modificar. Então, se você também precisa implementar um recurso realmente necessário, que depende desse frio relacionado aos dispositivos, você provavelmente gasta mais tempo para implementá-lo. E isso não é Então há um cenário muito infeliz quando a necessidade fora de um recurso é corretamente previsto. Mas a implementação do futuro está errada. Quando chega a hora e você percebe que um recurso é implementado, não nós esperamos por clientes. Você vai se enfrentar em uma situação em que você tem um recurso errado, às vezes completamente errado, e você tem que tomar uma decisão difícil se deve jogar fora a implementação atual e er implementar o recurso completamente a partir do terreno ou para investir recursos na reparação da implementação errada existente. Este é um dilema muito difícil. É difícil estimar se você deve reescrever o recurso ou reparar o existente . Martin pai surgiu com uma ótima pele, o que demonstra todos os problemas potenciais relacionados à violação jovem. O exemplo que discutimos é o caso de alto nível e você, Agnese muito mais simples de aplicar neste nível, embora, é
claro, mesmo neste nível, às vezes cometemos erros. Outro caso é baixo nível e diz respeito a escolhas diárias que fazemos no processo de codificação. Por exemplo, imagine que agora você está escrevendo uma função dentro de uma classe que precisa analisar um número de uma string personalizada recuperada de um cartão de plástico. Basicamente, você tem duas opções. Uma é apenas implementar uma função separada que passa essa string dentro da classe em que você está trabalhando agora. A segunda escolha e esta é a maneira que foi por padrão muitas vezes é implementar uma função de
passagem e extrair a classe utilitário que contém a função de passagem Isso soa lógico. Parece que podemos antecipar que nossos colegas também podem querer usar o recurso
de análise de outras partes da base de código. Não quero responder a esta pergunta em relação a este caso em particular. Quero responder à pergunta. Geralmente, existe um algoritmo simples que ajuda a tomar uma decisão correta no processo de codificação e em tais situações. Primeiro, pergunte a si mesmo se a função ou um futuro é necessário para ser implementado agora. Eventos foram é sim, em seguida, implementado, você tem A resposta é não. Faça outra pergunta a si mesmo. Quantos esforços serão necessários para implementar essa função ou um recurso no futuro? No caso, será
necessário. Se a resposta
for, definitivamente será muito simples. Então mantenha todas as coisas como estão. Não apresente nada adicional. Se a resposta
for, levará muito tempo para escrever muitas coisas para ajustar o design para torná-lo flexível
o suficiente para introduzir esse recurso. Em seguida, considere realizar facções de verão, que permitem evitar escritos maciçamente no futuro. Lembre-se que nem as práticas gile nem quaisquer princípios de matéria impuseram a ideia de evitar planejamento. Pelo contrário, você deve sempre planejar cuidadosamente o que você precisará no futuro. E que recursos e esforços serão necessários para atender novamente aos novos requisitos? Isso não significa que você tem que executar um grande up de design, mas ele deve. Não significa que você tenha que esquecer muita coisa. O objetivo que queremos alcançar aplicando ya Agni é economizar algum tempo. Por favor, não se inscreva. Jovem me para re fábrica. Você precisa executar uma fábrica para habilitar Yanni. Espero que agora você entenda melhor como alcançar o Santo Graal com o algoritmo que eu
coloquei nesta palestra. Esteja pronto para falhar. Aplicando o princípio Agni, levará algum tempo para obter experiência suficiente e inventar. Sua perseverança valerá a pena na próxima palestra. Vamos analisar o princípio da separação das preocupações.
51. 05 SoC 05: Esta palestra é intitulada “Separação de Preocupações”. Separação de preocupações ou uma meia e curto é um princípio que foram realmente discutidos
na seção fora princípio de responsabilidade única SRP no futebol fortemente relacionado. Basicamente, o
futebol é um princípio, o que significa que temos de separar diferentes preocupações em diferentes módulos. Aderir à meia permite construir sistemas modulares. A diferença entre futebol e SRP é que o futebol é aplicado principalmente ao mais alto nível . O valor da separação de preocupações é simplificar o desenvolvimento e a manutenção de
programas de computador . Quando as preocupações estão bem separadas, seções
individuais podem ser reutilizadas, bem como desenvolvidas e atualizadas de forma independente. Um valor especial é a capacidade de melhorar ou modificar posteriormente uma seção de código sem ter que saber os detalhes de outras seções e sem ter que fazer uma resposta alterações nessas seções. Na maioria das vezes, você pode tratar SRP e meia como os mesmos conceitos, e você pode usá-los de forma intercambiável. Aqui está a lista de preocupações que muitas vezes devemos enfrentar no desenvolvimento de software empresarial. Você é lógica de negócios, apresentação, lógica e banco de dados. Imagine uma sala onde todas as coisas estão espalhadas pelo chão será simples. Para encontrar um livro em particular lá. Não seria mais fácil manter todas as coisas separadas livros na prateleira, brinquedos nas caixas e assim por diante? O mesmo podemos dizer sobre programação e separação de preocupações. Se você entrar emaranhado você. Eu era lógica de negócios. Então será mais difícil para você manter toda a massa, encontrar qualquer coisa que você precisa, sua mudança, qualquer coisa que você precisa mudar e assim por diante. Há uma coisa que pode arruinar as nossas melhores intenções em relação à separação de preocupações. Essa coisa desagradável é chamada de lamber abstrações com preocupações separadas. Ao jogar a constante off encapsulation Onley por encapsulamento, podemos proteger objetos e ocultar seus internos. Infelizmente, a
abstração está vazando, especialmente em olhos AP complexos. Há um grande número de casos populares fora lambendo abstrações. Um dos meus exemplos favoritos. Um dos seus modelos ou, em outras palavras, lógica de
apresentação sabe algo específico para você. Eu aqui é um exemplo quando um modelo de vista expõe uma propriedade do tipo colar, este é um exemplo clássico quando a lógica de apresentação é implementada incorretamente do
ponto de vista da meia . Para corrigir este exemplo, precisamos remover a propriedade e expor outro que apenas retorna um bowline que você está em seu lado deve decidir qual cor para pico. Esta não é uma preocupação fora de uma camada de apresentação. Outro bom exemplo. Quando a lógica principal opera com identificadores exclusivos armazenados em um banco de dados. Nesse caso, uma preocupação de persistência é misturada com a lógica do domínio. A lógica do domínio deve ser agnóstica em relação a quaisquer mecanismos de persistência, na
verdade lá em desliga exemplos de abstrações de movimento. Tenha em mente que as camadas, que representam preocupações diferentes, devem ser isoladas umas das outras de tal forma que nenhuma delas deve saber sobre quaisquer detalhes
intrínsecos uns dos outros do outro lado. Devo admitir que pode haver exceções a partir desta regra a partir da perspectiva de Domine Dreamin designer Didi Dean camisa escrever procedimentos de início, que implementam qualquer tipo de lógica de negócios. Por exemplo, eles realizam validação e mutação de dados é considerada uma violação da separação de preocupações. Ao mesmo tempo,
infelizmente, correndo diretamente, correndo diretamente, os procedimentos
cirúrgicos são muito mais rápidos em certos cenários do que realizar operações através de um objeto. Mapeador relacional, como estrutura de entidade, tratar tais casos como exceções. Na próxima palestra, você aprenderá o princípio de separação de consulta dos EUA doente ou comando
52. 06 CQS: Esta palestra é intitulada Comando Comando de separação de consulta de comando. Separação de Consultas é uma programação imperativa principal fora. Foi concebido por um mas admirar como parte de seu trabalho pioneiro na
linguagem de programação Eiffel . Ele afirma que cada método deve ser um comando que executa em ação ou uma consulta que retorna dados para o cooler, mas não ambos. Em outras palavras, fazer uma pergunta não deve mudar a resposta. Geralmente, podemos dividir funções em dois tipos principais. Funções que executam comandos e funções, que executam uma consulta e retornam um resultado. Muitas vezes, os iniciantes misturam quadrados e comandos. Como resultado, eles criam funções que executam um comando e retornam um resultado de aquisição. Ao mesmo tempo. Isso é quase sempre uma coisa ruim. Considere um exemplo. Que cor está pedindo aqui? Logan foi uma tentativa bem sucedida? Talvez verdadeiro signifique que um usuário já foi bloqueado. É difícil dizer olhando para a assinatura da função. A coisa é que é impossível expressar o significado de um resultado boudin pelo nome das funções. O problema não está no nome ruim da função, mas o problema é que um comando não está separado de uma consulta. A lógica de comando e a lógica queer são misturadas na mesma função. Tão doente. US é um dos princípios fundamentais que ajudaram a projetar melhores olhos AP em relação a este exemplo. Seria melhor implementar uma função que implementa um comando e uma ou mais funções que implementam consultas por exemplo, como esta pelos nomes e assinaturas dessas funções. Está claro o que significam e o que fazem. Em outras palavras, essas funções são honestas que não implicam algo oculto e não mentem para um chamador. Na próxima palestra, vamos olhar para a lei fora do medidor reitor.
53. 07 Lei de Demeter: esta palestra é intitulada Law Off de Meter. Se olharmos para a Wikipédia, veremos que a lei fora do medidor, Senhor em suma ou principal fora da lista conhecimento é uma diretriz de design para o desenvolvimento de software , particularmente programas orientados a objetos. Na sua forma geral, o Senhor é um caso específico de acoplamento solto. Ok, parece ótimo. Mas o que isso realmente significa? Formulação geral do baixo é que cada unidade deve ter apenas conhecimento limitado sobre outras unidades. Unidades Onley intimamente relacionadas com a unidade atual ou cada unidade deve apenas falar com seus amigos. Não fale com estranhos. Grande soa claro, mas ainda não o suficiente prático. A forma formal objeto da lei pode ser resumida. Este método muitas vezes objeto só pode chamar métodos fora do próprio objeto. Um argumento fora do método, qualquer objeto criado dentro do método e quaisquer propriedades diretas ou campos do objeto. Finalmente, Finalmente, o significado prático torna-se claro. Além disso, todas estas orientações, no final, chegaram à seguinte declaração simples. Não fale com estranhos. Outra fórmula simples desta lei é usada. Só um médico. Certo, então vamos ver o exemplo prático deles, que foi sugerido há muito tempo por David Bach. É uma grande ilustração do problema. Considere o seguinte caso. Vamos fingir que devemos mudar as relações comerciais entre um rapaz do jornal e o cliente que quer comprar revistas. Um rapaz do papel toca a campainha, o cliente abre. Um jornaleiro de alguma forma tem que ser pago e, em seguida, entregar uma revista para o cliente. Vamos ver o código. Exemplo. Quais modelos? O caso aqui é uma classe de cliente simples, que tem primeiro e sobrenome, e também tem uma carteira fora do tipo carteira. Aqui você pode ver a classe da carteira. É extremamente simples. Ele apenas armazena o valor decimal, que determina a quantidade de dinheiro na carteira. O cliente fora da carteira. AP. Posso adicionar dinheiro à carteira, posso retirar dinheiro e verificar a quantidade atual de dinheiro. Parece bom e simples. É que a violência deve alimentar as nossas necessidades. A última coisa é implementar a lógica de um papel, mas vamos olhar para dentro. A classe de papelão expõe um único método Deliver revista, que leva o custo da revista e do cliente para o qual um jornaleiro tem que entregar. A revista parece ótima. Vejamos o documento de implementação. Boi só tira a carteira de um cliente e, em seguida, verifica a quantidade de dinheiro se há dinheiro
suficiente que o garoto de papel apenas leva, eles precisavam de algum. Caso contrário, um rapaz do jornal vai embora. Ótima. Bem, eu diria, o que você acha? É realmente ótimo? Se você pensar um pouco mais fundo, então você pode sair com a idéia de que há algo estranho no fato de que o menino de
papel tira a carteira de um cliente, a fim de ser pago um menino de papel tem acesso a clientes Mundo. Que absurdo. Você faria a gentileza de dar a sua carteira aos meninos de papel desconhecidos? Duvido que, neste caso, a violação da lei de D precisa de um reservista. O rapaz do jornal opera com água através de um cliente. O primeiro ponto aqui no código é quando um jornaleiro toma o mundo. Depois, há uma segunda filha Quando ele verifica a quantidade de dinheiro no mundo o mesmo caso quando um jornaleiro retirar algum dinheiro para descrever o problema ou seriamente, devo dizer que o principal problema com este projeto é que os meninos de papel sendo expostos mais informações do que ele precisa ser. Todos os problemas são as consequências desse fato. Então agora essas três classes estão bem acopladas. Se mudarmos a classe mundial, quando eu tiver que fazer alterações em ambas as outras classes, a
propósito, se uma carteira é agora que o garoto de papel vai lançar a exceção de referência mais baixa, então pode ser que no mundo real código baseado o menino de papel terá que lidar com isso, introduzindo agora verificações e a segunda sequência desordenando o código. Então, como corrigir o problema para corrigir o problema? Enfraquecer apenas motile o cenário do mundo real. Quando o rapaz do jornal entrega uma revista, ele só pede um pagamento. Vejamos o design melhorado. Agora. A classe do cliente expõe o método público chamado Obter pagamento. Enquanto o objeto da wallet subjacente agora está contido em um campo privado. Ninguém, exceto o cliente, tem acesso à carteira. O rapaz do papel agora é um dedo do pé forçado. Peça ao cliente para obter o pagamento. O “Paperboy “não tem os direitos. E, a
propósito, a responsabilidade, como no design anterior, mexer na carteira do cliente
para que o design melhorado seja melhor de três maneiras. É melhor modelar o cenário do mundo real. O código Paper Boy agora pede ao cliente um pagamento. O rapaz do jornal não tem acesso directo à carteira. Em segundo lugar, a função que essa classe agora pode mudar. E os meninos de papel completamente isolados da mudança e o terceiro era agora livre para mudar a implementação do método de pagamento get. Certo, vamos voltar aos slides. Para resumir, quero dizer que a regra sobre o número de pontos às vezes pode ser enganadora. A coisa é que a lei fora do medidor não é sobre o número de pontos. Esta lei é sobre reduzir o acoplamento e provar o encapsulamento. Quando estamos falando de estruturas de dados como estruturas de dados, que são expostos pelo documento Excel, é perfeitamente bom quando é um P. Eu permite que você cavar a estrutura do documento como este documento Excel que ela não célula e assim por diante. O mesmo pode ser aplicado aos olhos AP fluentes. Quando cada objetivo retorna um objeto para que você possa construir cadeias de método, por isso é sempre não tratar regras como dogmas e tentar entender o significado subjacente
da sala. Em vez de aplicar regras cegamente na próxima palestra, vamos aprender o diretor com menos espanto.
54. 08 PoLA: Esta palestra é intitulada Principal Off Menor Surpreensão e outro Princípio básico, em cima do qual um grande número de Padre Prince vai ficar é o principal fora menos espanto. Este princípio afirma que um componente fora de um sistema deve se comportar de forma consistente com a forma como os usuários fora desse componente provavelmente devem se comportar. Os seguintes princípios e técnicas são baseados no espanto fora da lista. E, claro, eles ajudam a se conformar com esse princípio. Totalmente seguro. A p I comando separação consulta em mutabilidade projetado por contrato e agora prevenção e muitos outros. Veja o exemplo a seguir. Temos uma classe de relatório com dois métodos traz relatório um e relatório de impressão. Seja e este trecho de código funciona bem. Mas se um cliente alterar a sequência desta chama assim um erro de conexão de banco de seu. A coisa é que uma conexão de banco de dados abre no início do trazer para Reppert um método e fecha no final da impressão Reppert ser método. Este é um exemplo simples, que tem um forte cheiro de acoplamento temporal onde a raiz causa o efeito colateral que está escondido do cliente fazendo o muito surpreendente do ponto de vista do cliente. Humoramente, podemos concluir que a métrica que reflete o fator fora de espanto muitas vezes FBI é o número fora gritado WTF é permitido. Simplificando, o principal espanto fora da lista significa que um design deve tanto grandes expectativas satisfazer essas expectativas. Deve fazer o que as pessoas esperavam fazer. Outro exemplo de um oito b I, que surpreende seus clientes, é o cara sobre a pilha Java padrão. Implementação de pilha padrão em Java expostos métodos Bush
e pop, e, além
disso, expõe o método de anúncio herdado da classe vetorial Deus Deus. O que a matemática ed é suposto fazer onde o item vai ser adicionado. É absolutamente espantoso. Eu estava quase grandioso quando enfrentei o dia pela primeira vez. Aqui está um exemplo da loja do mar. Um usuário esperaria do pelo menos que ele permite adicionar itens. Infelizmente, mesmo o sistema de lojas do mar tipo não é ideal neste caso. Eles não são suportados. Excepcional o trono. Na próxima palestra, você aprende o que é a informação oculta e encapsulamento, e qual é a diferença entre eles
55. Encapsulamento de 09: Esta palestra é intitulada “Information Oculting and Encapsulation”. Se olharmos para a Wikipédia, veremos a seguinte definição fora da informação Escondendo na ciência da computação Informação Esconder é o princípio da segregação fora das decisões de design em um
programa de computador que são mais propensos a mudar, protegendo assim outras partes fora do programa de modificações extensas. Se a decisão de projeto foi alterada, a proteção envolve fornecer uma interface estável que protege o restante do programa da implementação. Os detalhes que são mais como mudar escrito de outra forma. A ocultação de informações é a capacidade de impedir que certos aspectos de uma classe ou
componente de software sejam acessíveis aos seus clientes. Usando fissuras de linguagem de programação como variáveis privadas foram uma política de
exportação explícita . Concordo com essa definição, e depois de aprender os princípios sólidos, é absolutamente claro que o esconderijo de informações está subjacente a todos os princípios sólidos. Nós sempre nos esforçamos para ocultar essa informação, o que é irrelevante para os clientes. Quando um cliente vê o que ele não precisa, torna-se mais difícil entender tal um p I. Uma das perguntas mais populares que você pode ouvir em entrevistas é explicar a diferença entre ocultação de informações e encapsulamento, um grande número de pessoas confundiu essas noções. Existe uma opinião popular de que esses termos são os mesmos. Não concordo com esta afirmação de que a informação oculta é o encapsulamento de Samos. E aqui está o porquê. Em primeiro lugar, tente olhar para trás e responder à seguinte pergunta. Você constrói seus aplicativos em cima de componentes reutilizáveis? Tenho certeza que em 100% que você respondeu. Sim, eu sei. É claro que você sabe. Se você programar no trabalho O C. Sharp do que suas candidaturas, pelo
menos ficar em cima de um quadro inteiro maldito. E a seguinte pergunta é, você se encontra lendo o código-fonte desses componentes reutilizáveis? Se ele estiver disponível regularmente e a resposta for mais provável, você não o faz de vez em quando. Precisamos ler o código-fonte do BCL, por exemplo. Mas esse é um caso raro. Isso ocorre porque esses componentes são encapsulados. Eles permitiram usá-los sem cavar seus internos. Não precisamos do dedo do pé. Compreender a cozinha fora de componentes reutilizáveis para usá-los. Isto é o que é encapsulamento. O encapsulamento permite reutilizar componentes sem entender sua
implementação interna . Olhe para o exemplo de uma classe mal encapsulada aqui uma provocação. Pode parecer que este é um exemplo de silício, mas eu já vi muito fora dessa base de ouro. Claro, este é o pior caso, mas mesmo um AP lembrar implementado mal pode levar a sérias conseqüências infelizes. O que há de errado com isso? A. P Eu olho para o vendedor ritmo e método. Por que ele retorna um valor de string? É o código fora da resposta? É um cliente que eu devolvo? Quem diabos pode saber o que pode ser encapsulado pelo valor de string? Ele toma a montanha representada pelo riacho. O que se espera aqui? Uma casa decimal ou a pé? Talvez um inteiro olhar mais longe, mas eles obter retorno método cliente Evite entender como este método retorna, um cliente um cliente da segurança tem que saber sobre o evento recebido do cliente e o último método do cliente remover. Ele retorna um inteiro novamente. Qualquer coisa pode ser representada por um valor inteiro. Nesse caso, eu vi uma vez como um programador C usou inteiros para retornar boletins seus uns e zeros na
loja C. Sim, eu vi até mesmo um olhar tão assustador de lixo em como esse código pode parecer. Aqui está o salário base, que retorna nulo e aceita decimal. Tudo é compreensível. Agora é um comando que aceita o valor monetário em decimal. Outra opção é retornar um momento de resultado, que está fora do escopo deste curso. Se você está interessado em construir olhos AP robustas sobre erros com o
momento de resultado usando considerado para tomar o meu curso A B e C loja, as melhores práticas de design e implementação em você. Para mim, outro método get cliente agora retorna um cliente. Tudo está bem claro. Outra opção é retornar e talvez fora do cliente talvez também é chamado de Mona, que está fora do escopo deste curso. E se você está interessado em construir robôs, caras de
fita sobre agora é com o uso do talvez momento considerado para tomar o meu curso uma
loja PNC , as melhores práticas de design e implementação em você escurecê-lo para o cliente removido pode quer retornar void ou um resultado. Usamos um momento de resultado para declarar explicitamente em uma assinatura que a operação eles falham se ele retorna evitar que isso significa que a operação é bem-sucedida sempre. Este é um exemplo de um bom claro, um p I. A intenção off encapsulamento é proteger o in variance tornando estados inválidos impossível comando Quitter. O princípio da separação é um dos princípios mais importantes relacionados ao encapsulamento. E então eu quero brincar que você deve sempre lembrar que você deve escrever código para que o leitor do seu código possa ser um assassinato em massa psicopata. Quem sabe o seu endereço de casa? Durma bem, minha querida aluna.
56. API 10 API: O que é um P I, em essência, um p I é uma funcionalidade set off. Em termos gerais, ele pode ser enviado como uma biblioteca inteira. Ou pode ser apenas uma aula. Cada programador produz um prêmio de uma forma ou de outra. Boa programação é modular. O que inerentemente significa que esses limites modulares são olhos AP sozinhos. Bons olhos AP tendem a ser reutilizados. Eles podem se tornar um grande trunfo. Pelo contrário, um prêmio
ruim tornam-se passivos. Eles são bons olhos CP. Há olhos feios, mas não há FBI perfeito. Definitivamente o perfeito A torta é algo em um realista. Se você desenvolver uma classe para uso interno dentro de uma empresa, você desenvolver uma compra privada para os outros desenvolvedores dentro de sua empresa, este tipo off ambiente em que as folhas frias marca sêmen chama zoológico se você desenvolver uma classe para o público. É um FBI público, que pode ser potencialmente usado por milhões de desenvolvedores vendidos em todo o mundo, que este tipo de ambiente em que o código deixa marca sêmen chama deserto. Estes dois casos principais são diferentes, mas o quanto eles são diferentes. Vamos considerar um pouco após a introdução. By the way, você pode ler um ótimo artigo sobre rangers e zookeepers por Mark Semen seguindo o link que eu anexei. Em primeiro lugar, seria muito bom definir características de um bom p I. Vamos marcar as seguintes características. Simplicidade, expressividade e compromissos, idade
extensível e consistência. Agora vamos aprofundar as características dos olhos AP. A primeira simplicidade característica pode ser descrita através da regra bem conhecida relativa um desenvolvimento de tortas que você sempre pode adicionar, mas nunca remover. Isso significa que, se houver muitos usuários fora do seu a p I, você não poderá remover a funcionalidade que eles já usam. É por isso que desenvolver o seu PI. É sempre preferível adiar funções questionáveis em vez de incluí-las no lançamento
atual fora do curso. A declaração anterior também é sobre AP Ivor Shani, mas consideramos isso no contexto de encontrar o equilíbrio entre poder e simplicidade. Portanto, aqui enfrentamos um compromisso entre poder e simplicidade. Quando o poder ou, em outras palavras, habilidades expressas em funcionalidade fora em um p I bruto, é simplicidade degrada. O saldo está escondido em algum lugar na média dourada, então uma das questões mais interessantes aqui é como estimar a simplicidade, muitas vezes um P I. Infelizmente, não
há maneiras algorítmicas de calcular qualquer significado coeficientes fora da simplicidade. Muitas vezes do FBI. A única maneira de entender se um FBI é simples ou não é estimar o tempo gasto na compreensão por seus usuários. Este método permite construir uma curva de aprendizagem, muitas vezes FBI, se a simplicidade A P I fora da qual você está tentando analisar, é relativamente pequena se. Se não é uma estrutura enorme, então você pode dar a alguns de seus colegas e assistir. Quanto tempo eles vão levar para entender o seu A P I e quantas vezes eles vão exigir comentários ou qualquer documentação fora do FBI? Este passo simples mostrará se o FBI é simples o suficiente, comparando com seus requisitos de simplicidade ou não. Assim, em primeiro lugar, pode fixar um prazo para a compreensão da Europa. Peço então aos seus colegas que tentem usar uma funcionalidade de prêmio e, em seguida, comparar sua premissa. Com os resultados do riel indo desta forma, você será capaz de tomar uma decisão para tornar sua torta mais simples ou para parar no
ponto atual . As coisas ficam mais complexas quando um P I é expresso em termos fora de um determinado modelo de domínio. Neste caso, você tem que encontrar aqueles que estão familiarizados com o modelo de domínio e aqueles que não estão. Por que os dois? Porque os programadores são recursos humanos e podem deixar uma empresa a qualquer momento. Estes podem levar à situação em que um recém-chegado assumirá a responsabilidade de trabalhar com seu AP I. Então você tem que entender quanto tempo levará para entender o seu AP I. Em ambos os casos, esses pensamentos levam a a próxima característica de um bom A P I. bons olhos AP são caros porque, a fim de torná-los simples, é um acessório para gastar muito mais tempo do que apenas enviar todos os ensaios. Infelizmente, não só a simplicidade sofre com o investimento, os erros tendem a se acumular e o design começa a apodrecer. Consequentemente, ele leva a uma grande bola de lama em vez de clareza, e no final, ele leva a caixa de recursos é que pode ser alocado para o desenvolvimento de reparação são sempre limitados . Então, obviamente, não podemos polir oito caras por muito tempo. É por isso que há sempre compromissos entre poder e simplicidade, a propósito. Apesar de se esforçar para criar um FBI super poderoso, é quase impossível desfilar universalmente, pessoal, isso significa que um P I desenvolvedores tem que implementar as primeiras coisas primeiro. Para entender os principais cenários, é um acessório para analisar habilidades, vantagens e falhas que serão enfrentadas pelo usuário de todas as maneiras diferentes fora da implementação de uma extensão P I. A estabilidade é a próxima característica principal. Esta característica reflete as capacidades para aumentar o poder, muitas vezes FBI sem escritas de grau. Há um par de notícias é sobre esta característica. Podemos olhar para estende capacidade a partir da perspectiva, adicionando novas funcionalidades e preservando a compatibilidade com versões anteriores. O design deve se esforçar para ser capaz de adicionar novas funcionalidades. O principal objeto não são princípio neste caso é o princípio de fechamento aberto, que significa que um objeto deve ser aberto para extensão e fechado para modificação. Eu diria que, principalmente, este princípio é aplicável ao zoológico. AP Olhos e g brilhante com os caras como para público oito caras é que no início não
deve implantar recursos que poderiam contradizer com a funcionalidade que pode ser introduzida
no futuro. Se você está em dúvidas. É melhor não apresentar um membro do FBI do que apresentá-lo. Quando estamos falando de olhos públicos AP, nós filmar no início, preservar a compatibilidade com versões anteriores, mudar um AP I existente para que ele vai quebrar qualquer cliente existente é a maior cena. Infelizmente, esta cena não pode ser evitada às vezes, mas você deve se esforçar para quebrar o código de clientes tão raramente quanto possível. Um FBI tem que ser lógico e consistente. A consistência, muitas vezes do FBI, significa que as decisões se aplicam ao design da fita. EI são fortemente opinados. Haverá sempre diferentes opções disponíveis com suas vantagens e desvantagens. Mas os designers de P I devem tomar de lado e ficar com ele ao longo de todo o caminho. Vejamos um mau exemplo de consistência. A Beach Peaster Library expõe os seguintes métodos. Aparentemente, há um método inconsistente de nomear fora. Parece que os desenvolvedores estavam em dúvida e hesitaram sobre qual estilo fora nomear eles devem ficar com. Ao longo do caminho. A melhor opção neste caso específico era usar sublinhados em todos os lugares. A pior maneira era usar em todos os lugares. A nomenclatura siamesa e a pior maneira possível é usar em todos os lugares, diferentes estilos de nomenclatura, a pior maneira possível é exatamente o que os designers BHP string AP I escolheram. Agora os desenvolvedores devem ter em mente dois estilos de nomenclatura diferentes e lembrar quando usar o que isso é realmente insano. Certo, discutimos as características dos caras da fé. Agora vamos falar brevemente sobre caras públicos e privados. Os princípios marcados são mais importantes para a construção de olhos públicos AP publicamente, caras colocar maior responsabilidade na juventude e privado ser olhos. É por isso que você tem que se esforçar para melhorar as características, tanto quanto você pode. O custo das más decisões pode ser extremamente elevado. O que acabei de dizer não significa que os desenvolvedores privados do FBI não precisem levar em conta essas características. Eu sou um forte crente em que os olhos particulares de AP devem ser desenvolvidos, tendo em mente todas essas características. As repercussões do design privado AP I de baixa qualidade podem ser horríveis. A coisa é que as camadas são construídas em cima de outras camadas, bem como aplicações muitas vezes construídas em cima de outras aplicações. Portanto, introduzir mudanças quebrando em olhos de AP privados pode ter um impacto muito ruim em módulos
dependentes e aplicativos inteiros. O Corolla re deste fato é que os zookeepers devem se esforçar para se tornar rangers de qualquer maneira. Assim, todas as técnicas que vamos discutir neste curso são aplicáveis ao desenvolvimento de olhos tanto
privados como públicos de AP mais sobre o tema. Você pode ler seguindo os links anexados a esta palestra. Ok, vamos falar um pouco sobre os princípios de desenvolvimento P I. Existem alguns princípios de desenvolvimento que nos ajudam a criar um P olhos com características grandes ou
pelo menos satisfatórias. Vamos olhar para eles mais de perto. Os olhos AP devem ser tão simples quanto possível, mas não mais simples. Este é o princípio falado em primeiro lugar por Albert Einstein. Este é um princípio geral que se aplica a muitas coisas da nossa vida, no contexto de um desenvolvimento de prémios. Este princípio implica que as coisas simples devem ser simples e, ao mesmo tempo, as coisas
difíceis devem ser realizáveis na prática. Isso também significa que quando você está em dúvida sobre a introdução de um determinado membro, apenas deixe de fora. Lembre-se novamente que você sempre pode adicionar, mas nunca remover. Esta regra é mais relevante para um prêmio público, mas não se esqueça que introduzir mudanças quebrando no FBI privado é também ter uma cena, um bom AP. Eu deveria permitir fazer muito sem aprender muito na prática, isso significa que você deve se esforçar para construir um P olhos, que são simples de usar em outros, para realizar tarefas simples. E no topo desses cenários simples, tarefas
mais difíceis devem ser realizadas. Você notou que o primeiro princípio ressoa com o 2º 1? Na verdade, todos os princípios estão interligados. Todos eles têm algo em comum. AP Olhos deve basear-se em casos de uso como um Corolla prática re podemos dizer aqui é que isso significa duas coisas. A primeira é que, para projetar um AP, imagino que você seja um cliente da fita. Eu escrevo algum código, que usa que ainda inexistente um p I. Como os clientes frio deve parecer como fazer como o frio que você escreveu. A segunda coisa é que você tem que começar a fazer um esboço de um vizinho o mais rápido
possível . Não reunir desliga requisitos, basta fazer um esboço simples e perguntar, São os desenvolvedores o que eles pensam sobre o seu design? Então, a primeira coisa que você deve fazer é escrever várias amostras frias para os principais casos de uso. Peça aos seus colegas que implementem os principais casos de uso caso tenham tido dificuldades. É um mau sinal. Fornecer uma barreira baixa para usar um A P I. Na prática, isso significa que você sempre deve fornecer os construtores mais simples com valores padrão para parâmetros devem lançar exceções com mensagens que explicam o que fazer para corrigir. O problema não deve exigir que os clientes criem explicitamente mais de um tipo para realizar o uso principal. Casos não devem exigir de planos para executar uma inicialização ampla, muitas vezes objetos construir auto-explicativos AP olhos. Gostaria de expressar este pensamento. Em outras palavras, deixe uma torta clientes para confiar na Intel um sentido A por clientes deve entender a uma torta apenas
usando a inteligência. Então um a p eu tem que ser compreensível intuitivamente. Apesar do ponto anterior, você deve fornecer uma documentação decente no caso de olhos particulares AP. Isto é especialmente importante para um prêmio que continha as principais noções que inerentemente os
torna difíceis de entender, especialmente para aqueles que são apenas o começo aprendendo os conceitos de domínio. No final, eu diria que seu bebê eu deveria apelar para a emoção mais poderosa. Qual deles você acha? Amor? Não exatamente. Apelar para a preguiça. Ninguém quer aprender um livro. Uma mão grossa sobre usar seu FBI. Ninguém, nem mesmo você.
57. 11 11 VS YAGNI: esta palestra é intitulada Sólido versus Jovem. Se você assistir o curso com cuidado, você pode notar que tentando corrigir um problema de design, sempre
acabamos com mais classes e funções. Em outras palavras, pode
parecer que acabamos com um design mais complexo. Aplicação cega de princípios sólidos pode nos levar à complexidade desnecessária. Sorria muitas vezes. Complexidade desnecessária é o resultado direto de violar o princípio de Yardeni. Greg Young há muito tempo saiu com a seguinte declaração. Os desenvolvedores têm uma tendência a tentar resolver problemas específicos com soluções gerais. O revestimento de ouro sempre leva ao acoplamento e complexidade e software. Greg Yann sugeriu fazer uma cabra específica em vez de torná-la geral. O princípio de responsabilidade única Natural está de acordo com a sugestão Greg Young de tornar o ouro específico. SRP leva a classes específicas com responsabilidades concretas. Ele aborda um problema muito específico. Os princípios da shin off Kalay aparecem quando chegamos a uma situação em que precisamos tornar o código mais geral, o que devemos fazer para que a verdadeira questão é o que deve ser generalizado. A resposta a esta pergunta dá o seu princípio de abstração reutilizado. O princípio envoltório significa essencialmente que se você tem uma abstração no nosso caso, uma interface ou uma classe abstrata e não é reutilizada ou, em outras palavras, implementada por mais de um implementador. Então você provavelmente viola o princípio da abstração reutilizada. Então o valor real de uma abstração é que ela elimina o irrelevante e amplifica o essencial de acordo com Toa Tio Bob. Então, para vir aqui para resolver princípios evitando violação yardeni ao mesmo tempo, começar com uma implementação concreta fora de um comportamento específico, observar as semelhanças emergentes e aplicar a regra de três, que afirma que se você encontrar-se em uma situação em que você deseja repetir a mesma chamada terceira vez, você precisa introduzir uma abstração e encapsulado o comportamento comum nele. Esta é a única maneira como você pode alcançar o equilíbrio entre sólido nous e você, Agnes a nível arquitetônico. Na próxima palestra, vamos concretizar este tópico um pouco e falar sobre OCP versus Yeah, Agni
58. 12OCP VS YAGI: Na palestra anterior, você aprendeu as relações entre princípios sólidos em geral e princípio Yanni. Nesta palestra, você verá um exemplo concreto de sólido versus Yardeni na forma de OCP versus Agonia . Vamos voltar para a forma clássica de violação UCP que analisamos na seção de receitas. Temos o método de dispositivo fino aqui, que implementa sua. Qual declaração de caso Inside Switch Gay declaração é uma construção fora de uma
programação processual na natureza? Esse método viola o OCP? Do ponto de vista da definição de fofocas Myers, receita não é violada aqui, uma vez que a adição de novo modelo de dispositivo não leva a quaisquer alterações na assinatura fora do método do
dispositivo de incêndio . Mas estamos mais interessados na definição do Martin. Nos dias modernos, e do ponto de vista de Martin, a OCP é claramente violada para resolver o problema. No OCP, Sectional introduziu uma classe baseada abstrata e vários herdeiros, que representavam os modelos de dispositivos. Então, introduzimos vários tipos novos em vez de um inicial. Sim, Agni ao mesmo tempo significa que não precisamos introduzir abstrações até
precisarmos delas. Então, o que fazer com esta situação? Qual princípio deve esperar aqui fofoca Orry Ogni, Um colega meu, Vladimir Horcoff, dá uma grande resposta a esta pergunta. A resposta dele é que depende. Depende do que falamos anteriormente. Se estamos falando de AP público, eu ou não, a resposta é diferente nesses casos. Então, no caso de um AP privado, eu jovem é mais importante que OCP. Se possuirmos o código baseado inteiramente e o desenvolvermos dentro de um grupo privado de pessoas, não
devemos introduzir abstrações. Até vermos o terceiro repetitivo Cho Chung vai aparecer, então precisamos aplicar OCP para evitar aplicação excessiva de código. No caso de AP público, precisamos sacrificar sua agonia e aplicar OCP imediatamente porque os custos futuros honram Factoring para o projeto orientado a objeto será enorme introduzirá
mudanças quebrando . Os clientes não gostam de quebrar alterações. Então, neste caso, OCP é mais importante que o Yanni. Na próxima palestra, vamos esclarecer a diferença entre SRP e eu falo
59. 13 SRP e ISP: esta palestra é intitulada como R P e Eyes Speed. Muitas vezes, os desenvolvedores se confundem com a diferença entre SRP e eu falo. Por exemplo, os desenvolvedores dizem que, se aplicarem este R P
, não há necessidade de aplicar a velocidade do gelo. Desde que todos os óculos têm uma única responsabilidade, eles pensam que eu velocidade aplicar para corrigir esta violação RP. No entanto, esta opinião está longe de ser a verdade. S R B implica que uma classe deve ter apenas um. A razão para mudar eu falo ao mesmo tempo nos diz que os clientes não devem depender coisas que não precisam mais concretamente e indo direto ao ponto, suas diferentes visões sobre a mesma idéia, SRP está mais focado no designer Lado. Ponto de vista, enquanto falo é mais focado no ponto de vista do lado do cliente. Considere o exemplo a seguir aqui tem um armazenamento de dados que implementa operações de leitura e gravação. Seria estranho separar essas operações em classes separadas, então não violamos isso. Estão aqui ao mesmo tempo? Se tivermos 10 clientes que dependem da funcionalidade de leitura e outros 10 clientes que dependem da funcionalidade de escrita de empréstimo do que poderia ser significativo introduzir duas interfaces que eu leitor e eu escrevo para esconder coisas de clientes que eles fazem Não. Preciso ver para aplicarmos o gelo aqui. Ok. Na próxima palestra, falaremos sobre arquitetura e design.
60. 14 Arquitetura e design: esta palestra é intitulada Arquitetura e Design. Você já pensou o que é arquitetura? O que isso significa? E qual é a diferença entre arquitetura e design? Os desenvolvedores costumavam usar esses termos de forma intercambiável. É muito importante sentir a diferença. Então vamos começar com a arquitetura. Todo software sério tem uma arquitetura. Mesmo que a arquitetura seja caótica, significaria que o caos é a arquitetura desse sistema caótico. Arquitetura de software é um termo muito vago, que muitas vezes é tratado como o mais alto nível de abstração fora de um sistema. Que tipo de armazenamento de dados está presente? Como os módulos interagem uns com os outros? Quais sistemas de recuperação estão em vigor e assim por diante? Em algum lugar em 2013 houve um post de Martin pai que analisou o problema de definir a noção fora da arquitetura. Ele citou Ralph Johnson, que disse que não existe tal noção, ist o mais alto nível de abstração de um sistema de usuários,
desenvolvedores, detentores de
produtos, detentores de
produtos, todos
eles olham para o sistema de diferentes ângulos e veja a arquitetura de forma diferente. É mais correto dizer que a arquitetura é composta por componentes significativos, e o que torna um componente significativo é um especialista. Desenvolvedores dizem que componentes específicos são significativos, então o rolo fora da noção da arquitetura é social. Trata-se de um acordo formal e, muitas vezes, informal sobre a forma de ver o sistema a partir do mais alto nível. Há também outra definição de cama fora da arquitetura, e é importante falar sobre isso. Aqui está. Arquitetura são as decisões que você deseja que você possa começar logo no início de um projeto. Devido a esta definição, os desenvolvedores tendem a pensar que escolher um asno DBM particular, eles tomam uma decisão arquitetônica. Em alguns casos, é verdade, e em outros casos não é. Por exemplo, se nós isolados para ser acumulado usando interfaces no limite correspondente fora do nosso sistema de
software e nós pudéssemos substituir isso seria uma bagunça, nós torná-lo irrelevante. E provavelmente não vamos tratar isso. D ser uma massa tem um componente significativo. Na verdade, o BMS e você eu somos ferramentas. Quando dizemos que uma determinada DBM resposta particular você alta tecnologia pertence à arquitetura. Uma analogia vem à mente que quando construímos uma casa, tratamos martelos, quebra-cabeças e outras ferramentas como a arquitetura da casa. Isso soaria absurdo. Claro, esta não é uma analogia absolutamente válida, vez que os martelos não têm uma influência tão significativa sobre o resultado,
como os sistemas de gerenciamento de banco de dados fazem. Mas devemos entender que devemos nos esforçar,
se possível, se possível, para tornar as ferramentas irrelevantes do ponto de vista do domínio. Devemos esforçar-nos por adiar tanto quanto possível as decisões arquitectónicas, uma vez que as decisões tomadas nas fases iniciais muitas vezes acabam por não ser óptimas na melhor das hipóteses. A definição de um projeto de software não justifica observações tão profundas. Design de software é sobre projetar os módulos ou componentes individuais. Quais são as responsabilidades? Funções fora do módulo X fora do vidro? Por
que, o que ele pode fazer e o que não os padrões de design podem ser usados. Projeto de software enfatiza o componente de módulo e nível de missão. Temos também noções como arquitetura e design panners. Padrões arquitetônicos são formas padrão fora de relações entre componentes que consideram padrões de arquitetura
significativos em geral incluem dois níveis cliente e servidor basicamente e cenário de servidor, três níveis cliente senhor, e banco de dados na maioria das vezes software ou arquitetura finalizada, o modelo de serviço Web, orientado a
eventos e assim por diante. Os pais projetados são os padrões que falamos ao longo do curso. De tempos em tempos, eles podem ser divididos em comportamentais, estruturais e de criação todos os padrões. Espero que agora entenda melhor. O que é arquitetura e design? Vamos falar sobre procurar um pouco de equilíbrio na próxima palestra.
61. 15 Conclusão: nesta seção, você aprendeu que cada pedaço de conhecimento deve ter uma única representação
inequívoca no sistema, e esta é a definição do princípio da unidade. As formas mais comuns de violação principal seca são fluxo mágico ou valores, lógica
duplicada em vários locais e lógica uniforme repetida ou vários casos de switch espalhados por toda a base de código. Você aprende que isso implica que a simplicidade deve ser uma meta chave no design e sobre a
complexidade do avaliador deve ser evitada. A principal técnica que usamos para lutar com a complexidade é a decomposição. A complexidade imposta pelo próprio domínio é chamada de complexidade essencial. complexidade acidental é a complexidade de nossas soluções, que se destinam a resolver os problemas do domínio. Sim, mas ele é tudo sobre evitar a engenharia. Não há critério bem definido, que permita medir a novidade jovem do sistema. Sim, ele é um diretor de programação extrema que afirma que um programador não deve adicionar funcionalidade até ser considerado um acessório. S futebol europeu estão fortemente relacionados. Basicamente, meia é um princípio que significa que temos que separar diferentes preocupações em diferentes módulos. Aderir ao sock permite construir sistemas modulares aqui está a lista de preocupações que muitas vezes devemos enfrentar no desenvolvimento de software empresarial. Você I lógica de negócios, apresentação, lógica e dados consulta Maze Comando, separação ou buscar-nos é um princípio que afirma que cada método deve ser um comando que executa em ação ou uma consulta que retorna dados para o chamador, mas não ambos. Em outras palavras, fazer uma pergunta não deve mudar a resposta. Uma formulação geral da lei de Demeter é a seguinte. Cada união deve ter apenas conhecimento limitado sobre outras unidades. Unidades Onley intimamente relacionadas com a unidade atual ou cada sindicato deve apenas falar com seus amigos ou não falar com estranhos que traz uma lista de puxar fora. O espanto está subjacente a um grande número de outros princípios e técnicas. Este princípio afirma que um componente fora de um sistema deve se comportar de forma consistente com a forma como os usuários fora desse componente provavelmente se comportarão. Você aprendeu que ocultação de informações e encapsulamento são conceitos diferentes. O encapsulamento destina-se a proteger as informações de variância. Esconder é uma das maneiras de alcançar o encapsulamento adequado. Você também aprendeu que você pode alcançar limites entre complexidade e simplicidade, aplicando seu princípio de abstração reutilizado que OCP bits Yardeni em caso de AP público I e vice-versa em caso de privado A P I. Sim, agonia bate OCP. Você aprende que uma terapia e gelo pr semelhante em sua intenção, mas diferente do ponto de vista semântico. SRP e eu falamos e ambos serão aplicados na mesma classe. Por exemplo, eles não contradizem um com o outro. Você aprende que arquitetura e design são noções diferentes. Arquitetura é o acordo entre grupo de pessoas, geralmente programadores especialistas, sobre a importância fora dos componentes do sistema. Enquanto o design de software é um conceito de nível mais baixo e diz respeito aos detalhes de implementação no final, como classes e interfaces interagem e assim E ele também aprendeu que, é claro, você precisa praticar para se tornar sábio em relação à construção sistemas de software que podem ser mantidos. Parabéns. Este é o fim do curso. Foi uma longa viagem. Espero que tenha gostado. Aprendi muito e me tornei um desenvolvedor melhor. E obrigado por assistir