Feed Artigos Comentários

Arquivo de 5 de Novembro de 2006



Desenvolvimento de Software Hildebrando em 05 Nov 2006

Convention over Configuration

Você só deve configurar aquilo que for específico, o que for padrão deve ser utilizado normalmente. Assim como padrões de projeto talvez você ja utilize mas nem sabia, portanto aqui vai um exemplo.

Imagine que você tem uma tela de edição de dados de uma pessoa. Junto a esta tela você tem o Controller (Servlet), o objeto de dominio (POJO) e a tabela PESSOA. Além desta tela você tem outra tela de pesquisa de pessoas. Se você seguir o padrão de nomenclatura, por exemplo. A Classe Pessoa esta ligada a tabela PESSOA, por tanto o arquivo de tela é o Pessoa.jsp você esta seguindo uma determinada convenção, evitando criar arquivos de configuração para montar o fluxo.

O conceito é bem simples. Para as situações normais basta seguir as convenções que o seu sistema ja deve estar preparado para tratar estes padrões.

Com o Struts uma forma interessante da utilização de CoC é com os wildcards das Actions. Se todas as suas Actions forem SalvarProduto, SalvarCliente, SalvarPedido você pode declarar a Action Salvar* , e por convenção pode se chegar ao componente de serviço ou de domínio.

Um link sobre o assunto Struts - Wildcard http://www.twdata.org/struts-wildcard/

Desenvolvimento de Software Hildebrando em 05 Nov 2006

A produtividade de Ruby on Rails - I.

Você ja teve ter ouvido falar de uma nova linguagem que pretende revolucionar o desenvolvimento de software. Ele chama Ruby e foi inventada a algum tempo visando produtividade.

Eu olho novas tecnologias com uma certa desconfiança, isso se deve a inumeras que ja vi chegar, ficar e passar. Porém vou começar um estudo pesado em Ruby pois pode contribuir com o nosso processo.

A Linguagem Ruby é uma linguagem bem simples, com tipagem fraca e outros recursos mais dinâmicos.

Sugiro o tutorial http://kb.reflectivesurface.com/br/tutoriais/rubyOnRails/

1 - Comece fazendo o download do Ruby.

2 - De uma analisada na documentação. Se você tem uma base de OO vai entender o porque da linguagem simples.

3 - Na instalação Windows (que eu utilizei) você ira encontrar um aplicativo chamado de RubyGems. É como se fosse um gerenciador de pacotes. Portanto qualquer novo pacote deve ser feito utilizando seus comandos. O pacote que iremos utilizar é o Rails.

gem install rails --include-dependencies

Na instalação ja foi adicionado no PATH o diretorio /ruby/bin.

Devido a todas as dependencias a instalação demora alguns minutos. Infelizmente sem barra de progresso portanto tenha paciência se a tela ficar estática por um tempo. O resultado final deve ser :


Bulk updating Gem source index for: http://gems.rubyforge.org
Successfully installed rails-1.1.6
Successfully installed activesupport-1.3.1
Successfully installed activerecord-1.14.4
Successfully installed actionpack-1.12.5
Successfully installed actionmailer-1.2.5
Successfully installed actionwebservice-1.1.6
Installing ri documentation for activesupport-1.3.1...
Installing ri documentation for activerecord-1.14.4...
Installing ri documentation for actionpack-1.12.5...
Installing ri documentation for actionmailer-1.2.5...
Installing ri documentation for actionwebservice-1.1.6...
Installing RDoc documentation for activesupport-1.3.1...
Installing RDoc documentation for activerecord-1.14.4...
Installing RDoc documentation for actionpack-1.12.5...
Installing RDoc documentation for actionmailer-1.2.5...
Installing RDoc documentation for actionwebservice-1.1.6...

4 - Após a instalação vamos criar a estrutura básica de uma aplicação WEB.

rails c:\ruby\hellorails

Este processo é bem rápido e ao fim você tem uma estrutura de diretórios :

+ app
+ components
+ config
+ db
+ doc
+ lib
+ log
+ public
+ script
+ test
+ tmp
+ vendor
+ Rakefile
+ README

Entre no diretório

cd c:\ruby\hellorails

Inicie o servidor

ruby script/server

=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2006-11-04 20:59:05] INFO WEBrick 1.3.1
[2006-11-04 20:59:05] INFO ruby 1.8.4 (2006-04-14) [i386-mswin32]
[2006-11-04 20:59:05] INFO WEBrick::HTTPServer#start: pid=3732 port=3000

Se tudo funcionou como o previsto basta acessar o servidor no endereco http://localhost:3000

5 - Vamos começar nosso projeto fazendo o famoso CRUD (Create,Retrieve,Update,Delete). Para integrar com o MySQL voce precisa alterar o arquivo config/database.yml.


gem install mysql

Select which gem to install for your platform (i386-mswin32)
1. mysql 2.7.1 (mswin32)
2. mysql 2.7 (ruby)
3. mysql 2.6 (ruby)
4. mysql 2.5.1 (ruby)
5. Cancel installation
> 1
Successfully installed mysql-2.7.1-mswin32
Installing ri documentation for mysql-2.7.1-mswin32...
Installing RDoc documentation for mysql-2.7.1-mswin32...

Copie o arquivo libmysql.dll que esta localizado no diretorio bin do MySQL para o diretorio bin do ruby.

6 - O Rails utiliza o modelo MVC como sua estrutura camadas, por tanto execute “ruby script/generate” para criar seus arquivos “controller” e “model”.

6.1 - Controller

C:\ruby\hellorails>ruby script/generate controller Produto editar pesquisar
exists app/controllers/
exists app/helpers/
create app/views/produto
exists test/functional/
create app/controllers/produto_controller.rb
create test/functional/produto_controller_test.rb
create app/helpers/produto_helper.rb
create app/views/produto/editar.rhtml
create app/views/produto/pesquisar.rhtml

“ruby script/generate controller Produto editar pesquisar”

Produto = É o nome do controller
editar = É o nome de uma View
pesquisar = É o nome de outra View

6.2 - Model

C:\ruby\hellorails>ruby script/generate model Produto
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/produto.rb
create test/unit/produto_test.rb
create test/fixtures/produtos.yml
create db/migrate
create db/migrate/001_create_produtos.rb

“ruby script/generate model Produto”
Produto = É o nome do Model

7 - Para testar se esta tudo funcionando você deve configurar suas paginas no arquivo app/controllers/produto_controller.rb

class ProdutoController < ApplicationController

def index
render_text "Hello, world! Pagina principal"
end

def editar
render_text "Hello, world! Editar"
end

def pesquisar
render_text "Hello, world! Pesquisar"
end
end

Cada def contida no arquivo representa seu método e este indica cada requisição. Portanto para entrar no metodo pesquisar basta acessar a pagina http://localhost:3000/produto/pesquisar

8 - Para completar o fluxo precisamos criar um novo componente view. Na verdade este ja foi criado no momento que criamos o controller, portanto basta alterar seu codigo para

def editar
end

Ao acessar a pagina esta ira redirecionar para o arquivo “app\views\produto\editar.rhtml”

Notem que não foi feita configuração em nenhum arquivo ainda. O fluxo de camadas é executado sguindo alguns padrões de nomenclatura.

9 - Realizando o CRUD. Como tudo ja esta funcionando vamos criar uma tabela de testes em todos os ambientes descritos no arquivo config/database.yml (hellorails_development , hellorails_test , hellorails_production).


CREATE TABLE PRODUTOS
(
id INTEGER NOT NULL PRIMARY KEY,
descricao VARCHAR(50) NOT NULL,
detalhes VARCHAR(255) NOT NULL,
preco DECIMAL(10,2) NULL
);

ALTER TABLE PRODUTOS MODIFY COLUMN `id` INTEGER NOT NULL DEFAULT NULL AUTO_INCREMENT;

Repare que a tabela foi criada no plural. O Rails vai fazer a co-relação de singular/plural.

Um recurso interessante é o scaffolding. Para utiliza-lo basta alterar o seu arquivo controller.


class ProdutoController < ApplicationController

scaffold :produto

end

Este é um recurso que mapeia as operações CRUD para esta determinada tabela. O interessante é que não há geração de código, portanto se for incluido um novo campo na tabela a tela será alterada também.

10 - Uma coisa que você deve estar questionando é quanto a customização. As telas criadas seguem templates do Rails, e com certeza em seus projetos você ira utilizar um padrão diferente. O Rails tem essa ideia de havendo necessidade de mudança é so você descrevê-las.

produto_controller.rb
class ProdutoController < ApplicationController

scaffold :produto

layout "default"

def list
@entries = Produto.find_all nil, "descricao"
end

def edit
@entry = Produto.find(@params["id"])
end

end

list.rhtml
<table border="1" cellpadding="4" cellspacing="0" width="90%">
<tr>
<th>Descricao</th>
<th>Preco</th>
<th colspan="3">Actions</th>
</tr>
<% @entries.each do |entry| %>
<tr>
<td><%= entry.descricao %></td>
<td><%= entry.preco %></td>
<td><%= link_to "Show", :action => "show", :id => entry.id %></td>
<td><%= link_to "Edit", :action => "edit", :id => entry.id %></td>
<td><%= link_to "Destroy", :action => "destroy", :id => entry.id %></td>
</tr>
<% end %>
</table
<p><%= link_to "New", :action => "new" %></p>

edit.rhtml
<%= start_form_tag :action => "update" %>

<%= hidden_field 'entry', 'id' %>

<p>Descricao:<br / ><%= text_field 'entry', 'descricao' %></p>
<p>Preco:<br / ><%= text_field 'entry', 'preco' %></p>
<p>Detalhes:<br / ><%= text_area 'entry', 'detalhes', "rows" => "3" %></p>

<input type="submit" value="Update" />

<%= end_form_tag %>