SlideShare uma empresa Scribd logo
JavaScript Firme:
Módulos com RequireJS
e
BDD com Jasmine
André Valenti
#TDC2013 - The Developer's Conference
#QConSP
São Paulo - SP
André Valenti
Professor de Ensino Tecnológico no
IFSP São Carlos
Sobre mim
Sobre mim
● Desenvolvedor durante 4,5 anos
● Principais experiências:
○ Java
○ JavaScript / Node.js / CoffeeScript
○ Jogos HTML5
○ Groovy / Grails
○ PostgreSQL
Pergunta:
● Você tem medo de alterar seu projeto?
Estrutura
● Projetos crescem
● Alterações são inevitáveis
● Firme na base, flexível no topo
Firmeza
estrutura_firme ⇒ sossego
Firmeza
estrutura_firme ⇒ sossego (mentira!)
¬estrutura_firme ⇒ ¬sossego (verdade)
estrutura_firme tende a⇒ sossego (verdade)
Estrutura
● Sintomas de base frouxa:
○ Criar novo módulo dá muito trabalho
○ Alterações de negócio quebram o projeto
● Sintomas de topo engessado:
○ Evoluir código dá muito trabalho
○ Refatorar dá muito trabalho
JavaScript
Linguagem de programação com uma certa
importância...
JavaScript
Das linguagem usadas pelos projetos
hospedados no GitHub, JavaScript é primeira,
representando 21% do total.
As próximas são: Ruby (12%), Java (8%), Shell
(8%), Python (8%), PHP (7%), C (6%), C++
(5%), Perl (4%) e CoffeeScript (3%).
https://github.com/languages
JavaScript
Orientação a Objetos em JavaScript:
JavaScript
Uma classe chamada MinhaClasse, com um campo
chamado valor, do tipo int, privado; um método
chamado metodo1, público, sem parâmetros, sem valor
de retorno; um método chamado metodo2, público, com
2 parâmetros do tipo int, com retorno do tipo int.
JavaScript
function MinhaClasse(valor) {
this._valor = valor;
}
JavaScript
function MinhaClasse(valor) {
this._valor = valor;
}
MinhaClasse.prototype.metodo1 = function() {
};
JavaScript
function MinhaClasse(valor) {
this._valor = valor;
}
MinhaClasse.prototype.metodo1 = function() {
};
MinhaClasse.prototype.metodo2 = function(a, b) {
return this._valor + a + b;
};
JavaScript
function MinhaClasse(valor) {
this._valor = valor;
}
MinhaClasse.prototype.metodo1 = function() {
};
MinhaClasse.prototype.metodo2 = function(a, b) {
return this._valor + a + b;
};
new MinhaClasse(1).metodo2(3, 4);
JavaScript
Exemplo: jogo de xadrez
JavaScript
● Como organizar o código?
● Como estruturar o projeto?
"Cria logo um HTML aí e manda ver!"
(MacGyver)
xadrez-macgyver-1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Título da Página</title>
</head>
<body>
<h1>Título da Página</h1>
<script>
// Seu código JavaScript aqui!
</script>
</body>
</html>
xadrez-macgyver-1
Em pouco tempo, seu projeto ficará assim:
xadrez-macgyver-1
(código imenso dentro do HTML)
JavaScript
● Dá para melhorar isso aí!
● De que jeito?
"Cria uns .js, mete uns <script> e já era!"
(MacGyver)
xadrez-macgyver-2
<html>
<head> ... </head>
<body> ...
<script src="js/src/Jogador.js"></script>
<script src="js/src/Posicao.js"></script>
<script src="js/src/Xadrez.js"></script>
<script src="js/src/xadrez-main.js"></script>
</body>
</html>
xadrez-macgyver-(1|2)
Código dos projetos disponível no GitHub:
git clone https://github.com/awvalenti/javascript-firme.git
cd javascript-firme/xadrez-macgyver-1
cd javascript-firme/xadrez-macgyver-2
xadrez-macgyver-(1|2)
● Problemas:
○ Exige ficar acrescentando <script>
○ Cria globais (variáveis, funções, classes)
○ Dependências ficam mascaradas
○ Forte tendência a acoplamento
○ Não vai rodar no NodeJS
RequireJS
● http://requirejs.org/
● Gestor de módulos
● Compatível com navegadores e com NodeJS
RequireJS
● Deixa claras as dependências
● Evita globais
● Ajuda a reduzir acoplamento
● Carrega scripts automaticamente
Sem RequireJS
// MinhaClasse.js
function MinhaClasse() {
this._objeto1 = new Classe1();
this._objeto2 = new Classe2();
}
// Problemas:
// - dependências implícitas: Classe1 e Classe2
//
// - obrigatoriedade de elementos <script> no HTML
//
// - globais: Classe1, Classe2 e MinhaClasse
Com RequireJS
// MinhaClasse.js
define(['Classe1', 'Classe2'], // dependências explícitas
function(Classe1, Classe2) {
function MinhaClasse() {
// tudo é importado automaticamente
this._objeto1 = new Classe1();
this._objeto2 = new Classe2();
}
MinhaClasse.prototype.meuMetodo = function() {};
return MinhaClasse; // não gera globais
});
Sem RequireJS
<html>
<head> ... </head>
<body> ...
<script src="js/src/Jogador.js"></script>
<script src="js/src/Posicao.js"></script>
<script src="js/src/Xadrez.js"></script>
<script src="js/src/xadrez-main.js"></script>
</body>
</html>
Com RequireJS
<html>
<head> ... </head>
<body> ...
<script src="js/lib/require.js"
data-main="js/src/xadrez-main.js"></script>
</body>
</html>
xadrez-modular
git clone https://github.com/awvalenti/javascript-firme.git
cd javascript-firme/xadrez-modular
Modelagem
Xadrez pode ser modelado de várias maneiras...
Modelagem 1
Classes: Xadrez, Jogador
Modelagem 2
Classes: Jogador, Tabuleiro, Casa, Peça,
TipoPeça
Modelagem 3
Classes: Jogador, Time, CorTime, Tabuleiro,
Peça, TipoPeça
Modelagem
● Perguntas:
○ Qual das três é mais adequada?
○ As classes estão boas assim?
○ Será útil ter a classe Jogador desde já?
Modelagem
● São perguntas difíceis de se responder...
Modelagem
● São perguntas difíceis de se responder...
● ...no início do projeto!
BDD
● http://en.wikipedia.org/wiki/Behavior-
driven_development
● Especificação de comportamentos antes de
implementar funcionalidades
● Requisitos guiando o design de código, de
maneira incremental
● APIs sendo criadas antes de implementações
Jasmine
● http://pivotal.github.io/jasmine/
● Framework para BDD em JavaScript
● Roda tanto no navegador quanto no NodeJS
● Escrevem-se specs usando-se describe e it
Jasmine
describe('MeuObjeto', function() {
describe('no cenario XYZ', function() {
it('deve comportar-se da maneira W', function() {
expect(meuObjeto.getOQueEstaFazendo()).toBe('W');
});
it('deve acontecer tal outra coisa', function() {
expect(meuObjeto.getTalOutraCoisa()).toBe(true);
});
});
});
Jasmine
● Na verdade, usa-se também um beforeEach
para criar o objeto:
Jasmine
describe('MeuObjeto', function() {
var meuObjeto = null;
beforeEach(function() {
meuObjeto = new MeuObjeto();
});
describe('no cenario XYZ', function() {
it('deve comportar-se da maneira W', function() {
expect(meuObjeto.getOQueEstaFazendo()).toBe('W');
});
it('deve acontecer tal outra coisa', function() {
expect(meuObjeto.getTalOutraCoisa()).toBe(true);
});
});
});
Exemplo padrão do Jasmine
git clone https://github.com/awvalenti/javascript-firme.git
cd javascript-firme/exemplo-padrao-jasmine
(ou https://github.com/downloads/pivotal/jasmine/jasmine-standalone-1.3.1.zip)
xadrez-especificado
git clone https://github.com/awvalenti/javascript-firme.git
cd javascript-firme/xadrez-especificado
xadrez-modular-e-especificado
git clone https://github.com/awvalenti/javascript-firme.git
cd javascript-firme/xadrez-modular-e-especificado
Conclusões
● Firme na base, flexível no topo
● Fazer sem estrutura…
○ ...funciona no começo, depois capenga
○ (experiência própria!)
Conclusões
Não seja MacGyver, seja Profissional!
Conclusões
MacGyvers têm mais dor de cabeça
MacGyver: "I really hope this works... Trust me, I know about this stuff."
Conclusões
Profissionais têm mais sossego
Neo: "Sussa."
Obrigado!
● André Valenti ("Fi")
● São Carlos-SP
● Professor no IFSP
● Contato:
○ E-mail: awvalenti@gmail.com
○ Twitter: @awvFi
○ Blog: aosfi.blogspot.com
○ SlideShare: slideshare.net/AndrFi

Mais conteúdo relacionado

PDF
#Qualidade decodigo
PDF
Piadas de CSS e Javascript
PPTX
Metodologias ágeis no desenvolvimento Wordpress
PPTX
A transformação ágil com scrum
PPTX
Práticas para Melhorar o seu Desenvolvimento Front-End
ODP
Django - Muito além do básico
PDF
(A17) LabMM3 - Planificação de projeto e tópicos avançados de tecnologias Web
PDF
Joomla! do desktop ao datacenter
#Qualidade decodigo
Piadas de CSS e Javascript
Metodologias ágeis no desenvolvimento Wordpress
A transformação ágil com scrum
Práticas para Melhorar o seu Desenvolvimento Front-End
Django - Muito além do básico
(A17) LabMM3 - Planificação de projeto e tópicos avançados de tecnologias Web
Joomla! do desktop ao datacenter

Mais procurados (20)

PDF
POG nunca mais - SOLISC
PPTX
Dando Start na Carreira Deeva
PDF
It skills para rh aprender e contratar
PDF
Mini Curso Android basico EATI-2017
PDF
O que move a web atualmente?
PDF
Mecanismo de busca em Node.js e MongoDB
PDF
Construindo um framework CSS
PPTX
O Spring está morto! Viva o Spring!
PDF
Mapa de aprendizado Front End
PDF
5 Pontos sobre desenvolvimento de software
PDF
Do código à produção com Gitlab (mundo python)
PDF
PostgreSQL Wonderland TDC-SP 2015
ODP
"Mas eu não tenho experiência..." E daí??? - Como quebrar o ciclo vicioso de...
KEY
Desenvolvendo Aplicações com Zend Framework
PDF
Tunning jvm em java 8
PPT
Um front end entre nós
KEY
Sistemas para o Mundo Real
ODP
Rubysoc final RubyConfBR
PDF
Composição e Integração de Sistemas em 2013
PDF
Desenvolvimento ágil do jeito certo
POG nunca mais - SOLISC
Dando Start na Carreira Deeva
It skills para rh aprender e contratar
Mini Curso Android basico EATI-2017
O que move a web atualmente?
Mecanismo de busca em Node.js e MongoDB
Construindo um framework CSS
O Spring está morto! Viva o Spring!
Mapa de aprendizado Front End
5 Pontos sobre desenvolvimento de software
Do código à produção com Gitlab (mundo python)
PostgreSQL Wonderland TDC-SP 2015
"Mas eu não tenho experiência..." E daí??? - Como quebrar o ciclo vicioso de...
Desenvolvendo Aplicações com Zend Framework
Tunning jvm em java 8
Um front end entre nós
Sistemas para o Mundo Real
Rubysoc final RubyConfBR
Composição e Integração de Sistemas em 2013
Desenvolvimento ágil do jeito certo
Anúncio

Semelhante a JavaScript Firme: Módulos com RequireJS e BDD com Jasmine (20)

PDF
Visao geralti netshoes03
PDF
Visao geralti netshoes03
PPTX
Behaviour driven development, com jbehave
KEY
O que vi na QCon 2012 São Paulo
PDF
PHPZEIRO: Adote um framework
PPTX
Como desenvolver com um sistema com um front-end colossal?
PDF
Lightning Talk: Webdev who?
PDF
Desenvolvendo com Dojo Toolkit
PPT
Introdução ao XP
PPTX
A Evolução do Front end
PDF
Como encarar o desenvolvimento front-end
PDF
JavaScript: uma visão geral da linguagem e seu ecossistema
PPTX
Encontrando equilíbrio do DDD enquanto sua aplicação cresce
PDF
Palestra nosql
PDF
TDC2012: Apps RIA com Sencha GXT 3 e GWT
PDF
Javascript aula 01 - visão geral
PDF
Dividindo responsabilidades com VRaptor, Rest, HTML5 e CSS3
PDF
LabMM 3: Documentação de planificação
PDF
Criando software para o futuro com DDD, Arquitetura, Patterns, e Atitude
ODP
Conhecendo o Nodejs
Visao geralti netshoes03
Visao geralti netshoes03
Behaviour driven development, com jbehave
O que vi na QCon 2012 São Paulo
PHPZEIRO: Adote um framework
Como desenvolver com um sistema com um front-end colossal?
Lightning Talk: Webdev who?
Desenvolvendo com Dojo Toolkit
Introdução ao XP
A Evolução do Front end
Como encarar o desenvolvimento front-end
JavaScript: uma visão geral da linguagem e seu ecossistema
Encontrando equilíbrio do DDD enquanto sua aplicação cresce
Palestra nosql
TDC2012: Apps RIA com Sencha GXT 3 e GWT
Javascript aula 01 - visão geral
Dividindo responsabilidades com VRaptor, Rest, HTML5 e CSS3
LabMM 3: Documentação de planificação
Criando software para o futuro com DDD, Arquitetura, Patterns, e Atitude
Conhecendo o Nodejs
Anúncio

Mais de André Willik Valenti (6)

PDF
Usabilidade de Ferramentas
PPT
Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)
PPT
Minicurso Encoding - TDC2012
PDF
Minicurso encoding
PDF
Minicurso de Expressões Regulares
PDF
Minicurso de jQuery
Usabilidade de Ferramentas
Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)
Minicurso Encoding - TDC2012
Minicurso encoding
Minicurso de Expressões Regulares
Minicurso de jQuery

Último (19)

PPTX
Aula 18 - Manipulacao De Arquivos python
PDF
Apple Pippin Uma breve introdução. - David Glotz
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PDF
Aula04-Academia Heri- Tecnologia Geral 2025
PDF
Processos na gestão de transportes, TM100 Col18
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PDF
COBITxITIL-Entenda as diferença em uso governança TI
Aula 18 - Manipulacao De Arquivos python
Apple Pippin Uma breve introdução. - David Glotz
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Custos e liquidação no SAP Transportation Management, TM130 Col18
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Aula04-Academia Heri- Tecnologia Geral 2025
Processos na gestão de transportes, TM100 Col18
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
COBITxITIL-Entenda as diferença em uso governança TI

JavaScript Firme: Módulos com RequireJS e BDD com Jasmine