Paradigma Orientado a Objetos
O paradigma orientado a objetos (OO) tomou sua forma a partir do conceito inicial de uma nova abordagem de programação, enquanto o interesse em métodos de design e análise veio muito mais tarde. O paradigma de análise e design OO é o resultado lógico da ampla adoção de linguagens de programação OO.
A primeira linguagem orientada a objetos foi Simula (Simulação de sistemas reais) que foi desenvolvido em 1960 por pesquisadores do Norwegian Computing Center.
Em 1970, Alan Kay e seu grupo de pesquisa na Xerox PARC criou um computador pessoal chamado Dynabook e a primeira linguagem de programação orientada a objetos (OOPL) - Smalltalk, para programar o Dynabook.
Nos anos 1980, Grady Boochpublicou um artigo intitulado Object Oriented Design que apresentou principalmente um design para a linguagem de programação, Ada. Nas edições seguintes, ele estendeu suas idéias para um método completo de design orientado a objetos.
Na década de 1990, Coad incorporou idéias comportamentais aos métodos orientados a objetos.
As outras inovações significativas foram Object Modeling Techniques (OMT) por James Rum Baugh e Engenharia de Software Orientada a Objetos (OOSE) por Ivar Jacobson.
Introdução ao Paradigma OO
O paradigma OO é uma metodologia significativa para o desenvolvimento de qualquer software. A maioria dos estilos ou padrões de arquitetura, como tubo e filtro, repositório de dados e baseado em componente, podem ser implementados usando este paradigma.
Conceitos básicos e terminologias de sistemas orientados a objetos -
Objeto
Um objeto é um elemento do mundo real em um ambiente orientado a objetos que pode ter uma existência física ou conceitual. Cada objeto tem -
Identidade que o distingue de outros objetos no sistema.
Estado que determina as propriedades características de um objeto, bem como os valores das propriedades que o objeto contém.
Comportamento que representa atividades externamente visíveis realizadas por um objeto em termos de mudanças em seu estado.
Os objetos podem ser modelados de acordo com as necessidades da aplicação. Um objeto pode ter uma existência física, como um cliente, um carro, etc .; ou uma existência conceitual intangível, como um projeto, um processo, etc.
Classe
Uma classe representa uma coleção de objetos com as mesmas propriedades características que exibem um comportamento comum. Ele fornece o blueprint ou a descrição dos objetos que podem ser criados a partir dele. A criação de um objeto como membro de uma classe é chamada de instanciação. Assim, um objeto é uminstance de uma classe.
Os constituintes de uma classe são -
Um conjunto de atributos para os objetos que devem ser instanciados da classe. Geralmente, diferentes objetos de uma classe têm alguma diferença nos valores dos atributos. Os atributos são freqüentemente chamados de dados de classe.
Um conjunto de operações que retratam o comportamento dos objetos da classe. As operações também são chamadas de funções ou métodos.
Example
Vamos considerar uma classe simples, Circle, que representa o círculo da figura geométrica em um espaço bidimensional. Os atributos desta classe podem ser identificados da seguinte forma -
- x – coord, para denotar a coordenada x do centro
- coord y, para denotar coordenada y do centro
- a, para denotar o raio do círculo
Algumas de suas operações podem ser definidas da seguinte forma -
- findArea (), um método para calcular a área
- findCircumference (), um método para calcular a circunferência
- scale (), um método para aumentar ou diminuir o raio
Encapsulamento
Encapsulamento é o processo de vincular atributos e métodos dentro de uma classe. Por meio do encapsulamento, os detalhes internos de uma classe podem ser ocultados de fora. Ele permite que os elementos da classe sejam acessados de fora apenas por meio da interface fornecida pela classe.
Polimorfismo
Polimorfismo é originalmente uma palavra grega que significa a capacidade de assumir várias formas. No paradigma orientado a objetos, o polimorfismo implica o uso de operações de maneiras diferentes, dependendo das instâncias nas quais estão operando. O polimorfismo permite que objetos com diferentes estruturas internas tenham uma interface externa comum. O polimorfismo é particularmente eficaz ao implementar a herança.
Example
Vamos considerar duas classes, Circle e Square, cada uma com um método findArea (). Embora o nome e a finalidade dos métodos nas classes sejam os mesmos, a implementação interna, ou seja, o procedimento de cálculo de uma área é diferente para cada classe. Quando um objeto da classe Circle invoca seu método findArea (), a operação encontra a área do círculo sem nenhum conflito com o método findArea () da classe Square.
Relationships
Para descrever um sistema, tanto a especificação dinâmica (comportamental) quanto a estática (lógica) de um sistema devem ser fornecidas. A especificação dinâmica descreve os relacionamentos entre objetos, por exemplo, passagem de mensagens. E a especificação estática descreve os relacionamentos entre as classes, por exemplo, agregação, associação e herança.
Passagem de mensagens
Qualquer aplicação requer uma série de objetos interagindo de maneira harmoniosa. Os objetos em um sistema podem se comunicar uns com os outros usando a passagem de mensagens. Suponha que um sistema tenha dois objetos - obj1 e obj2. O objeto obj1 envia uma mensagem ao objeto obj2, se obj1 deseja que obj2 execute um de seus métodos.
Composição ou Agregação
Agregação ou composição é um relacionamento entre classes pelo qual uma classe pode ser composta de qualquer combinação de objetos de outras classes. Ele permite que os objetos sejam colocados diretamente no corpo de outras classes. A agregação é referida como um relacionamento “parte de” ou “tem um”, com a capacidade de navegar do todo para suas partes. Um objeto agregado é um objeto composto por um ou mais outros objetos.
Associação
Associação é um grupo de links com estrutura e comportamento comuns. A associação representa o relacionamento entre objetos de uma ou mais classes. Um link pode ser definido como uma instância de uma associação. O grau de uma associação denota o número de classes envolvidas em uma conexão. O grau pode ser unário, binário ou ternário.
- Uma relação unária conecta objetos da mesma classe.
- Um relacionamento binário conecta objetos de duas classes.
- Um relacionamento ternário conecta objetos de três ou mais classes.
Herança
É um mecanismo que permite que novas classes sejam criadas a partir de classes existentes, estendendo e refinando seus recursos. As classes existentes são chamadas de classes básicas / classes pai / superclasses, e as novas classes são chamadas de classes derivadas / classes filhos / subclasses.
A subclasse pode herdar ou derivar os atributos e métodos da (s) superclasse (s), desde que a superclasse assim o permita. Além disso, a subclasse pode adicionar seus próprios atributos e métodos e pode modificar qualquer um dos métodos da superclasse. Herança define um relacionamento “é um”.
Example
De uma classe Mamífero, várias classes podem ser derivadas, como Humano, Gato, Cão, Vaca, etc. Humanos, gatos, cães e vacas têm características distintas de mamíferos. Além disso, cada um tem suas características particulares. Pode-se dizer que uma vaca “é - um” mamífero.
Análise OO
Na fase de análise orientada a objetos do desenvolvimento de software, os requisitos do sistema são determinados, as classes são identificadas e os relacionamentos entre as classes são reconhecidos. O objetivo da análise OO é entender o domínio da aplicação e os requisitos específicos do sistema. O resultado dessa fase é a especificação de requisitos e análise inicial da estrutura lógica e viabilidade de um sistema.
As três técnicas de análise usadas em conjunto para análise orientada a objetos são modelagem de objetos, modelagem dinâmica e modelagem funcional.
Modelagem de Objetos
A modelagem de objetos desenvolve a estrutura estática do sistema de software em termos de objetos. Ele identifica os objetos, as classes nas quais os objetos podem ser agrupados e os relacionamentos entre os objetos. Também identifica os principais atributos e operações que caracterizam cada classe.
O processo de modelagem de objetos pode ser visualizado nas seguintes etapas -
- Identificar objetos e agrupar em classes
- Identifique as relações entre as classes
- Crie um diagrama de modelo de objeto de usuário
- Definir atributos de objeto de usuário
- Defina as operações que devem ser realizadas nas aulas
Modelagem Dinâmica
Depois que o comportamento estático do sistema é analisado, seu comportamento em relação ao tempo e às mudanças externas precisa ser examinado. Este é o propósito da modelagem dinâmica.
A Modelagem Dinâmica pode ser definida como "uma maneira de descrever como um objeto individual responde a eventos, sejam eventos internos acionados por outros objetos, ou eventos externos acionados pelo mundo exterior."
O processo de modelagem dinâmica pode ser visualizado nas seguintes etapas -
- Identifique os estados de cada objeto
- Identificar eventos e analisar a aplicabilidade das ações
- Construir um diagrama de modelo dinâmico, composto por diagramas de transição de estado
- Expresse cada estado em termos de atributos de objeto
- Valide os diagramas de transição de estado desenhados
Modelagem Funcional
A modelagem funcional é o componente final da análise orientada a objetos. O modelo funcional mostra os processos que são executados dentro de um objeto e como os dados mudam à medida que se movem entre os métodos. Ele especifica o significado das operações de uma modelagem de objeto e as ações de uma modelagem dinâmica. O modelo funcional corresponde ao diagrama de fluxo de dados da análise estruturada tradicional.
O processo de modelagem funcional pode ser visualizado nas seguintes etapas -
- Identifique todas as entradas e saídas
- Construir diagramas de fluxo de dados mostrando dependências funcionais
- Indique o propósito de cada função
- Identifique as restrições
- Especifique os critérios de otimização
Design Orientado a Objetos
Após a fase de análise, o modelo conceitual é desenvolvido em um modelo orientado a objetos usando design orientado a objetos (OOD). No OOD, os conceitos independentes de tecnologia no modelo de análise são mapeados em classes de implementação, as restrições são identificadas e as interfaces são projetadas, resultando em um modelo para o domínio da solução. O principal objetivo do projeto OO é desenvolver a arquitetura estrutural de um sistema.
Os estágios do design orientado a objetos podem ser identificados como -
- Definindo o contexto do sistema
- Projetando a arquitetura do sistema
- Identificação dos objetos no sistema
- Construção de modelos de design
- Especificação de interfaces de objetos
O projeto OO pode ser dividido em duas fases - projeto conceitual e projeto detalhado.
Conceptual design
Nesta etapa, são identificadas todas as classes necessárias para a construção do sistema. Além disso, responsabilidades específicas são atribuídas a cada classe. O diagrama de classes é usado para esclarecer os relacionamentos entre as classes e o diagrama de interação é usado para mostrar o fluxo de eventos. Também é conhecido comohigh-level design.
Detailed design
Neste estágio, atributos e operações são atribuídos a cada classe com base em seu diagrama de interação. O diagrama da máquina de estado é desenvolvido para descrever os detalhes adicionais do projeto. Também é conhecido comolow-level design.
Princípios de design
A seguir estão os principais princípios de design -
Principle of Decoupling
É difícil manter um sistema com um conjunto de classes altamente interdependentes, pois a modificação em uma classe pode resultar em atualizações em cascata de outras classes. Em um projeto OO, o acoplamento estreito pode ser eliminado pela introdução de novas classes ou herança.
Ensuring Cohesion
Uma classe coesa executa um conjunto de funções intimamente relacionadas. A falta de coesão significa - uma classe executa funções não relacionadas, embora não afete a operação de todo o sistema. Isso torna toda a estrutura do software difícil de gerenciar, expandir, manter e alterar.
Open-closed Principle
De acordo com este princípio, um sistema deve ser capaz de se estender para atender aos novos requisitos. A implementação existente e o código do sistema não devem ser modificados como resultado de uma expansão do sistema. Além disso, as seguintes diretrizes devem ser seguidas no princípio aberto-fechado -
Para cada classe concreta, interfaces e implementações separadas devem ser mantidas.
Em um ambiente multithread, mantenha os atributos privados.
Minimize o uso de variáveis globais e variáveis de classe.