Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Nos Trilhos Com Rails - Palestra FISL - Abril 2007

Nos Trilhos Com Rails - Palestra FISL - Abril 2007

Esta palestra é baseada na minha monografia de conclusão de curso. Faz uma breve apresentação do Ruby e mostra funcionalidades interessantes providas pelo framework Rails.

Sylvestre Mergulhão

April 01, 2007
Tweet

More Decks by Sylvestre Mergulhão

Other Decks in Technology

Transcript

  1. Necessidades Desenvolver para a web Desenvolver para a web de

    forma organizada Desenvolver para a web de forma f cil de manter á Desenvolver para a web de forma f cil á Desenvolver para a web de forma r pida á Desenvolver para a web de forma (mais formas???)
  2. Motiva o n çã ° 1/3 Java Muito trabalho para

    pouco resultado Java+Struts Muita(mesmo!) configura o e muito(mesmo!) trabalho çã para pouco resultado PHP Muita liberdade resulta em pouca organiza o çã
  3. Motiva o n çã ° 2/3 Comparativos encontrados na Internet

    de um tal de framework Ruby on Rails (RoR ou apenas Rails) com o Struts. Alguns chegavam a dizer num total de 10:1 em rela o a çã quantidade de linhas de c digo entre um e outro, mas ó sem muitos detalhes. Por que n o pagar pra ver? ã
  4. Motiva o n çã ° 3/3 Na verdade n o

    paguei, recebi... pois estava no ã hor rio de expediente. á Download e instala o de linguagem, bibliotecas, çã conector para o banco de dados Postgresql e o framework RoR: 1h. Desenvolvimento passo-a-passo de uma aplica o CRUD çã seguindo um tutorial: 1h.
  5. Resultado Duas aplica es... çõ Uma em Java+Struts+Hibernate Outra em

    Ruby on Rails O mesmo banco de dados... O mesmo c rebro... é
  6. “Uma linguagem que n o afeta seu ã jeito de

    pensar sobre programa o çã n o vale a pena aprender” ã Alan Jay Perlis Cientista da computa o çã
  7. Ruby? Oh, quanta preciosidade... DRY. Poxa, mas por que t

    o seco? ã KISS. Tomara que n o seja o Last. ã POLS: A l gica da menor surpresa. ó Conceitos utilizados pelo Ruby
  8. Algumas caracter sticas í Orienta o a objetos sempre! çã

    Tipifica o forte, mas din mica çã â Atributo de classe? sempre privado... acesso s por m todos... ó é
  9. Orienta o a objetos sempre! çã Tudo(mesmo!) um objeto. é

    puts "alguma coisa".upcase # imprimirá "ALGUMA COISA"
  10. num = 81 6.times do puts "#{num.class}: #{num}" num *=

    num end Fixnum: 81 Fixnum: 6561 Fixnum: 43046721 Bignum: 1853020188851841 Bignum: 3433683820292512484657849089281 Bignum: 11790184577738583171520872861412518665678211592275841109096961 Tipifica o forte, mas din mica çã â
  11. Outros tipos Fixnum Bignum Float Range – representa intervalo de

    valores como 1..10 ou b..e; Express o regular – representa uma express o regular ã ã /a/ ou /^\s*[a-z]/
  12. 3.times do # Irá imprimir 6 vezes "Ruby rulez!" puts

    "Ruby rulez!" puts "Ruby rulez!" end Blocos de c digo ó 3.times { puts "Ruby rulez!" } # Irá imprimir 3 vezes # "Ruby rulez!"
  13. Framework MVC 3 m dulos principais: ó . Active Record

    – ORM . Action Controller . Action View Utiliza os mesmos conceitos do Ruby e mais um, chamado Convention over Configuration. Configura o s necess ria quando n o existe çã ó é á ã padr o. ã O framework Rails
  14. minha_aplica o/ çã /app - arquivos dos modelos, vis es

    e controles õ /components - componentes reutiliz veis á /config - arquivos de configura o, como de banco çã de dados, por exemplo /db - arquivos do schema do banco de dados /doc - Documenta o gerada automaticamente çã /lib - c digo compartilhado ó /log - arquivos de log gerados pela aplica o çã /public - o diret rio que acess vel pela web. Da ó é í vis o do navegador parece que toda a ã aplica o roda daqui çã /scripts - conjunto de scripts utilit rios á /test - local para os testes de unidade, funcionais, mock objects e fixtures /vendor - c digos de terceiros, como plugins ó Estrutura de diret rios 1/2 ó
  15. app/ /controllers - onde s o colocados os controladores ã

    /helpers - onde s o colocados os helpers ã /models - onde s o colocados os modelos ã /views - onde s o colocados arquivos de vis o ã ã e templates Estrutura de diret rios 2/2 ó
  16. Active Record, o salvador! A classe que representa o modelo

    class Client < ActiveRecord::Base validates_uniqueness_of :login, :name validates_presence_of :login, :name, :password validates_confirmation_of :password def self.login(login, password) find(:first, :conditions => ["login = ? and password = ?",login,password]) end def try_to_login Client.login(self.login, self.password) end end
  17. Active Record Requisi o ao Banco de Dados çã Client.find(:first,

    :conditions => ["login = ?","sylva"]) Quero buscar o cliente com login “sylva”! oh quem poder me ajudar? á Client.find_by_login("sylva")
  18. Active Record Requisi o ao Banco de Dados çã De

    onde surgiram os m todos 'find' e 'find_by_login'?? é Eles n o est o definidos na classe Client! ã ã
  19. Active Record Requisi o ao Banco de Dados çã Na

    verdade, nem tanto... simplesmente heran a... é ç class Client < ActiveRecord::Base ... ... ... end
  20. Active Record Requisi o ao Banco de Dados çã Ent

    o, nenhum c digo precisou ser escrito para buscar ã ó um cliente no banco. Bastou invocar o m todo que herdado do ActiveRecord é é and it's done!
  21. Em Hibernate.... Ap s escrever o XML de mapeamento, ó

    gerar a f brica de requisi es, resgatar a sess o e á çõ ã outras coisas mais... package org.gula.persistence.dao; import java.util.ArrayList; import java.util.Collection; import org.gula.entity.Cliente; import org.hibernate.*; import org.hibernate.criterion.Expression; import org.gula.persistence.dao.DAOException; import org.gula.persistence.HibernateUtil; public class ClienteDAO { ... public Cliente retrieve(Cliente clientePk) throws DAOException { Cliente cliente; Session session = null; try { session = HibernateUtil.currentSession(); cliente = (Cliente) session.createCriteria(Cliente.class).add( Expression.eq( "login", clientePk.getLogin())) .uniqueResult(); HibernateUtil.closeSession (); } catch (Exception e) { throw new DAOException(e); } return cliente; } }
  22. Active Record Mapeamento dos relacionamentos Usando-se a conven o do

    Rails fica simples e, çã SEM CONFIGURA O! ÇÃ class Sale < ActiveRecord::Base has_many :sale_items (...) end class SaleItem < ActiveRecord::Base belongs_to :product belongs_to :sale (...) end
  23. Beans? Pra que feij es? õ Struts faz valida o

    dos FORMUL RIOS çã Á ActionForm ou DynaActionForm Diretamente na Action, via m todo validate() no é ActionForm ou via Validator Framework (mais xml! ) ¬¬
  24. Beans? Pra que feij es? õ Valida o do modelo,

    n o do formul rio... çã ã á Valida o fica junta com o modelo. çã class Product < ActiveRecord::Base belongs_to :category belongs_to :manufacturer validates_uniqueness_of :nome validates_presence_of :nome validates_presence_of :category_id validates_presence_of :manufacturer_id validates_numericality_of :preco validates_numericality_of :estoque ... end
  25. Beans? Pra que feij es? õ Se as valida es

    default n o forem suficientes çõ ã basta definir o m todo validate() dentro do modelo é E mais! Pode ser sobrecarregado tamb m o m todo é é validate_on_create() e validate_on_update() Os nomes seguem o POLS ;)
  26. class Product < ActiveRecord::Base belongs_to :category belongs_to :manufacturer (...) protected

    def validate errors.add(:preco, 'Preço negativo') unless preco.nil? || preco > 0.0 end def validate_on_create errors.add(:picture, l(:error_jpeg)) if self.imagem.empty? || validate_content end def validate_on_update if self.imagem.empty? @product = Product.find(self.id) self.imagem = @product.imagem return end errors.add(:picture, l(:error_jpeg)) if validate_content end (...) end
  27. Sess es em Rails... just KISS! õ Atributo session sempre

    dispon vel dentro í dos controladores permite uso f cil da sess o... á ã Como num Hash. def authorize unless session[:client_id] flash[:notice] = l(:do_login) session[:jumpto] = request.parameters redirect_to(:controller => "client", :action => "login") end end
  28. O que foi desenvolvido? Foram desenvolvidas duas aplica es muito

    çõ semelhantes na interface e que utilizam a mesma base de dados. As duas possuem as mesmas funcionalidades e operam da mesma forma do ponto de vista do usu rio. á Uma foi desenvolvida em Java+Struts+Hibernate. A outra em Ruby on Rails.
  29. Comparativo num rico é SLOCCount - http://www.dwheeler.com/sloccount/ CLOC - http://cloc.sourceforge.net/

    Contadores de linhas de c digo. Ignoram linhas em ó branco e coment rios. á
  30. N mero de linhas de c digo ú ó Linhas

    Ruby 681 Java 3854 0 250 500 750 1000 1250 1500 1750 2000 2250 2500 2750 3000 3250 3500 3750 4000 Java Ruby Rela o de 1:5,66 çã
  31. N mero de arquivos de c digo ú ó 0

    2,5 5 7,5 10 12,5 15 17,5 20 22,5 25 27,5 30 32,5 35 37,5 40 42,5 45 Java Ruby Rela o de 1:1,833 çã Arquivos Ruby 24 Java 44
  32. Linhas RHTML 500 JSP 875 N mero de linhas de

    templates ú 0 100 200 300 400 500 600 700 800 900 JSP RHTML Rela o de 1:1,75 çã
  33. Arquivos RHTML 25 JSP 26 N mero de arquivos de

    template ú 0 2,5 5 7,5 10 12,5 15 17,5 20 22,5 25 27,5 JSP RHTML Quase a mesma rela o çã
  34. N mero de linhas em ú arquivos de configura o

    çã Linhas YAML 18 XML 273 0 25 50 75 100 125 150 175 200 225 250 275 XML YAML Linhas YAML 18 XML 273 Vale a pena calcular essa rela o? çã Apenas para manter a apresenta o em çã conformidade: 1:15. PS: Nas 18 linhas YAML est o ã configurados 3 bancos: devel, test e prod.
  35. O trabalho buscou mais que ser um simples comparativo de

    linhas de c digo. ó Na pequena aplica o çã desenvolvida, o Rails mostrou como a l gica de sua ó implementa o deixa as coisas çã mais simplificadas para os desenvolvedores.
  36. Claro que usar apenas um caso como verdade universal n

    o correto. ã é Mas ele se mostrou preparado para os desafios de grandes sistemas web.
  37. “Ruby on Rails: porque programa o n o precisa ser

    çã ã entediante.” Fabio Akita Programador Java O futuro livre. Open your minds. é