Vamos aprender Boo – Parte 3 – IQuackFu

Publicado em 07/08/2011

0


Olá pessoal, tudo certo?

Depois de aprender um pouco sobre Boo e trabalharmos um pouco a sintaxe, vamos nos dedicar a estudar uma característica mais “avançada” da linguagem Boo: a interface IQuackFu.

Vamos usar o SharpDevelop?!

Programar em Boo é muito bacana. Infelizmente, alguns desenvolvedores (eu incluso) estão tão acostumados com uma IDE que o “não-suporte” do Visual Studio se converte em um obstáculo quase intransponível.

Felizmente, há uma IDE open-source, muito bacana, chamada SharpDevelop que “salva” a casa. Abaixo, mostro um screenshot:

image

 

Recomendo fortemente que você baixe e instale o SharpDevelop para “brincar” com Boo.

IQuackFu

Se anda como pato e faz “quack” como um pato, então deve ser IQuackFu

Em algumas linguagens, geralmente dinâmicas, usa-se o termo duck typing ou method missing para designar o processo de binding em tempo de execução, ou late binding. Ou seja, não precisamos nos preocupar com o tipo de um objeto. Nem mesmo precisamos nos preocupar com as operações que ele suporta.

IQuackFu é a abordagem de Boo para prover suporte para late binding.

Essa interface define apenas três operações (bem mais simples que a abordagem da DLR, por exemplo). São elas:

  • QuackGet(name: string,  parameters : object[]) : object
  • QuackInvoke(name: string, params args: object[]): object
  • QuackSet(name: string, parameters: object[], value: object): object

QuackGet e QuackSet servem para “ligar” propriedades. QuackInvoke serve para “ligar” métodos.

Uma implementação simples de IQuackFu: PropertyBag

Para poder explicar como funciona a interface, vamos fazer uma implementação muito simples. Observe:

namespace IQuackFuProject

import System
import System.Collections

public class PropertyBag(IQuackFu):
	_hash as Hashtable
	
	public def constructor():
		_hash = Hashtable()
		
	def QuackInvoke(name as string, args as (object)) as object:
		pass
	
	def QuackGet(name as string, parameters as (object)) as object:
		if (_hash.ContainsKey(name)):
			return _hash[name]
		else :
			return null;
	
	def QuackSet(name as string, parameters as (object), value as object) as object:
		if (_hash.ContainsKey(name)):
			_hash[name] = value
		else :
			_hash.Add(name, value);

Alguns pontos a observar:

  • É a primeira vez nessa série que mostro como definir um namespace. Simples, não?!
  • Para poder aceitar uma “lista” como parâmetro, colocamos o tipo entre parênteses;
  • Quando não desejamos implementar um método de uma interface, devemos utilizar a palavra chava “pass”.

Escrevendo um “código cliente”

Agora que temos uma classe implementando IQuackFu, vamos colocar as “mãos-na-massa”. Observe:

namespace IQuackFuProject

import System

bag = PropertyBag();

bag.Name = "Elemar Junior"
bag.Age = 31

print bag.Name
print bag.Age

print "Press any key to continue . . . "
Console.ReadKey(true)

Legal! Temos late binding Smiley de boca aberta

Executando o programa…

image

Perfeito!

Por hoje, era isso!

Etiquetado:
Publicado em: Sem categoria