Você está na página 1de 54

Princpio de POO (Programao Orientada a Objetos)

Viviane Torres da Silva viviane.silva@ic.uff.br http://www.ic.uff.br/~viviane.silva/2010.1/es1

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

Mtodos de acesso (get e set) Atributos (privados)

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

Projeto Estruturado Heursticas

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 .....

Projeto Estruturado Heursticas


.....

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

Projeto Estruturado -> Projeto OO


De Projeto Estruturado para Orientado a Objetos
Para projetar estruturas de nvel 2 (ou superior) de encapsulamento, devem ser utilizadas outras tcnicas Entretanto, a filosofia utilizada no paradigma estruturado se mantm no paradigma OO O princpio que rege projeto em qualquer nvel se baseia em atribuir responsabilidade, mantendo junto o que correlato e separando o que distinto O objetivo principal do projeto criar sistemas robustos, confiveis, extensveis, reutilizveis e manutenveis

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

Classe A int getCPF() Classe B int cpf = a.getCPF(); String getCPF()

Congeneridade/Acoplamento

III/XV

Congeneridade de nome: descreve uma dependncia em relao a um nome

Classe A String getCGC() Classe B String cgc = a.getCGC(); String getCNPJ()

Congeneridade/Acoplamento

IV/XV

Congeneridade de posio: descreve uma dependncia em relao a uma posio

Classe A // 0 -> modelo // 1 -> cor // 2 -> combustvel String[] parametro;

Classe B a.setParametro(1, preto);

// 0 -> modelo // 1 -> combustvel // 2 -> cor String[] parametro;

Congeneridade/Acoplamento

V/XV

Congeneridade de conveno: descreve uma dependncia em relao a uma conveno

Classe A // -1 inexistente int getId(String nome) Classe B int id = a.getId(Joao); if (id == -1) out.print(Inexistente);

// -1: removido // -2: inexistente int getId(String nome)

Congeneridade/Acoplamento

VI/XV

Congeneridade de algoritmo: descreve uma dependncia em relao a um algoritmo


Classe A // Usa mtodo de Rabin int code(int valor) Classe C int v1 = 12345; int v2 = a.code(v1); int v3 = b.decode(v2); if (v1 == v3) out.print(OK);

// Usa RSA int code(int valor) Classe B // Usa mtodo de Rabin int decode(int valor)

Congeneridade/Acoplamento

VII/XV

Congeneridade de execuo: descreve uma dependncia em relao seqncia de execuo

Classe A void conectaInternet()

Classe C a.conectaInternet(); ... b.leEmails();

Classe B void leEmails() b.leEmails(); ... a.conectaInternet();

Congeneridade/Acoplamento

VIII/XV

Congeneridade temporal: descreve uma dependncia em relao durao de execuo

Classe A void ligaRaioX()

Classe C a.ligaRaioX(); this.wait(200); // ms b.desligaRaioX();

Classe B void desligaRaioX()

a.ligaRaioX(); this.compactaBD(); this.wait(200); // ms b.desligaRaioX();

Congeneridade/Acoplamento

IX/XV

Congeneridade de valor: descreve uma dependncia em relao a valores

Classe A Lado do quadrado void setLado(int lado)

Classe C O quadrado a.setLado(5); b.setArea(25);


Lado = 5 x rea

Classe B rea do quadrado void setArea(int area) a.setLado(5); b.setArea(30);


Lado = 6 x rea

Congeneridade/Acoplamento

X/XV

Congeneridade de identidade: descreve uma dependncia em relao a ponteiros idnticos


Classe C Classe A O cliente void setCPF(String cpf) String getCPF() String cpf = 123456789; a.setCPF(cpf); b.setCPF(cpf); if (a.getCPF() == b.getCPF()) out.print(Dono da compra);

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 void setCPF(String cpf) void setCPF(Cpf cpf)

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

Arquitetura Reutilizao nos domnios

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()

Veiculo carro = ...; Veiculo aviao = ...; carro.decola(); // ???

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

get Seno () getTangente()

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()

Figura amplia() gira()

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()

Figura amplia() gira()

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

Você também pode gostar