Se você é um programador, ou já estudou algo sobre programação, deve ter ouvido falar de Orientação de Objetos (OO), que nada mais é que o paradigma mais utilizado no mundo na criação de softwares. Isto ocorre devido ao tipo de abstração que este paradigma emprega aos problemas da vida real. Neste artigo vou explicar como ele funciona e as principais características e funcionalidades que o definem.
Conceituação
Orientação a Objetos usa a comparação em que o código fonte é escrito de uma forma em que as suas funcionalidades são agrupadas em "blocos" abstratos que se comunicam entre si, como um verdadeiro brinquedo LEGO, que são os bloquinhos que possuem encaixes e que podem ser encaixados em diversos outros bloquinhos. Esta comparação não é exagerada quanto a o OO pois uma das suas finalidades é justamente promover a reutilização de código e a fácil adaptação a novas funcionalidades.
Estes "blocos" que cito no paragrafo anterior são pedaços de código-fonte que agrupam funções e variáveis que juntas representam um objeto da vida real, que são conhecidos por objetos (ta ai o nome Orientado a Objetos), qualquer ser da vida real pode ser transformado em um objeto.
Aqui está um exemplo bem intuitivo: Um carro é um meio de transporte que é formado pela união de várias peças e sistemas, todos trabalham em uma sinergia perfeita para que ele possa se mover nas pista. Se uma peça como disco de freio quebrar, nós podemos imediatamente trocar a peça defeituosa por outra peça igual a antiga sem comprometer o funcionamento do resto do carro. Bem assim deve se comportar os códigos fontes dos programas que usam o OO, o carro que simboliza um programa possuí vários "blocos" de código que se comunicam entre si e trocam informações que no nosso exemplo são as peças do carro.
Mas cabe ressaltar que o Paradigma Orientado a Objetos não substitui os outros paradigmas, pois ele faz uso de estruturas de outros paradigmas, ele nada mais é que uma melhoria de paradigmas mais antigos.
O padrão OO veio para incrementar as seguintes caracteristicas:
- Definição de objetos abstratos;
- Encapsulamento;
- Encapsulamento;
- Herança;
- Polimorfismo;
Vou falar sobre cada uma delas nos próximos parágrafos.
Definição de objetos abstratos
Como já foi dito e parágrafos anteriores, o OO permite abstrair objetos reais para objetos de computador. São geralmente definidos por classes que reproduzem o comportamento dos objetos reais, através de uma identidade, propriedades e métodos.
As classes são também ditas tipos de dados abstratos, que na verdade está definindo um tipo de objeto, por exemplo, se eu criar uma classe Casa com propriedades como : cor, tamanho, forma. Com certeza que existirão muitas casas de diferentes cores, tamanhos, formas, mas o seu tipo ainda é o mesmo que é Casa. A classe é como uma receita e o objeto é o seu resultado. Toda classe deve ser única e a partir dela podemos criar infinitos objetos.
Quando queremos nos referenciar ao tipo do objeto e as propriedades e métodos comuns, nós falamos sobre a classe daquele objeto. Já quando estamos manipulando um objeto já criado e armazenado na memória do computador então nós nos referimos à instância daquela classe.
Cada objeto deve ter um identificação única para que não ocorra conflitos caso precisemos mudar alguma característica de algum objeto específico. Essa identidade dos objetos são definidas pelo compilador, ou pelo próprio programador que pode criar á mão sua identificação, atribuindo um código numérico ou alfa-numérico em uma propriedade como Id.
Propriedades são atributos que definem um objeto. A classe define as propriedades que serão comuns aos objetos e cada objeto define os valores destas propriedades. Exemplo: uma classe Cachorro pode ter propriedades como Nome, Raça, Cor, e os objetos podem definir seu próprio Nome, Raça e Cor como "Toby", "Pastor Alemão", "Marrom".
Métodos são ações que os objetos podem fazer. Retomando a classe Cachorro , alguns exemplos de métodos podem ser Latir , Correr, Comer... etc.
Encapsulamento
Através desta característica é que podemos transformar tarefas muito grandes e complexas em tarefas menores e mais simples. Podemos criar objetos, utilizar suas propriedades e métodos dentro de outros objetos. Isto nos possibilita dividir um grande problema em partes pequenas para serem resolvidas, depois de solucionadas reunimos os resultados.
Um exemplo prático é o pedal acelerador do carro, o usuário somente tem que empurrar o pedal para frente para que possa acelerar o motor do carro, no entanto dentro de todo o sistema do carro ocorrem coisas mais complexas até que o carro possa acelerar a rotação das rodas.O motorista não precisa saber os processos que o carro passa até acelerar o carro, basta apenas saber que ao empurrar o pedal o carro se moverá.
Bem assim é um código encapsulado, nós implementamos a solução dentro de um método dentro de um objeto que apenas precise que o usuário forneça alguns dados de entrada e depois ele fará a manipulação destes dados de uma forma que não precisamos ver, nem ter o conhecimento de como ele o faz, somente precisamos ver o resultado.
Herança
É a forma pela qual criamos novas classes reaproveitando classes antigas sempre mantendo a compatibilidade entre as classes antigas e novas, ou seja, se quisermos inserir propriedades ou métodos novos em uma classe já existente, sem que estas modificações atrapalhem o bom funcionamento do programa, nós então criamos uma nova classe que somente tem as novas propriedades e então inserimos alguma notação que mostre ao compilador que queremos fazer uma herança entre classes (no java e no c# é chamado de extends) e logo depois o nome da classe que será herdada. A partir de agora a nova classe será usada ao invés da antiga e mesmo que já existam partes do código usando objetos desta classe antiga, eles não terão problemas pois os seus métodos e propriedades ainda existem.
A herança em OO cria uma espécie de "árvore genealógica" onde a classe que está no topo foi a primeira a ser criada, a ela damos o nome de classe Pai e as suas descendentes (as classes que herdam as usas propriedades) damos o nome de classes filhas. A cada nova herança criada a repete-se esta hierarquia: a classe que será herdada é a pai e a classe que herda é a filha. É importante ter isto em mente pois todas estas são definições relativas á posição da classe nesta árvore, hora um determinado filho pode ser pai de outra classe ou um pai ser filho de uma classe superior na hierarquia. Saber isto nos permite identificar quais métodos e propriedades podemos obter ao instanciar um objeto de uma determinada classe, pois, Uma classe pai não possui os novos métodos de uma classe filha, mas a classe filha possui todos os métodos da classe pai. Sem falar que uma classe filha pode sobrescrever métodos da classe pai (sem mudar a nomenclatura do método) para que ela se comporte de um modo específico. E para que a classe filha adicione um comportamento extra a implementação feita na sua classe pai, basta ela fornecer dentro do método requerido um identificador para que o compilador chame a implementação da classe pai (no java é .super) e logo abaixo adicionar o código extra.
Herança abre um leque enorme de usabilidade de código e de abstração de problemas, sem falar que diminui a quantidade de código de um programa e é através dela que conhecemos a próxima característica principal da Orientação a Objetos que é o Polimorfismo.
Polimorfismo
No tópico anterior nós vivos os conceitos de herança, que cria uma certa "árvore genealógica", e que as classes que estão mais abaixo nesta árvore tem acesso a todas as propriedades e métodos das classes superiores. O polimorfismo se aproveita da herança quanto a árvore que é criada pela mesma e ele acontece durante a instanciação de objetos desta árvore.
Suponhamos que exista uma classe chamada Telefone e uma classe chamada Smartfone , que representam respectivamente um aparelho telefone e um aparelho telefone celular portátil. No nosso exemplo hipotético a classe Smartfone herda de Telefone a seguinte propriedade : número, e também o seguinte método: verNumero. Já Smartfone , além de possuir as propriedades e métodos herdados, possui alguns métodos a mais.
Agora precisamos criar uma nova classe que deve herdar de Telefone , a classe SmartTv que , no nosso exemplo hipotético, também fará ligações e esta também possui o método chamado verNumero.
Eis aqui o problema: durante a execução do programa o usuário é quem vai escolher qual das duas tecnologias que vai utilizar para fazer uma ligação, e isto nós não temos como saber qual o usuário vai escolher, e a depender do que ele escolher será chamado o método verNumero, mas como saber qual dos dos dois métodos executar?
É ai que entra o polimorfismo, para solucionar este problema nós podemos criar uma variável que possui o tipo da classe pai e depois que o usurário escolher o dispositivo, será criado um objeto de acordo com o dispositivo escolhido. O através do polimorfismo é que nós podemos atribuir uma instância de uma classe diferente do tipo da variável,(por isto o nome polimorfismo, poli = muitas, morphos = formas), a variável poderá assumir duas instâncias: ou ela receberá um objeto do tipo Smartfone ou do tipo SmartTv .
Mas isto só é possível por que estas classes possuem um pai em comum que é Telefone ,ou seja, a classe pai suporta instancias de objetos das usas classe filhas mas as classes filhas não. Logo, quando chamar o método verNumero, não será executado a implementação do pai mesmo que o tipo da variável seja da classe pai, mas o objeto que ela armazena é de outra classe ,então , o método a ser executado será a do objeto que a variável estiver guardando.
Desta forma nós deixamos o computador decidir por si só o que deve ser feito com as habilidades nativas da Orientação a Objeto.
Conclusão
Não é atoa que o Paradigma Orientado a Objetos seja tão utilizado, as possibilidades de abstrações que podem ser feitas são infinitas, podemos representar quase tudo (se não tudo!) do nosso munto para o mundo virtual. Como vocês podem notar OO não é uma bomba de conceitos, na verdade ele depende de conceitos de paradigmas mais antigos e só veio para melhorar a vida dos estudantes e programadores.Referências
Carlo Ghezzi, Mehdi Jazayeri Programming Language Concepts , 3 edição ,USA, 1997, John Wiley & Sons,Inc. All rights reserved. Pg. 285 ,"Object-oriented languages".
Nenhum comentário:
Postar um comentário