Antipatterns Javascript

70
JAVASCRIPT ANTIPATTERNS ALCIDES QUEIROZ

description

Palestra sobre Anti-patterns Javascript

Transcript of Antipatterns Javascript

Page 1: Antipatterns Javascript

JAVASCRIPTANTIPATTERNS

ALCIDES QUEIROZ

Page 2: Antipatterns Javascript

JAVASCRIPTANTIPATTERNS

ALCIDES QUEIROZ

+ MÁS-PRÁTICAS E CILADAS!

Page 3: Antipatterns Javascript

@alcidesqueirozalcidesqueiroz.com

Page 4: Antipatterns Javascript

@alcidesqueirozalcidesqueiroz.com

!=

Page 5: Antipatterns Javascript

Antes, algumas

questões:

Page 6: Antipatterns Javascript

Quem aqui já trabalha com desenvolvimento?

Page 7: Antipatterns Javascript

Quem aqui já trabalha com desenvolvimento?

Quem programa em JavaScript?

Page 8: Antipatterns Javascript

Quem aqui já trabalha com desenvolvimento?

Quem programa em JavaScript?

Quem conhece os principais design

patterns?

Page 9: Antipatterns Javascript

Anti...

what?!

Page 10: Antipatterns Javascript

Em Engenharia de software, um anti-padrão é um padrão de projeto de software que

pode ser comumente usado mas é ineficiente e/ou

contra-produtivo em prática.

”Wikipedia

Page 11: Antipatterns Javascript

● Termo cunhado por Andrew Koenig em 1995, inspirado no Livro do GoF

● Popularizado em 1998 com o livro AntiPatterns - Refactoring Software, Architectures, and Projects in Crisis

Page 12: Antipatterns Javascript

Indo direto ao.

Page 13: Antipatterns Javascript

Definir os métodos de uma classe dentro de seuconstrutor

#1

Page 14: Antipatterns Javascript

function Pessoa(nome){ this.nome = nome;

this.apresentarSe = function(){

return "Meu nome é " + this.nome;

}}

Page 15: Antipatterns Javascript

● Para cada chamada ao construtor, uma nova instância do método apresentarSe é criada!

Page 16: Antipatterns Javascript

Live Code!

Page 17: Antipatterns Javascript

function Pessoa(nome){ this.nome = nome;}

Pessoa.prototype.apresentarSe = function(){ return "Meu nome é " + this.nome; }

Page 18: Antipatterns Javascript

● Agora, todos os objetos da classe Pessoa compartilham de uma única instância do método apresentarSe

Page 19: Antipatterns Javascript

Fazer comparaçõesnão-estritas

#2

Page 20: Antipatterns Javascript

Qual o valor lógico das expressões abaixo?1 == "1"

[[1 * 1]] == true

" \n\t " == false

4567 != "4567"

Page 21: Antipatterns Javascript

1 == "1" true→

[[1 * 1]] == true true→

" \n\t " == false true→

4567 != "4567" false→

O.M.G!

TOMA!

Page 22: Antipatterns Javascript

● Em comparações feitas com os operadores == e !=, é feita coersão implícita de tipo, resultando nesse tipo de bizarrice:[ [ ], null, '', null ] == ",,,"

//true!

Page 23: Antipatterns Javascript

1 === "1" false→

[[1 * 1]] === true false→

" \n\t " === false false→

4567 !== "4567" true→

AÍ SIM!

Page 24: Antipatterns Javascript

● Em Javascript, que é uma linguagem de tipagem fraca, onde variáveis são interpretadas de forma diferente dependendo do contexto, preferivelmente use os operadores === e !==.

Page 25: Antipatterns Javascript

Poluir o namespace global

#3

Page 26: Antipatterns Javascript

<script>

var i = 0;

function explorarAntiPattern(){

id = 321;

for(i = 0; i < 10; i++){}

}

explorarAntiPattern();

console.log(i);//10

console.log(id);//321

</script>

Page 27: Antipatterns Javascript

● Declarar variáveis sem o uso da keyword var, ou fora do escopo de uma function, polui o namespace global desnecessariamente

Page 28: Antipatterns Javascript

function solucao(){

var id = 321;

for(var i = 0; i < 10; i++){}

}

Page 29: Antipatterns Javascript

● As variáveis i e id agora pertencem ao escopo da função solucao, e não mais são globais.

Page 30: Antipatterns Javascript

Pera aí!E se eu quiser criar variáveis em um escopo compartilhado entre múltiplas functions, mas não quiser fazê-las globais?!?!

Page 31: Antipatterns Javascript

(function(){

var nome = "Joãozin";

function digaOla(){

console.log("Olá " + nome); }

function digaTchau(){ console.log("Tchau " + nome); }

digaOla(); digaTchau();

})();

CHUCK NORRIS APROVA!

Page 32: Antipatterns Javascript

● Com o uso de uma função anônima, a variável nome foi declarada num escopo acessível às funções digaOla e digaTchau, sem precisar para isso tornar-se global.

Page 33: Antipatterns Javascript

//blá blá blá blá blá//blá blá blá/*blá blá*/

#4

Page 34: Antipatterns Javascript

var i++;//adiciona 1 a i

var m = "read";//atribui "read" a m

Page 35: Antipatterns Javascript

//Autoriza uma ação

function autorizarAcao(){

...

var acao = getAcao(); //seta a ação

var url = "/a=" + acao; //seta a URL

...

}

Page 36: Antipatterns Javascript

//Autoriza uma ação

function autorizarAcao(){

...

var acao = getAcao(); //seta a ação

var url = "/a=" + acao; //seta a URL

...

}Plaquê issú?!?

Page 37: Antipatterns Javascript

● Seu código deve ser claro, se você precisar fazer uso constate de comentários em seus códigos, há algo de muito errado com eles.

Page 38: Antipatterns Javascript
Page 39: Antipatterns Javascript

Duas perguntas a se fazer antes de escrever um comentário

Page 40: Antipatterns Javascript

1. É uma informação REALMENTE NECESSÁRIA?!?!?!?

Page 41: Antipatterns Javascript

1. É uma informação REALMENTE NECESSÁRIA?!?!?!?

Caso a resposta para a pergunta acima seja sim, considere a segunda:

Page 42: Antipatterns Javascript

1. É uma informação REALMENTE NECESSÁRIA?!?!?!?

Caso a resposta para a pergunta acima seja sim, considere a segunda:

2. Meu código pode ser aprimorado, e assim tornar-se claro ao ponto de ser auto-explicável?

Page 43: Antipatterns Javascript

Javascript Inline

#5

Page 44: Antipatterns Javascript

<button onclick="resetFormDefaults()">Redefinir</button>

Page 45: Antipatterns Javascript

● Mantenha seu HTML simples, ele deve conter apenas a definição de seu documento.

● Separe seu código JavaScript em arquivos à parte.

Page 46: Antipatterns Javascript

[HTML]<button id="defaults">Padrão</button>

[JS]$(document).ready(function(){ $('#defaults').click(resetFormDefaults);});

Page 47: Antipatterns Javascript

Estender prototypes de tipos nativos

#6

Page 48: Antipatterns Javascript

Estender prototypes de tipos nativos ||Estender o DOM

#6

Page 49: Antipatterns Javascript

String.prototype.format = function() {

...

}

ou :

window.screenId = "cadastro_cliente";

Page 50: Antipatterns Javascript

● Não é à prova do Futuro

● Não é à prova do Passado

● Pode induzir à confusão sobre o que é nativo e o que é custom

● Especificação Ecma não obriga o suporte

Page 51: Antipatterns Javascript

● Quer adicionar comportamento a um objeto nativo? Envolva-o com um wrapper

Page 52: Antipatterns Javascript

Jogo bala!

Page 53: Antipatterns Javascript

Evite:

Page 54: Antipatterns Javascript

Evite:● new Array(), use []

Page 55: Antipatterns Javascript

Evite:● new Array(), use []● new Object(), use {}

Page 56: Antipatterns Javascript

Evite:● new Array(), use []● new Object(), use {}● Boolean(expressao), use !!expressao

Page 57: Antipatterns Javascript

Evite:● new Array(), use []● new Object(), use {}● Boolean(expressao), use !!expressao● if(!par){...}, use if(par === false){...}

Page 58: Antipatterns Javascript

Evite:● new Array(), use []● new Object(), use {}● Boolean(expressao), use !!expressao● if(!par){...}, use if(par === false){...}● Abusar de funções anônimas em callbacks

Page 59: Antipatterns Javascript

Deprecated

Page 60: Antipatterns Javascript

● Uso do with

Page 61: Antipatterns Javascript

● Uso do with● Uso do atributo language na tag script

Page 62: Antipatterns Javascript

● Uso do with● Uso do atributo language na tag script● Envolver código javascript entre comentários HTML

Page 63: Antipatterns Javascript

● Uso do with● Uso do atributo language na tag script● Envolver código javascript entre comentários HTML● document.write, o DOM está aí para ser usado

Page 64: Antipatterns Javascript

Final Tips

Page 65: Antipatterns Javascript

● Lint your code!

Page 66: Antipatterns Javascript

● Lint your code!● Use uma ferramenta de code inspection (Firebug, Chrome Developer Tools)

Page 67: Antipatterns Javascript

● Lint your code!● Use uma ferramenta de code inspection (Firebug, Chrome Developer Tools)● Use uma library, não reinvente a roda

Page 68: Antipatterns Javascript

● Lint your code!● Use uma ferramenta de code inspection (Firebug, Chrome Developer Tools)● Use uma library, não reinvente a roda● Use o Google Hosted Libraries

Page 69: Antipatterns Javascript

Perguntas?

Page 70: Antipatterns Javascript

Conheça-nos

dev.grupofortes.com.br

@DevGrupoFortes