Os princípios do desenho orientado a objetos
Os princípios do desenho orientado a objetos Encapsulamento e congeneridade Domínios, grau de dependência e coesão Os perigos da herança e do polimorfismo
Encapsulamento e congeneridade A sub-rotina, inventada nos anos 40, introduziu o conceito de encapsulamento Encapsular - separar o programa em partes, o mais isoladas possível. Classes implementam o encapsulamento nível 2
http://www2.ic.uff.br/~anselmo/cursos/tpa/apresentacoes/poo.pdf Níveis de encapsulamento Encapsulamento nível 0: Completa inexistência de encapsulamento Linhas de código efetuando todas as ações Encapsulamento nível 1: Módulos procedimentais Procedimentos permitindo a criação de ações complexas Encapsulamento nível 2: Classes de objetos Métodos isolando o acesso às características da classe Encapsulamento nível 3: Pacotes de classes Conjunto de classes agrupadas, permitindo acesso diferenciado entre elas Encapsulamento nível 4: Componentes Interfaces providas e requeridas para fornecer serviços complexos
http://www2.ic.uff.br/~anselmo/cursos/tpa/apresentacoes/poo.pdf
Encapsulamento Com o uso da técnica de anéis de operações podem ser criados atributos virtuais Atributos virtuais, podem ser calculados pelos métodos get e set em função dos atributos reais Exemplo1: método double getvolume() na classe cubo retornando (lado ^ 3) Exemplo2: método void setnome(string nome) armazenando o argumento nome nos atributos primeironome, iniciaismeio, ultimonome http://www2.ic.uff.br/~anselmo/cursos/tpa/apresentacoes/poo.pdf
Congeneridade Terem nascido juntos
Congeneridade Terem nascido juntos int i; i = 7;
Congeneridade Terem nascido juntos int i; i = 7; Se A for modificado, B terá que ser modificado ou ao menos verificado Pode ocorrer uma modificação no sistema que obrigue modificações conjuntas em A e B
Congeneridade Congeneridade de tipo Congeneridade de nome
Congeneridade Congeneridade de tipo Congeneridade de nome int i; i = 7; char i; i = 7; (tipo) int j; i = 7; (nome)
Congeneridade Congeneridade de convenção ex: num positivos = pessoas e num negativos = empresas if ordem.numerodaconta>0 (trata-se de uma pessoa)
Congeneridade Congeneridade de convenção http://www2.ic.uff.br/~anselmo/cursos/tpa/apresentacoes/poo.pdf
Congeneridade Congeneridade de posição Ex: linhas de código devem aparecer na sequencia correta
http://www2.ic.uff.br/~anselmo/cursos/tpa/apresentacoes/poo.pdf
http://www2.ic.uff.br/~anselmo/cursos/tpa/apresentacoes/poo.pdf
http://www2.ic.uff.br/~anselmo/cursos/tpa/apresentacoes/poo.pdf
Congeneridade x Encapsulamento O encapsulamento é um tipo de policiamento sobre a congeneridade. A orientação a objetos elimina (pelo menos minimiza) uma parte da congeneridade (diferentemente de sistemas com encapsulamento nível 1)
Congeneridade x Manutenção Minimizar a congeneridade total Alguns exemplos de coisas a evitar: Ex: cliente.setnome( João ); cliente.nome = João ; Herança em excesso e mal projetada
Domínios, grau de dependência e coesão
Domínios de uma classe Uma classe pode pertencer a um dos quatro domínios: base arquitetura negócio aplicação
Domínios de uma classe Domínio de base: usualmente fazem parte das bibliotecas da linguagem de programação utilizáveis em várias aplicações Fundamentais: incluídas como tipos de dados convencionais, integrantes e simples. Ex: int, boolean Estruturais: implementam estruturas de dados consagradas, como Pilha, Fila Semânticas: ex: data, hora
Domínios de uma classe Domínio de arquitetura: fornece abstrações para a arquitetura de hardware ou software utilizada Classes de comunicação implementam mecanismos que possibilitam a comunicação com outros sistemas, como porta e máquina remota (ex.: Sockets e RMI) Classes de manipulação de banco de dados criam abstrações para acesso aos SGBDs (ex.: pacotes JDBC e JDO) Classes de interface humana incluem janela e botão de comando. (ex.: pacotes swing e awt)
Domínios de uma classe Domínio de negócio: dizem respeito a uma empresa em particular (ex: saldo, cliente, paciente). Domínio de aplicação: dizem respeito a uma aplicação dessa empresa (ex: relaçãopacientecirurgia).
http://www2.ic.uff.br/~anselmo/cursos/tpa/apresentacoes/poo.pdf
Reflexões Quais desses domínios de classe podemos comprar? base arquitetura negócio aplicação
Reflexões Quais desses domínios de classe podemos comprar? base arquitetura negócio aplicação A competitividade de sua companhia talvez dependa do período para implementação de novos sistemas de software. O sucesso estratégico da sua empresa vai eventualmente depender do quão bem você construa sua biblioteca de classes do domínio de negócio.
Grau de dependência Grau de dependência direto indica quantas classes são referenciadas diretamente por uma determinada classe Grau de dependência indireto indica quantas classes são referenciadas diretamente ou indiretamente (recursivamente) por uma determinada classe
Grau de dependência http://www2.ic.uff.br/~anselmo/cursos/tpa/apresentacoes/poo.pdf
Grau de dependência Uma classe A referencia diretamente uma classe B se: A é subclasse direta de B A tem atributo do tipo B A tem parâmetro de método do tipo B A tem variáveis em métodos do tipo B A chama métodos que retornam valores do tipo B Assume-se que as classes do domínio de base tem grau de dependência igual a zero
Grau de dependência O grau de dependência serve para verificar projetos orientados a objeto Espera-se que: Classes de domínios mais altos (negócio e aplicação) tenham alto grau de dependência indireto Classes de domínios mais baixos (arquitetura e base) tenham baixo grau de dependência indireto
Coesão medida da inter-relação das características (atributos e operações) localizadas na interface externa de uma classe Classes fracamente coesas apresentam características dissociadas Classes fortemente coesas apresentam características relacionadas, que contribuem para a abstração implementada pela classe
Coesão A coesão pode ser classificada em: Coesão de instância mista Coesão de domínio misto Coesão de papel misto Coesão alternada Coesão múltipla Coesão funcional
Coesão A coesão de instância mista ocorre quando algumas características são indefinidas para alguns objetos da classe
Coesão A coesão de instância mista ocorre quando algumas características são indefinidas para alguns objetos da classe fred.lancarporcentagemdecomissao();
Coesão Vendedor VendedorComissionado VendedorNaoComissionado
Coesão A coesão de papel misto ocorre quando algumas características ou comportamentos criam dependência entre classes de contextos distintos em um mesmo domínio Ex: fred.numerodecachorros
Os perigos da herança e do polimorfismo
Herança e polimorfismo constituem uma ferramenta poderosa para a modelagem OO Entretanto, seu uso excessivo ou equivocado pode ser nocivo à qualidade do modelo produzido O uso excessivo da assertiva goto provocou a sua má fama no paradigma estruturado Para que o paradigma OO não sofra do mesmo problema, é necessário o uso correto dessas estruturas
Abusos da herança Conjuntos equivocados http://www2.ic.uff.br/~anselmo/cursos/tpa/apresentacoes/poo.pdf
Abusos da herança Conjuntos equivocados http://www2.ic.uff.br/~anselmo/cursos/tpa/apresentacoes/poo.pdf
Abusos da herança Conjuntos equivocados http://www2.ic.uff.br/~anselmo/cursos/tpa/apresentacoes/poo.pdf
Abusos da herança Hierarquia invertida
Abusos da herança Hierarquia invertida
Abusos da herança Confundir classe com instância
Abusos da herança Utilização inadequada de herança
Polimorfismo Permite que referências de tipos de classes mais abstratas representem o comportamento das classes concretas. Permite tratar vários tipos de maneira homogênea (através da interface do tipo mais abstrato).
Polimorfismo Promove concisão na POO Tanto operações como variáveis podem exibir polimorfismo Em um desenho imperfeito, o polimorfismo traz perigos O desenhista não tem ideia da classe que efetivamente será passada para runtime. Um objeto pode receber uma mensagem não compreendida e provocar erro de runtime.