Escolar Documentos
Profissional Documentos
Cultura Documentos
Agenda
Encapsulamento Projeto Estruturado Congeneridade Domnios Grau de dependncia Coeso Contratos Interface de classes Perigos detectados em POO
Encapsulamento
Mecanismo utilizado para lidar com o aumento de complexidade Consiste em exibir o que pode ser feito sem informar como feito Permite que a granularidade de abstrao do sistema seja alterada, criando estruturas mais abstratas
Nveis de Encapsulamento
Existem vrios nveis de utilizao de encapsulamento Encapsulamento nvel 0: Completa inexistncia de encapsulamento Linhas de cdigo efetuando todas as aes Encapsulamento nvel 1: Mdulos procedimentais Procedimentos permitindo a criao de aes complexas
Nveis de Encapsulamento
Encapsulamento nvel 2: Classes de objetos Mtodos isolando o acesso s caractersticas da classe Encapsulamento nvel 3: Pacotes de classes Conjunto de classes agrupadas, permitindo acesso diferenciado entre elas
Nveis de Encapsulamento
Encapsulamento nvel 4: Componentes Interfaces providas e requeridas para fornecer servios complexos
Encapsulamento
Projeto orientado a objetos tem foco principal em estruturas de nvel 2 de encapsulamento as classes A tcnica de Anis de Operaes ajuda a manter um bom encapsulamento interno da classe O uso dessa tcnica no afeta o acesso externo (que continua sendo regido por modificadores de visibilidade) Nessa tcnica so criados trs anis fictcios na classe Os mtodos de anis externos acessam sempre mtodos (ou atributos) de anis internos consecutivos
Encapsulamento
Permitido
Demais mtodos
Proibido
Encapsulamento
Com o uso da tcnica de anis de operaes podem ser criados atributos virtuais Atributos virtuais, podem ser calculados pelos mtodos get e set em funo dos atributos reais Exemplo1: mtodo double getVolume() na classe cubo retornando (lado ^ 3) Exemplo2: mtodo void setNome(String nome) armazenando o argumento nome nos atributos primeiroNome, iniciaisMeio, ultimoNome
Projeto Estruturado Para projetar estruturas de nvel 1 de encapsulamento (i.e.: Mdulos de procedimentos) foram criados alguns termos de projeto, dentre eles:
Arvore de dependncia: Estrutura que descreve a dependncia entre mdulos
G D E F B C A
Projeto Estruturado
Fan-in: indica quantos mdulos tem acesso a um dado mdulo Fan-out: indica quantos mdulos so acessados por um dado mdulo
Fan-out = 3
Fan-in = 2
Projeto Estruturado
Acoplamento: mede as interconexes entre os mdulos de um sistema Coeso: mede a afinidade dos procedimentos dentro de cada mdulo do sistema As mtricas de acoplamento e coeso variam em uma escala relativa (e.g.: fracamente, fortemente) O principal objetivo de um projeto estruturado criar mdulos fracamente acoplados e fortemente coesos
I/II
Para que esse objetivo principal pudesse ser atingido, foram definidas algumas heursticas:
Aps a primeira interao do projeto, verifique a possibilidade de juntar ou dividir os mdulos Minimize o fan-out sempre que possvel Maximize o fan-in em mdulos prximos s folha da rvore de dependncias Mantenha todos os mdulos que sofrem efeito de um determinado mdulo como seus descendentes na rvore de dependncias Verifique as interfaces dos mdulos com o intuito de diminuir a complexidade e redundncia e aumentar a consistncia .....
II/II
Crie mdulos onde as suas funes no dependam do seu estado interno (resultados no variam entre duas chamadas iguais de procedimentos) Evite mdulos que so restritivos em relao aos seus dados, controle ou interface Esforce-se para manter o controle sobre o projeto dos mdulos, no permitindo conexes de improviso Prepare o sistema pensando nas restries de projeto e nos requisitos de portabilidade
Congeneridade/Acoplamento
I/XV
Congeneridade um termo similar a acoplamento ou dependncia Para no confundir com acoplamento do projeto estruturado, alguns autores utilizam esse termo A congeneridade entre dois elemento A e B significa que: Se A for modificado, B ter que ser modificado ou ao menos verificado Pode ocorrer uma modificao no sistema que obrigue modificaes conjuntas em A e B
Congeneridade/Acoplamento
II/XV
Existem diversos tipos diferentes de congeneridade Congeneridade de tipo: descreve uma dependncia em relao a um tipo de dados
Congeneridade/Acoplamento
III/XV
Congeneridade/Acoplamento
IV/XV
Congeneridade/Acoplamento
V/XV
Classe A // -1 inexistente int getId(String nome) Classe B int id = a.getId(Joao); if (id == -1) out.print(Inexistente);
Congeneridade/Acoplamento
VI/XV
// Usa RSA int code(int valor) Classe B // Usa mtodo de Rabin int decode(int valor)
Congeneridade/Acoplamento
VII/XV
Congeneridade/Acoplamento
VIII/XV
Congeneridade/Acoplamento
IX/XV
Congeneridade/Acoplamento
X/XV
Classe B A compra void setCPF(String cpf) String getCPF() a.setCPF(123456789); b.setCPF(123456789); if (a.getCPF() == b.getCPF()) out.print(Dono da compra);
Congeneridade/Acoplamento
XI/XV
Congeneridade de diferena: descreve uma dependncia em relao a diferenas de termos que deve ser preservada tambm conhecida como contrageneridade ou congeneridade negativa Ocorre, por exemplo, quando uma classe faz uso de herana mltipla de duas ou mais classes que tem mtodos com nomes iguais (Eiffel utiliza a palavra-chave rename para contornar o problema)
Congeneridade/Acoplamento
XII/XV
Outro exemplo est relacionado com classes de nomes iguais em pacotes diferentes importados por uma terceira classe (soluo usando o namespace completo da classe) Tambm ocorre em caso de sobrecarga de mtodos
Classe A setCPF(null);
Congeneridade/Acoplamento
XIII/XV
O encapsulamento ajuda a lidar com os problemas relacionados com a congeneridade Supondo um sistema de 100 KLOCs em nvel 0 de encapsulamento
Como escolher um nome de varivel que no foi utilizado at o momento? Este cenrio indica um alto grau interno de congeneridade de diferena
Congeneridade/Acoplamento
XIV/XV
Algumas diretrizes devem ser seguidas, nesta ordem, para facilitar a manuteno: 1. Minimizar a congeneridade total 2. Minimizar a congeneridade que cruza as fronteiras do encapsulamento 3. Minimizar a congeneridade dentro das fronteiras do encapsulamento
Congeneridade/Acoplamento
XV/XV
Os mecanismos existentes da orientao a objetos que mais geram congeneridade so: Funes amigas Herana mltipla Uso de atributos protegidos em herana simples Implementaes espertas que fazem uso incorreto das estruturas OO argumentando ganho de desempenho
cliente.setNome(Joo);
cliente.nome = Joo;
Domnios
I/VII
Domnio pode ser visto como uma estrutura de classificao de elementos correlatos Normalmente, sistemas OO tem suas classes em um dos seguintes domnios: Domnio de aplicao Domnio de negcio Domnio de arquitetura Domnio de base Cada classe de um sistema OO devem pertencer a um nico domnio para ser coesa
Domnios
II/VII
O domnio de base descreve classes fundamentais, estruturais e semnticas Usualmente as classes do domnio de base j fazem parte das bibliotecas da linguagem de programao Classes fundamentais so tratadas, muitas das vezes, como tipos primitivos das linguagens OO (ex.: int e boolean) Classes estruturais implementam estruturas de dados consagradas (ex.: Hashtable, Stack e Set) Classes semnticas implementam elementos semnticos corriqueiros (ex.: Date e Color)
Domnios
III/VII
O domnio de arquitetura fornece abstraes para a arquitetura de hardware ou software utilizada As linguagens atuais tambm incluem classes do domnio de arquitetura Classes de comunicao implementam mecanismos que possibilitam a comunicao com outros sistemas (ex.: Sockets e RMI) Classes de manipulao de banco de dados criam abstraes para acesso aos SGBDs (ex.: pacotes JDBC e JDO) Classes de interface com usurio possibilitam a construo de sistemas interativos (ex.: pacotes swing e awt)
Domnios
IV/VII
O domnio de negcio descreve classes inerentes a uma determinada rea do conhecimento (ex.: AntenaAtiva, Repetidor e Equipamento no domnio de telecomunicaes)
O domnio de aplicao descreve classes cola, que servem para fazer as classes dos demais domnios funcionarem em um sistema
Domnios
V/VII
Cada domnio faz uso das classes dos domnios inferiores Desta forma, o domnio de base o mais reutilizvel, enquanto o domnio de aplicao torna-se praticamente no reutilizvel Acredita-se na possibilidade de reutilizao em grande escala de classes no domnio de negcio, mas isso ainda no uma realidade
Base
Negcio
Aplicao
Maior
Menor
Domnios
VI/VII
Classes do domnio de negcio no devem ser dependentes de tecnologia Caso isso ocorra, tanto a classe do domnio quanto a tecnologia implementada nela sero dificilmente reutilizveis Para contornar esse problema podem ser utilizadas classes mistas, pertencentes ao domnio de aplicao Classes mistas so teis para misturar conceitos de domnios diferentes, sem afetar as classes originais
Domnios
VII/VII
Dependncia de tecnologia de transmisso de informaes via fax-modem na classe Fatura (domnio de negcio):
Fatura
enviaPo rFax() enviaPorEMail() enviaPorCorrei o()
Grau de Dependncia
I/VI
Grau de dependncia uma mtrica semelhante a Fan-out de projeto estruturado Grau de dependncia direto indica quantas classes so referenciadas diretamente por uma determinada classe Grau de dependncia indireto indica quantas classes so referenciadas diretamente ou indiretamente (recursivamente) por uma determinada classe
Grau de Dependncia
II/VI
GDDA = 3 GDIA = 12
Grau de Dependncia
III/VI
Uma classe A referencia diretamente uma classe B se: A subclasse direta de B A tem atributo do tipo B A tem parmetro de mtodo do tipo B A tem variveis em mtodos do tipo B A chama mtodos que retornam valores do tipo B Assume-se que as classes do domnio de base tem grau de dependncia igual a zero
Grau de Dependncia
VI/VI
O grau de dependncia serve para verificar projetos orientados a objeto Espera-se que: Classes de domnios mais altos (negcio e aplicao) tenham alto grau de dependncia indireto Classes de domnios mais baixos (arquitetura e base) tenham baixo grau de dependncia indireto
Coeso
I/XII
Classes fracamente coesas apresentam caractersticas dissociadas Classes fortemente coesas apresentam caractersticas relacionadas, que contribuem para a abstrao implementada pela classe possvel avaliar a coeso verificando se h muita sobreposio de uso dos atributos pelos mtodos
Se sim, a classe tem indcios de estar coesa
Coeso
II/XII
A coeso pode ser classificada em: Coeso de instncia mista Coeso de domnio misto Coeso de papel misto Coeso alternada Coeso mltipla Coeso funcional
Coeso
III/XII
A coeso de instncia mista ocorre quando algumas caractersticas ou comportamentos no so vlidos para todos os objetos da classe Normalmente, problemas de coeso de instncia mista podem ser corrigidos atravs da criao de subclasses utilizando herana
Veiculo acelera() decola ()
Veiculo acelera()
VeiculoTerrestre
VeiculoAereo decola()
Coeso
IV/XII
A coeso de domnio misto ocorre quando algumas caractersticas ou comportamentos no fazem parte do domnio em questo Quando a coeso de domnio misto ocorre, a classe tende a perder o seu foco com o passar do tempo Um exemplo clssico a classe que representa nmeros reais (Float), quando so inseridos mtodos de manipulao numrica
Qual a semntica do float?
Coeso
V/XII
A soluo para esse problema a separao das responsabilidade em classes de diferentes domnios, tirando a sobrecarga da classe Float
Matematica
Float
getSeno() getTangente() converteC2F() converteF2C() converteUS2R() converteR2US()
Float
Temperatura
converteC2F() converteF2C()
Moeda
converteUS2R() converteR2US()
Coeso
VI/XII
A coeso de papel misto ocorre quando algumas caractersticas ou comportamentos criam dependncia entre classes de contextos distintos em um mesmo domnio Problemas de coeso de papel misto so os menos importantes dos problemas relacionados coeso O maior impacto desse problema est na dificuldade de aplicar reutilizao devido a bagagem extra da classe Exemplo: algumas das caractersticas e comportamentos da classe Funcionario no so necessrias em todos contextos
Coeso
VII/XII
A classe Funcionrio pode ser reutilizada sob o ponto de vista dos sistemas de assistncia mdica (AM) ou de treinamento (TR)
Funcionario
getCPF() getSalario()
Funcionario
getCPF() getSal ario() getTipoSanguineo() getFormacao Universit aria()
0..1 FuncionarioA M
getTipoSanguineo()
0..1 FuncionarioTR
getFormacaoUniversitaria()
Coeso
VIII/XII
A coeso alternada ocorre quando existe seleo de comportamento dentro do mtodo Usualmente o nome do mtodo contm OU De algum modo informada a chave para o mtodo poder identificar o comportamento desejado Internamente ao mtodo utilizado switch-case ou if aninhado Para corrigir o problema, o mtodo deve ser dividido em vrios mtodos, um para cada comportamento
Coeso
IX/XII
Exemplo: mtodo ampliaOuGira(int proporcao, boolean funcao) em Figura Agravante: o argumento proporcao serve como escala ou angulo, dependendo de funcao Poderia ser pior: no ter o argumento funcao, com proporcao tendo valor negativo para escala e positivo para angulo
Figura
ampliaOuGira()
Coeso
X/XII
A coeso mltipla ocorre quando mais de um comportamento executado sempre em um mtodo Usualmente o nome do mtodo contm E No possvel executar um comportamento sem que o outro seja executado, a no ser atravs de improviso (ex.: parmetro null) Para corrigir o problema, o mtodo deve ser dividido em vrios mtodos, um para cada comportamento
Coeso
XI/XII
Exemplo: mtodo ampliaEGira(int escala, int angulo) em Figura Poderia ser pior: uso de fator no lugar de escala e angulo com uma funo que decompe os dois argumentos
Figura
amp li aEGira()
Coeso
XII/XII
A coeso funcional ocorre quando encontrado o nvel ideal de coeso para uma classe Tambm conhecida como coeso ideal Utiliza nomes expressivos para os seus mtodos Bons nomes de mtodos normalmente so compostos por <verbo na 3a. pessoa do singular> + <substantivo> Exemplos: loja.calculaVendas(), livro.imprimeCapa() conta.efetuaDeposito()
Bibliografia
Fundamentos do Desenho Orientado a Objeto com UML, Meilir Page-Jones, Makron Books, 2001 Vrias transparncias foram produzidas por Leonardo Murta
http://www.ic.uff.br/~leomurta