Métodos de Extensão

Uma característia presente nas linguagens de dinâmicas e que também está disponível na plataforma .NET, é a capacidade de extender uma classe sem a que seja necessário uma herança da mesma, o que seria impossível numa classe selada, que não permite que seja herdada.
Veja um exemplo em ruby (trecho retirado do artigo Micro Tutorial de Ruby – Parte I):

class String
def empty?
self.nil? || self.size == 0
end
end

nome = "Sebastião Relson"
nome.empty?

Veja como fica a saída do programa utilizando o IRB:

relson@lenny-amd64:~$ irb
irb(main):001:0> class String
irb(main):002:1> def empty?
irb(main):003:2> self.nil? || self.size == 0
irb(main):004:2> end
irb(main):005:1> end
=> nil
irb(main):006:0> nome = "Sebastião Relson"
=> "Sebasti\303\243o Relson"
irb(main):007:0> nome.empty?
=> false
Agora um exemplo em c# .NET:

using System;

namespace MetodosExtensao
{

class MainClass
{
    public static void Main(string[] args)
    {
        int i = 1;
        Console.WriteLine(i.Negativo());
    }
}

static class ExtensoaInteiro
{
    public static int Negativo(this int i)
    {
        return -i;
    }
}
}

Nesse exemplo a saída seria somente:

-1

Para facilitar a inserção do código no blog e deixar e exemplo mais simples coloquei as classes no mesmo arquivo. O código foi retirado com adaptações do livro Microsoft Visual C# 2008, Passo a Passo - John Sharp.

Para finalizar leia também o artigo de um grande amigo meu, o memorável Rafael Camargo que fala a respeito que também fala de métodos de extensão o artigo é C#: Extension Methods & Speech.

Variáveis, Escopo e Modificadores de acesso

Nessa postagem tem um título bastante abrangente, pois bem, procurarei esclarecer e fazer comparações de como funcionam as Variáveis, Escopo e conseqüentemente os Modificadores de acesso em diversas linguagens e plataformas, desmitificando assim alguns “falsos cognatos”.

Variáveis

Uma variável é um espaço rotulado por um identificador (geralmente segue a regra de nomeação para todos os identificadores) para armazenamento de valores de acordo com o tipo definido. O espaço em memória a ser reservado depende do tipo e que foi definido, basicamente tais tipos podem ser divididos em Tipos Primitivos ou Tipos Referência.

Tipos primitivos

São tipos de variáveis com tanho e formatos fixos, em linguagens orientadas a objetos esses tipos não existem ou mesmo são encapsulados por uma classe que o representa. Um tipo primitivo pode ser um valor numérico inteiro de ponto flutuante ou um valor literal. Cada plataforma ou linguagem tem suas restrições e definições sobre como e quais serão eles.

Tipos Referência

Diferente dos tipos primitivos os tipos de referência fazem uma referência a um objeto em memória dessa forma várias variáveis podem fazer referência a um único objeto em memória. Os valores não são fixos, no entanto hipoteticamente pode supor se os atributos de uma classe forem de tipos primitivos o espaço armazenado será o suficiente para os atributos acomodar todos os atributos.

Geralmente quando se declara uma variável, é necessário informar um identificador e o seu tipo, porém algumas linguagens não permitem ou mesmo não exigem que seja informado um tipo.

Vejamos algumas formas de declaração de variáveis:

  • No Visual Basic
Dim nomeIdentificador As Tipo

Onde a palavra reservada
Dim (de dimensão) é seguida por um nome para o identificador, opcionalmente pode se usar a palavra reservada As para informar o tipo. Se um identificador novo é encontrado no código com um valor a ele sendo atribuído, o compilador cria automaticamente uma nova variável. Para forçar que todas as variáveis sejam declaradas é necessário informar em cada início de arquivo de código fonte a palavra reservada Option Explicit.

  • Nas linguagens baseadas na Linguagem C (C++, Java, C# .NET, etc.)

String nomeIdentificador = "Valor Inicial;"

String é um tipo para exemplificar (representa uma cadeia de caracteres) um nome para um identificador e opcionalmente pode se atribuir um valor inicial como no exemplo especificado, a cadeia de caracteres “Valor Inicial” e por fim “;” para finalizar a expressão.

Escopo

O escopo diz respeito a visibilidade de um identificador, basicamente pode se dizer que um identificador é visível no bloco que foi declarado, porém em alguns casos isso pode não ficar bem claro, se deseja modificar a visibilidade de um identificador é necessário utilizar um modificador de acesso que seja adequado a visibilidade desejada, como descrito no tópico a seguir.

Modificadores de acesso

Os modificadores de acesso servem para alterar a visibilidade de um identificador e são utilizados em varios contextos diferentes.
Em algumas plataformas de linguagens como C, Visual Basic 6 existe as variáveis Globais que são vistas por todo o programa.
No Visual Basic 6 era necessário utilizar a palavra chave Global. O que é um problema ter a visibilidade em todo o programa pois se torna muito complexo fazer o controle de quem modifica o valor da variável.
Com a criação dos espaços de nomes (namespace) ou Pacotes (Packages) em Java, todos os identificadores fazem parte de uma hierarquia.

Os modificadores acesso mais comuns são o private ( privado ) e public (público) que são utilizados tanto em membros da classe como também na própria classe.

Com o modificador de acesso private o idenficiador é visto somente dentro do bloque em que é declarado, no entanto, o público permite o acesso em qualquer lugar.

Existem outros modificadores que não são tão comuns como os descritos acima, são eles, o protected( protegido) que tem o comportamento semelhante do private porém ainda tem visibilidade para as classes que o herdam.

Outros que são específicos de plataforma são o “friend” do Visual Basic 6 que permite que somente seja acessível de dentro da DLL ou EXE em que é declarado, funcionamente análogo ao “internal” do C# .NET, que restringe a visiblidade ao Assembly em que é declarado, esse também é o modificador padrão quando não é informado na declaração. Já no Java a visibilidade é para o pacote, ou seja não é necessário estar no mesmo “jar” a visiblidade é definida pela organização lógica.

Iniciando em Ruby

Fazia um bom tempo em que eu não ficava empolgado com uma nova teconlogia, até que de tanto escutar rumores fui procurar a respeito do tal Ruby, linguagem dinâmica, baseada no SmallTalk (Assim como tudo que é orientado a objetos no “mundo” :D).

Antes de botar a mão na massa ouvi todos os episódios publicados na época (até o 39) do Rails PodCast Brasil com Carlos Brando e Fabio Akita indicado por um colega de trabalho, gostei muito do PodCast, pela profundidade nos temas abordados e da imparcialidade, digo isso que por já ter escutado alguns podcast que defendiam uma certa plataforma de desenvolvimento e o foca era na nada mais na menos que propaganda deles mesmo para a “fornecedora da plataforma”.

O primeiro tutorial “Micro-Tutorial de Ruby” do Akita onde escrevi as primeiras linhas em ruby, tive problemas ao instalar o irb pois o link apontava para um instalador corrompido, foi resolvido.

Até aí tava tranquilo, tudo bem… mais quando eu vi o Screencast para iniciantes em Rails(Programando um Blog em 15 minutos) minha cabeça explodiu, fiquei correndo de um lado para outro igual ao jacaré do pica-pau, sem pensar já li o “Aprendendo Ruby on Rails”. Li a versão em PDF, mais esses é um livro que desejo comprar como forma de gratidão ao autor, existe uma vasta quantidade de material de estudo e referência on-line. Pena que algumas lojas virtuais os livros de ruby são classificados como livros de Java.

Pra mim é um novo paradigma de desenvolvimento, uma nova sintax, uma nova plataforma, muito atraente, acho interessante usar ferramentas leves e nem por isso improdutiva para trabalhar e estudar, em fim muita coisa nova.