@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

Javascript Ilegível

  • 1.
  • 2.
  • 5.
    /* Comentários */ Não precisa ser o “capitão óbvio”
  • 6.
    // get aspecific user getUser: function (id) { // código aqui }
  • 7.
    Porém... … nemtodo 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ãoter 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
  • 11.
  • 12.
  • 13.
  • 14.
  • 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);
  • 18.
    Namespacing Nomear coisasnão é fácil... http://javascriptweblog.wordpress.com/2010/12/07/namespacing-in-javascript/ http://michaux.ca/articles/javascript-namespacing
  • 20.
    // Globais Everywhere var User = function () {} var Company = function () {} // Tudo certo para dar errado...
  • 21.
    // Uma globalpara a todos governar var MYGLOBAL = MYGLOBAL || {}; MYGLOBAL.User = {}; MYGLOBAL.User.Admin = function () {}; MYGLOBAL.Company = function () {};
  • 22.
  • 23.
    AMD (Asyncronous ModuleDefinition) 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 demódulos do Node.js O Browserify implementa no browser
  • 28.
  • 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 doES6 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.
  • 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/
  • 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 Horade 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 deler vira problema do projeto, não é só teu ou do colega
  • 44.
    Sempre pense napessoa que vai dar manutenção no seu código! @rafael_sps github.com/rssilva