Programando com Orientação a Objetos
Antes de Começar
A forma de programar em que simplesmente se ordena que coisas sejam executadas em seqüência - forma conhecida como Programação Estruturada ou Imperativa - não é a única forma de se criar um programa. Há algumas outras e, nos últimos anos, tem se destacado cada vez mais uma dessas formas, mas uma forma específica, a Orientação a Objetos.
Chamadas de Paradigmas, formas de programar têm muita diferença entre si e sair de uma para outra exige uma mudança de visão. É preciso ver as coisas de outro modo. No caso específico de Programação Orientada a Objetos, temos um paradigma que derivou de dois outros: a Programação Estruturada e a Funcional. Este paradigma realmente mostra as coisas funcionando de outra forma mas, por trazer muita semelhança com a Programação Estruturada, é possível que se aprenda sua técnica e não seu espírito. Como resultado disso, teríamos alguém que programa utilizando uma linguagem orientada a objetos, mas não o paradigma, fazendo as coisas quase que da mesma forma que faria em uma linguagem estruturada.
JavaScript implementa, até certo ponto, as vantagens da Programação Orientada a Objetos, permitindo seu uso. Está fora do escopo deste livro tratar a programação orientada a objetos diretamente, como paradigma, por isso não espere muito da sessão seguinte, que prentende apenas orientar o leitor, se me permite o trocadilho. Para um estudo mais aprofundado da Programação Orientada a Objetos, sugiro que recorra à literatura apropriada.
Orientação a Objetos
Na Programação Orientada a Objetos, temos trechos de código que representam objetos. Objetos digitais estão jogados em um ambiente montando um inteiro.
Composição
Um objeto pode ser composto por valores (computacionalmente falando, inteiros, strings, booleanos...) e outros objetos.
Considere como coisas simples uma barra de ferro ou madeira, um pedaço de vidro ou qualquer elemento feito apenas com um material. Assim sendo, uma automóvel não é uma coisa simples, mas um objeto. Poderíamos falar diretamente do volante (e até comprá-lo separadamente), daí temos que o volante é outra coisa. Faz parte do carro, mas existe completamente, mesmo sem carro (se vai ser útil ou não sem o carro é uma outra questão). Mas o volante é simples? Não, é um outro objeto. E assim temos objetos e mais objetos se compondo, uns formados por outros, até um momento em que não há mais objetos, apenas coisas simples.
Classes
Classes representam uma categoria de objetos e é aqui que a coisa começa a complicar para quem não está muito acostumado. Ao invés de explicar de cara, vou começar com um exemplo. Vamos imaginar um Ford Ka. Não gosto de fazer propaganda de A ou de B, mas os detalhes são fundamentais neste ponto. Imagine um azul, placa ABC-1234, com um adesivo Jota Papelaria no vidro de trás e um arranhão pequeno na porta do motorista. Claro que um carro tem muito mais detalhes do que isso, mas vamos parar por aqui. Este carro é um objeto, certo?
Agora vamos ver um outro Ka, mas este é branco, novo, com os pneus gastos, com um adesivo em cada porta de um escudo do Vasco (não sou vascaino). A placa ZXC-8765, e uma imagem de Nossa Senhora no canto inferior esquerdo do vidro da frente.
Esses dois carros não tem nada a ver um com o outro, não é verdade? Mas tem... O que têm a ver? Têm a ver que os dois são Fords Ka e, portanto, muito parecidos apesar de tudo. Os dois têm uma mesma composição (se forem do mesmo ano) de portas, bancos, volantes, motor... Mas o motor de um pode estar mais gasto que o do outro, assim como os pneus estavam. Mas mesmo assim, esses componentes também têm uma coisa em comum: são do mesmo tipo. Em Orientação a Ojetos, da mesma classe.
Herança
Pode-se dizer que o ZXC-8765 do exemplo anterior era um carro, certo? Mas pode-se dizer também que ele era um Ford Ka. Como pode ser duas coisas se era apenas um objeto? Na verdade, isso ocorre porque o Ford Ka é um carro.
Esse papo parece meio óbvio e confuso, não? O que é preciso ver exatamente é que o ZXC-8765 não é simplesmente um carro e que nenhum carro é simplesmente carro. Todos têm um modelo de alguma indústria que os define melhor.
O que se deve entender também é que o Ford Ka é um carro. O que isso significa? Significa que a idéia do Ford Ka tem todas as características referentes à idéia de carro, por herança.
Quais são as características de carro? Possuem pneus, andam no chão deslizando os pneus. Possuem motor e lugar para alguém que o conduza, dito motorista. Quais as de um Ford Ka? Todas as de um carro, mais: são exatamente 4 os pneus e muitas outras.
Quando dizemos que uma classe A herda de outra classe B, queremos dizer que todo objeto x que seja feito segundo as normas de A, sendo considerado um A, será também considerável como um B.
Usando Objetos
Um objeto é uma coisa que agrupa variáveis (aqui chamadas de atributos) e funções (aqui chamadas de métodos). A grande vantagem ao usar objeto é que, além de agruparmos coisas que têm a ver entre si, elas passam a ser mais integradas.
Um atributo é acessado com um ponto depois do nome do objeto, seguido do próprio atributo. É como se fosse uma variável e pode ser utilizado da mesma forma.
Um método também é acessado dessa forma, mas com parênteses depois. Enfim, é tudo quase igual. Assim, os comandos a seguir são válidos.
zxc.cor = "white"
zxc.andar()
mensagem = (zxc.arCondicionado) ? "Tem ar condicionado" : "Não tem ar condicionado"
Um objeto funciona como um vetor associativo. Assim, você pode acessar a cor, por exemplo, também com:
zxc["cor"] = "white"
Estrutura with
Se você pretende tratar um só objeto, pode utilizar o comando with, utilizado assim:
with (zxc) {
cor = "white"
andar()
}
Isso colabora para que você poupe tempo e caracteres, o que pode ser muito importante em JavaScript, já que tudo vai ser transferido pela rede antes de ser interpretado.
A Criação de Classes
O esquisito de O. O. em JavaScript é justamente aqui, na criação de classes. Uma classe, em JavaScript, é apenas uma função. A única coisa que difere é que nesta função você utilizará o this para agregar atributos e métodos. O this referencia não somente a própria classe, mas o objeto específico durante sua execução. Este.
Para adicionar um atributo, basta escrever this.nomeDoAtributo. Se for um objeto, você deve instanciá-lo: this.lista = new Array(). Para adicionar um método, você deve utilizar aquela forma estranha de definição de função: this.escreve = function() { document.write( this.texto ) } define um método escreve que escreverá o conteúdo do atributo texto deste objeto.
Classe Data
Vamos ver se as coisas clareiam um pouco mais com um exemplo: trata-se de uma clássica classe de Data que escreve a data por extenso e na forma simples.
function Data(dd, mm, aa) {
this.dia = dd
this.mes = mm
this.ano = aa
this.extenso = false
this.obtemExtenso = function() {
switch (this.mes) {
case 1: mmm = "janeiro"; break
case 2: mmm = "fevereiro"; break
case 3: mmm = "março"; break
case 4: mmm = "abril; break
case 5: mmm = "maio"; break
case 6; mmm = "junho"; break
case 7: mmm = "julho"; break
case 8: mmm = "agosto"; break
case 9: mmm = "setembro"; break
case 10: mmm = "outubro"; break
case 11: mmm = "novembro"; break
case 12: mmm = "dezembro"; break
}
return this.dia + " de " + mmm + " de " + this.ano
}
this.obtemSimples = function() {
return this.dia + "/" + this.mes + "/" + this.ano
}
this.escreve = function() {
if (this.extenso) {
document.write( this.obtemExtenso() )
} else {
document.write( this.obtemSimples() )
}
}
}
Esta classe, apesar de simples, já mostra algo interessante: permite que você escolha a forma na qual a data será escrita. Assim, devemos criar um objeto do tipo data como segue:
var d = new Data(10, 07, 2002)
Uma vez feito isso, se escrevemos:
d.extenso = true
Ao digitarmos d.escreve(), a data será escrita por extenso. Sem isso, ela será escrita na forma normal.
Composição
É muito simples o conceito. Tão simples que não há muito o que falar. Um objeto é uma variável. Uma classe pode definir atributos, que são variáveis. Por conseqüência, um atributo pode também ser um objeto e esse o ponto chave. É só colocar this.atributo = new Classe(params) e pronto.
Herança
A herança, como já foi explicado no tópico paradigma, é quando queremos dizer que uma classe A é, de certa forma, uma especialização da classe B.
Um dos exemplos mais clássicos disso é o de Pessoa. Vamos supor uma classe Pessoa. Ela teria como atributos nome, endereço, telefone, e-mail... Agora queremos uma Pessoa Física. Basta acrescentarmos o CPF e outras coisas mais. Não é interessante re-escrever tudo. Uma Pessoa Jurídica teria o CNPJ. No final, a classe Pessoa deveria ter o que há em comum entre Pessoas Físicas e Jurídicas. Usando herança, nós não precisaremos re-escrever tudo, basta dizermos que PessoaFisica, apesar de ter CPF e outras coisas, é uma Pessoa. O mesmo com Pessoa Jurídica.
JavaScript possui um jeito muito esquisito de se definir isso: com o protótipo da função (é o construtor da classe, mas para o JavaScript ainda é uma função). O acesso é na forma constructorDaClasse.prototype = new construtorDaClasseMae. Apenas isso. Sem parênteses mesmo! Lembre que em JavaScript o construtor da classe é o próprio nome da classe.
Vamos a um exemplo. Vamos supor que já existe uma classe Pessoa, inclusive com um método escrever() que escreve na tela todos os seus dados na forma Campo: Valor. Agora, vamos supor, queremos criar uma classe PessoaFisica. Isso é feito assim:
function PessoaFisica() {
this.cpf
this.setCPF(n) {
this.cpf = n
}
this.escrever() {
parent.escrever()
document.write("CPF: " + this.cpf + "\<BR\>")
}
}
Este código está muito simples e falta alguma coisa, não? Falta dizermos que uma pessoa física é também uma pessoa. Para isso, devemos escrever (depois de escrita toda a classe) a linha já apresentada:
PessoaFisica.prototype = new Pessoa
Com isso temos que uma pessoa física é também uma pessoa.
Outra coisa interessante que ainda não foi dita é o parent. É a forma de acessar métodos da classe-mãe. A chamada que está na classe PessoaFisica significa Classe-mãe.escrever().
Site com conteúdo relacionado
Olá,
Gostaria de sugerir uma leitura relativa a este site, ela se encontra no meu blog http://www.prosadigital.com. Nele é possível encontrar assuntos sobre Javascript orientado a objetos!
Espero ter ajudado!
Abraços!
orientação a objetos
como eesses comandos seriam em C#
Submeter um novo comentário