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.

Avatar for Nando Vieira

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).