Introdução
Saudações companheiros do mundo da tecnologia. Como comentado no
post anterior, irei falar hoje um pouco sobre lógica orientada a objetos. O tema refere-se à técnica de programação mais difundida atualmente nos
modernos processos de desenvolvimento de software pois oferece inúmeras
vantagens nos quesitos tempo e reutilização de código ao passo que possibilita
aos desenvolvedores construir seus módulos de aplicação de uma forma genérica
para reutilização em tantos projetos quanto possíveis. As principais vantagens de aplicar orientação a objetos são:
- Reaproveitamento de código: Classes criadas para uma aplicação podem ser reaproveitadas.
- Escalabilidade dos Sistemas: Devido os objetos possuírem certa independência é possível aplicar melhorias e novas funcionalidades no sistema sem impactar a aplicação na sua totalidade.
- Mantenabilidade: A manutenção também fica mais eficiente uma vez que quaisquer mudanças são efetuadas em qualquer módulo do sistema mas de forma isolada evitando assim alterações indevidas em outros módulos.
Classes de Objetos
Em OO (Orientação a Objetos) tudo no universo do sistema é objeto e como
tal possui suas características particulares. A forma de fazer distinção entre
objetos para alcançar funcionalidades diferentes, de acordo com a
especificidade de cada qual, é através das “Classes”. Com elas
criamos objetos novos, pois todas as classes são definições de objetos com
diferentes características. A estas características particulares, que tornam os
objetos distintos entre si, chamamos de “atributos e métodos” da
classe.
Por tanto podemos explicar uma Classe como: “Uma definição conceitual de um objeto do mundo real cujo estado e particularidades do objeto são representados por seus atributos e métodos.”
Atributos e Métodos
Os atributos de uma classe são as características que lhes confere
especificidade diante do contexto da aplicação. Como por exemplo as
características de um animal tais como: quantidade de patas, tipo de
movimentação (bípede ou quadrúpede), gênero, tipo de habitat e etc.
Métodos são todas as ações que um objeto pode realizar. A única forma de solicitar uma ação de um objeto é através de chamadas aos métodos desse objeto. É através dessas chamadas que os objetos “conversam” e trocam mensagens entre si dentro da aplicação. A título de exemplo imagine um objeto da classe Cachorro, exemplos de métodos seriam “Latir”, “Correr”, “Morder”, “Pular”. Da mesma forma podemos imaginar métodos para uma classe do tipo Conta Corrente que teria ações como “Depositar”,”Sacar” e “Transferir”.
Veja abaixo a representação do que seria uma classe do tipo ContaCorrente no padrão UML:
Prometo futuramente escrever um post sobre UML, clique aqui para
acessar a definição para o tema na Wikipédia.
Composição e Agregação
Existem tipos de relações que podem ser estabelecidas entre classes de objetos de forma que estas mesmas cooperem e trabalhem juntas para que representem corretamente aquilo que se propõe. Estes relacionamentos são basicamente de dois tipos: Agregação e Composição.
No relacionamento do tipo agregação as duas classes envolvidas, apesar de estabelecerem uma relação, ambas podem existir independentemente do relacionamento uma vez que não foram criadas em função disto, como por exemplo, imagine uma classe “Pessoa” e uma classe “Endereço”, existe uma relação de agregação pois a classe Pessoa com certeza agrega um objeto da classe Endereço, tal qual a realidade onde toda pessoa possui um endereço residencial. Assim a classe Endereço não deixará de existir se a classe Pessoa deixar de existir e vice versa, pois endereço também diz respeito a classes do tipo “PessoaJuridica” e assim também a toda classe que necessite da representação de uma localidade.
Para demonstrar a relação do tipo composição podemos utilizar o exemplo citado acima criando uma classe do tipo “Rua” e esta mesma possui os atributos nome, bairro, e cidade. Neste exemplo podemos perceber que a classe Rua foi criada em função da classe Endereço e que a mesma ajuda a compor uma localidade juntamente com os atributos de numero e estado. A este tipo de relacionamento onde uma classe existe em função da outra chamamos de Composição.
Subclasses e Superclasses
Uma das características mais interessantes do paradigma da orientação a
objetos é trabalhar com herança de objetos. Mas o que exatamente seria herança
de objetos, e o que tem a ver com subclasses e superclasses? Calma, eu
explico... Já mencionamos anteriormente que em OO tudo é objeto, pois bem,
uma das formas que os objetos se relacionam é através de herança. Neste
tipo de relacionamento temos uma classe de objeto genérica que incorpora todas
as característica de um grupo mais amplo onde cada um estende as características
da classe genérica. Estes objetos são subclasses e a classe mais genérica é a
superclasse em uma relação de pai e filho. Cada subclasse pode se especializar
e oferecer, além dos recursos disponíveis pela superclasse, também métodos e
atributos exclusivos. A principal vantagem de se trabalhar dessa forma é a
manutenção do código da aplicação pois se eventualmente precisarmos implementar
uma nova funcionalidade para determinado grupo de classes, o mesmo pode ser
feito na classe mais genérica e através da herança a nova função é estendida
para todas a subclasses. Abaixo um diagrama para ilustrar melhor o
que seria a relação de herança através de um exemplo simples:
No exemplo acima podemos observar a classe mais genérica “Animal”, ela é
a superclasse, todas as classes estendem a classe animal porque de fato todo
mamífero ou réptil é um animal, e como tal, possuem os métodos Comer() e
Domir(). Na mesma linha de raciocínio, tanto o gato como o cão é um mamífero,
no entanto são classes especialistas onde o gato possui o método exclusivo
Miar() e o cão possui o método exclusivo Latir() e mesmo assim ambos possuem o
método amamentar pois herdam da classe Mamífero.
Encapsulamento
Trata-se da característica das classes de proteger seus atributos e
métodos de alterações indevidas, o método de encapsular diz respeito a tornar
alguns atributos e métodos acessíveis apenas à própria classe ocultando da
aplicação geral os detalhes da implementação de alguns métodos. Nesse contexto
encontramos o conceito de interface do objeto, que é exatamente os atributos e
métodos visíveis externamente e que oferecem suas funcionalidades de forma
transparente, ou seja, sem demonstrar como é feito cada ação mas tão somente
entregando o método que realiza a ação.
Polimorfismo
É a característica que atribuímos a alguns métodos para que possam se
comportar de acordo com a chamada realizada. O próprio nome traduzido ao pé da
letra significa “várias formas”. E é isso o que implementamos ao aplicar
polimorfismo. Todas as classes podem possuir métodos de nomes iguais mas com
parâmetros diferentes. E o que irá definir qual método será executa no momento
da chamada? Será executado o método que recebe os parâmetros fornecidos. A
título de exemplo podemos criar uma classe de nome “Produto” que possui dois
métodos descritos da seguinte forma: aplicarDesconto() e aplicarDesconto(float
valor). O primeiro método aplica o desconto com um valor padrão que digamos que
seja de 10%, já o segundo método aplica o desconto que é fornecido nos parâmetros
da chamada ao método. Assim se quisermos aplicar o desconto padrão basta chamar
o método sem passar nenhum parâmetro, da mesma forma para específica um valor
para o desconto, o mesmo deve ser passado no parâmetro no formato:
aplicarDesconto(13).
Outro exemplo de polimorfismo está ligado à herança pois é possível
implementar uma lógica diferente para métodos herdados, realizando assim o que
chamamos de sobrescrita de método. Para exemplificar podemos continuar a partir
do ultimo exemplo da classe Produto, podemos criar uma classe que estende a
classe Produto e que possui uma implementação diferente para o método
aplicarDesconto(), na linguagem de programação Java para sobrescrever um método
é necessário que o método que sobrescreve possua exatamente a mesma assinatura
do método que está sendo sobreescrito, ou seja, mesmos parâmetros,mesmo
retorno, lógica diferente. Caso os parâmetros do método sejam alterados teremos
a sobre carga do método, o próprio ato de criar dois métodos de nomes iguais
mas parâmetros diferentes, chama-se de sobrecarga de método.
Segue abaixo um exemplo onde implemento o conceito em Java:
public class SuperClasse {
public int somar(){
return 1+2;
}
public int somar(int x, int y){
return x+y;
}
}
public class SubClasse extends SuperClasse{
public int somar(){
return 2+2;
}
}
public class App {
public static void main(String[]
args){
SubClasse a = new SubClasse();
System.out.println(a.somar());
System.out.println(a.somar(2,3));
}
}
No exemplo acima, em SuperClasse, realizamos a sobrecarga do método somar(), exemplo de polimorfismo na própria classe. Em seguinda em SubClasse o método somar() é sobreescrito, o que o faz comportar-se diferente na classe especializada, e como a classe estende da SuperClasse, possui ainda o método somar(int x, int y) que recebe dois parâmetros.
Interfaces
Interfaces são modelos de classes que existem apenas para definir métodos e atributos obrigatórios a determinadas classes, estes atributos não possuem corpo, apenas o nome e o tipo de retorno. Interfaces nunca jamais serão instanciadas por objetos.Quando se cria uma interface para uma classe, a classe que implementa aquela interface obrigatoriamente deve implementar os métodos definidos na interface.
Classes Abstratas
São classes que existem apenas para criar herança. A principal diferença
das classes abstratas para interfaces está no fato de que as primeiras podem
implementar alguns ou todos os métodos da classe. Podem ter também apenas o que
chamamos de métodos abstratos, que são métodos definidos apenas para que as
classes que herdam dela implementem o método.
As classes abstratas jamais serão instanciadas porque simplesmente não
faz o menor sentido instanciar uma classe dessa natureza. Como no exemplo do
diagrama no item Composição e Agregação, não faz sentido instanciar
um objeto do tipo Animal, pois ele existe apenas para que, no nível hierárquico
transfira atributos e métodos para as demais classes através da herança.
Finalizando
Bem, neste post vimos os principais conceitos que permeam o paradigma de
OO, expliquei de forma superficial a idéia básica dos conceitos inerentes,
espero que este artigo possa contribuir como ponto de partida para mais estudos
e aprofundamentos. São exemplos de linguagens orientadas a objetos: Java, C#,
PHP e C++. São quatro das linguagens mais conhecidas do mercado, e vale a pena
se aprofundar em qualquer uma delas.
O meu muito obrigado e gostaria de deixar minha indicação de um curso
muito bom de orientação a objetos disponibilizado pelo site treinaweb,
não um curso gratuito mas possui um ótimo material, suporte a dúvidas e um belo
certificado ao final do curso. Muito Obrigado fiquem com Deus e até a próxima.
Nenhum comentário:
Postar um comentário