SlideShare a Scribd company logo
1 of 34
Oque é SampleAbstractionsPrinciple? Princípio de Estabilidade e Abstração
SAP Definição: Um pacote deve ser tão abstrato quanto estável. Um pacote estável deve ser também abstrato  de modo que sua estabilidade  não impeça que ele seja estendido. Um pacote instável deve ser  concreto desde que o código concreto dentro dele seja facilmente alterado.
Exemplo Exemplo de mudança no cliente.  Usuários e gerentes são incapazes de prever a qualidade de seus produto. Uma simples mudança em uma parte do pedido pode provocar falhas em outras partes que parecem ser completamente independentes. Corrigindo esses problemas podem surgir ainda mais problemas, e o processo de manutenção começa a se assemelhar a um cachorro correndo atrás do rabo.   É difícil reutilizar um projeto que é altamente interdependente. Por isso os desenvolvedores se assustam com a quantidade de trabalho para separar uma parte indesejável do projeto, da parte desejável se um projeto possui essa característica.   
Exemplo Exemplo de mudança no cliente.    Muitas vezes o custo é menor do que fazer a separação, sendo assim, é comum vermos projetos desse tipo serem remodelados do zero. Para ilustrar vamos utilizar um programa simples que é carregado com a tarefa de copiar caracteres digitados em um teclado para uma impressora, e que a plataforma de implementação não dá suporte a independência dos dispositivos.  
Exemplo
Exemplo Exemplo de mudança no cliente.    Há três módulos. O módulo "Copy"  chama os outros dois. Imagine um loop dentro do módulo  "Copy". O corpo do loop que chama o módulo "Read Keybord” (leitura do teclado) para buscar um caracter do teclado, que envia um caracter para omódulo "Write Printer” (Escrever impressora) que imprime o caráter. Os dois módulos de baixo nível são bem reutilizáveis. Eles podem ser usados em muitos outros programas para ter acesso ao teclado e a impressora. Este é o mesmo tipo de reutilização que ganhamos com bibliotecas de rotinas.   Veja um exemplo de código parecido com o módulo “Copy”.  
Exemplo Exemplo do código Copy  void Copy() { int c; while ((c = ReadKeyboard()) != EOF) WritePrinter(c); }  
Exemplo Exemplo de mudança no cliente.  Note que o módulo "Copy" é dependente do módulo "Write Printer", e portanto, não pode ser reutilizado em um novo contexto, apesar da funcionalidade desse módulo ser muito interessante, ele não é reutilizável em qualquer contexto que não envolva um teclado ou uma impressora. Por exemplo, considere esse contexo: um programa que copia os caracteres digitados em um teclado para um arquivo em disco.  Certamente poderíamos modificar o módulo "Copiar" para dar-lhe a nova funcionalidade desejada.
Exemplo Exemplo de mudança no cliente.  Poderíamos acrescentar um “if” para que possamos escolher entre o módulo "Write Printer" e o "Write Disk”, dependendo somete de algum tipo de comando.  No entanto, isso acrescenta novas interdependências, para o sistema, e conforme o passar do tempo, cada vez mais dispositivos podem participar do programa, então o módulo "Copy" estará repleto de declarações “if” e “else” e será dependente de vários módulos de nível inferior.  Ele se tornará rígido e frágil.
Ivertendo Dependências Invertendo dependências com OOD    Uma forma de caracterizar o problema acima é de notar que o módulo que contémum alto nível de acoplamento, ou seja, o módulo "Copy", é dependente de seus detalhes.    Se pudéssemos controlar os outros módulos a partir de qualquer dispositivo de entrada para qualquer dispositivo de saída, poderíamos reutilizar livrimente o “Copy”. O OOD nos dá mecanismos para a realização dessa inversão de dependência.
Ivertendo Dependências
Exemplo classReader {  public: virtual int Read() = 0; }; class Writer { public: virtual void Write(char) = 0; }; void Copy(Reader& r, Writer& w) { int c; while((c=r.Read()) != EOF) w.Write(c); }
Exemplo No entanto, essa classe "Copy" de não depende em tudo da "Keyboard Reader", nem da "Printer Writer". Assim, as dependências foram invertidas. Agora, a classe "Copy" dependesomente das abstracts, e o “Read” e o “Writer”. Agora podemos reutilizar a classe "Copy", independentemente do "Keyboard Reader" e do "Printe Writer". Podemos inventar novos tipos de "Reader" e "Writer" que podem dar suporte à classe "Copy". Além disso, não importa quantos tipos de "Reader e "Writer" são criados, "Copy" não dependerá de nenhum deles.  Não haverá interdependências para deixar o programa frágil ou rígido. Esta é a essência do DIP.
Estável VS Volátil Certamente poderíamos imaginar algumas mudanças se estendecemos um pouco o nosso pensamento. Mas no curso dos acontecimentos normal, essas classes têm baixa volatilidade. Desde "Copy" dependa de módulos que são do tipo não-volátil, é muito pouco provável que a “Copy” sofra alterações. "Copy" também é um exemplo do princípio "Open/Closed". "Copy" está aberta a ser expanção, uma vez que podem criar novas versões de "Reader"e "Writer". No entanto, "Copy" está fechada para a modificação, já que não tem que modificá-lo para alcançar essas extensões. Assim, podemos dizer que uma dependência boa é uma dependência de algo com baixa volatilidade. Quanto menos volátil o objetivo da dependência,  melhor a dependência. Da mesma forma uma "Má Dependência" é uma dependência de algo que é volátil. Quanto mais volátil o objetivo da dependência, pior é a dependência.
Estabilidade Independência A definição clássica da estabilidade palavra é: "Não é facilmente abalado."   Esta é a definição que iremos utilizar neste artigo. Ou seja, a estabilidade não é uma medida da probabilidade que um módulo vai mudar, e sim é uma medida da dificuldade de um módulo em mudar.Como se alcançar a estabilidade? Por que, por exemplo "Reader" e "Writer",  são  tão estáveis? Considere novamente as forças que poderiam fazê-los mudar. Eles não dependem de nadaem tudo, então a mudança de uma dependencia não podem estender-se até eles e levá-los a mudar.  Essa característica é chamda de "Independência".
Estabilidade Independência Classes Independente são classes que não dependem de qualquer outra coisa. Outra razão que "Reader" e "Writer" são estáveis ​​é que eles são dependencias de outras classes. Entre "Copy", "KeyboardReader" e "KeyboardWriter“. O fato é que, podem existir alterações de "Reader" e "Writer", mas, quanto mais dependencias essas classes tiverem, mais difícil será alteralas. Se alterarmos "Reader" ou "writer" que teria que mudar todas as outras classes que dependem delas. Assim, essa mudança daria muito trabalho e isso nos impede de mudar essas classes, e aumentando a sua estabilidade.
Classes Estáveis As classes mais estáveis, são classes que são independentes e responsáveis. Essas classes não têm nenhuma razão para mudar, e muitas razões para não mudar
Dependências Estáveis As dependências entre pacotes em um projeto devem ser no sentido da estabilidade dos PACOTES. Os PACOTES devem depender apenas de pacotes que são MAIS ESTÁVEL que ele. Projetos não podem ser completamente estáticos. Alguma volatilidade é necessário ser mantida no projeto.
Métricas de Estabilidade Como podemos medir a estabilidade de um pacote? Uma maneira é contar o número de dependências que entram e saem desse pacote. Estas contagens nos permitirá calcular a posição estabilidade do pacote.
Métricas de Estabilidade Ca: Acoplamentos Aferentes: O número de classes de fora deste pacote, que dependemem classes dentro deste pacote. Ce: Acoplamentos eferente: O número de classes dentro desse pacote que depende declasses de fora deste pacote. I: Instabilidade: (Ce/(Ca + Ce)): Esta métrica tem no intervalo [0,1]. I = 0  (indica ser um pacote  maximamente estável).  I = 1  (indica um pacote máximamente instável).   As métricas de Ca e Ce são calculados pela contagem do número de classes fora do pacote em questão que têm dependências com as classes dentro do pacote em questão.
Métricas de Estabilidade O PSD diz que a métrica de um pacote que deve ser maior do que as métricas I dopacotes que ele depende. ou seja, eu métricas devem diminuir na direção de dependência.Nem todos os pacotes devem ser estáveis. Se todos os pacotes em um sistema foram maximamente estável, o sistema seria imutável. Esta não é uma situação desejável. Na verdade, queremos projetar a nossa estrutura de pacotes, de modo que alguns pacotes são instáveis, e alguns são estáveis. A figura a seguir mostra o idealconfiguração de um sistema com três pacotes.
Métricas de Estabilidade
SAP Este princípio estabelece uma relação entre a estabilidade e a abstração.  Ele diz que um pacote estável deve também ser abstrato de modo que sua estabilidade não impeça que ele seja modificado. Por outro lado, ele diz que um pacote instável deve ser de concreto, uma vez que a sua instabilidade permita que o código de concreto dentro dele seja facilmente alterado.
SAP- Como mensurar? (NC): O número de classes do pacote (Na): O número de classes abstratas nopacote (Abstração):  A = Na / Nc Um A  tem o intervalo [0,1] A = 0 (implica que o pacote não tem classes abstratas) A = 1 (implica que o pacote possui somente classes abstratas)
SAP - Gráfico A.I. I = 1, A = Imaximamenteinstável eAbstrato I = 0, A = 0maximamenteestável econcreto
SAP - Gráfico A.I. I = 1, A = Imaximamenteinstável eAbstrato I = 0, A = 0maximamenteestável econcreto
SAP - Gráfico A.I. Pacotes que são maximamente ESTÁVEIS devem ser maximamente ABSTRATOS.     PACOTES instáveis DEVEM SER CONCRETOS.     A abstração de um pacote deve ser PROPORCIONAL a sua estabilidade. Um pacote que fica na seqüência principal não é abstrato o bastante para a sua estabilidade,nem é instável para a sua abstração.
SAP - Distância da seqüência principal O pacote deve estar ligado ou próximo da seqüência principal (Distância D): D = | A + I - 1 | / √ 2 Intervalos D’ a partir de [0, 0,707 ~] (Distância normalizada D ‘): D’ = | I + A - 1 | Intervalos D 'a partir de [0, 1] D = 0 indica que o pacote está diretamente ligadoa seqüência principal D = 1 indica que o pacote está tão longelonge possível a partir da seqüência principal
SAP – Média e variância de todas as métricas D.
SAP- Plotando a métrica D’ de cada pacote ao longo do tempo
SAP- Plotando a métrica D’ de cada pacote ao longo do tempo
SAP- Plotando a métrica D’ de cada pacote ao longo do tempo
SAP     Dependências-AcíclicasDependências-EstáveisAbstrações-Estáveis Estabilidade
Autores Cláudio Roberto Xavier Samuel Lopes

More Related Content

What's hot

Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)Ryan Padilha
 
Strategy - Padrões de Projeto
Strategy - Padrões de ProjetoStrategy - Padrões de Projeto
Strategy - Padrões de ProjetoEduardo Mendes
 
Apostila: Curso de java III
Apostila: Curso de java IIIApostila: Curso de java III
Apostila: Curso de java IIIVerônica Veiga
 
Orientação a Objetos no Delphi - Controle de Estoque (III)
Orientação a Objetos no Delphi - Controle de Estoque (III)Orientação a Objetos no Delphi - Controle de Estoque (III)
Orientação a Objetos no Delphi - Controle de Estoque (III)Ryan Padilha
 
Design Pattern MVC – Arquitetura de Software Coesa e Flexível
Design Pattern MVC – Arquitetura de Software Coesa e FlexívelDesign Pattern MVC – Arquitetura de Software Coesa e Flexível
Design Pattern MVC – Arquitetura de Software Coesa e FlexívelRyan Padilha
 
Observable Binding Para Atualização na UI Android
Observable Binding Para Atualização na UI AndroidObservable Binding Para Atualização na UI Android
Observable Binding Para Atualização na UI AndroidVinícius Thiengo
 
Visualg primeira interação
Visualg   primeira interaçãoVisualg   primeira interação
Visualg primeira interaçãoHumberto Cepep
 
Como DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um LegadoComo DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um LegadoLuiz Costa
 

What's hot (10)

Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)
 
Strategy - Padrões de Projeto
Strategy - Padrões de ProjetoStrategy - Padrões de Projeto
Strategy - Padrões de Projeto
 
Curso Java I
Curso Java ICurso Java I
Curso Java I
 
Apostila: Curso de java III
Apostila: Curso de java IIIApostila: Curso de java III
Apostila: Curso de java III
 
Aula2
Aula2Aula2
Aula2
 
Orientação a Objetos no Delphi - Controle de Estoque (III)
Orientação a Objetos no Delphi - Controle de Estoque (III)Orientação a Objetos no Delphi - Controle de Estoque (III)
Orientação a Objetos no Delphi - Controle de Estoque (III)
 
Design Pattern MVC – Arquitetura de Software Coesa e Flexível
Design Pattern MVC – Arquitetura de Software Coesa e FlexívelDesign Pattern MVC – Arquitetura de Software Coesa e Flexível
Design Pattern MVC – Arquitetura de Software Coesa e Flexível
 
Observable Binding Para Atualização na UI Android
Observable Binding Para Atualização na UI AndroidObservable Binding Para Atualização na UI Android
Observable Binding Para Atualização na UI Android
 
Visualg primeira interação
Visualg   primeira interaçãoVisualg   primeira interação
Visualg primeira interação
 
Como DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um LegadoComo DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um Legado
 

Similar to OqueéSampleAbstractionsPrinciple

Aprendendo C# do zero
Aprendendo C# do zeroAprendendo C# do zero
Aprendendo C# do zeroManawydan
 
Java memory model primary ref. - faq
Java memory model   primary ref. - faqJava memory model   primary ref. - faq
Java memory model primary ref. - faqPedro De Almeida
 
Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...
Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...
Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...Vinicius Pulgatti
 
Spring & Struts
Spring & StrutsSpring & Struts
Spring & Strutseduan
 
Java Primeiros Passos - Cap 7
Java Primeiros Passos - Cap 7Java Primeiros Passos - Cap 7
Java Primeiros Passos - Cap 7David Willian
 
Aula 1 - Java - Prof.ª Cristiane Fidelix
Aula 1 - Java - Prof.ª Cristiane FidelixAula 1 - Java - Prof.ª Cristiane Fidelix
Aula 1 - Java - Prof.ª Cristiane FidelixCris Fidelix
 
Aula1- Java PRof.ª Cristiane Fidelix
Aula1- Java PRof.ª Cristiane FidelixAula1- Java PRof.ª Cristiane Fidelix
Aula1- Java PRof.ª Cristiane FidelixCris Fidelix
 
Hexagonal Rails
Hexagonal RailsHexagonal Rails
Hexagonal RailsLuiz Costa
 
Construção de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em JavaConstrução de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em JavaFernando Camargo
 

Similar to OqueéSampleAbstractionsPrinciple (20)

Sap – stablility and abstract principle
Sap – stablility and abstract principleSap – stablility and abstract principle
Sap – stablility and abstract principle
 
Interface
InterfaceInterface
Interface
 
Sdp – stable dependencies principles
Sdp – stable dependencies principlesSdp – stable dependencies principles
Sdp – stable dependencies principles
 
poster
posterposter
poster
 
Aprendendo C# do zero
Aprendendo C# do zeroAprendendo C# do zero
Aprendendo C# do zero
 
Java memory model primary ref. - faq
Java memory model   primary ref. - faqJava memory model   primary ref. - faq
Java memory model primary ref. - faq
 
Java script
Java scriptJava script
Java script
 
Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...
Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...
Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...
 
Spring & Struts
Spring & StrutsSpring & Struts
Spring & Struts
 
Java Primeiros Passos - Cap 7
Java Primeiros Passos - Cap 7Java Primeiros Passos - Cap 7
Java Primeiros Passos - Cap 7
 
2832014 curso plsql
2832014 curso plsql2832014 curso plsql
2832014 curso plsql
 
424928
424928424928
424928
 
Aula 1 - Java - Prof.ª Cristiane Fidelix
Aula 1 - Java - Prof.ª Cristiane FidelixAula 1 - Java - Prof.ª Cristiane Fidelix
Aula 1 - Java - Prof.ª Cristiane Fidelix
 
Aula1- Java PRof.ª Cristiane Fidelix
Aula1- Java PRof.ª Cristiane FidelixAula1- Java PRof.ª Cristiane Fidelix
Aula1- Java PRof.ª Cristiane Fidelix
 
Hexagonal Rails
Hexagonal RailsHexagonal Rails
Hexagonal Rails
 
xxx no sequel
xxx no sequelxxx no sequel
xxx no sequel
 
Construção de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em JavaConstrução de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em Java
 
plsql oracle
plsql oracleplsql oracle
plsql oracle
 
Aula07
Aula07Aula07
Aula07
 
[Pereira IC'2011] Otimizacoes no LLVM
[Pereira IC'2011] Otimizacoes no LLVM[Pereira IC'2011] Otimizacoes no LLVM
[Pereira IC'2011] Otimizacoes no LLVM
 

More from Engenharia de Software Ágil

More from Engenharia de Software Ágil (20)

Sap – stablility and abstract principle
Sap – stablility and abstract principleSap – stablility and abstract principle
Sap – stablility and abstract principle
 
Common closure principle
Common closure principleCommon closure principle
Common closure principle
 
Common closure principle
Common closure principle Common closure principle
Common closure principle
 
Acyclic dependencies principle
Acyclic dependencies principleAcyclic dependencies principle
Acyclic dependencies principle
 
Acyclic dependencies principle (adp)
Acyclic dependencies principle  (adp)Acyclic dependencies principle  (adp)
Acyclic dependencies principle (adp)
 
Reuse release equivalence principle
Reuse release equivalence principleReuse release equivalence principle
Reuse release equivalence principle
 
Rep reuse release equivalence principle
Rep reuse release equivalence principleRep reuse release equivalence principle
Rep reuse release equivalence principle
 
principio de reutilização comum
principio de reutilização comumprincipio de reutilização comum
principio de reutilização comum
 
Princípio law of demeter
Princípio law of demeterPrincípio law of demeter
Princípio law of demeter
 
Lod law of demeter
Lod law of demeterLod law of demeter
Lod law of demeter
 
Dip the dependency inversion principle
Dip   the dependency inversion principleDip   the dependency inversion principle
Dip the dependency inversion principle
 
Dip the dependency inversion principle
Dip   the dependency inversion principleDip   the dependency inversion principle
Dip the dependency inversion principle
 
Dip the dependency inversion principle
Dip   the dependency inversion principleDip   the dependency inversion principle
Dip the dependency inversion principle
 
(ISP) - Interface Segregation Principle
(ISP)  - Interface Segregation Principle(ISP)  - Interface Segregation Principle
(ISP) - Interface Segregation Principle
 
LSP – The Liskov Substitution Principle
LSP – The Liskov Substitution PrincipleLSP – The Liskov Substitution Principle
LSP – The Liskov Substitution Principle
 
SRP - Single Responsability Principle
SRP - Single Responsability PrincipleSRP - Single Responsability Principle
SRP - Single Responsability Principle
 
Princípio Law Of Demeter (LOD)
Princípio Law Of Demeter (LOD)Princípio Law Of Demeter (LOD)
Princípio Law Of Demeter (LOD)
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
 
FDD
FDDFDD
FDD
 
DDD - Domain Driven Design
DDD - Domain Driven DesignDDD - Domain Driven Design
DDD - Domain Driven Design
 

OqueéSampleAbstractionsPrinciple

  • 1. Oque é SampleAbstractionsPrinciple? Princípio de Estabilidade e Abstração
  • 2. SAP Definição: Um pacote deve ser tão abstrato quanto estável. Um pacote estável deve ser também abstrato de modo que sua estabilidade não impeça que ele seja estendido. Um pacote instável deve ser concreto desde que o código concreto dentro dele seja facilmente alterado.
  • 3. Exemplo Exemplo de mudança no cliente. Usuários e gerentes são incapazes de prever a qualidade de seus produto. Uma simples mudança em uma parte do pedido pode provocar falhas em outras partes que parecem ser completamente independentes. Corrigindo esses problemas podem surgir ainda mais problemas, e o processo de manutenção começa a se assemelhar a um cachorro correndo atrás do rabo.   É difícil reutilizar um projeto que é altamente interdependente. Por isso os desenvolvedores se assustam com a quantidade de trabalho para separar uma parte indesejável do projeto, da parte desejável se um projeto possui essa característica.  
  • 4. Exemplo Exemplo de mudança no cliente.   Muitas vezes o custo é menor do que fazer a separação, sendo assim, é comum vermos projetos desse tipo serem remodelados do zero. Para ilustrar vamos utilizar um programa simples que é carregado com a tarefa de copiar caracteres digitados em um teclado para uma impressora, e que a plataforma de implementação não dá suporte a independência dos dispositivos.  
  • 6. Exemplo Exemplo de mudança no cliente.   Há três módulos. O módulo "Copy" chama os outros dois. Imagine um loop dentro do módulo "Copy". O corpo do loop que chama o módulo "Read Keybord” (leitura do teclado) para buscar um caracter do teclado, que envia um caracter para omódulo "Write Printer” (Escrever impressora) que imprime o caráter. Os dois módulos de baixo nível são bem reutilizáveis. Eles podem ser usados em muitos outros programas para ter acesso ao teclado e a impressora. Este é o mesmo tipo de reutilização que ganhamos com bibliotecas de rotinas.   Veja um exemplo de código parecido com o módulo “Copy”.  
  • 7. Exemplo Exemplo do código Copy  void Copy() { int c; while ((c = ReadKeyboard()) != EOF) WritePrinter(c); }  
  • 8. Exemplo Exemplo de mudança no cliente. Note que o módulo "Copy" é dependente do módulo "Write Printer", e portanto, não pode ser reutilizado em um novo contexto, apesar da funcionalidade desse módulo ser muito interessante, ele não é reutilizável em qualquer contexto que não envolva um teclado ou uma impressora. Por exemplo, considere esse contexo: um programa que copia os caracteres digitados em um teclado para um arquivo em disco. Certamente poderíamos modificar o módulo "Copiar" para dar-lhe a nova funcionalidade desejada.
  • 9. Exemplo Exemplo de mudança no cliente. Poderíamos acrescentar um “if” para que possamos escolher entre o módulo "Write Printer" e o "Write Disk”, dependendo somete de algum tipo de comando. No entanto, isso acrescenta novas interdependências, para o sistema, e conforme o passar do tempo, cada vez mais dispositivos podem participar do programa, então o módulo "Copy" estará repleto de declarações “if” e “else” e será dependente de vários módulos de nível inferior. Ele se tornará rígido e frágil.
  • 10. Ivertendo Dependências Invertendo dependências com OOD   Uma forma de caracterizar o problema acima é de notar que o módulo que contémum alto nível de acoplamento, ou seja, o módulo "Copy", é dependente de seus detalhes.   Se pudéssemos controlar os outros módulos a partir de qualquer dispositivo de entrada para qualquer dispositivo de saída, poderíamos reutilizar livrimente o “Copy”. O OOD nos dá mecanismos para a realização dessa inversão de dependência.
  • 12. Exemplo classReader { public: virtual int Read() = 0; }; class Writer { public: virtual void Write(char) = 0; }; void Copy(Reader& r, Writer& w) { int c; while((c=r.Read()) != EOF) w.Write(c); }
  • 13. Exemplo No entanto, essa classe "Copy" de não depende em tudo da "Keyboard Reader", nem da "Printer Writer". Assim, as dependências foram invertidas. Agora, a classe "Copy" dependesomente das abstracts, e o “Read” e o “Writer”. Agora podemos reutilizar a classe "Copy", independentemente do "Keyboard Reader" e do "Printe Writer". Podemos inventar novos tipos de "Reader" e "Writer" que podem dar suporte à classe "Copy". Além disso, não importa quantos tipos de "Reader e "Writer" são criados, "Copy" não dependerá de nenhum deles. Não haverá interdependências para deixar o programa frágil ou rígido. Esta é a essência do DIP.
  • 14. Estável VS Volátil Certamente poderíamos imaginar algumas mudanças se estendecemos um pouco o nosso pensamento. Mas no curso dos acontecimentos normal, essas classes têm baixa volatilidade. Desde "Copy" dependa de módulos que são do tipo não-volátil, é muito pouco provável que a “Copy” sofra alterações. "Copy" também é um exemplo do princípio "Open/Closed". "Copy" está aberta a ser expanção, uma vez que podem criar novas versões de "Reader"e "Writer". No entanto, "Copy" está fechada para a modificação, já que não tem que modificá-lo para alcançar essas extensões. Assim, podemos dizer que uma dependência boa é uma dependência de algo com baixa volatilidade. Quanto menos volátil o objetivo da dependência, melhor a dependência. Da mesma forma uma "Má Dependência" é uma dependência de algo que é volátil. Quanto mais volátil o objetivo da dependência, pior é a dependência.
  • 15. Estabilidade Independência A definição clássica da estabilidade palavra é: "Não é facilmente abalado."  Esta é a definição que iremos utilizar neste artigo. Ou seja, a estabilidade não é uma medida da probabilidade que um módulo vai mudar, e sim é uma medida da dificuldade de um módulo em mudar.Como se alcançar a estabilidade? Por que, por exemplo "Reader" e "Writer", são tão estáveis? Considere novamente as forças que poderiam fazê-los mudar. Eles não dependem de nadaem tudo, então a mudança de uma dependencia não podem estender-se até eles e levá-los a mudar. Essa característica é chamda de "Independência".
  • 16. Estabilidade Independência Classes Independente são classes que não dependem de qualquer outra coisa. Outra razão que "Reader" e "Writer" são estáveis ​​é que eles são dependencias de outras classes. Entre "Copy", "KeyboardReader" e "KeyboardWriter“. O fato é que, podem existir alterações de "Reader" e "Writer", mas, quanto mais dependencias essas classes tiverem, mais difícil será alteralas. Se alterarmos "Reader" ou "writer" que teria que mudar todas as outras classes que dependem delas. Assim, essa mudança daria muito trabalho e isso nos impede de mudar essas classes, e aumentando a sua estabilidade.
  • 17. Classes Estáveis As classes mais estáveis, são classes que são independentes e responsáveis. Essas classes não têm nenhuma razão para mudar, e muitas razões para não mudar
  • 18. Dependências Estáveis As dependências entre pacotes em um projeto devem ser no sentido da estabilidade dos PACOTES. Os PACOTES devem depender apenas de pacotes que são MAIS ESTÁVEL que ele. Projetos não podem ser completamente estáticos. Alguma volatilidade é necessário ser mantida no projeto.
  • 19. Métricas de Estabilidade Como podemos medir a estabilidade de um pacote? Uma maneira é contar o número de dependências que entram e saem desse pacote. Estas contagens nos permitirá calcular a posição estabilidade do pacote.
  • 20. Métricas de Estabilidade Ca: Acoplamentos Aferentes: O número de classes de fora deste pacote, que dependemem classes dentro deste pacote. Ce: Acoplamentos eferente: O número de classes dentro desse pacote que depende declasses de fora deste pacote. I: Instabilidade: (Ce/(Ca + Ce)): Esta métrica tem no intervalo [0,1]. I = 0 (indica ser um pacote maximamente estável). I = 1 (indica um pacote máximamente instável). As métricas de Ca e Ce são calculados pela contagem do número de classes fora do pacote em questão que têm dependências com as classes dentro do pacote em questão.
  • 21. Métricas de Estabilidade O PSD diz que a métrica de um pacote que deve ser maior do que as métricas I dopacotes que ele depende. ou seja, eu métricas devem diminuir na direção de dependência.Nem todos os pacotes devem ser estáveis. Se todos os pacotes em um sistema foram maximamente estável, o sistema seria imutável. Esta não é uma situação desejável. Na verdade, queremos projetar a nossa estrutura de pacotes, de modo que alguns pacotes são instáveis, e alguns são estáveis. A figura a seguir mostra o idealconfiguração de um sistema com três pacotes.
  • 23. SAP Este princípio estabelece uma relação entre a estabilidade e a abstração. Ele diz que um pacote estável deve também ser abstrato de modo que sua estabilidade não impeça que ele seja modificado. Por outro lado, ele diz que um pacote instável deve ser de concreto, uma vez que a sua instabilidade permita que o código de concreto dentro dele seja facilmente alterado.
  • 24. SAP- Como mensurar? (NC): O número de classes do pacote (Na): O número de classes abstratas nopacote (Abstração): A = Na / Nc Um A tem o intervalo [0,1] A = 0 (implica que o pacote não tem classes abstratas) A = 1 (implica que o pacote possui somente classes abstratas)
  • 25. SAP - Gráfico A.I. I = 1, A = Imaximamenteinstável eAbstrato I = 0, A = 0maximamenteestável econcreto
  • 26. SAP - Gráfico A.I. I = 1, A = Imaximamenteinstável eAbstrato I = 0, A = 0maximamenteestável econcreto
  • 27. SAP - Gráfico A.I. Pacotes que são maximamente ESTÁVEIS devem ser maximamente ABSTRATOS. PACOTES instáveis DEVEM SER CONCRETOS. A abstração de um pacote deve ser PROPORCIONAL a sua estabilidade. Um pacote que fica na seqüência principal não é abstrato o bastante para a sua estabilidade,nem é instável para a sua abstração.
  • 28. SAP - Distância da seqüência principal O pacote deve estar ligado ou próximo da seqüência principal (Distância D): D = | A + I - 1 | / √ 2 Intervalos D’ a partir de [0, 0,707 ~] (Distância normalizada D ‘): D’ = | I + A - 1 | Intervalos D 'a partir de [0, 1] D = 0 indica que o pacote está diretamente ligadoa seqüência principal D = 1 indica que o pacote está tão longelonge possível a partir da seqüência principal
  • 29. SAP – Média e variância de todas as métricas D.
  • 30. SAP- Plotando a métrica D’ de cada pacote ao longo do tempo
  • 31. SAP- Plotando a métrica D’ de cada pacote ao longo do tempo
  • 32. SAP- Plotando a métrica D’ de cada pacote ao longo do tempo
  • 33. SAP Dependências-AcíclicasDependências-EstáveisAbstrações-Estáveis Estabilidade
  • 34. Autores Cláudio Roberto Xavier Samuel Lopes