26 agosto 2007

You think you know (JavaScript) but you have no idea


Seguindo a iniciativa do Rafael Mueller, que por sinal foi muito bem sucedida, vou tentar apresentar um pouco sobre JavaScript, tentando desmistificar essa história de JS como uma Ciência Oculta, destinada apenas às famosas gambiarras do mundo do desenvolvimento de software.

Concordo com o Douglas Crockford quando ele diz que JavaScript é a Lingaguem de Programação mais não-compreendida do mundo. E digo mais, isso é culpa nossa!
Somos nós, programadores, que normalmente não buscamos a melhoria de nosso código fonte devido a uma série de fatores: falta de ferramentas de apoio, desinteresse ou preguiça. Acreditar que no desenvolvimento web a camada de apresentação não precisa da mesma atenção e cuidados que as camadas de persistência e negócio, é fadar o sistema ao limbo da manutenção.

Vou passar alguns conceitos, visando a melhoria do código produzido em javascript:

Você pode não gostar da idéia, mas a grande maioria dos computadores do mundo possuem ao menos um interpretador JS instalado.

Orientação a objetos

Sim! Orientado a objetos! De uma maneira diferente de algumas linguagens, mas javascript e totalmente orientado a objetos. E infelizmente como toda linguagem (ak. Java, Cpp, C#) também existe uma enorme possibilidade de produzir código ruim, escrevendo um programa sem a menor compreensão de OO.

JS possui objetos que podem conter dados ou métodos para tratar dados. Objetos podem conter outros objetos. Mesmo não possuindo a definição de classes, existe o conceito de constructor que possui o mesmo princípio. Ainda possui um sistema de objetos com herança (é-um) e agregação (possui-um).

Metodos e atributos privados? Claro que possue....

Vamos ao código:

Variáveis e Métodos públicos


Os membros de um objeto são sempre públicos. Podem ser modificados, utilizados ou alterados por qualquer função. Existem duas maneira de colocar novos membros a um objeto:

Utilizando um construtor:
function Container(param) {
this.nome = param;
}

Criando Objeto:
var umContainer = new Container('nomeCont');

Assim, a umCantainer.nome possui o valor 'nomeCont'.

Utilizando o prototype:
Tecnica utilizada para adicionar metodo publicos a um objeto. O mecanismo de prototype é utilizado para herança, ele também conserva memória. Para adicionar um novo metodo a um objeto:

Container.prototype.getNome = function(){
return this.nome;
}

Assim o método pode ser utilizado normalmente:
umContainer.getNome()


Métodos estáticos:
A estratégia de utilizar o prototype é uma grande vantagem para o desenvolvimento, entretanto os métodos criados através desse modelo ficam acessíveis apenas após a instância do objeto. Uma maneira de criar métodos estáticos em JS é através do mesmo princípio que utilizamos acima, com atributos:
function Container(param) {
this.nome = param;

this.metodoEstatico = function() {
return 'Eu sou um método estático';
}
}

Tanto o atribuito Container.nome quanto Container.metodoEstatico() estão disponiveis sem que haja a necessidade de instarciar a classe.


Variáveis e Métodos privados


Variáveis dentro de um objeto são considerados privados:
function Container(param) {
this.nome = param;
var secret = 0;
var that = this;

function diminuirUm() {
if (secret > 0) {
secret -= 1;
return true;
} else {
return false;
}
}
}

Acima, o atributo secret é apenas acessível pela própria instância do objeto Container, assim como o metodo diminuirUm. O atributo that, descrito como a solução para um problema de Especificação da Linguagem ECMAScript, serve para tornar o objeto disponível para os métodos privados. Assim, para fazer uso de métodos privados, necessitamos apresentar o conceito de métodos Privilegiados, capazes de acessos metodos públicos e privados de um objeto.

Métodos privilegiados

São métodos destinados a serem acessíveis de forma pública, entretanto possuem acesso aos métodos privados de um objeto. É possível removê-lo ou alterá-lo, mas não é possível através dele ter acesso real (alteração, exclusão) aos métodos e atributos privados.
function Container(param) {
this.nome= param;
var secret = 3;
var that = this;

function diminuirUm() {
if (secret > 0) {
secret -= 1;
return true;
} else {
return false;
}
}

this.service = function () {
if (dec()) {
return that.nome;
} else {
return null;
}
};
}

service é um método privilegiado. Chamando umContainer.service() obteremos o retorno 'nomeCont' apenas por três vezes, e após isso será sempre retornado null. service é disponível para outros objetos, mas seus atributos não.


Será que consegui melhorar seu conceito?? Ainda não?? Logo tem mais!
Fonte

Douglas Crockford fala sobre JavaScript

Um comentário:

  1. Uma forma bacana de se trabalhar com métodos privados é da seguinte forma:

    var Objeto = {};
    Objeto = function() {
    var minhavar1, minhavar2; // private
    function metodoPrivado() {
    return minhavar1;
    }
    return {
    metodoPublico: function() {
    metodoPrivado();
    }
    }
    }(); // * detalhe para essa linha

    Essa última linha, executa a função, fazendo ela existir.

    ResponderExcluir