SlideShare una empresa de Scribd logo
1 de 54
Descargar para leer sin conexión
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

Más contenido relacionado

La actualidad más candente

It skills para rh aprender e contratar
It skills para rh  aprender e contratarIt skills para rh  aprender e contratar
It skills para rh aprender e contratarAle Uehara
 
Mini Curso Android basico EATI-2017
Mini Curso Android basico EATI-2017Mini Curso Android basico EATI-2017
Mini Curso Android basico EATI-2017Jonathan Filho
 
O que move a web atualmente?
O que move a web atualmente?O que move a web atualmente?
O que move a web atualmente?Fabio Janiszevski
 
Mecanismo de busca em Node.js e MongoDB
Mecanismo de busca em Node.js e MongoDBMecanismo de busca em Node.js e MongoDB
Mecanismo de busca em Node.js e MongoDBLuiz Duarte
 
Construindo um framework CSS
Construindo um framework CSSConstruindo um framework CSS
Construindo um framework CSSDiego Eis
 
Mapa de aprendizado Front End
Mapa de aprendizado Front EndMapa de aprendizado Front End
Mapa de aprendizado Front EndCaio Vaccaro
 
5 Pontos sobre desenvolvimento de software
5 Pontos sobre desenvolvimento de software5 Pontos sobre desenvolvimento de software
5 Pontos sobre desenvolvimento de softwareMiguel Alho
 
Do código à produção com Gitlab (mundo python)
Do código à produção com Gitlab (mundo python)Do código à produção com Gitlab (mundo python)
Do código à produção com Gitlab (mundo python)Better Developer
 
"Mas eu não tenho experiência..." E daí??? - Como quebrar o ciclo vicioso de...
 "Mas eu não tenho experiência..." E daí??? - Como quebrar o ciclo vicioso de... "Mas eu não tenho experiência..." E daí??? - Como quebrar o ciclo vicioso de...
"Mas eu não tenho experiência..." E daí??? - Como quebrar o ciclo vicioso de...Julio Cesar Nunes de Souza
 
Desenvolvendo Aplicações com Zend Framework
Desenvolvendo Aplicações com Zend FrameworkDesenvolvendo Aplicações com Zend Framework
Desenvolvendo Aplicações com Zend FrameworkDomingos Teruel
 
Tunning jvm em java 8
Tunning jvm em java 8Tunning jvm em java 8
Tunning jvm em java 8Luan Cestari
 
Sistemas para o Mundo Real
Sistemas para o Mundo RealSistemas para o Mundo Real
Sistemas para o Mundo RealLeandro Silva
 
Rubysoc final RubyConfBR
Rubysoc final RubyConfBRRubysoc final RubyConfBR
Rubysoc final RubyConfBRtchandy
 
Composição e Integração de Sistemas em 2013
Composição e Integração de Sistemas em 2013Composição e Integração de Sistemas em 2013
Composição e Integração de Sistemas em 2013Leandro Silva
 
Desenvolvimento ágil do jeito certo
Desenvolvimento ágil do jeito certoDesenvolvimento ágil do jeito certo
Desenvolvimento ágil do jeito certoMarcos Petry
 

La actualidad más candente (20)

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

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

Visao geralti netshoes03
Visao geralti netshoes03Visao geralti netshoes03
Visao geralti netshoes03Ale Uehara
 
Behaviour driven development, com jbehave
Behaviour driven development, com jbehaveBehaviour driven development, com jbehave
Behaviour driven development, com jbehaveMarcelo Zeferino
 
O que vi na QCon 2012 São Paulo
O que vi na QCon 2012 São PauloO que vi na QCon 2012 São Paulo
O que vi na QCon 2012 São PauloIsmael
 
Como desenvolver com um sistema com um front-end colossal?
Como desenvolver com um sistema com um front-end colossal?Como desenvolver com um sistema com um front-end colossal?
Como desenvolver com um sistema com um front-end colossal?Mozart Diniz
 
Lightning Talk: Webdev who?
Lightning Talk: Webdev who?Lightning Talk: Webdev who?
Lightning Talk: Webdev who?Leandro Nunes
 
Desenvolvendo com Dojo Toolkit
Desenvolvendo com Dojo ToolkitDesenvolvendo com Dojo Toolkit
Desenvolvendo com Dojo ToolkitFlávio Lisboa
 
A Evolução do Front end
A Evolução do Front endA Evolução do Front end
A Evolução do Front endDouglas Matoso
 
Como encarar o desenvolvimento front-end
Como encarar o desenvolvimento front-endComo encarar o desenvolvimento front-end
Como encarar o desenvolvimento front-endJean Carlo Emer
 
JavaScript: uma visão geral da linguagem e seu ecossistema
JavaScript: uma visão geral da linguagem e seu ecossistemaJavaScript: uma visão geral da linguagem e seu ecossistema
JavaScript: uma visão geral da linguagem e seu ecossistemaFabio Agostinho Boris
 
Encontrando equilíbrio do DDD enquanto sua aplicação cresce
Encontrando equilíbrio do DDD enquanto sua aplicação cresceEncontrando equilíbrio do DDD enquanto sua aplicação cresce
Encontrando equilíbrio do DDD enquanto sua aplicação cresceCarolina Karklis
 
TDC2012: Apps RIA com Sencha GXT 3 e GWT
TDC2012: Apps RIA com Sencha GXT 3 e GWTTDC2012: Apps RIA com Sencha GXT 3 e GWT
TDC2012: Apps RIA com Sencha GXT 3 e GWTLoiane Groner
 
Dividindo responsabilidades com VRaptor, Rest, HTML5 e CSS3
Dividindo responsabilidades com VRaptor, Rest, HTML5 e CSS3Dividindo responsabilidades com VRaptor, Rest, HTML5 e CSS3
Dividindo responsabilidades com VRaptor, Rest, HTML5 e CSS3André Luiz Forchesatto
 
LabMM 3: Documentação de planificação
LabMM 3: Documentação de planificaçãoLabMM 3: Documentação de planificação
LabMM 3: Documentação de planificaçãoCarlos Santos
 
Criando software para o futuro com DDD, Arquitetura, Patterns, e Atitude
Criando software para o futuro com DDD, Arquitetura, Patterns, e AtitudeCriando software para o futuro com DDD, Arquitetura, Patterns, e Atitude
Criando software para o futuro com DDD, Arquitetura, Patterns, e AtitudePablo Dall'Oglio
 
Conhecendo o Nodejs
Conhecendo o NodejsConhecendo o Nodejs
Conhecendo o NodejsCaio Cutrim
 

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

Visao geralti netshoes03
Visao geralti netshoes03Visao geralti netshoes03
Visao geralti netshoes03
 
Visao geralti netshoes03
Visao geralti netshoes03Visao geralti netshoes03
Visao geralti netshoes03
 
Behaviour driven development, com jbehave
Behaviour driven development, com jbehaveBehaviour driven development, com jbehave
Behaviour driven development, com jbehave
 
O que vi na QCon 2012 São Paulo
O que vi na QCon 2012 São PauloO que vi na QCon 2012 São Paulo
O que vi na QCon 2012 São Paulo
 
PHPZEIRO: Adote um framework
PHPZEIRO: Adote um frameworkPHPZEIRO: Adote um framework
PHPZEIRO: Adote um framework
 
Como desenvolver com um sistema com um front-end colossal?
Como desenvolver com um sistema com um front-end colossal?Como desenvolver com um sistema com um front-end colossal?
Como desenvolver com um sistema com um front-end colossal?
 
Lightning Talk: Webdev who?
Lightning Talk: Webdev who?Lightning Talk: Webdev who?
Lightning Talk: Webdev who?
 
Desenvolvendo com Dojo Toolkit
Desenvolvendo com Dojo ToolkitDesenvolvendo com Dojo Toolkit
Desenvolvendo com Dojo Toolkit
 
Introdução ao XP
Introdução ao XPIntrodução ao XP
Introdução ao XP
 
A Evolução do Front end
A Evolução do Front endA Evolução do Front end
A Evolução do Front end
 
Como encarar o desenvolvimento front-end
Como encarar o desenvolvimento front-endComo encarar o desenvolvimento front-end
Como encarar o desenvolvimento front-end
 
JavaScript: uma visão geral da linguagem e seu ecossistema
JavaScript: uma visão geral da linguagem e seu ecossistemaJavaScript: uma visão geral da linguagem e seu ecossistema
JavaScript: uma visão geral da linguagem e seu ecossistema
 
Encontrando equilíbrio do DDD enquanto sua aplicação cresce
Encontrando equilíbrio do DDD enquanto sua aplicação cresceEncontrando equilíbrio do DDD enquanto sua aplicação cresce
Encontrando equilíbrio do DDD enquanto sua aplicação cresce
 
Palestra nosql
Palestra nosqlPalestra nosql
Palestra nosql
 
TDC2012: Apps RIA com Sencha GXT 3 e GWT
TDC2012: Apps RIA com Sencha GXT 3 e GWTTDC2012: Apps RIA com Sencha GXT 3 e GWT
TDC2012: Apps RIA com Sencha GXT 3 e GWT
 
Javascript aula 01 - visão geral
Javascript   aula 01 - visão geralJavascript   aula 01 - visão geral
Javascript aula 01 - visão geral
 
Dividindo responsabilidades com VRaptor, Rest, HTML5 e CSS3
Dividindo responsabilidades com VRaptor, Rest, HTML5 e CSS3Dividindo responsabilidades com VRaptor, Rest, HTML5 e CSS3
Dividindo responsabilidades com VRaptor, Rest, HTML5 e CSS3
 
LabMM 3: Documentação de planificação
LabMM 3: Documentação de planificaçãoLabMM 3: Documentação de planificação
LabMM 3: Documentação de planificação
 
Criando software para o futuro com DDD, Arquitetura, Patterns, e Atitude
Criando software para o futuro com DDD, Arquitetura, Patterns, e AtitudeCriando software para o futuro com DDD, Arquitetura, Patterns, e Atitude
Criando software para o futuro com DDD, Arquitetura, Patterns, e Atitude
 
Conhecendo o Nodejs
Conhecendo o NodejsConhecendo o Nodejs
Conhecendo o Nodejs
 

Más de André Willik Valenti

Más de André Willik Valenti (6)

Usabilidade de Ferramentas
Usabilidade de FerramentasUsabilidade de Ferramentas
Usabilidade de Ferramentas
 
Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)
Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)
Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)
 
Minicurso Encoding - TDC2012
Minicurso Encoding - TDC2012Minicurso Encoding - TDC2012
Minicurso Encoding - TDC2012
 
Minicurso encoding
Minicurso encodingMinicurso encoding
Minicurso encoding
 
Minicurso de Expressões Regulares
Minicurso de Expressões RegularesMinicurso de Expressões Regulares
Minicurso de Expressões Regulares
 
Minicurso de jQuery
Minicurso de jQueryMinicurso de jQuery
Minicurso de jQuery
 

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