quinta-feira, 12 de setembro de 2013

Diagrama de Classe



Análise Orientada ao Objeto


Na análise estruturada se faz a decomposição funcional do sistema proposto. Ou seja, visualiza-se um sistema como um conjunto de áreas funcionais que pode ser dividido em processos.
A técnica de projeto estrutural é direta, mas força os programadores a se concentrarem nas operações, com pouca atenção à estrutura dos dados.
Na análise orientada ao objeto, os ciclos de vida dos objetos são definidos em modelos para capturar os eventos agindo nos objetos. O último passo é a definição de processo, baseada nos objetos e nos seus ciclos de vida.
O desenvolvimento do projeto baseado em objetos é um processo conceitual independente de uma linguagem de programação até as etapas finais. É similar às técnicas de modelagem de informações utilizadas no projeto de banco de dados, embora acrescente o conceito de comportamento dependente da classe.


O resultado de um projeto orientado ao objeto é uma hierarquia de classes. Cada classe é um módulo independente, com estruturas de dados e controle. O domínio do problema pode ser visualizado mais natural e realisticamente como uma coleção de objetos e métodos associados.
Esse modelo contém objetos encontrados no domínio da aplicação, incluindo uma descrição das propriedades dos objetos e de seu comportamento.
São criados modelos, aplicáveis a todas as etapas do desenvolvimento.  Um sistema de extrema complexidade exige os três modelos a seguir:
  • Modelo de objetos – descreve a estrutura estática dos objetos de um sistema e seus relacionamentos, contendo, ainda, diagrama de objetos.
  • Modelo dinâmico – descreve os aspectos de um sistema que se modificam com o tempo e é usado para especificar e implementar os aspectos de controle do sistema. Ex.: Diagrama de Estado
  • Modelo Funcional – descreve as transformações dos valores dos dados de um sistema. DFD.


Os objetos podem ser concretos, como um arquivo em um sistema de arquivos, ou conceituais, como uma norma de escalonamento em um sistema operacional de multiprocessamento. Cada objeto tem a sua própria identidade, que lhe é inerente.

Essencialmente, um projeto orientado ao objeto consiste em quatro passos fundamentais:
  1. identificação e definição de objetos e classes;
  2. organização do relacionamento entre as classes;
  3. desenvolvimento em uma hierarquia de classes;
  4. elaboração de bibliotecas de classes e frames de aplicação reutilizáveis.

Os programadores começam com um conjunto de classes, expandindo-as, modificando-as e montando-as como um protótipo de uma aplicação.
Descobrir estes objetos é um grande desafio. Uma das técnicas utilizadas é a gramatical onde em uma descrição formal do sistema desejado e observam-se os substantivos  como identificadores em potencial das classes dos objetos. Os verbos, por outro lado, identificariam métodos.

Características da  Orientação ao Objeto

 

Objeto é a representação de elementos do mundo real, sob o ponto de vista do problema. Todo objeto é identificável. As coisas do mundo real são denominadas objetos. Exemplos.: um cliente, uma loja, um pedido de compra, etc.

Atributos representam as características do objeto.


Métodos são as operações ou funções oferecidas pelo objeto.


Estado diz respeito à situação em que pode estar determinado objeto. Depende da natureza do objeto.

Comportamento é o meio pelo qual o objeto passa de um estado para o outro. Normalmente, isso se dá mediante uma ação/condição.

Classe  representa um conjunto de objetos com as mesmas características. Todos os objetos da classe são identificáveis e  distinguíveis. Cada um deles é uma instância de classe. Uma classe é uma descrição dos atributos e serviços comuns a um grupo de objetos. Classe é uma abstração das características de um grupo de coisas do mundo real.
Obs.: Objetos de um classe interagem através do envio de mensagens.

Abstração consiste na concentração nos aspectos essenciais, próprios de uma entidade e em ignorar suas propriedades acidentais. Foco em aspectos relevantes para um determinado propósito.

Encapsulamento consiste na separação dos aspectos externos de um objeto, acessíveis por outros objetos, dos detalhes internos da implementação daquele objeto, que ficam ocultos dos demais objetos. Não há dados ou procedimentos fora de um objeto. O acesso a um dado só é permitido ao objeto que contém tal dado, através de métodos que possui. Quando um objeto A quer acessar um dado do objeto B, ele o fará através do acionamento de mensagens. O mecanismo de encapsulamento é uma forma de restringir o acesso ao comportamento interno de um objeto. Cada objeto possui uma interface que é o que ele conhece e o que ele sabe fazer, sem descreve como o objeto faz.

Herança é o compartilhamento de atributos e operações entre classes com base em um relacionamento hierárquico. Permite que a estrutura comum seja compartilhada por diversas subclasses semelhantes sem redundâncias. Cada classe em um nível de hierarquia herda as características das classes nos níveis acima.

Acoplamento Dinâmico Caso o objeto não encontre um método dentro de seu encapsulamento, verificará em seus ramos de herança aquelas superclasses que tenham o método invocado.

Polimorfismo significa que a mesma operação pode atuar de modos diversos em classes diferentes. A operação MOVER, por exemplo, pode atuar de forma diferente nas classes Janela e PeçadeXadrez.
Uma linguagem de programação baseada em objetos seleciona automaticamente o método correto para implementar uma operação com base no nome da operação e na classe do objeto que esteja sendo operado. Quem chama uma operação não precisa considerar quantas implementações de uma determinada operação existem.
Um objeto pode enviar a mesma mensagem para objetos semelhantes, mas que implementam a sua interface de formas diferentes.

Benefícios do Paradigma da Orientação a Objetos


  • Modelagem mais natural
  • Reutilização – Várias classes projetadas constituirão bibliotecas, que poderão ser acionadas por projetos diferentes dos originais.
  • Projetos mais rápidos com qualidade
  • Codificação simplificada.

UML – Unified  Modeling Language

É uma linguagem unificadora de notações, diagramas e formas de representação.

A UML pode ser utilizada para vários objetivos como:
  • Padronizar a diagramação de modelos  graças às regras e ao vocábulo que ela especifica;
  • Facilitar a visualização de modelos;
  • Expressar sem ambigüidades o conteúdo de um modelo;
  • Construir blocos de código com o auxílio de ferramentas;
  • Apresentar uma modelagem com o nível de abstração e detalhamento desejado.

A UML é formada por:
  • Itens;
  • Relacionamentos;
  • Diagramas

Itens

  • Itens Estruturais – Componentes estáticos de um modelo.
    • Classe - conjuntos de objetos que compartilham atributos, operações, semântica e relacionamentos.
    • Interface – Portas de comunicação de um componente ou classe com o mundo exterior. Listam os serviços disponibilizados por um componente ou classe.
    • Colaborações – São entidades que servem para agrupar várias classes, interfaces e outros elementos que juntos proporcionam um comportamento diferente daquele gerado por apenas cada um dos participantes. Pode representar também um conjunto de operações formado por várias classes.
    • Caso de Uso – Descrição de um conjunto de seqüências de ações, que um sistema executa para produzir um resultado de valor observável por um ator.
    • Componentes – São elementos de software, por exemplo, bibliotecas, executáveis e fragmentos de código fonte que possuem uma interface bem definida.
    • Nós – Elementos físicos existentes em tempo de execução que representam um recurso computacional. Ex.: servidor de aplicações.

  • Itens Comportamentais – Partes dinâmicas dos diagramas.
    • Interações
    • Estados

  • Itens de Agrupamento – Pode agrupar vários casos de uso correlatos ou vários atores de um modelo.

  • Itens Anotacionais – Observações textuais colocadas nos diagramas.

Relacionamentos

  • Dependência – um elemento utiliza-se de serviços de outro elemento.
  • Associação – Representam relacionamentos entre classes, atores e casos de uso.
  • Generalização – Usado para descrever uma variação emum comportamento padrão encontrado em dois ou mais elementos.
  • Realização – Especificam os serviços que classes ou componentes fornecem às interfaces.


Diagrama de Classes

Identificação de Classes
As classes são a estrutura de dados que darão ao programador a noção do domínio do problema.
O modelo de classes tem os dados e o comportamento destes.
Uma classe é uma abstração de um conjunto de coisas que possuem características e operações em comum. Ela surge da união de vários objetos que possuem coisas em comum.
Os atributos de uma classe correspondem à descrição dos dados armazenados pelos objetos. A cada atributo de uma classe está associado um conjunto de valores que esse atributo pode assumir. Cada instância de classe assume valores diferentes para cada atributo.
As operações correspondem à descrição das ações que os objetos de uma classe sabem realizar. Objetos de uma classe compartilham as mesmas operações.

Conceitos que ajudam na identificação e definição de classes e métodos:
  • Modelar como classes as entidades que ocorrem naturalmente no domínio do problema;
  • Projetar métodos com um único objetivo;
  • Projetar um novo método quando se defrontar com a alternativa de ampliar um já existente;
  • Evitar métodos extensos;
  • Armazenar como variáveis de instância os dados que são necessários a mais de um método ou a uma subclasse;
  • Projetar para uma biblioteca de classe, não para si próprio ou para sua aplicação.

Uma nova classe deve ser criada quando:
  • A nova classe representar uma abstração significativa para o domínio do problema;
  • Os serviços que ela proporcionar forem provavelmente usados por várias outras classes;
  • O seu comportamento for inerentemente complexo;
  • A classe ou método fizer pouco uso das representações dos seus operandos;
  • Se representada como um método de uma outra classe, poucos usuários desta classe a solicitariam.

Regras para elaborar classes abstratas:
  • Identificar mensagens e métodos comuns e migrá-los para uma super classe. Isto pode criar a necessidade de quebrar métodos e dividi-los entre superclasses e subclasses;
  • Eliminar os métodos de uma superclasse que são freqüentemente sobrescritos em vez de herdados por suas subclasses. Isto tornará a superclasse mais abstrata e conseqüentemente mais útil;
  • Acessar todas as variáveis somente pelo envio de mensagens. As classes ficarão mais abstratas quando dependerem menos das suas representações de dados;
  • Trabalhar subclasses para serem especializadas. Uma subclasse será especializada se herdar todos os métodos da superclasse e acrescentar novos a si própria. Uma subclasse deveria sempre representar um superconjunto do comportamento de seus pais.

Classes Iniciais

A identificação das classes tem como objetivo saber quais objetos irão compor o sistema.
O modelador analisa cada Use Case para identificar as classes candidatas a desempenhar responsabilidades.
O nome do ator deve ser removido da lista de classes candidatas se não for necessário que o sistema mantenha informações sobre o mesmo.
Uma única classe não deve ser sobrecarregada com responsabilidades demais. Não se deve concentrar a inteligência do sistema em uma única classe.
Responsabilidades conceitualmente relacionadas devem ser mantidas em uma única classe. Ex.: Cliente
Deve-se evitar redundância de responsabilidades.
Após construir o modelo de Use Case e o de classes, verificar a consistência entre os dois modelos.
Os modelos de Use Case e de Classe são estáticos, o aspecto dinâmico do sistema é representado pelo modelo de interações e pelo modelo de estados.

Há dois métodos principais para identificar classes: dirigido a dados e dirigido a responsabilidades.
No método dirigido a dados, a ênfase está na identificação da estrutura dos conceitos relevantes para um domínio de negócio. Resulta em um modelo conceitual do sistema.
No método dirigido a responsabilidades, a ênfase está na identificação de classes a partir de seus comportamentos relevantes para o sistema. Enfatiza o encapsulamento da estrutura e do comportamento dos objetos.

No diagrama de classes, define-se três recursos de notação: nome da associação, direção de leitura e papel.  Devem ser usados quando o significado de uma associação não for muito óbvio.







Atributos
Um atributo é um valor de dado guardado pelos objetos de uma classe. Cada atributo possui um valor para cada instância de objeto. Diferentes instâncias de objetos podem ter valores iguais ou diferentes para um dado atributo.
Com relação aos atributos a sintaxe proposta é:

Visibilidade NomeAtributo:TipoDoAtributo = ValorDefault {propriedade}
·        Visibilidade
Trata-se de uma marcação que pode ser realizada pelos símbolos (+, #, -).
(+) Visibilidade pública – é acessível por todas as classes (valor default)
(#) Visibilidade protegida – pode ser vista pela classe e pelo pacote no qual a classe é definida
(-) Visibilidade privada – somente acessível pela própria classe.
·        NomeAtributo
Seqüência de caracteres que devem formar um nome auto-explicativo.

·        TipoDoAtributo
Expressa o tipo do conteúdo que se pretende armazenar para o atributo. Ligada à linguagem de programação.
·        ValorDefault
Refere-se ao conteúdo inicial do atributo, de acordo com seu tipo.
·        {propriedade}
Elemento opcional, que complementa informações a respeito do atributo.

Atributo Derivado
Quando o valor do atributo pode ser obtido a partir do valor de outro(s) atributo(s). É representado com uma barra inclinada à esquerda.

Atributo Estático
Pode haver atributos que tenham escopo de classe, ou seja, que armazenam valor comum a todos os objetos da classe. Sintaxe  na UML: sublinhado. Usado na implementação de regras de negócio. Ex.: QuantidadeMaximaAlunos em uma classe CURSO.

Com relação aos métodos, a sintaxe geral sugerida é:


Visibilidade NomeDoMétodo (Parâmetro) : TipoDeRetorno {propriedade}
·        Visibilidade
Trata-se de uma marcação que pode ser realizada pelos símbolos (+, #, -).
(+) Visibilidade pública – é acessível por todas as classes
(#) Visibilidade protegida – pode ser vista pela classe e pelo pacote no qual a classe é definida
(-) Visibilidade privada – somente acessível pela própria classe.
·        NomeDoAtributo
Representa a operação que será processada.
·        Parâmetro
Trata-se de uma lista de valores devidamente separados por vírgula.
O elemento direção serve para definir se o parâmetro pode ou não ser modificado pela operação. Através desse elemento, o modelador pode definir se o parâmetro é de entrada, saída ou ambos.

Direção
Significado
in
Parâmetro de entrada: não pode ser modificado pela operação. Serve somente como informação para o objeto receptor.
out
Parâmetro de saída: pode ser modificado pela operação para fornecer alguma informação ao objeto remetente.
inout
Parâmetro de entrada que pode ser modificado.


·        TipoDeRetorno
Expressa o tipo do conteúdo que se pretende obter de retorno do método. Ligada à linguagem de programação.
·        {propriedade}
Elemento opcional, que complementa informações a respeito do método. Podem ser uma ou mais das seguintes: isQuery, sequential, guarded, concurrent.
IsQuery indica que a execução de tal operação não modificará o estado do objeto. Não modifica atributos nem associações do objeto.
As demais propriedades são utilizadas em sistemas multi threaded.

Todas as operações que são declaradas nas mensagens de um objeto a outro em um diagrama de interação devem ter visibilidade pública.
As operações possuem um escopo. Uma operação que tem escopo de classe processa atributos estáticos.

Classe Virtual – Interface
Há um tipo especial de classe a qual não pode ser instanciada, ou seja, não se conseguirá gerar objetos diretamente dela, o que a torna uma classe virtual/abstrata, servindo apenas para especificar as operações externamente visíveis para uma classe. Uma interface descreve padrões legais de interação entre dois objetos. A interface funciona como uma classe modelo, que outras classes poderão fazer uso, implementando as funcionalidades descritas. Estereótipo <<type>>. Define uma classe virtual, que não possui atributos e cujos métodos serão implementados em outras instâncias.


  

Relações entre classes
Para que classes executem suas tarefas é necessária a interação entre elas.  As classes podem apresentar alguns tipos de relações: herança, dependência, associação, agregação/composição e classe associativa


Ligações e Associações
Uma ligação é uma conexão física ou conceitual entre instâncias de objetos.
Uma associação descreve um grupo de ligações com estrutura e semântica comuns. Todas as ligações de uma associação interligam objetos da mesma classe. Ex.: Pessoa Trabalha-para Empresa.
Ex. :     Diagrama de classes:              País                 Tem_capital     Cidade
            Diagrama de instâncias:           Canadá             Tem_capital     Ottawa

As associações podem ser unárias, binárias, ternárias ou de ordem mais elevada. Não é aconselhável utilizar associações de ordem elevada.
O mais usual é a associação binária que é representado por uma linha ligando as classes.
Uma associação ternária é uma unidade atômica e não pode ser subdividida em associações binárias sem perder informações. Ex.: Pessoas que são programadoras usam linguagens de programação  em projetos.
Uma associação unária é também conhecida como associação recursiva, pelo fato de ser um relacionamento entre objetos da mesma classe.





Navegabilidade de Associações
Devem ser definidas para todas as associações. Na maioria das vezes ela é bidimensional. Caso não haja a necessidade, recomenda-se transforma-la em unidirecional, para facilitar a implementação.
Pode-se usar o diagrama de interações para definir o sentido da navegabilidade. Dados dois objetos associados, A e B, se há pelo menos uma mensagem de A para B em algum diagrama de interação, então a associação deve ser navegável de A para B, e vice-versa.

 Agregação
É a relação “parte-todo” ou “parte-de-um” no qual os objetos que representam os componentes de alguma coisa são associados a um objeto que representa a estrutura inteira. Usado para mostrar que um tipo de objeto é composto de outro objeto.




A agregação por valor, ou composição, (losango cheio) indica que o tempo de vida das partes são dependentes do tempo de vida do todo. Ex.: Pedido e Itens Pedido A agregação por referência  (losango sem preenchimento), o tempo de vida das partes não são mutuamente dependentes do tempo de vida do todo. Ex.: Curso, disciplinas e salas.

Na agregação, os objetos que fazem parte do todo são criados e destruídos independentemente deste último. Além disso, um objeto-parte pode ser utilizado para compor diversos objetos-todo. A destruição de um desses objetos-todo não implica na destruição do objeto-parte.

Na composição, os objetos parte pertencem a um único todo.  Além disso, objetos-parte são sempre criados e destruídos pelo objeto-todo. Se o todo deixa de existir, o mesmo acontece com suas partes.

Tanto na agregação quanto na composição, o todo tem prioridade para criar suas partes. Portanto, é mais adequado que o objeto todo crie suas partes quando requisitado por outros objetos.

Classes Associativas
Este tipo de classe normalmente aparece quando duas ou mais classes estão associadas, e é necessário manter informações sobre a associação. Ligadas a associações de multiplicidade muitos para muitos.
Diferenciam-se de associações ternárias pois estas são utilizadas quando é preciso associar objetos de três classes distintas.

Dependência
Um relacionamento de dependência entre duas classes mostra que uma instância de uma classe depende da instância de outra classe. Relacionamentos no qual a modificação de um item superior ocasiona modificações em itens inferiores.

 


Generalização
Generalização é o relacionamento entre uma classe e uma ou mais versões refinadas dela. Facilita a modelagem pela estruturação de classes e incorpora resumidamente o que é semelhante e o que é diferente em relação a elas. A herança de operações é uma boa ajuda durante a implementação como veículo para reutilização de código.
Generalização é utilizada para referir-se ao relacionamento entre classes, enquanto herança refere-se ao mecanismo de compartilhamento de atributos e operações utilizando o relacionamento de generalização.

Multiplicidade
Especifica quantas instâncias de uma classe relacionam-se a uma única instância de uma classe associada, por meio do número máximo e mínimo. Depende de pressupostos e de como são definidas as fronteiras de um problema. Pode ser acrescentada aos relacionamentos de associação e agregação.

Notação
Significado
0..1
Zero ou uma instância
1
Somente uma instância
0..*
Zero ou mais instâncias
*
Default, número mínimo e máximo de instâncias são ilimitados
1..*
Um ou mais instâncias
<literal>..*
Número exato ou mais de instâncias


Cancelamento de Características
Uma subclasse pode cancelar uma característica de uma superclasse pela definição de uma característica com o mesmo nome. A característica da subclasse refina e se sobrepõe à característica da superclasse.
Para métodos, é importante lembrar que não se deve nunca cancelar a assinatura do mesmo. Um cancelamento deve preservar o tipo e o número de atributos e o tipo de argumentos de uma operação (método) e o tipo retornado de uma operação (método).







.

1 comentários: