Category Archives: Orientação a Objetos

Herança no Javascript

Herança é capacidade de um objeto reusar (herdar) os métodos e propriedades de outro objeto. O modelo de orientação a objetos baseado em protótipos, estabelece que um objeto serve de “molde” ou “base” (protótipo) para outro e a herança em javascript adiciona a propriedade global “instanceof” para definir se um objeto “é” do mesmo tipo do objeto base (protótipo). Para implementar a herança, voce define um objeto base (protótipo) que fornecerá as características aos outros objetos.

Todos os objetos definidos pelo desenvolvedor são candidatos a objeto base. Como medida de segurança as classes Native e Host não estão eleitos a servirem como objetos base.

Selecionado o objeto base, agora voce pode criar os objetos que herdarão e modificarão o objeto base conforme os requisitos. Os objetos filhos criados pelo desenvolvedor herdam todas as propriedades e métodos do objeto base, incluindo o construtor e as implementações de métodos. Lembrando que todas as propriedades e métodos são públicos, então os objetos podem acessá-los diretamente. Esses objetos podem adicionar novas propriedades e métodos não presentes no objeto base ou reescrever com novas implementações.

Keyword This

A palavra chave This faz referência ao escopo do objeto onde ela está sendo chamada.

Como o uso do This no ECMAScript existe a possibilidade de emular os escopos privados usando a palavra chave var, já que por default a linguagem só conhece o escopo público.

function objetoY()  {
    var variavel_privada = "Essa variável é privada";
    this.variavel_publica = "Essa variável é pública";
}

Nesse código a variável denominada “variavel_privada” não é propriedade do objeto “objetoY” e sim uma propriedade local ao contexto desse objeto, simulando assim uma variável privada já que outros contextos não terão acesso a ela, apenas métodos e propriedades internas ao objeto, enquanto a propriedade “variavel_publica” faz parte do objeto e é de escopo público.

Herança via Object masquerading

É uma estratégia que emula a herança, um construtor associa todas as propriedades e métodos (com o paradigma de declaração de Construtor) usando a keyword “this” para o contexto interno do qual foi referenciado. Porque o construtor é como uma função, voce pode montar o construtor de um objeto “A” dentro de um método de um objeto “B” e chamá-lo. O objeto “B” então recebe as propriedades e métodos definidos no construtor de “A” porque o this agora aponta para o contexto do novo objeto.

Cria o objeto que servirá de base:

function A(sColor) {
    this.color = sColor;
    this.sayColor = function () {
        alert(this.color);
    };
}

Agora eu crio o objeto chamado de “B” que herdará de “A”, quando eu chamo o objeto “A”, ele é referenciado ao contexto interno e o “this” passa a pertencer a “B”:

function B(sColor, sName) {
    this.newMethod = A;
    this.newMethod(sColor);
    delete this.newMethod;
    this.name = sName;
    this.sayName = function () {
        alert(this.name);
    };
}

Ao executar essas sentenças:

var objA = new ClassA('red');
var objB = new ClassB('blue', 'Nicholas');
objA.sayColor(); //outputs 'red'
objB.sayColor(); //outputs 'blue'
objB.sayName(); //outputs 'Nicholas'
alert(objB instanceof A ); //false
alert(objB instanceof B ); //true

Temos as mesmas chamadas de A em B com emulação completa da herança.

Como perceberam, Object Masquerading suporta a implementação de múltipla herança, mas como se trata de uma estratégia de emulação, essa abordagem não define o tipo do objeto que herda semelhante aos tipos herdados e portanto falha ao tentar comparar pelo “instanceof“.

Herança via métodos call() e apply()

Os métodos globais call e apply (que todo objeto herda do objeto Global) são estratégias semelhantes ao “Object Masquerading” e importam o contexto de um objeto ao outro.

call(Objeto, argumento1, argumento2, ...)
apply(Objeto, array-de-argumentos)

Se diferenciam somente no quesito que se refere aos parâmetros passados, onde o método call recebe uma sequencia de parâmetros, enquanto o método apply recebe um array de parâmetros.

function nome(sPrefixo, sSufixo) {
    alert(sPrefixo + this.parametro_interno + sSufixo);
};
var obj = new Object();
obj.parametro_interno = 'Milfont';
nome.call(obj, 'O ', ' é o mais elegante. ');

Observe que nesse exemplo a função “nome” está definida fora do objeto “obj” e associa a propriedade parametro_interno a seu próprio contexto, utilizamos o método call para passar o objeto “obj” ao contexto da função “nome” e a sequência de parâmetros esperados pelo seu construtor.

A função apply se comporta da mesma maneira e difere apenas na execução:

nome.apply(obj, new Array('O ', ' é o mais elegante. '));

Ao invés de passar os parâmetros em sequência, passamos um array com a sequência desses parâmetros.

A vantagem do método apply é que toda função tem uma propriedade chamada arguments que herda do objeto Global e facilita a implementação:

function A(sNome) {
    this.nome = sNome;
    this.digaNome = function () {
        alert(this.nome);
    };
}

function B(sNome, sName) {
    A.apply(this, arguments);
    this.sobrenome = sName;
    this.digaSobrenome = function () {
        alert(this.sobrenome);
    };
}

Aqui temos dentro da função “B” a chamada de “A” passando pelo método apply o contexto de “B” para o interior da função “A”, observe que repassa a propriedade arguments que é um array de argumentos recebidos.

Executando, teríamos:

var objA = new A('martins');
var objB = new B('Christiano', 'milfont');
objA.digaNome();  // 'martins'
objB.digaNome();  // 'Christiano'
objB.digaSobrenome(); // 'milfont'

Herança via Prototype

A forma de herança atualmente reconhecida pela especificação é a cadeia de protótipos ou Prototype chaining. Utilizando a propriedade prototype que todos os objetos herdam de Global, voce associa o contexto (métodos e propriedades) a outro objeto e o qualifica a ser do mesmo tipo do objeto que ele está recebendo.

function A() {}
A.prototype.nome = 'red';
A.prototype.digaNome = function () {
    alert(this.nome);
};
function B() {}
B.prototype = new A();

Aqui a função B recebe todos os métodos e propriedades de A e passa a ser do tipo dela, executando teríamos:

var objA = new A();
var objB = new B();
objA.nome = 'martins';
objB.nome = 'Christiano';
objA.digaNome(); // martins
objB.digaNome(); // Christiano

alert(objB instanceof A); // true
alert(objB instanceof B); // true

Formas híbridas podem ser usadas, mesclando esses métodos na construção dos objetos.

Multipla herança

Algumas linguagens orientadas a objetos habilitam o suporte à múltipla herança. Que é a capacidade de um objeto herdar as propriedades (métodos e atributos) de mais de um objeto. Além que esse objeto passa a ser da espécie dos objetos que ele herda, como por exemplo:

function Passaro(){
    this.nome = 'papagaio';
}
function Produto(){
    this.valor = 'R$10,00';
}

Passaro.prototype = new Produto;
Passaro.prototype.imprimir = function(){
    return this.valor + ' - ' + this.nome;
}

Uma classe PetStore poderia realizar um teste se o periquito é dos tipos Produto e Passaro para aplicar medicamento adequado à espécie por exemplo, esse tipo de construção é comum em linguagens como C, é simulado em Java por meio de interfaces.

var passaro = new Passaro();
alert(passaro instanceof (Produto)); // saida: true
alert(passaro instanceof (Passaro)); // saida: true
alert(passaro.imprimir()); // saida: "R$10,00 - papagaio"

Javascript não suporta múltipla herança pelo método de prototype que é o método que define o tipo do objeto, existe entretanto como contornar isso, um exemplo é a biblioteca zInherit (http://www.nczonline.net/downloads/) de Nicholas C. Zakas (http://www.nczonline.net/writing/), autor dos excelentes livros “Professional Ajax” e “Professional JavaScript for Web Developers”.

Esse script acrescenta os métodos inheritFrom e instanceOf ao objeto nativo Object.

function Biologia(){
    this.reino = 'animal';
}
function Produto(){
    this.valor = 'R$10,00';
}
function Passaro(){
    Produto.apply(this);
    Biologia.apply(this);
    this.nome = 'periquito';
}

Passaro.prototype.inheritFrom(Produto);
Passaro.prototype.inheritFrom(Biologia);
Passaro.prototype.imprimir = function(){
    return this.reino + ' - ' + this.valor + ' - ' + this.nome;
}

var passaro = new Passaro();
alert(passaro.instanceOf(Produto)); //saida : true
alert(passaro.instanceOf(Biologia)); //saida : true
alert(passaro instanceof (Passaro)); //saida : true
alert(passaro.imprimir()); // saida: "animal - R$10,00 - papagaio"

O metodo apply() habilita a aplicar um método de outro objeto no contexto de um objeto diferente.

Os frameworks modernos como ExtJS e YUI tem suas formas de implementarem a múltipla herança. Uma das formas mais utilizadas pelos Frameworks Ajax é copiarem os métodos e variáveis de um protótipo ao objeto que herdará.

Typically chemist’s shop can sale to you with discreet treatments for various health problems. There are numerous of safe online pharmacies that will deliver medications to your address. There are divers medicines for each afflictions. Learn more about “viagra manufacturer coupon“. Maybe “viagra discount coupons” is a very much complicated matter. Matters, like “coupons for viagra“, are coupled numerous types of health problems. If you need to take prescription medications, ask your dispenser to check your testosterone levels before. Sometimes the treatment options may include erectile disfunction remedies or a suction device that helps get an erection. Keep in mind web-site which is ready to sell erectile dysfunction drugs like Viagra without a recipe is fraudulent. When you purchase from an unknown web-site, you run the risk of getting counterfeit remedies.

Estudar para que se eu já sei o que fazer

Tenho severas críticas ao modelo educacional, principalmente o superior. Vou e volto para a faculdade de tempos em tempos, minha escola real está nos livros, a faculdade é pelo diploma porque a falta dele as vezes fecha portas que não tem como serem abertas e em determinados momentos precisam serem ultrapassadas.

Minhas críticas derivam principalmente da falácia e do sofismo, as pessoas acreditam que possuir um nível superior as credita para a qualificação necessária a uma determinada tarefa simplesmente. Quantos alunos estão se formando esse ano em Ciência da Computação sem a necessária qualificação? A maioria? Todos? Nenhum? Como saber se não existe um mecanismo eficiente de provar isso?

Na ausência de um mecanismo eficiente, o mercado sempre adota pontos factuais para basear suas contratações, e uma delas é o porte de um diploma de curso superior.

Fiz quase todas as cadeiras que envolvem desenvolvimento de software: Estrutura de dados, laboratório 1 e 2, técnicas de programação 1 e 2, lógica matemática, teoria da computação, entre outras que não lembro no momento. Em todas essas cadeiras nunca ouvi o professor(a) sequer mencionar coisas como: Closure, Currying, Continuation, Design By Contract, Actor model, Lazy evaluation, Tail recursion, Quine, Engine, Liskov substitution principle, … mais algumas coisas que não lembrei no momento …

O básico de orientação a objetos é ensinado, o aluno consegue até responder o que é herança e encapsulamento, mas eu nunca vi sequer mencionarem Orientação a Objetos Prototype-based, aí tenho que me deparar com gente dizendo que Javascript ou Lua fede porque simplesmente não entende como funciona os conceitos e acha estranho a sintaxe das linguagens.

Eu mesmo passei a faculdade inteira sem discutir design patterns, com exceção de DAO, que eventualmente pula na frente dos alunos em alguma cadeira obscura de "desenvolvimento web" (sic). Hoje um amigo estava impressionado com as recomendações que o pessoal da SUN passou sobre o GoF na caravana de ontem, e eu falei para ele que isso é naftalina, sério, se em 2007, o GoF é novidade para você, algo de muito sério aconteceu com sua formação.

Tive um professor muito bom, Hélio Moura, que usava na época a primeira edição do livro "Applying UML and Patterns"(que é de 1997 e faz portanto 10 anos) do Craig Larman, referência na época para RUP, e passou alguns princípios legais como GRASP, Law of Demeter, Open/closed principle, entre mais algumas coisas legais que não lembro agora. Mas isso foi uma exceção, e esse professor não ministra mais aulas na faculdade onde estudo. Isso era coisa de 99 ou 2000, início do milênio, vi que os professores de lá ainda usam a mesma versão do livro do Craig. Detalhe, já estamos na terceira edição e com mudanças significativas.

Agora PoEAA do Martin Fowler que é bom, voce vai passar batido, nem tenha esperança de discutir isso em sala de aula.

Domain Model? isso é anos-luz da academia brasiliana, vá estudar que é melhor. Domain Driven Design também é assunto inexistente, procure outra freguesia.

Metodologias ágeis, enquanto a academia está descobrindo XP (timidamente claro), o mercado já discute a fusão entre XP, Scrum, FDD, Crystal, DSDM. Até a Microsoft tem métodos ágeis enquanto a academia consolida UPs como novidade.

A maioria sai da faculdade monoglota, com apenas o conhecimento específico de uma linguagem de programação, enquanto deveriam estudar princípios, estão estudando linguagem. Programação funcional até pode ser vista, talves raramente em uma cadeira de calculo, ou IA (com LISP) se der tempo, alguns confundem sentenças com paradigmas, tinha um professor que falava que por a linguagem ter sentença condicional como um "IF", ela não poderia ser considerada 100% Orientada a objetos, entre outras sandices bizarras. DSL? bah!

Conversando com um amigo dia desses lá na faculdade, entramos no assunto banco de dados, sem querer surgiu no meio da discussão sobre formas normais, para minha surpresa ele disse que não sabia do que eu estava falando, achei estranho porque o professor de banco de dados 1, cadeira responsável por esse conteúdo, é um excelente professor, Fernando Siqueira, e conhecendo ele eu sabia que não passaria ninguém sem ensinar formas normais. Depois esse meu amigo voltou e falou que deu uma "olhada" no livro e "lembrou". Ora, isso me causa apreensão, mesmo eu sabendo que o professor tem a competência sobre uma matéria e tenho certeza que a aplicou, porque um aluno simplesmente esquece o principal conteúdo de uma determinada matéria?

São mistérios, mas mistério mesmo é uma menina que se forma esse ano e não sabe ainda para que serve um banco de dados, mesmo evidentemente ter cursado todas as cadeiras de banco de dados. Isso sim merece estudo, tese, trabalhos científicos e tudo que nós pudessemos descobrir.

Livros

A minha escola real são os livros, tive e tenho alguns bons professores, uns poucos excelentes, mas os autores clássicos são os mestres dos meus mestres. Não procure livro específico, procure autor, e toda a cultura por volta desse autor.

Posso indicar alguns que são a base da carreira de qualquer desenvolvedor que se preze: Alan S. Koch, Alistair Cockburn, Bertrand Meyer, Craig Larman, Eric Evans, Joshua Kerievsky, Kent Beck, Martin Fowler, Rod Johnson, Ron Jeffries, Steve McConnell, Robert C. Martin, … isso só dando uma olhadela aqui na minha "biblioteca". Sei que esqueci nomes importantes, mas se você seguir essa lista, vai acabar caindo neles.

O pior disso tudo é que o pessoal fica empolgado com título aqui, o cara virou doutor já se acha semi-deus, são praticamente inacessíveis, é muito mais facil você falar com Martin Fowler do que falar com um Doutor brasileiro.

Então voce tem duas alternativas, estudar ou frequentar a faculdade, dá para conciliar as duas, mas a preferência será sempre para o estudo, ele que pagará o leite de cada dia, aliás… leite não que esse está matando ultimamente, e ei que pensei que era a cerveja 🙂

Typically chemist’s shop can sale to you with discreet treatments for various soundness problems. There are numerous of safe online pharmacies that will deliver medications to your address. There are divers medicines for each afflictions. Learn more about “viagra manufacturer coupon“. Maybe “viagra discount coupons” is a very much complicated matter. Matters, like “coupons for viagra“, are coupled numerous types of health problems. If you need to take prescription medications, ask your druggist to check your testosterone levels before. Sometimes the treatment options may turn on erectile malfunction remedies or a suction device that helps get an erection. Keep in mind web-site which is ready to sell erectile disfunction drugs like Viagra without a formula is fraudulent. When you purchase from an unknown web-site, you run the risk of getting counterfeit remedies.