Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Organizando o JavaScript

Organizando o JavaScript

Atualmente é comum criarmos apps que usam muito JavaScript. Infelizmente, nem sempre o código é fácil de ler ou de manter. Funções que fazem de tudo um pouco, "Callback Hell" e desorganização são problemas recorrentes. Neste palestra você verá algumas dicas de como colocar o seu JavaScript na linha.

Nando Vieira

August 24, 2012
Tweet

More Decks by Nando Vieira

Other Decks in Programming

Transcript

  1. Dos 10 repositórios mais populares do Github, 7 repositórios* são

    relacionados a JavaScript. *twitter bootstrap, node.js, jquery, html5 boilerplate, impress.js, backbone.js, chosen.
  2. Dicas Você verá algumas dicas que podem ajudar a escrever

    códigos melhores, e torná-lo um *rockstar. *Embora isso seja possível, não é uma garantia. Além disso, é melhor ser um profissional que rockstar.
  3. Conheça a linguagem *Saiba closures, funções, escopo de variáveis, this

    e como modificá-lo, pseudo-orientação a objetos, prototype e, provavelmente, muito mais coisas. *Ninguém disse que a vida seria fácil. Quando você decidiu se tornar um desenvolvedor web, assumiu o compromisso de não se tornar um dinossauro.
  4. *jQuery não é JavaScript É apenas um framework que abstrai

    e facilita a manipulação do Document Object Model. *Quero morrer quando pergunto para alguém se ele sabe JavaScript e a resposta é “Eu sei jQuery”. Pretty... jQuery não é JavaScript!
  5. var Counter = { count: 0 , increment: function() {

    this.count += 1; } , decrement: function() { this.count -= 1; } , reset: function() { this.count = 0; } }; O atributo Counter.count pode ser manipulado indiscriminadamente.
  6. A variável `count` só pode ser manipulada através de nossa

    API pública. var Counter = (function(){ var count = 0; return { increment: function() { count += 1; } , decrement: function() { count -= 1; } , reset: function() { count = 0; } , count: function() { return count; } }; })();
  7. Injetando o jQuery como dependência garantimos o funcionamento do plugin.

    ;(function($){ $.fn.plugin = function() { // do something }; })(jQuery);
  8. // jquery $("p").css({color: "red"}); // mootools $$("p").setStyle("color", "red"); // prototype

    $$("p").invoke("setStyle", {color: "red"}); // dojotoolkit dojo.query("p").style({color: "red"});
  9. function dom(selector) { this.selector = selector; }; dom.prototype.css = function(style)

    {}; dom.prototype.remove = function() {}; dom.prototype.addClass = function(className) {}; dom.prototype.removeClass = function(className) {}; dom.find = function(selector) { return new dom(selector); }; exemplo utópico
  10. Não importa qual framework você esteja usando, a API foi

    abstraída. dom.find("p").css({ color: "red" });
  11. var Chat = {}; Chat.channel = new Channel(); Chat.participants =

    new Participants(Chat.channel); Chat.messages = new Messages(Chat.channel); Chat.inputMessage = new InputMessage(Chat.channel); Chat.connection = new Connection(Chat.channel);
  12. function Participants(channel) { this.channel = channel; // Listen to the

    connected signal and add a new // user to the participants list. this.channel.on("connected", this.onConnected); // Listen to the disconnected signal and remove // user from the participants list. this.channel.on("disconnected", this.onDisconnected); }
  13. function Messages(channel) { this.channel = channel; // Listen to the

    new message signal and add message // to the list. this.channel.on("new message", this.onNewMessage); // Listen to the connected signal and tell everybody // that somebody has joined the room. this.channel.on("connected", this.onConnected); }
  14. function InputMessage(channel) { this.channel = channel; } InputMessage.prototype.send = function(message,

    user) { // Send message through WebSockets maybe // Then notify that a new message has been sent this.channel.publish("new message", message, user); };
  15. function Channel() { this.events = {}; } Channel.prototype.on = function(event,

    callback) { this.events[event] || (this.events[event] = []); this.events[event].push(callback); }; Channel.prototype.publish = function(event) { var args = [].slice.call(arguments, 1); this.events[event] || (this.events[event] = []); this.events[event].forEach(function(callback){ callback.apply(null, args); }); };
  16. Uma coisa de cada vez O seu código deve fazer

    uma coisa de cada vez e deve fazê-la bem!
  17. "invite_friends" : function() { var resizeLoader = function() { $("#loader").css("width",

    $(".places").width()); $("#loader").css("height", $(".places").height()-18); } resizeLoader(); var resizeTimer; $(window).bind('resize', function() { clearTimeout(resizeTimer); resizeTimer = setTimeout(resizeLoader, 50); }); $("a[href=#automatic_invite]").click(function(e){ SomeApp.utils.stopPropagation(e); if(!$(this).parents(".tab_title:first").is(".active")) { $(".tab_title:first") .toggleClass("active"); $(".tab_title:last") .toggleClass("active"); $("#automatic") .toggleClass("hidden"); $("#manual") .toggleClass("hidden"); } }); var suffixes = { "gmail": "@gmail.com", "yahoo": "", "live": "@hotmail.com", "other": ""
  18. .toggleClass("active"); $("#automatic") .toggleClass("hidden"); $("#manual") .toggleClass("hidden"); } }); if (location.hash ==

    '#manual_invite') { $(".tab_title:first") .toggleClass("active"); $(".tab_title:last") .toggleClass("active"); $("#automatic") .toggleClass("hidden"); $("#manual") .toggleClass("hidden"); } //mudando a aba do serviço automaticamente var service_mapping = {0: 'gmail', 1:'yahoo', 2:'live'}; var services_radio_button = ""; for (key in service_mapping) { if ($("#services")[0].places[key].checked) { services_radio_button = service_mapping[key]; } } $("#service-suffix").html(suffixes[services_radio_button]); $("#services fieldset").attr("class", services_radio_button); $("p#service_instructions").addClass("hidden"); $("#service-select").addClass("hidden"); if(services_radio_button == "yahoo") { $("p#service_instructions").removeClass("hidden"); } else if (services_radio_button == "other") { $("#service-select").removeClass("hidden"); } } }
  19. 354 linhas Redimensionamento de janelas, gerenciamento de abas, AJAX, validação,

    autenticação, criação de lista de contatos no DOM, filtros e, provavelmente, muito mais!
  20. Bad jQuery ou Bad developer? O jQuery é bom porque

    é simples de usar. Mas ele também é ruim porque é simples de usar.
  21. Uma coisa de cada vez O seu código deve fazer

    uma coisa de cada vez e deve fazê-la bem!
  22. Crie seu próprio framework Isso fará com que você entenda

    o problema a fundo e dará o conhecimento para resolver o problema. Depois jogue tudo fora.
  23. Crie arquivos separados Crie diversos arquivos, cada um com sua

    responsabilidade. Você sempre pode concatenar os arquivos com ferramentas como o Grunt.
  24. Documente o seu código Sempre que possível, documente o seu

    código. Você não vai lembrar porque fez isso na semana que vem.
  25. Injete os elementos em cada componente Em vez de assumir

    que o elemento está sempre na página, injete-o através do construtor. Isso permitirá escrever testes mais desacomplados.
  26. #4 *LIVE CODING *Não importa o quanto digam que fazer

    live coding sempre dá errado, eu não aprendo!
  27. #5 *OBRIGADO *Aqui é a parte que vocês batem palmas

    (ou vaiam) e fazem perguntas (ou vão embora).