Mootools – Classes

A programação orientada a objetos facilita, e muito, a vida do desenvolvedor. Podemos utilizar o mesmo código em vários lugares, para diferentes situações, modificando e estendendo apenas o que for necessário, sem precisar reescrever código. A Mootools, além de todas as outras funcionalidades, contém um sistema de criação de classes muito bem-pensado. Vamos ver como escrever classes utilizando esse sistema, assim como extendê-las e herdá-las.

Por que Classes?

Classes têm algumas vantagens sobre funções independentes. Podemos modificar e reusar suas funcionalidades sem precisar modificar o código original, criar objetos que armazenam informações dentro de seu próprio escopo e também utilizar métodos relacionados ao objeto. Além disso, com classes é possível utilizar menos código em mais situações.

Um bom exemplo da implementação de classes é a própria Mootools. Boa parte do que há na biblioteca é baseado em classes, estendendo-as, modificando-as e herdando-as. Funções não são muito utilizadas pela Mootools, pois o poder da utilização das classes é muito maior.

Definindo Classes

Para definir classes com a Mootools, utilizamos o construtor Class. O construtor leva como parâmetros os métodos e atributos da classe, através de uma literal de objeto.

var Vehicle = new Class({
	"initialize": function(features) {
		// Salvando as características no escopo do objeto
		this.features = features;
		this.position = 0;
	},
	"goForward": function(distance) {
		this.position += distance;
	},
	"goBackward": function(distance) {
		this.position -= distance;
	}
});

Na classe acima, definimos três métodos: initialize, goForward e goBackward. O método initialize deve estar presente em cada definição de classe, por ser o método que é chamado quando a classe é instanciada.

Após termos criado nossa classe, podemos instanciá-la sempre que necessário.

var myVehicle = new Vehicle({"color": "red"});
// Utilizando os métodos do objeto
myVehicle.goForward(100);
// Acessando propriedades
myVehicle.position; // 100

Estendendo Classes

Como em outras linguagens orientadas a objeto, as classes podem ser estendidas para criar funcionalidades mais específicas. No caso da classe Vehicle, podemos estendê-la para criar tipos de veículos específicos, como carros e motos. Para isso, usamos o método Class.extend, levando como parâmetro os novos métodos e propriedades que a classe deve conter.

var Car = Vehicle.extend({
	// O novo método de inicialização
	"initialize": function(features) {
		// Inicializamos a classe pai dentro da classe atual
		this.parent(features);
		this.wheels = 4;
		this.gear = 0;
	},
	"gearUp": function() {
		if(this.gear < this.features.gears) this.gear++;
	},
	"gearDown": function() {
		if(this.gear > -1) this.gear--;
	}
});
var Motorcycle = Vehicle.extend({
	"initialize": function(features) {
		this.parent(features);
		this.wheels = 2;
		this.gear = 0;
	},
	"gearUp": function() {
		if(this.gear < this.features.gears) this.gear++;
	},
	"gearDown": function() {
		if(this.gear > 0) this.gear--;
	}
});

Através do código acima, criamos duas novas classes baseadas em Vehicle, Car e Motorcycle, cada uma com suas características específicas, mas herdando os métodos da classe pai.

Assim como podemos criar tipos específicos de veículos, também podemos criar tipos específicos de carros e motos, bastando estender essas duas classes. Não há limite para extensões.

Além de estender outras classes, também é possível estender a própria classe, implementando novos métodos. Note que não é necessário recriar o método Class.initialize, já que não o modificamos, apesar de ser possível se necessário.

var Car = Car.extend({
	"horn": function() {
		this.soundHorn = true;
	}
});

Implementando Novos Métodos

Ao estender classes, o método Class.extend cria uma nova cópia da classe, não alterando-a de maneira alguma. Isso é facilmente percebido, já que, em nosso exemplo, myVehicle.gearUp não funciona, pois a classe não foi modificada quando criamos as outras extensões.

Para modificar a classe sem criar uma cópia sua e sem precisar modificar código algum, a Mootools usa o método Class.implement, recebendo como parâmetros os métodos e propriedades a serem implementados.

Modificando o último exemplo, poderíamos trocar Car.extend para Car.implement, eliminando a cópia desnecessária que criamos.

Car.implement({
	"horn": function() {
		this.soundHorn = true;
	}
});

Vale lembrar que utilizando Class.implement não temos acesso ao método this.parent, já que não estamos criando uma outra classe, somente implementando propriedades. Nesse caso, não há classe pai.

O uso de classes permite muito mais do que reutilização de código. Poupa-se tempo tanto no desenvolvimento quanto no uso do código e esse uso torna-se muito mais intuitivo, já que aproxima a programação de objetos reais. Por essas e outras que sou adepto dessa maravilhosa biblioteca. Até a próxima!

Posts Relacionados

Postado em janeiro 01, 2008 às 13:08

Comentários

  1. Bernardo Rufino

    Muito bom Júlio, espero começar a estudar Mootools logo.


  2. Rodrigo Fante

    Ja dei uma olhada no Mootools soh nao levei adiante porque descobri que é de um italiano, e depois que vim pra Italia, depender de italiano em qualquer sentido é a ultima coisa que faço


  3. JulioGreff

    @Bernardo: vale a pena. Vou postar mais um pouco sobre ela daqui uns tempos.
    @Rodrigo: Nem quero perguntar porque… Embora seja uma atitude um tanto… extrema.


  4. Bernardo Rufino

    huahauhauhauha, que cara preconceituoso, huahuauhahu…


  5. Rodrigo Fante

    ahahahahha
    Acreditem não sou uma pessoa de pré conceitos, neste caso é pós mesmo.
    E não sou de extremos também, se fosse a única opção usaria claro :D
    Mas não sendo a única prefiro evitar, do jeito que são não duvidaria o rapaz enlouquecer amanha e sair caçando os usuários querendo cobrar pelo uso.
    ahahahahha


  6. JulioGreff

    Credo! Mas tudo bem… E se ele cobrar eu abandono! Vou usar jQuery se for o caso…


Trackbacks

  1. JavaScript Orientado a Objetos - Parte 3 » JulioGreff Fevereiro 20, 2008 @ 15:02
  2. Mootools - Menu Sanfona » JulioGreff Abril 13, 2008 @ 16:49

Deixe seu comentário