O que é Orientação a Objeto - Mais uma tentativa

Em uma busca desesperada para explicar de forma simples os conceitos básicos de OO, acabei enveredando e usando exemplos nada convencionais. Espero assim que consiga alavancar a curiosidade de alguém por esta técnica de programação, mesmo que nessa tentativa nada formal e de pouco conteúdo técnico possa ser rotulado como um irresponsável.

[ Hits: 27.732 ]

Por: Franklin Anderson de Oliveira Souza em 21/02/2007 | Blog: http://fisica.ufmt.br/~franklinbr/


Vamos programar



Python é uma ótima linguagem de alto nível e fortemente orientada a objeto. Em Python quase tudo é objeto, sendo assim, com forte apoio nativo, fica fácil criar classes para aprendizagem. Vamos visualizar uma classe que uma vez fornecido o raio, ou seja um número, ele me retorne a área superficial de uma esfera e ainda seu volume. Segue abaixo a classe esfera, além disso esse classe ainda tem um atributo, o valor "Pi":

import math

class esfera:
    
    pi = 3.14 #atributo
    
    def __init__(self, raio): #construtor
        self.raio = raio
    
    def volume(self): #metodo_para_calculo_do_volume
        self.VolumeEsfera = (4/3) * self.pi * pow(self.raio,3)
        print "Volume da esfera: %f" %self.VolumeEsfera

    def superficie(self): #metodo_para_calculo_da_superficie
        self.AreaEsfera = 4 * self.pi * pow(self.raio, 2)
        print "Area da Esfera: %f" %self.AreaEsfera

Salve o código acima em um arquivo com a extensão .py, abra um terminal (vá de xterm mesmo) e rode o seguinte comando para carregar a classe:

$ python -i classe_esfera.py

Se o python estiver corretamente instalado, deve simplesmente aparecer um prompt sem mensagem alguma, apenas um prompt ">>>". Agora vamos instanciar a classe e calcular a superfície e volume para um raio igual a 6 metros.

Observe o código abaixo:

>>> var = esfera(6)
>>> var.volume()
Volume da esfera: 678.240000
>>> var.superficie()
Area superficial da esfera: 452.160000
>>> var.pi
3.14

Bem, vamos lá! A primeira linha instanciamos a classe passando o valor do raio. Agora temos uma instância de nome var e chamaremos os métodos que calculam a superfície e o volume a partir desta instância e no final ainda chamamos o atributo, mostrando o valor de pi, como segue as linhas do código acima.

A classe seguinte calcula a raiz de uma equação de segundo grau. Para isso basta fornecer os valores de a, b, c da equação (ax^2 + bx + c) no momento que formos instanciá-la.

#!/usr/bin/python

import math

class Raizes:

    def __init__(self, a, b, c): #construtores
        self.a = a
        self.b = b
        self.c = c
        self.delta = self.b**2 - 4 * self.a * self.c
    
    def calcula_Raizes(self): #metodo_de_calculo_das_raizes
        if self.delta < 0:
            print "Delta negativo:ndelta: %f" %(self.delta)
        
        elif self.delta == 0:
            self.xxx = (-self.b + math.sqrt(self.delta)) / 2*self.a
            print "Valor Calculado.nx: %fndelta: %f" %(self.xxx, self.delta)
        
        elif self.delta > 0:
            self.x = (-self.b + math.sqrt(self.delta)) / 2*self.a
            self.xx = (-self.b - math.sqrt(self.delta)) / 2*self.a
            print "Raizes.nx: %fnxx: %fndelta: %f" %(self.x, self.xx, self.delta)

Salve a classe em um arquivo e proceda da seguinte maneira para calcular as raizes:

$ python -i classe_equacao.py
>>> var = Raizes(2, -5, 3)
>>> var.calcula_Raizes()
Raizes.
x: 6.000000
xx: 4.000000
delta: 1.000000
>>>

Primeiramente carregamos a classe e em seguida instanciamos, vinculando à variável var e passando os valores 2, -5, 3. Uma vez instanciada a classe, podemos acessar os seus métodos, é o que fazemos quando rodamos o comando var.calcula_Raizes().

Pra encerrar...

Esqueci de dizer que é possível instanciar uma classe várias vezes e com valores diferentes vinculando cada instância a um valor por exemplo.

$ python -i classe_equacao.py
>>> var = esfera(4)
>>> var.volume()
Volume da esfera: 200.960000
>>> var.superficie()
Area da Esfera: 200.960000

>>> uia = esfera(2)
>>> uia.volume()
Volume da esfera: 25.120000
>>> uia.superficie()
Area da Esfera: 50.240000

Vou parar por aqui mesmo porque senão esse post fica muito grande, na verdade não tive a intenção de ensinar formalmente orientação a objeto, mas deixo a dica, no site do python brasil tem ótimos tutoriais sobre o assunto, lá sim você vai criar dúvidas sólidas e quem sabe esse post possa ser mais útil.

Vale ressaltar também que esse post surgiu da minha frustração quando resolvi aprender orientação a objeto. Percebi que existiam vários códigos com exemplos, mas nada que me descrevesse conceitualmente o que seria de fato programar usando OO.

[1] - Uma função pode ser definida como segue abaixo
função SomaDoisNumeros(inteiro A, inteiro B) {	
	inteiro C
	C = A + B
	return C
}
[2] - Patuás são enfeites, colares e utensílios decorativos, palavra muito usada no nordeste
Página anterior    

Páginas do artigo
   1. Introdução
   2. A aldeia
   3. Uma célula
   4. Vamos programar
Outros artigos deste autor

Polindo o seu Debian - KDE + Debian-Sid

Debian + Xorg + Nvidia - Um conceito visual para desktops

Gnuplot - versátil ferramenta científica

Gráficos elaborados com GnuPlot e Pov-Ray

Mp3Blaster - O mais completo reprodutor de MP3 modo texto

Leitura recomendada

Cube 2 - Sauerbraten: Jogo de tiro em primeira pessoa

Aprisionamento Tecnológico

SIMH: Recriando um pouco da história

Instalação do Arch Linux com LVM + Luks

Saiba como ativar dois ou mais fbpagers no Fluxbox

  
Comentários
[1] Comentário enviado por Ed_slacker em 21/02/2007 - 09:05h

Agora que comecei a estudar JAVA por conta própria eu tive esta dúvida do que era conceitualmente "POO".
Com seu artigo deu para ter uma excelente idéia do que vem a ser isso!
Não que seja um guia definitivo para esclarecer o assunto, mas para mim foi um ótimo ponto de partida!

Parabéns pelo artigo!!

Foi muito útil para mim e garanto que será muito útil para muitos aqui do VOL...

Amplexos.

[2] Comentário enviado por removido em 21/02/2007 - 21:46h

muito bom, esclarece bem, pois a maioria das pessoas interpretam 'orientado a objetos' como somente os objetos de uma interface grafica

[3] Comentário enviado por tralsl em 21/02/2007 - 23:04h

artigo muito bom, mas isso naum envolve todo o conceito de OO
eu tbm utilizei muito exemplo desse tipo para aprender java
embora python naum seja minha especialidade os exemplos são bons
exemplos e prática é a melhoor forma de aprender oo, naum importando a liguagem que se usa
entaum boa programação para todos :)

[4] Comentário enviado por bruinfo em 22/02/2007 - 13:39h

eu tinha uma certa dúvida sobre OO e agora eu tenho a clarezado q isso queria dizer.
Valeu

[5] Comentário enviado por tenchi em 23/02/2007 - 14:33h

Kra, muito legal o artigo, mas eu continuo não entendendo esse conceito. Você explicou muito bem, e acho que o problema é comigo msm.. rsrs
Eu "programo" em pascal, e sei que existe como "ativar" a orientação à objetos (FreePascal), mas há momentos em que eu tenho que fazer isso ({$MODE OBJFPC}). Mas eu sinceramente não entendo... Já pesquiser na Wikipedia, estou sempre lendo a documentação do FP, mas mesmo assim continuo na mesma. Dizem que uma das diferenças do c para o c++ é a orientação à objetos no segundo. Mas Eu não notei muita diferença entre as duas linguagens (Também, naum entendo muito delas).
O que eu acho que entendi é a orientação à eventos, tipo em tcl, onde as coisas acontecem quando acontece um evento (um clique do mouse, etc).
Já ouvi falar de orientação à aspectos (coisas do capeta) e até orientação à gambiarras (a verdadeira programação), mas eu simceramente fico mais confuso quando pesquiso sobre o asunto.
Uma pergunta: Eu não poderia usar um tipo de orientação numa linguagem qu eusa outro tipo? Sei lá.. rsrs

Obs: uma classe é uma função faz tudo?

ME desculpe pelas dúvidas, mas acho que se eu perguntasse isso na sessão de perguntas, ninguém responderia. Se vc conseguir esclarecer essa minha mente confusa, eu agradeceria.. ;)

nota 10 pro artigo.


( Algumas pessoas dizem que Chuck )
( Norris é um mito. Essas "algumas )
( pessoas" agora estão mortas. )


[6] Comentário enviado por removido em 26/09/2007 - 14:11h

Amigo, o artigo está muito bem escrito. Porém, o conceito aqui tratado está longe de ser POO, e sim, apenas um conceito de classe/objeto. POO envolve muitos outros conceitos sem os quais não se caracteriza esse paradigma, como por exemplo encapsulamento, herança e polimorfismo.

[7] Comentário enviado por f_Candido em 27/01/2008 - 00:47h

Muito bom o artigo, uma abordagem diferente.
Parabéns,
Abraços


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts