Início » Análise de Sistemas » Conceitos de Programação Orientada a Objetos
Postado Em 24/09/2015 [data do post] por Fábio dos Reis [autor do post] em Análise de Sistemas [categoria do post]
Programação Orientada a Objetos – POO (Object-Oriented Programming – OOP) é um paradigma de programação que usa tipos de dados personalizados. Em vez de operar apenas com tipos de dados primitivos, podemos construir novos tipos de dados, conforme nossa necessidade.
Esses novos tipos de dados, que chamamos de classes, podem conter estruturas semelhantes a funções, denominadas métodos, e variáveis internas, chamadas de atributos. As classes dão origem a objetos, em um processo denominado instanciação.
Os objetos são os "blocos de construção" de software na OO.
Fornece uma estrutura modular para a construção de programas
Objetos podem ser reutilizados em aplicações diferentes
O software se torna mais fácil de manter
O desenvolvimento é mais rápido, devido ao reuso de código
Encapsulamento: não é necessário conhecer a implementação interna de um objeto para poder usá-lo
Trata-se de uma ocorrência específica de uma classe; é uma "instância de classe".
Os objetos são a base da OO (Orientação a Objetos).
Os objetos representam entidades do mundo real, como aviões, pessoas, contas correntes, etc., mas também podem representar outros conceitos, como gráficos (círculos, quadrados, cones, esferas, etc.)
Um objeto possui características próprias (atributos) e executa determinadas ações (métodos), sendo esses atributos e métodos provenientes da classe que origina o objeto.
Abstrair significa selecionar aspectos específicos de um problema a ser analisado, deixando de lado outros aspectos. É a representação de uma entidade do mundo real na forma de idéias.
As entidades abstraídas podem se comunicar entre si, por meio da troca de Mensagens.
De acordo com o autor Correia (2006):
"Pelo princípio da abstração, nós isolamos os objetos que queremos representar do ambiente complexo em que se situam, e nesses objetos representamos somente as características que são relevantes para o problema em questão".
Os objetos se comunicam a partir da troca de mensagens.
Uma mensagem é um sinal enviado de um objeto a outro, o qual requisita um serviço, usando uma operação programada no objeto chamado. Por exemplo, para que um objeto execute um método, é necessário enviar a este objeto uma mensagem solicitando a execução do método desejado.
As mensagens somente ocorrem entre objetos que possuem uma Associação.
As mensagens também são programadas. Quando uma mensagem é recebida, uma operação é invocada no objeto chamado.
Há vários formatos de mensagens: procedures (subs e functions), passagem de sinais entre threads, acionamento de eventos, etc.
Uma Classe é uma coleção de objetos que são descritos com os mesmos atributos e as mesmas operações. Uma classe representa uma ideia ou conceito e classifica objetos que tenham propriedades similares.
As classes são os blocos de construção mais importantes dos sistemas orientados a objetos, e devem possuir responsabilidades bem definidas dentro da aplicação.
Uma classe é um tipo personalizado de dados.
Desta forma, uma classe é um tipo abstrato de dados, um "molde" para a criação de objetos. Cada classe criada se torna um novo tipo disponível para declarar variáveis e criar objetos
Por convenção, começamos o nome de uma classe com letra maiúscula, e capitalizamos cada palavra subsequente que o compuser.
As classes representam os blocos de construção mais importantes dos sistemas orientados a objetos, e devem possuir responsabilidades bem definidas dentro da aplicação.
Uma classe é como se fosse um tipo abstrato de dados, um "molde" para a criação de objetos.
Um objeto é, portanto, um "Instância de uma Classe"
As classes possuem atributos e métodos. Atributos são características da classe, que são comuns a todos os objetos derivados, e que podem apresentar valores diversos. Já os Métodos são as operações possíveis em uma classe (nos objetos instanciados a partir dela).
Ou Propriedade: Característica particular de uma ocorrência de uma classe, como por exemplo o nome e a idade de uma pessoa.
Existem dois tipos principais de propriedades:
Estáticas: Mantém o mesmo valor durante toda a sua existência. Por exemplo, a data de nascimento de uma pessoa é uma propriedade estática, pois mantém o mesmo valor durante toda a existência do objeto instanciado.
Dinâmicas: Podem ter valores que variam com o passar do tempo. A idade de uma pessoa pode ser considerada um atributo dinâmico, pois pode variar ao longo do tempo.
É a lógica contida em uma classe para atribuir-lhe comportamentos. São as funções e procedimentos contidos na classe.
O ato de invocar um método é a passagem de mensagens para o objeto.
Toda classe possui um método especial chamado de método construtor, que inicializa o objeto instanciado.
As classes também usam métodos destruidores para finalizar os objetos após seu uso.
Um método é uma sequência de declarações (comandos) que possui um nome de identificação. É similar a uma função ou procedimento.
Um método possui um nome e um corpo onde ficam os comandos que serão executados quando o método for chamado, e também podem receber dados para processamento (parâmetros) e retornar informações.
Os métodos são a forma principal de passagem de mensagens entre objetos. Um método deve executar sempre uma operação única. Os métodos também precisam ter um tipo de retorno, que pode ser um tipo de valor, de referência ou ainda void (não retornam valor).
Classe – Notação UML para representação
A seguir temos a forma padrão para representação de uma classe usando um diagrama de classes UML:
Instância de Classe
É o objeto, uma ocorrência específica de uma classe.
As classes originam instâncias sob requisição, no processo denominado Instanciação. O projetista / analista cria a classe. A classe é então usada para criar objetos em tempo de execução.
Veja a seguir um exemplo de criação de classe na linguagem C#. É declarado um atributo da classe Caixa – lado – e um método – Volume():
return lado * lado * lado;
Herança, em orientação a objetos, é a capacidade de um novo objeto tomar atributos e operações de um objeto existente.
Assim, podemos criar classes mais complexas sem que precisemos repetir código.
Aqui, a palavra-chave é Reuso de código, e é uma das metas a se atingir ao desenvolver software. O reuso permite reduzir o esforço dispendido no desenvolvimento de software ao reaproveitarmos códigos de uma classe na criação de outras classes.
A Herança é, portanto, um conceito extremamente importante em Orientação a Objetos.
Usamos a herança, por exemplo, para evitar repetição ao definirmos classes com características em comum e que são relacionadas entre si.
A herança é um relacionamento entre classes, que permite que uma classe "adquira" os membros (atributos e métodos) de outra classe.
Um exemplo clássico de herança seria a classificação de mamíferos no reino animal.
Homens, Baleias e Gatos são mamíferos, que compartilham muitas características entre si, mas claramente possuem atributos que os diferem uns dos outros.
Como podemos modelar Baleias, Gatos e Humanos em um software?
Podemos criar classes distintas para cada animal, mas essas classes teriam muitos comportamentos ("métodos") em comum entre eles, como Respirar, Mamar e Reproduzir-se, o que ocasionaria repetição desnecessária de código.
Usamos então Herança para resolver esse problema. Podemos criar uma classe chamada Mamífero que possua as características comuns a todos os animais mamíferos, e então criar as classes Humano, Baleia e Gato herdando essas funcionalidades e também implementando as funcionalidades específicas de cada animal, como Falar, Nadar e Miar.
Encapsulamento é a combinação de atributos e operações dentro de uma classe, deixando visível apenas o que é necessário para a comunicação entre dois objetos, como por exemplo alguns detalhes da implementação ou ainda a lógica de um método.
O encapsulamento permite ocultar a complexidade do código. Não é necessário entender como a operação funciona para poder utilizá-la. Um exemplo clássico é o de um motorista conduzindo um veículo. O motorista não precisa saber exatamente como um motor funciona internamente para poder dirigir o automóvel – o detalhes da "implementação" do motor ficam ocultos do motorista.
O encapsulamento protege os dados, permitindo o acesso a eles apenas a partir de métodos específicos e autorizados.
Desta forma, os objetos encapsulados podem ser comparados uma caixa preta: conhecemos asua interface externa, porém não precisamos nos preocupar com o que acontece internamente na caixa.
Encapsulamento – Níveis de Acesso
Há três níveis principais de acesso dos objetos:
Vamos discutir em mais detalhes esses níveis de acesso em uma lição especial sobre o assunto.
Uma operação de um objeto qualquer pode assumir vários comportamentos dependendo da chamada recebida, tratando e devolvendo respostas ao chamador.
Poli = Muitos; Morphos = Formas. Portanto, Polimorfismo = "múltiplas formas".
Portanto, o polimorfismo ocorre quando um objeto tem um comportamento diferente para uma mesma ação. Por exemplo, usando nosso exemplo de classes de animais, nas classes Gato e Humano existe um comportamento (método) em comum: Andar. Porém, cada uma dessas classes implementa o método Andar de forma diferente – os gatos andam em quatro patas, enquanto os humanos andam em duas. Ambos podem percorrer a mesma distância andando, ou seja, executando o método andar, mas o farão de forma diferente entre si.
Então, dependendo de como um método é invocado, seu comportamento será diferente.
Neste artigo publicamos uma pequena introdução à Orientação a Objetos. Nos próximos artigos desta série vamos nos aprofundar nesses assuntos, e apresentar muitos outros conceitos relativos a esse tópico.