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.

Avatar for Sylvestre Mergulhão

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. é