Mvc e o Javascript – Introducing Jails

Olá meus caros,

Há um tempo atrás havia começado uma discussão sobre como imaginava uma aplicação usando o design pattern MVC no javascript. Uma das coisas que havia comentado é que achava que o MVC no javascript não deveria ser tão complexo quanto é nas aplicações back-end e que para mim, o MVC no javascript deveria ser visto apenas como uma maneira de organização.

Mostrei como fazer uma simples aplicação back-end usando meu porco conhecimento em php, mostrando que não é necessário refazer um site, ou ter retrabalho para fazer uma aplicação que funcione com ou sem javascript.

Pensando nas coisas que havia comentado, comecei a pesquisar sobre como funcionavam os mais famosos frameworks do mercado, Cake, Rails, .NET MVC, CodeIgniter e alguns outros não tão conhecidos. Também pesquisei sobre os frameworks em javascript que também eram no esquema de Model, Views e Controllers.

Confesso que não gostei muitos dos frameworks javascript que pesquisei, muitos usavam uns esquemas de compilação de código, código em linha de comando para gerar um scaffold etc, tentativas de copiar a maneira como funciona o Rails. Outros tinham muita coisa a ser baixada, às vezes vinham com scripts de teste unitário e tudo mais… Para mim, é tudo uma tentativa de copiar as coisas que já existem em back-end para o front. Com isso a carga de arquivos necessários para fazer uma aplicação funcionar faz com que não compense montar sua aplicação em MVC principalmente se for um site simples.

Portanto, voltei novamente aos drafts passados, aqueles que eu havia postado e vi que para mim era aquele mesmo o caminho, deveria ser uma coisa bem simples, fácil de mexer, intuitivo e ao mesmo tempo escalável. Então montei algumas aplicações usando estes drafts e padronizei o código, construí métodos simples e úteis que eram sempre necessários e dentro desses padrões que sempre persistiam em se repetir montei o que eu acabei chamando de “Jails” . =D Taráaaaaaaaaaaaaa \o/

É claro que o nome Jails é uma brincadeira com o nome Rails porém tem a mesma intenção, colocar o Javascript na direção que considero certa. Portanto Jails significaria Javascript on Rails. Ele não é uma cópia do Rails, mas sofreu uma forte influência e inspiração. Usei alguns frameworks de diferentes linguagens e me baseei neles. O Jails é um grande objeto que pode ser incrementado com plugins e que já vem com alguns poucos plugins acoplados por padrão ou seja, uma aplicação escalável =).

Como o Jails enxerga sua aplicação?

Model : O que é json, dados que necessitam de alguma persistência.

View : Os elementos da tela, eventos, dom, tudo o que está no seu documento.

Controllers : Controladoras de requisições de ações que podem ou não influenciar sua Model, são como se fossem requisições como as que fazemos ao server, normalmente chamam os métodos da View.

– Rotas: Utiliza “Rotas” como os frameworks mais famosos costumam usar, no caso do Javascript, as rotas são usadas com hashs, ex: “#/home”.

Aos códigos então..

Nossa aplicação começa com uma variável global do nosso projeto, que carregará as Models, Views e Controllers. No meu exemplo vou chamar de App. Sempre começando com a Model.

/**
 * @class Model
 */

;(function(global){

	global.App = {};

	Jails.extend('Model', App.Model = {
		data   :{}
	});

})(window)

Aí eu inicío a aplicação como uma variável global, inicio o Model como uma propriedade da App e estendo a Model usando o Jails.
Depois a View:

;(function(Model){
    
    var 
	body,
	template = {
		message :'<h1><strong>@{message}</strong></h1>'
	};

	Jails.extend('View', App.View = {
		
		initialize :function(){
		    body = $('body');
		},
		
		print :function(msg){
		    var m = this.inject({ message :msg }, template.message);
		    body.html(m);
		},

		hello_world :function(param){
		   this.print('Hello World, My Jails Mvc Project!!! { ' +(param||'')+ ' }'); 
		}

	});

})(App.Model)

Passo na chamada do closure App.Model, lá embaixo do código, para poder usar a variável Model, mais sucinta. Toda View precisa de um método initialize que será chamado automaticamente e servirá para setar variáveis iniciais, como eu fiz.

Os outros métodos e o objeto template foram criados conforme minha necessidade. As Views quando estendidas recebem uma função bem útil chamada .inject(). Esse método pega um json como primeiro parâmetro e uma string como segundo parâmetro.

Ele vai pegar a chave do json procurar pela chave na string no padrão @{chave} e substituir pelo valor desta chave. Precisei deste método em TODAS as aplicações que usei o Jails.

E por último, a controller:

/**
 * @class Controller
 */
;(function(Model, View){
    
	Jails.extend('Controller', App.Controller = {

		index :function(param){
			View.hello_world( param );
		}

	});

})(App.Model, App.View)

Aqui, passo os dois objetos já existentes, a View e a Model para a controller como parâmetro e utilizo variáveis de mesmo nome mais sucintas nos parâmetros formais do nosso closure.

Novamente é estendido nosso objeto App, adicionando um novo objeto Controller. Aqui irão as actions que serão disparadas de acordo com nossas requisições. Apenas tenho uma action “Index” na aplicação e nela eu chamo o método hello_world da nossa view, passando um parâmetro como argumento, esse método da View vai pegar o parâmetro e substituir na string da variavel “template” (lá na nossa View).

Eu costumo deixar os três em arquivos separados, muito mais fácil a manutenção.

Beleza, mas agora quem decide qual action chamar ?

As actions são chamadas de acordo com a nossa url que possui um hash, portanto, isso será definido nas rotas:

/**
 * @singleton Routes
 */
;(function( namespace, App ){

	namespace.routes = [	
	
		{ '#!/:param' :function(param){
			App.Controller.index( param );
		}}

	]; 
		
})(Jails, App)

As rotas ficam direto no Jails, não no nosso App. Então passo dois parâmetros no nosso closure, Jails e App.

Elas são um vetor com rotas definidas para serem pegas da url cada vez que a url mudar, esse vetor tem como regra os itens de maior prioridade mais próximos do índice zero. Então a url mais importante deve ser a que estiver no topo.

A partir desta rota nós decidimos qual controller e qual action será chamada. No nosso exemplo acima, cada vez que acessarmos a url !#/:param, a Controller da nossa App dispará a action index passando aquele parâmetro como argumento.

:param não é uma palavra chave, nem na rota nem no parâmetro da função, você como programador decide qual nome chamar, desde que essa variável comece com “:”.

E por último, para decidir visitar essas url’s o Jails possui um objeto .url que contém métodos para nos direcionar às urls e actions que precisamos.

Se quiséssemos acessar a “home” fariámos:

Jails.url.redirect('home');

O método redirect é sobrecarregado, e podemos usá-lo também passando um objeto:

Jails.url.redirect( {home :'Pedro' })

Isso redirecionaria para a url : “/home/pedro”.

Poderíamos também usar string e objeto:

Jails.url.redirect('/sessao', {home :'Pedro'} )

Nos redirecionando para “/sessao/home/pedro”.
Isso é muito útil pois sempre estamos trabalhando com json no javascript, dependendo da ocasião, precisamos acessar a url dependendo de alguma propriedade de um objeto, esta forma quebra um galho, para que não precise iterar nada.

O Jails também possui a propriedade .params. Ela recupera os parâmetros usados na url, estes parâmetros são os que definimos nas rotas.

É…cansativa a leitura eu admito, o Jails pode fazer algumas outras coisas interessantes, mas para o começo cobri o necessário para explicar como utilizo o esquema MVC utilizando esse mini-framework. Após muitos testes muitas refatorações, o código ficou bem pequeno, o que era minha maior preocupação, deixá-lo bem leve e ao mesmo tempo poderoso suficiente para organizar e facilitar a codificação.

Esse post é o começo, nos próximos vou mostrar alguns métodos interessantes, alguma aplicações na vida real, pretendo também fazer um screencast para mostrar o quão fácil e intuitivo ficou programar as aplicações, principalmente que as que utilizam ajax.

Por enquanto, para quem não quiser esperar, pode baixar ou dar uma olhada no projeto, hospedado no svn do google: http://javiani-jails.googlecode.com/svn/trunk/site/index.htm

[update] A pedido do Maurício, para facilitar o compartilhamento do projeto, criei o github:
https://github.com/Javiani/Jails

A documentação utiliza o Jails, assim como a nova documentação do Validator. Gostei tanto da codificação do Jails, que padronizei usando essa plataforma para todas as documentações dos meus projetos. =D.

Fiquem à vontade para criticar, sugerir algo =). Prometo que os próximos posts serão melhores, principalmente o screencast.

Um grande abraço!

Anúncios

Walking Again…

Fazanos hein meus queridos….

Estava há muito tempo sem postar, mas graças à Deus por bons motivos. Às vezes gostamos tanto do que fazemos que acabamos esquecendo de viver a vida… Por muito tempo deixei minha vida social de lado, me dedicando apenas à faculdade e ao trabalho. Isso é muito ruim…porque trabalho nós achamos outro, dinheiro nós conseguimos de uma forma ou de outra, mas infelizmente não conseguimos recuperar o tempo que perdemos… E quanto mais velhos ficamos mais isso pesa. O tempo pesa. Mais do que recuperar o tempo perdido, o difícil é aprender o que deixamos de aprender com experiências de coisas mais corriqueiras, depois de velho.

Nesses últimos anos tenho me tornado cada dia mais sênior no meu trabalho e mais júnior na vida pessoal e acadêmica…Você quando chega nesse estágio, já recusou muitas festas, muitos bares, muitas baladas porque está “cansado demais”.

Se eu pudesse dar um conselho para qualquer pessoa é que ache o equilíbrio entre as duas coisas, esse equilíbrio existe e estou começando a encontrar apenas agora. Você pode e consegue achar tempo para tudo, mesmo estudando, trabalhando, namorando, fazendo academia ao mesmo tempo, você deve conseguir tempo para tudo e precisa encontrar tempo para tudo.

Todo mundo se pergunta quem de fato é em algum momento da vida, se é nerd, se é descolado, se é isso se é aquilo, e acaba querendo ser muitas vezes aquilo que não é, para se encaixar no que é mais “Legal”. Estava passando por esta fase, e deixei de ser aquilo que eu realmente era, comecei a perder tempo na vida social e na vida profissional. Porque eu sou daquele tipo de pessoa que prefere sempre acreditar nas coisas ruins que falam sobre nós, não sei se você também é assim. Isso é muito prejudicial, porque você vai ouvir coisas boas e muitas coisas ruins de outras pessoas, inclusive daquelas que você julga ser seus amigos.

Como eu ouvi coisas do tipo: “Você nunca vai conseguir…”, “Não é para você”, “Você é isso”, “Você é aquilo” . Você acaba desistindo de muita coisa ou deixando de conseguir muitas coisas…antes mesmo de tentar. As pessoas não gostam de ter alguém que tenha mais coisas ou que consiga mais coisas do que elas, uma forma de tentar sabotar isso é te falar o quão nada você é.

Sempre ouvi nos meios de comunicação sobre “Você precisa acreditar mais em você” ou “Não ligue para o que os outros pensam” coisas desse tipo. Para mim eram apenas frases clichês que todo mundo que conseguia alguma coisa ou conseguia chegar à algum lugar, falava para desabafar. Hoje isso faz muito sentido e acabo percebendo que aquilo que eu havia dito no parágrafo acima é verdade não só para mim como para todo mundo.

O fato é que você pode ser o que quiser ser, mas o mais importante é fazer o que gosta e deixar os esteriótipos de lado. Era o que eu estava fazendo nesse tempo todo longe do blog, correndo atrás de muitas coisas que havia deixado de lado. Comecei a perceber, que poderia conseguir ser bem sucedido na vida social, na vida profissional, na vida acadêmica se quisesse, pra isso precisava esquecer tudo aquilo que ouvi e ouço e comecei a fazer tudo o que senti vontade de fazer . E estou fazendo.

Não vou dizer que me dei bem em tudo e estou com a vida perfeita, mas enfrento os fracassos e decepções muito mais do que antes e isso é EXTREMAMENTE IMPORTANTE para ser bem sucedido em qualquer coisa. Você precisa fracassar, você precisa saber enfrentar as coisas para poder ter coragem de ousar. Se não fracassa é porque não tenta, se não tenta, nào conseguirá nada.

Um colega do trabalho me passou uma série de vídeos do site papodehomem.com.br muito bons sobre motivação, e era o que eu estava precisando, acho que nem ele sabe o quão importante foi para mim aqueles vídeos. Enfim, acho que são bem conhecidos hoje, mas vale muito a pena deixar aqui no blog caso alguém ainda não tenha visto. Eu aconselho ver todos e todos os dias.

Bom, é sobre isso que se trata o post de hoje, não sobre trabalho, não sobre algoritmos, sobre uma experiência da minha vida.

Queria me desculpar pela ausência, vou começar a postar coisas novas agora, e aposto que vão gostar muito do próximo post. =)

Um abraço!

http://papodehomem.com.br/listas-descaralhantes-3-videos-para-matar-a-preguica/