Slide 1

Slide 1 text

ORGANIZANDO O Nando Vieira http://nandovieira.com.br JavaScript

Slide 2

Slide 2 text

@fnando [email protected] nandovieira.com

Slide 3

Slide 3 text

http://hellobits.com

Slide 4

Slide 4 text

http://howtocode.com.br howto.

Slide 5

Slide 5 text

http://codeplane.com.br

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

JavaScript É, atualmente, uma das linguagens de programação mais importantes do mundo.

Slide 8

Slide 8 text

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.

Slide 9

Slide 9 text

Fama Mas mesmo com essa explosão, ainda temos códigos muito ruins.

Slide 10

Slide 10 text

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.

Slide 11

Slide 11 text

#1 Aprenda JavaScript

Slide 12

Slide 12 text

JavaScript Uma linguagem extremamente poderosa e flexível.

Slide 13

Slide 13 text

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.

Slide 14

Slide 14 text

*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!

Slide 15

Slide 15 text

Aprenda a linguagem Ela não é uma linguagem tão grande e difícil como você pensa.

Slide 16

Slide 16 text

http://developer.mozilla.org

Slide 17

Slide 17 text

http://howtocode.com.br

Slide 18

Slide 18 text

http://w3scho... melhor não!

Slide 19

Slide 19 text

http://w3fools.com

Slide 20

Slide 20 text

#2 JavaScript Patterns

Slide 21

Slide 21 text

Patterns vs Standards

Slide 22

Slide 22 text

Patterns não são regras. São apenas repetições conhecidas que podem ser documentadas.

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

Module pattern Permite emular a visibilidade de métodos e atributos.

Slide 25

Slide 25 text

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.

Slide 26

Slide 26 text

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; } }; })();

Slide 27

Slide 27 text

Module pattern Permite injetar dependências.

Slide 28

Slide 28 text

jQuery.noConflict();

Slide 29

Slide 29 text

$.fn.plugin = function() { // do something }; jQuery.noConflict() restaura o valor anterior da variável global $.

Slide 30

Slide 30 text

Injetando o jQuery como dependência garantimos o funcionamento do plugin. ;(function($){ $.fn.plugin = function() { // do something }; })(jQuery);

Slide 31

Slide 31 text

Facade pattern Permite criar APIs mais simples e desacopladas, abstraindo a implementação original.

Slide 32

Slide 32 text

// jquery $("p").css({color: "red"}); // mootools $$("p").setStyle("color", "red"); // prototype $$("p").invoke("setStyle", {color: "red"}); // dojotoolkit dojo.query("p").style({color: "red"});

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

Não importa qual framework você esteja usando, a API foi abstraída. dom.find("p").css({ color: "red" });

Slide 35

Slide 35 text

A abstração pode ser extremamente complexa e trabalhosa. dom.find("p").css({ color: "red" });

Slide 36

Slide 36 text

Mediator pattern Faz a intermediação entre diferentes componentes, de modo que eles possam interagir indiretamente.

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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); }

Slide 40

Slide 40 text

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); }

Slide 41

Slide 41 text

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); };

Slide 42

Slide 42 text

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); }); };

Slide 43

Slide 43 text

Uma coisa de cada vez O seu código deve fazer uma coisa de cada vez e deve fazê-la bem!

Slide 44

Slide 44 text

"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": ""

Slide 45

Slide 45 text

.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"); } } }

Slide 46

Slide 46 text

No content

Slide 47

Slide 47 text

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!

Slide 48

Slide 48 text

Bad jQuery ou Bad developer? O jQuery é bom porque é simples de usar. Mas ele também é ruim porque é simples de usar.

Slide 49

Slide 49 text

$("#page").load("/some/file.html");

Slide 50

Slide 50 text

$("#page").load("/some/file.html"); Seleção do elemento no DOM

Slide 51

Slide 51 text

$("#page").load("/some/file.html"); Requisição AJAX

Slide 52

Slide 52 text

$("#page").load("/some/file.html"); Manipulação do DOM

Slide 53

Slide 53 text

Uma coisa de cada vez O seu código deve fazer uma coisa de cada vez e deve fazê-la bem!

Slide 54

Slide 54 text

#3 MVC/MV*

Slide 55

Slide 55 text

O pattern MVC separa as aplicações em três partes conhecidas como Model, Views e Controllers.

Slide 56

Slide 56 text

Model Gerencia os dados, persistência e regras de negócio de sua aplicação.

Slide 57

Slide 57 text

View Renderiza os modelos e permite a interação do usuário com a aplicação.

Slide 58

Slide 58 text

Controller Faz a mediação das interações do usuário com as views e modelos.

Slide 59

Slide 59 text

Existem poucas implementações que seguem o MVC proposto pela Xerox PARC à risca.

Slide 60

Slide 60 text

A maioria dos frameworks implementa uma variação (ou nem implementam).

Slide 61

Slide 61 text

MVVM Model View ViewModel Model View Presenter Model View Adapter Model View Variation MVP MVA MV*

Slide 62

Slide 62 text

No JavaScript, tivemos uma explosão de frameworks nos últimos 2 anos.

Slide 63

Slide 63 text

Existem mais de 50 frameworks que querem virar “o queridinho” dos desenvolvedores.

Slide 64

Slide 64 text

http://addyosmani.github.com/todomvc/

Slide 65

Slide 65 text

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.

Slide 66

Slide 66 text

usuário views (UI) controllers models

Slide 67

Slide 67 text

#4 DICAS GERAIS

Slide 68

Slide 68 text

Crie arquivos separados Crie diversos arquivos, cada um com sua responsabilidade. Você sempre pode concatenar os arquivos com ferramentas como o Grunt.

Slide 69

Slide 69 text

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.

Slide 70

Slide 70 text

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.

Slide 71

Slide 71 text

Testes Códigos mais simples e com menos responsabilidades são infinitamente mais simples de testar.

Slide 72

Slide 72 text

Aprenda JavaScript Você só será um desenvolvedor melhor quando realmente souber o JavaScript.

Slide 73

Slide 73 text

#4 *LIVE CODING *Não importa o quanto digam que fazer live coding sempre dá errado, eu não aprendo!

Slide 74

Slide 74 text

#5 *OBRIGADO *Aqui é a parte que vocês batem palmas (ou vaiam) e fazem perguntas (ou vão embora).