Básico sobre OO
Autor: Geek on the beach | Publicado: 2012-02-01T22:24:00-02:00

Introdução

Antes de darmos inicio aos tópicos avançados, demonstrarei aqui os princípios básicos da orientação a objeto, de forma clara, simples e direta, questões como classe, objeto, herança e polimorfismo.

Aprimoramento progressivo

Muito se fala hoje sobre orientação a objeto mas, diga-se de passagem, ela é bem velha e apesar disso é altamente utilizada. Isso nos leva a uma necessidade de aprender e dominar de fato a utilização da programação orientada a objetos ou popularmente conhecida como POO mas, não podemos simplesmente atropelar as outras formas de desenvolvimento e para ser sincero o não aprendizado das outras duas formas de programação torna muito mais difícil o entendimento do paradigma de orientação a objetos.
No esquema temos a seguinte evolução:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Programação Linear -&gt; Programação Orientada a Eventos -&gt; Programação Orientada a Objetos

Conceitos de OO

Classes

A primeira noção que precisamos ter, é que existe muita diferença de POO em relação a programação estruturada, porém, muito se assemelha em certos quesitos principalmente quando estamos falando de Delphi que pode trabalhar com procedures e functions e não necessariamente com métodos statics que em Delphi são conhecidos como class procedure e class function.
O conceito básico de OO, é a ideia de trabalhar com entidades denominadas classes, essas são representações de entidades reais em nosso mundo e/ou entidades necessárias para o funcionamento do sistema, tudo aquilo que reúne um conjunto de características de forma a constituir um tipo,ou seja, é passível de classificação é um excelente candidato a ser uma classe.

Ex. de classes: Cliente, Telefone, Usuário, Endereço, Divida, Parcela

Bom, isso parece simples certo?

Em teoria sim, mas não tanto, classificar entidades comumente usadas ou entidades do mundo real é uma tarefa relativamente simples porque possuímos uma capacidade natural de agrupar características, inclusive a título de curiosidade, isso é um meio que nosso cérebro encontra para classificar objetos e animais, tornando assim racional, plausível e evidente a diferença entre uma maçã e um cachorro. Mas quando falamos de entidades fictícias que somente existem no domínio do sistema essa tarefa torna-se um pouco mais complexa, pois é difícil enxergar de forma clara um denominador comum que torne racional a classificação de tal entidade, diferenciar uma maçã de um cachorro é simples, mas e diferenciar entidades que não possuem características físicas e/ou reais, como por ex. um log de sistema de uma inserção em tabela ou um relatório qualquer.

A chave para determinar e formar classes é procurar características em comum e características que podem ser adquiridas de classes superiores (Falaremos sobre herança mais tarde),&nbsp; suponhamos que você deva classificar a si mesmo, inicialmente é possível extrair dezenas de características que agrupadas em uma classificação tornam você um individuo pertencente a uma classe, mas se analisarmos de forma criteriosa é possível determinar características que não são exclusivamente suas, sendo uma pessoa eu posso afirmar que você é dotado de polegar opositor, sendo um humano posso determinar que você possui uma quantidade de peso, altura, sexo, cor e raça. Podemos continuar cada vez mais a abstrair as características da classificação e cada vez mais iremos perceber que na realidade você é uma especialização de uma classe maior, sendo assim você assim como eu é uma especialização da classe homo sapiens, que é uma especialização da classe mamífero, que é uma especialização da classe animal e assim por diante.

O mesmo pode ser aplicar em entidades presentes apenas no domínio do sistema, uma classe relatório pode ter inúmeras especializações, cada uma com um propósito, relatório de faturamento, relatório de parcelas, relatório de contas a pagar etc..., porém em todos os casos, todo relatório herda características da classe relatório, é possível observar isso no Delphi de forma clara, cada novo form é uma especialização da classe TForm.

Objetos

Os objetos nada mais são que instancias de uma determinada classe, pode parecer confuso, mas imaginemos o seguinte, mesmo que se classificada uma determinada entidade não é garantido que exista um individuo daquela classe, a classe Mamute nunca deixara de existir mas, no presente momento não possuímos nenhum objeto desta classe instanciado, logo não existem Mamutes, mas isso não contradiz a classificação do Mamute de acordo com suas características, logo uma classe não necessariamente possui instancias (Objetos), mas todos objetos obrigatoriamente pertencem a uma classe.

Herança

O nome herança é praticamente auto explicativo, você herdou os genes de seus pais, assim como seus pais herdaram os genes de seus avós, essa ideia persiste em relação a classes, quando falamos que uma classe é a especialização de outra e/ou que uma classe é herança de outra, estamos dizendo que as características presentes nas classes mais abstratas níveis acima (Denominadas "super" ou classe "pai"), foram passadas para suas classes filhas, a herança é cumulativa, ou seja, ao herdar as características de uma classe pai se essa por ventura tiver sido herdada de outra classe, a nova classe filha herdara tanto as características do pai, como as do avó, e assim sucessivamente até chegar no topo da cadeia também conhecida como "raiz", está não herda características de ninguém, no caso do Delphi nossa classe raiz é a TObject, todas as demais classes são especializações desta.

Polimorfismo

Está provavelmente é a definição mais complexa de ser absorvida, muitas pessoas fingem que entendem o polimorfismo apenas para não passar vergonha, mas não tenha medo ou receio, é um conceito um pouco difícil de entender, vou fazer o possível para explica-lo de forma clara e direta sem enrolação.

O Polimorfismo assim como o nome indica Poli (Muitas ou Varias) Morfismo (Transformações ou Mutações), é a capacidade de uma classe se transformar em outra, agora você pode estar pensando "BRUXARIA! QUEIMEM TUDO", mas a verdade é que isso é um pouco mal explicado e interpretado por ai, na realidade o polimorfismo é de fato a capacidade de uma classe se "transformar" em outra, o que esquecem de dizer é que essa capacidade no fundo é ideia que: Já que eu herdo as características de uma classe pai, eu posso então me transformar nessa classe (Lembram do ditado? Filho de peixe, peixinho é?), é basicamente isso, quando utilizamos o polimorfismo estamos transformando a nossa classe atual para alguma classe pai afim de abstrair as características da classe mais especializada da qual essa sofreu herança, se analisarmos a questão da herança onde é dito que: "Uma classe filha herda todas as características de uma classe sucessivamente até a classe raiz", em Delphi podemos observar isso da seguinte maneira, todo objeto em Delphi pode sofrer polimorfismo para classe TObjet, porem, apesar de amplamente utilizada nem todo objeto em Delphi pode sofrer polimorfismo para classe TComponent, pelo simples fato de que não se pode efetuar uma transformação para uma classe qualquer, e sim somente para classes em que houve herança.

Isso parece um pouco sem sentido, afinal para que eu usaria este recurso? Imagine o seguinte: Existem varias especializações da classe mamífero, assim como os humanos, cachorros também se alimentam de leite, pois bem, se eu pedisse para você reunir todos os mamíferos em determinado local, na pratica nós iremos considerar só as características relativas aos mamíferos, se o polimorfismo não existi-se nós não conseguiríamos agrupar objetos baseados em características mais abstratas adquiridas de classes mais altas, tal como a classe mamífero.

O Polimorfismo garante a possibilidade de "transformação" de uma classe em outra, entretanto essa transformação não é definitiva, uma classe que sofreu uma herança de outra classe pode sofrer polimorfismo para está, porem, não perdera suas características adquiridas na especialização, essas características adquiridas ficam inacessíveis ( Existe como acessa-las mesmo nesse estado, mas não utilizando recursos de OO convencionais) enquanto não houver um polimorfismo inverso de pai para filho, repare que só é possível especializar um objeto de classe pai, contanto que este seja oriundo de um polimorfismo sofrido de alguma classe que herdou suas características, Exemplo:
Supondo que exista uma classe TPessoa e outra classe TCliente, e a segunda é uma especialização de TPessoa, só é possivel efetuar o "cast" polimórfico de TPessoa para TCliente, se o objeto em questão onde existe a classe TPessoa for oriundo de um processo polimórfico da classe TCliente para TPessoa, caso contrario isso ocasionara um erro, dá mesma forma que é impossível efetuar um polimorfismo para uma classe mais abstrata a partir de outra que nunca herdou suas características.
Um fato muito importante sobre o polimorfismo é que deve se ter em mente que é possível efetuar o "cast" polimórfico para qualquer classe de grau superior, não importando o nível do grau (Contato que está tenha sofrido herança direta ou indireta), é por causa disto que conseguimos não só em Delphi mas, em qualquer linguagem que tenha suporte a OO, utilizar listas de objetos genéricos, que no fundo são listas de objetos de classe raiz, logo comportam qualquer objeto da linguagem.

Bom pessoal, fico por aqui por hoje, logo me aprofundarei mais nessas questões.

Até a próxima