SlideShare uma empresa Scribd logo
@rafael_sps 
Javascript Ilegívl
Quem? 
Desenvolvedor web 
no Grupo RBS
/* Comentários */ 
Não precisa ser o “capitão óbvio”
// get a specific user 
getUser: function (id) { 
// código aqui 
}
Porém... 
… nem todo mundo 
enxerga a Matrix!
function validate (str) { 
return /^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I 
{0,3})$/.test(str); 
}
“É melhor não ter comentários e/ou 
documentação do que tê-los de forma 
ruim/errônea/desatualizada” 
http://blog.millermedeiros.com/always-comment-weird-things/
Variáveis / Métodos 
“Mais curto não é sempre melhor” 
(speaking Javascript) 
regularUser melhor que rglrUsr
Conciso 
& 
Claro
Booleanos 
isPlaying(); 
isNumber(); 
hasListener;
Funções 
loadData(); 
render(); 
parse();
Coleções 
users; 
companies; 
petList;
Event handlers 
onBtnClick; 
onKeyUp; 
onMouseOver;
var anonymBtn = document.querySelector('#anonym'); 
var declaredBtn = document.querySelector('#declared'); 
var myHandler = function () { 
console.log('declared'); 
var a = 1 + b; 
} 
anonymBtn.addEventListener('click', function () { 
console.log('anonym'); 
var a = 1 + b; 
}); 
declaredBtn.addEventListener('click', myHandler, false);
Namespacing 
Nomear coisas não é fácil... 
http://javascriptweblog.wordpress.com/2010/12/07/namespacing-in-javascript/ 
http://michaux.ca/articles/javascript-namespacing
// Globais Everywhere 
var User = function () {} 
var Company = function () {} 
// Tudo certo para dar errado...
// Uma global para a todos 
governar 
var MYGLOBAL = MYGLOBAL || {}; 
MYGLOBAL.User = {}; 
MYGLOBAL.User.Admin = function () {}; 
MYGLOBAL.Company = function () {};
Módulos 
http://addyosmani.com/writing-modular-js/ 
http://www.infoq.com/br/presentations/modularizacao-em-javascript
AMD (Asyncronous Module Definition) 
RequireJS é a implementação mais popular 
http://tomdale.net/2012/01/amd-is-not-the-answer/
define([], 
function () { 
var Robot = function () { 
this.init = function (battery) { 
this.battery = battery; 
} 
this.charge = function () { 
this.battery.level++; 
console.log(this.battery.level) 
} 
} 
return Robot; 
});
define([], 
function () { 
var Battery = function () { 
this.init = function (level) { 
this.level = level; 
} 
} 
return Battery; 
});
require(['battery.js', 'robot.js'], function 
(Source, Robot) { 
var source = new Source(); 
source.init(80); 
var robot = new Robot(); 
robot.init(source); 
robot.charge(); // 81 
robot.charge(); // 82 
});
CommonJS 
Sistema de módulos do Node.js 
O Browserify implementa no browser
browserify main.js -o bundle.js
var Battery = function () { 
this.init = function (level) { 
this.level = level; 
} 
} 
module.exports = Battery;
var Robot = function () { 
this.init = function (battery) { 
this.battery = battery; 
} 
this.charge = function () { 
this.battery.level++; 
console.log(this.battery.level); 
} 
} 
module.exports = Robot;
var Battery = require('./battery.js'); 
var Robot = require('./robot.js'); 
var source = new Battery(); 
source.init(80); 
var robot = new Robot(); 
robot.init(source); 
robot.charge(); // 81 
robot.charge(); // 82
Harmony 
Especificação do ES6 
http://es6rocks.com/2014/10/es6-modules-today-with-6to5/
var Battery = function () { 
this.init = function (level) { 
this.level = level; 
} 
} 
export { Battery }
var Robot = function () { 
this.init = function (battery) { 
this.battery = battery; 
} 
this.charge = function () { 
this.battery.level++; 
console.log(this.battery.level); 
} 
} 
export { Robot }
import { Battery } from 'battery.js'; 
import { Robot } from 'robot.js'; 
var source = new Battery(); 
source.init(80); 
var robot = new Robot(); 
robot.init(source); 
robot.charge(); 
robot.charge();
S.O.L.I.D 
Princípios introduzidos pelo 
“Uncle Bob”
Single Responsability Principle 
“Uma classe/módulo deve ter somente 
uma razão para mudar” 
http://freshbrewedcode.com/derekgreer/2011/12/08/solid-javascript-single-responsibility- 
principle/
var SearchWidget = function () { 
return { 
init: function (el) { 
this.el = el; 
this.input = this.el.find('.search-input'); 
}, 
onData: function (data) { 
this.renderList(data); 
}, 
renderList: function (users) { 
var str = ''; 
users.forEach(function (user) { 
str += '<li>' + user.name + '</li>'; 
}); 
$('.userList').html(str); 
},
get: function (query) { 
$.ajax({ 
url: 'users.json', 
data: { 
query: query 
} 
}).done(this.onData.bind(this)); 
}, 
bindClick: function () { 
$('.go-button').on('click', function () { 
var query = this.input.val(); 
this.get(query); 
}.bind(this)); 
} 
} 
}
Muitas responsabilidades 
Hora de corrigir a lambança refatorar
var SearchWidget = function () { 
return { 
init: function (el) { 
this.el = el; 
this.input = this.el.find('.search-input'); 
}, 
bindClick: function (callback) { 
this.el.find('.go-button').on('click', function () { 
var query = this.input.val(); 
callback(query); 
}.bind(this)); 
} 
} 
}
Código difícil de ler vira problema do 
projeto, não é só teu ou do colega
Sempre pense na pessoa que vai 
dar manutenção no seu código! 
@rafael_sps 
github.com/rssilva

Mais conteúdo relacionado

Mais procurados

JavaScript Model-View no Frontend
JavaScript Model-View no FrontendJavaScript Model-View no Frontend
JavaScript Model-View no Frontend
Henrique Gogó
 
Node.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasNode.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo Branas
Rodrigo Branas
 
RMI em Java
RMI em JavaRMI em Java
RMI em Java
Charleston Anjos
 
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo BranasNode.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Rodrigo Branas
 
7Masters jQuery - boas práticas em JavaScriptQuery, com Bruno Rocha
7Masters jQuery - boas práticas em JavaScriptQuery, com Bruno Rocha7Masters jQuery - boas práticas em JavaScriptQuery, com Bruno Rocha
7Masters jQuery - boas práticas em JavaScriptQuery, com Bruno Rocha
iMasters
 
Programação functional reativa: lidando com código assíncrono
Programação functional reativa: lidando com código assíncronoProgramação functional reativa: lidando com código assíncrono
Programação functional reativa: lidando com código assíncrono
Leonardo Borges
 
Backbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosBackbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectados
Henrique Gogó
 
Node.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo BranasNode.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo Branas
Rodrigo Branas
 
Minicurso javascript
Minicurso javascriptMinicurso javascript
Minicurso javascript
Lucas Aquiles
 
Event-based Asynchronous Pattern (EAP)
Event-based Asynchronous Pattern (EAP)Event-based Asynchronous Pattern (EAP)
Event-based Asynchronous Pattern (EAP)
Rogério Moraes de Carvalho
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
Guilherme Blanco
 
Java script - funções
Java script - funçõesJava script - funções
Java script - funções
Cristiano Pires Martins
 
Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)
Douglas Mendes
 
Mobileconf dicas-android
Mobileconf dicas-androidMobileconf dicas-android
Mobileconf dicas-android
Alberto Souza
 
Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2
Jeison Barros
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
Michel Ribeiro
 
Programação funcional em JavaScript: como e por quê?
Programação funcional em JavaScript: como e por quê?Programação funcional em JavaScript: como e por quê?
Programação funcional em JavaScript: como e por quê?
Arthur Xavier
 

Mais procurados (20)

JavaScript Model-View no Frontend
JavaScript Model-View no FrontendJavaScript Model-View no Frontend
JavaScript Model-View no Frontend
 
Node.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasNode.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo Branas
 
RMI em Java
RMI em JavaRMI em Java
RMI em Java
 
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo BranasNode.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
 
7Masters jQuery - boas práticas em JavaScriptQuery, com Bruno Rocha
7Masters jQuery - boas práticas em JavaScriptQuery, com Bruno Rocha7Masters jQuery - boas práticas em JavaScriptQuery, com Bruno Rocha
7Masters jQuery - boas práticas em JavaScriptQuery, com Bruno Rocha
 
Programação functional reativa: lidando com código assíncrono
Programação functional reativa: lidando com código assíncronoProgramação functional reativa: lidando com código assíncrono
Programação functional reativa: lidando com código assíncrono
 
Backbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosBackbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectados
 
Doctrine2 Seminário PHP
Doctrine2 Seminário PHPDoctrine2 Seminário PHP
Doctrine2 Seminário PHP
 
Java 06
Java 06Java 06
Java 06
 
Node.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo BranasNode.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo Branas
 
Minicurso javascript
Minicurso javascriptMinicurso javascript
Minicurso javascript
 
Debugging no Devtools
Debugging no DevtoolsDebugging no Devtools
Debugging no Devtools
 
Event-based Asynchronous Pattern (EAP)
Event-based Asynchronous Pattern (EAP)Event-based Asynchronous Pattern (EAP)
Event-based Asynchronous Pattern (EAP)
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Java script - funções
Java script - funçõesJava script - funções
Java script - funções
 
Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)
 
Mobileconf dicas-android
Mobileconf dicas-androidMobileconf dicas-android
Mobileconf dicas-android
 
Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
 
Programação funcional em JavaScript: como e por quê?
Programação funcional em JavaScript: como e por quê?Programação funcional em JavaScript: como e por quê?
Programação funcional em JavaScript: como e por quê?
 

Destaque

TVSS Fall2012 Week 6
TVSS Fall2012 Week 6TVSS Fall2012 Week 6
TVSS Fall2012 Week 6Katelyn Melan
 
IMPACT Silver Corporate Presentation
IMPACT Silver Corporate PresentationIMPACT Silver Corporate Presentation
IMPACT Silver Corporate PresentationAdnet Communications
 
Introducción curso básico de fotografía para el estudiantado de la Carrera d...
Introducción curso básico de fotografía para el estudiantado de la Carrera d...Introducción curso básico de fotografía para el estudiantado de la Carrera d...
Introducción curso básico de fotografía para el estudiantado de la Carrera d...Edgar
 
kevin ariza recuperacion
kevin ariza recuperacionkevin ariza recuperacion
kevin ariza recuperacionguest60e152
 
Presentación shutterstock
Presentación  shutterstockPresentación  shutterstock
Presentación shutterstock
francinicer
 
Mami deber
Mami deberMami deber
Mami deber
aniluacosta
 
¿Te dejarías la barba así?.ppt
¿Te dejarías la barba así?.ppt¿Te dejarías la barba así?.ppt
¿Te dejarías la barba así?.ppt
Juan Carlos Briquet Marmol
 
Juan Carlos Briquet Mármol: Benjamín Heine y su arte
Juan Carlos Briquet Mármol: Benjamín Heine y su arteJuan Carlos Briquet Mármol: Benjamín Heine y su arte
Juan Carlos Briquet Mármol: Benjamín Heine y su arte
Juan Carlos Briquet Marmol
 
6 April Daily market report
6 April Daily market report6 April Daily market report
6 April Daily market reportQNB Group
 
Regina Ombam - NACC, Kenya
Regina Ombam - NACC, KenyaRegina Ombam - NACC, Kenya
Regina Ombam - NACC, Kenya
Regional AIDS Training Network
 
Grinntech introduction
Grinntech introductionGrinntech introduction
Grinntech introduction
grinntech
 
Présentation sur l’assemblée annuelle 2013
Présentation sur l’assemblée annuelle 2013Présentation sur l’assemblée annuelle 2013
Présentation sur l’assemblée annuelle 2013
TransCanada Corporation
 
ReparaMiBarrio-TVSS-week5
ReparaMiBarrio-TVSS-week5ReparaMiBarrio-TVSS-week5
ReparaMiBarrio-TVSS-week5
davidmanero
 
TURKEY DAY Trade-A-Way
TURKEY DAY Trade-A-WayTURKEY DAY Trade-A-Way
TURKEY DAY Trade-A-Way
Jane Ross
 
Functional techniques in Ruby
Functional techniques in RubyFunctional techniques in Ruby
Functional techniques in Ruby
erockendude
 
Okuriventures
OkuriventuresOkuriventures
Okuriventures
btomaskutz
 
In Appreciation of the Life of Artist & Art Teacher Gary R. Sanchez
In Appreciation of the Life of Artist & Art Teacher Gary R. SanchezIn Appreciation of the Life of Artist & Art Teacher Gary R. Sanchez
In Appreciation of the Life of Artist & Art Teacher Gary R. SanchezUNM Continuing Education
 
Tu vi be -2009
Tu vi   be -2009Tu vi   be -2009
Tu vi be -20090018539123
 

Destaque (20)

TVSS Fall2012 Week 6
TVSS Fall2012 Week 6TVSS Fall2012 Week 6
TVSS Fall2012 Week 6
 
IMPACT Silver Corporate Presentation
IMPACT Silver Corporate PresentationIMPACT Silver Corporate Presentation
IMPACT Silver Corporate Presentation
 
Introducción curso básico de fotografía para el estudiantado de la Carrera d...
Introducción curso básico de fotografía para el estudiantado de la Carrera d...Introducción curso básico de fotografía para el estudiantado de la Carrera d...
Introducción curso básico de fotografía para el estudiantado de la Carrera d...
 
kevin ariza recuperacion
kevin ariza recuperacionkevin ariza recuperacion
kevin ariza recuperacion
 
Presentación shutterstock
Presentación  shutterstockPresentación  shutterstock
Presentación shutterstock
 
Mami deber
Mami deberMami deber
Mami deber
 
Programme complet
Programme completProgramme complet
Programme complet
 
Une Histoire Damour
Une Histoire DamourUne Histoire Damour
Une Histoire Damour
 
¿Te dejarías la barba así?.ppt
¿Te dejarías la barba así?.ppt¿Te dejarías la barba así?.ppt
¿Te dejarías la barba así?.ppt
 
Juan Carlos Briquet Mármol: Benjamín Heine y su arte
Juan Carlos Briquet Mármol: Benjamín Heine y su arteJuan Carlos Briquet Mármol: Benjamín Heine y su arte
Juan Carlos Briquet Mármol: Benjamín Heine y su arte
 
6 April Daily market report
6 April Daily market report6 April Daily market report
6 April Daily market report
 
Regina Ombam - NACC, Kenya
Regina Ombam - NACC, KenyaRegina Ombam - NACC, Kenya
Regina Ombam - NACC, Kenya
 
Grinntech introduction
Grinntech introductionGrinntech introduction
Grinntech introduction
 
Présentation sur l’assemblée annuelle 2013
Présentation sur l’assemblée annuelle 2013Présentation sur l’assemblée annuelle 2013
Présentation sur l’assemblée annuelle 2013
 
ReparaMiBarrio-TVSS-week5
ReparaMiBarrio-TVSS-week5ReparaMiBarrio-TVSS-week5
ReparaMiBarrio-TVSS-week5
 
TURKEY DAY Trade-A-Way
TURKEY DAY Trade-A-WayTURKEY DAY Trade-A-Way
TURKEY DAY Trade-A-Way
 
Functional techniques in Ruby
Functional techniques in RubyFunctional techniques in Ruby
Functional techniques in Ruby
 
Okuriventures
OkuriventuresOkuriventures
Okuriventures
 
In Appreciation of the Life of Artist & Art Teacher Gary R. Sanchez
In Appreciation of the Life of Artist & Art Teacher Gary R. SanchezIn Appreciation of the Life of Artist & Art Teacher Gary R. Sanchez
In Appreciation of the Life of Artist & Art Teacher Gary R. Sanchez
 
Tu vi be -2009
Tu vi   be -2009Tu vi   be -2009
Tu vi be -2009
 

Semelhante a Javascript Ilegível

Design patterns
Design patternsDesign patterns
Design patterns
DouglasSoaresAndrSch
 
Rafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia
 
OOP Java
OOP JavaOOP Java
OOP Java
Jorge Cardoso
 
Tutorial Dwr - Combos Dependentes
Tutorial Dwr - Combos DependentesTutorial Dwr - Combos Dependentes
Tutorial Dwr - Combos Dependentes
Alexandre S. Oliveira
 
Realtime com node.js e socket.io
Realtime com node.js e socket.ioRealtime com node.js e socket.io
Realtime com node.js e socket.io
Caio Ribeiro Pereira
 
Aula5
Aula5Aula5
Aula5
fkimura
 
React + Flux (Alt)
React + Flux (Alt)React + Flux (Alt)
React + Flux (Alt)
Cezar Luiz
 
Manipulando Bancos de Dados com JDBC
Manipulando Bancos de Dados com JDBCManipulando Bancos de Dados com JDBC
Manipulando Bancos de Dados com JDBC
Antonio Passos
 
Exercicios professor marcos monteiro (1)
Exercicios professor marcos monteiro (1)Exercicios professor marcos monteiro (1)
Exercicios professor marcos monteiro (1)
jose-junior89
 
Minicurso groovy grails
Minicurso groovy grailsMinicurso groovy grails
Minicurso groovy grails
Victor Hugo Germano
 
Mock Objects
Mock ObjectsMock Objects
Mock Objects
elliando dias
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
Giovanni Bassi
 
JS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript FuncionalJS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript Funcional
iMasters
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Loiane Groner
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Rodrigo Urubatan
 
Mvc sem Controller
Mvc sem ControllerMvc sem Controller
Mvc sem Controller
Milfont Consulting
 
Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com Cactus
Denis L Presciliano
 
JPA - Java Persistence API
JPA - Java Persistence APIJPA - Java Persistence API
JPA - Java Persistence API
Rodrigo Cascarrolho
 
Backbone.js - A espinha dorsal de aplicações web
Backbone.js - A espinha dorsal de aplicações webBackbone.js - A espinha dorsal de aplicações web
Backbone.js - A espinha dorsal de aplicações web
Henrique Gogó
 

Semelhante a Javascript Ilegível (20)

Design patterns
Design patternsDesign patterns
Design patterns
 
Rafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em ação
 
OOP Java
OOP JavaOOP Java
OOP Java
 
Tutorial Dwr - Combos Dependentes
Tutorial Dwr - Combos DependentesTutorial Dwr - Combos Dependentes
Tutorial Dwr - Combos Dependentes
 
Realtime com node.js e socket.io
Realtime com node.js e socket.ioRealtime com node.js e socket.io
Realtime com node.js e socket.io
 
Aula5
Aula5Aula5
Aula5
 
React + Flux (Alt)
React + Flux (Alt)React + Flux (Alt)
React + Flux (Alt)
 
Manipulando Bancos de Dados com JDBC
Manipulando Bancos de Dados com JDBCManipulando Bancos de Dados com JDBC
Manipulando Bancos de Dados com JDBC
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
Exercicios professor marcos monteiro (1)
Exercicios professor marcos monteiro (1)Exercicios professor marcos monteiro (1)
Exercicios professor marcos monteiro (1)
 
Minicurso groovy grails
Minicurso groovy grailsMinicurso groovy grails
Minicurso groovy grails
 
Mock Objects
Mock ObjectsMock Objects
Mock Objects
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
JS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript FuncionalJS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript Funcional
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
 
Mvc sem Controller
Mvc sem ControllerMvc sem Controller
Mvc sem Controller
 
Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com Cactus
 
JPA - Java Persistence API
JPA - Java Persistence APIJPA - Java Persistence API
JPA - Java Persistence API
 
Backbone.js - A espinha dorsal de aplicações web
Backbone.js - A espinha dorsal de aplicações webBackbone.js - A espinha dorsal de aplicações web
Backbone.js - A espinha dorsal de aplicações web
 

Mais de Rafael Specht da Silva

Não alimente os trolls: JavaScript é bonito - FrontInSM 2015
Não alimente os trolls: JavaScript é bonito - FrontInSM 2015Não alimente os trolls: JavaScript é bonito - FrontInSM 2015
Não alimente os trolls: JavaScript é bonito - FrontInSM 2015Rafael Specht da Silva
 
Processamento Digital de Sinais com Javascript - RSJS 2015
Processamento Digital de Sinais com Javascript - RSJS 2015Processamento Digital de Sinais com Javascript - RSJS 2015
Processamento Digital de Sinais com Javascript - RSJS 2015
Rafael Specht da Silva
 
Digital Signal Processing w/ Javascript
Digital Signal Processing w/ JavascriptDigital Signal Processing w/ Javascript
Digital Signal Processing w/ Javascript
Rafael Specht da Silva
 
Javascript ao Infinito e Além TDC Porto Alegre 2014
Javascript ao Infinito e Além TDC Porto Alegre 2014Javascript ao Infinito e Além TDC Porto Alegre 2014
Javascript ao Infinito e Além TDC Porto Alegre 2014
Rafael Specht da Silva
 
Web audio api TDC
Web audio api TDCWeb audio api TDC
Web audio api TDC
Rafael Specht da Silva
 
Javascript ao Infinito e Além
Javascript ao Infinito e AlémJavascript ao Infinito e Além
Javascript ao Infinito e Além
Rafael Specht da Silva
 
A esquecida camada física ou porquê minha internet é tão lenta
A esquecida camada física ou porquê minha internet é tão lentaA esquecida camada física ou porquê minha internet é tão lenta
A esquecida camada física ou porquê minha internet é tão lenta
Rafael Specht da Silva
 

Mais de Rafael Specht da Silva (7)

Não alimente os trolls: JavaScript é bonito - FrontInSM 2015
Não alimente os trolls: JavaScript é bonito - FrontInSM 2015Não alimente os trolls: JavaScript é bonito - FrontInSM 2015
Não alimente os trolls: JavaScript é bonito - FrontInSM 2015
 
Processamento Digital de Sinais com Javascript - RSJS 2015
Processamento Digital de Sinais com Javascript - RSJS 2015Processamento Digital de Sinais com Javascript - RSJS 2015
Processamento Digital de Sinais com Javascript - RSJS 2015
 
Digital Signal Processing w/ Javascript
Digital Signal Processing w/ JavascriptDigital Signal Processing w/ Javascript
Digital Signal Processing w/ Javascript
 
Javascript ao Infinito e Além TDC Porto Alegre 2014
Javascript ao Infinito e Além TDC Porto Alegre 2014Javascript ao Infinito e Além TDC Porto Alegre 2014
Javascript ao Infinito e Além TDC Porto Alegre 2014
 
Web audio api TDC
Web audio api TDCWeb audio api TDC
Web audio api TDC
 
Javascript ao Infinito e Além
Javascript ao Infinito e AlémJavascript ao Infinito e Além
Javascript ao Infinito e Além
 
A esquecida camada física ou porquê minha internet é tão lenta
A esquecida camada física ou porquê minha internet é tão lentaA esquecida camada física ou porquê minha internet é tão lenta
A esquecida camada física ou porquê minha internet é tão lenta
 

Javascript Ilegível

  • 2. Quem? Desenvolvedor web no Grupo RBS
  • 3.
  • 4.
  • 5. /* Comentários */ Não precisa ser o “capitão óbvio”
  • 6. // get a specific user getUser: function (id) { // código aqui }
  • 7. Porém... … nem todo mundo enxerga a Matrix!
  • 8. function validate (str) { return /^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I {0,3})$/.test(str); }
  • 9. “É melhor não ter comentários e/ou documentação do que tê-los de forma ruim/errônea/desatualizada” http://blog.millermedeiros.com/always-comment-weird-things/
  • 10. Variáveis / Métodos “Mais curto não é sempre melhor” (speaking Javascript) regularUser melhor que rglrUsr
  • 15. Event handlers onBtnClick; onKeyUp; onMouseOver;
  • 16. var anonymBtn = document.querySelector('#anonym'); var declaredBtn = document.querySelector('#declared'); var myHandler = function () { console.log('declared'); var a = 1 + b; } anonymBtn.addEventListener('click', function () { console.log('anonym'); var a = 1 + b; }); declaredBtn.addEventListener('click', myHandler, false);
  • 17.
  • 18. Namespacing Nomear coisas não é fácil... http://javascriptweblog.wordpress.com/2010/12/07/namespacing-in-javascript/ http://michaux.ca/articles/javascript-namespacing
  • 19.
  • 20. // Globais Everywhere var User = function () {} var Company = function () {} // Tudo certo para dar errado...
  • 21. // Uma global para a todos governar var MYGLOBAL = MYGLOBAL || {}; MYGLOBAL.User = {}; MYGLOBAL.User.Admin = function () {}; MYGLOBAL.Company = function () {};
  • 23. AMD (Asyncronous Module Definition) RequireJS é a implementação mais popular http://tomdale.net/2012/01/amd-is-not-the-answer/
  • 24. define([], function () { var Robot = function () { this.init = function (battery) { this.battery = battery; } this.charge = function () { this.battery.level++; console.log(this.battery.level) } } return Robot; });
  • 25. define([], function () { var Battery = function () { this.init = function (level) { this.level = level; } } return Battery; });
  • 26. require(['battery.js', 'robot.js'], function (Source, Robot) { var source = new Source(); source.init(80); var robot = new Robot(); robot.init(source); robot.charge(); // 81 robot.charge(); // 82 });
  • 27. CommonJS Sistema de módulos do Node.js O Browserify implementa no browser
  • 29. var Battery = function () { this.init = function (level) { this.level = level; } } module.exports = Battery;
  • 30. var Robot = function () { this.init = function (battery) { this.battery = battery; } this.charge = function () { this.battery.level++; console.log(this.battery.level); } } module.exports = Robot;
  • 31. var Battery = require('./battery.js'); var Robot = require('./robot.js'); var source = new Battery(); source.init(80); var robot = new Robot(); robot.init(source); robot.charge(); // 81 robot.charge(); // 82
  • 32. Harmony Especificação do ES6 http://es6rocks.com/2014/10/es6-modules-today-with-6to5/
  • 33. var Battery = function () { this.init = function (level) { this.level = level; } } export { Battery }
  • 34. var Robot = function () { this.init = function (battery) { this.battery = battery; } this.charge = function () { this.battery.level++; console.log(this.battery.level); } } export { Robot }
  • 35. import { Battery } from 'battery.js'; import { Robot } from 'robot.js'; var source = new Battery(); source.init(80); var robot = new Robot(); robot.init(source); robot.charge(); robot.charge();
  • 36. S.O.L.I.D Princípios introduzidos pelo “Uncle Bob”
  • 37. Single Responsability Principle “Uma classe/módulo deve ter somente uma razão para mudar” http://freshbrewedcode.com/derekgreer/2011/12/08/solid-javascript-single-responsibility- principle/
  • 38.
  • 39. var SearchWidget = function () { return { init: function (el) { this.el = el; this.input = this.el.find('.search-input'); }, onData: function (data) { this.renderList(data); }, renderList: function (users) { var str = ''; users.forEach(function (user) { str += '<li>' + user.name + '</li>'; }); $('.userList').html(str); },
  • 40. get: function (query) { $.ajax({ url: 'users.json', data: { query: query } }).done(this.onData.bind(this)); }, bindClick: function () { $('.go-button').on('click', function () { var query = this.input.val(); this.get(query); }.bind(this)); } } }
  • 41. Muitas responsabilidades Hora de corrigir a lambança refatorar
  • 42. var SearchWidget = function () { return { init: function (el) { this.el = el; this.input = this.el.find('.search-input'); }, bindClick: function (callback) { this.el.find('.go-button').on('click', function () { var query = this.input.val(); callback(query); }.bind(this)); } } }
  • 43. Código difícil de ler vira problema do projeto, não é só teu ou do colega
  • 44. Sempre pense na pessoa que vai dar manutenção no seu código! @rafael_sps github.com/rssilva