POO na Vida Real

A Orientação a Objetos na programação client-side é um poderoso recurso, tornando tudo mais fácil, rápido e compacto, economizando preciosos bytes. A programação orientada a objetos é uma arte, e saber quando e como usar tornam você um artista. Aceita o desafio de aprender uma nova técnica? Então vamos lá.

Vou falar do pouco que sei sobre a aplicação real da
POO. O melhor lugar pra se implementar a POO são os objetos DOM, pois eles já tem uma classe criada, e o JavaScript nos permite extendê-la.
Vamos ao primeiro exemplo: um menu expansível. Normalmente, usamos algo próximo disso:

menu.onclick = function() { toggle($("menu"); }

Descontando a parte obstrusiva, nada parece errado, e na verdade não está. Toda vez que clicamos no menu, ele executa a função toggle, que executaria outra função para saber se o menu estava expandido ou não (geralmente uma verificação na classe CSS). Mas podemos melhorar.

Consideremos tudo como um objeto. Nesse caso, o menu seria um objeto. Portanto, ele precisa de uma função construtora para podermos cria-lo. Precisaremos dos seguintes atributos e métodos:

  • element: o elemento DOM que representa o menu.
  • contracted: atributo booleano, indica se o menu está contraído ou não.
  • toggle(): nossa querida função que irá contrair e expandir o menu.

Poderíamos adicionar expand() e contract(), mas vamos resumir. Vejamos a função construtora:

function Menu(element) {
  this.element = element;
  this.element.onclick = function() { this.toggle(); }; // obstrusivo, dá um desconto né?
  this.element.className = "contract-menu"; // já escondemos o menu
  this.contracted = true; // e indicamos que ele está escondido
  this.toggle = function() {
    if(this.contracted === true) {
	  this.element.className = "expand-menu";
	  this.contracted = false;
	}
    else {
	  this.element.className = "contract-menu";
	  this.contracted = true;
	}
  }
}

Peraí, não aumentamos o tamanho de código? Sim, mas a maravilha é exatamente essa. Você precisará desse código apenas uma vez, e alguns caracteres criam vários e vários menus com as mesmas propriedades. Um var menu = new Menu($("elemento")) resolve tudo. E também poderíamos reutilizar o código fazendo sub-menus, ou adicionando novos métodos em tempo de execução, caso sejam necessários. Interessante, não?

A implementação em objetos DOM é extremamente simples. Tudo que utilizar um estado (variáveis de instância) pode partir pra orientação a objeto. Agora vamos para algo menos visível.

Uma requisição em Ajax tem variáveis de instância. Também muito simples depois que se pega a essência da coisa. Vejamos a função construtora:

function Ajax(url /*, options*/) { // simples, sem opções por agora
  this.url = url;
  var requestResponses = reqAjax(this.url); // variável privada
  // a função acima já usa POO, não vamos nos preocupar com ela dessa vez
  // ela retorna { responseText, responseXML, errors }
  this.getResponseText = function() {
    if(typeof requestResponses.errors != "undefined") this.throw(requestResponses.errors);
    else return requestResponses.responseText;
  }
  this.getResponseXML = function() {
    if(typeof requestResponses.errors != "undefined") this.throw(requestResponses.errors);
    else return requestResponses.responseXML;
  }
  this.throw = function(errors) {
    if(typeof errors == "undefined") return requestResponses.errors;
	else throw("Requisição retornou erros: " + errors);
  }
}

Só uma função extremamente simplória e não muito útil. Só pra fazer uma demonstração (estava tentando pensar em algo mais elaborado, mas fugiu da mente). Realmente deseja um desafio? Tente criar a função reqAjax com tudo que ela tem direito. Um quebra-cabeça, literalmente.

Quer mais? Bom, então recomendo ler um pouco sobre Ruby. Sim, é server-side, não tem nada a ver, mas a orientação a objeto é realmente interessante. Extremamente recomendado.

Eu até queria postar mais alguns exemplos, mas só vieram a mente coisas muito grandes, e não ando com tempo pra isso. Podem deixar sugestões nos comentários, aí eu volto e edito o post. Fui!

Posts Relacionados

Postado em maio 23, 2007 às 19:10

Comentários

  1. Bernardo Rufino

    Júlio, excelente post!
    Só um detalhe ali no exemplo do Ajax, não seria melhor declarar seu protótipo ao invés de declarar pelo construtor?
    Ahh realmente depois de mexer com Ruby que eu aprendi o que é orientação a objetos de verdade. hehe…


  2. JulioGreff

    É, realmente ficaria mais legível, mas não sei se ficaria melhor não. E realmente depois de ler um pouco de Ruby as coisas “desanuviam” na mente, hehehe.


Deixe seu comentário