SlideShare una empresa de Scribd logo
1 de 51
Pourquoi
        :ruby, :ruby_on_rails
            sont géniaux?
                 D’un point de vue technique!




9 juillet 2010                              Maxime Menant
Qui parle?
•   Maxime Menant
•   25 ans
•   Sophia Antipolis
•   http://blog.maximemenant.fr
•       maxime_menant
•   +2 an de dev Ruby on Rails
•   +3 ans de dev Web (PHP, Java, ...)
Ruby
:ruby

• Libre               • Syntaxe proche du
                        langage naturel
• 100% Objet
• Interprété          • Code compact
• Multi-paradigme     • Méta-programmation
Les bases de
:variables
:variables

   Variables :
locale
@instance
@@de_classe
:variables
                       Constante : COLORS
   Variables :
locale
@instance
@@de_classe
:variables
                       Constante : COLORS
   Variables :
locale
@instance                  Accesseur :
@@de_classe             attr_accessor
                        attr_reader
                        attr_writer
:conditions
:conditions
if value == 3 then
   ...
elsif value > 3
   ...
else
   ...
end
:conditions
if value == 3 then
   ...               unless value < 20
elsif value > 3        ...
   ...               end
else
   ...
end
:conditions
if value == 3 then
   ...                  unless value < 20
elsif value > 3           ...
   ...                  end
else
   ...
end
                     thresold = true if a < 100
                     thresold = true unless a >= 100
:boucles
:boucles
10.times do |i|
  puts i
end
:boucles
10.times do |i|
  puts i
                      books.each do |book|
end
                        puts book.name
                      end
:boucles
10.times do |i|
  puts i
                         books.each do |book|
end
                           puts book.name
                         end

 a *= 2 while a < 100
 a *= 2 until a >= 100
:symbole
:symbole
'symbol'.object_id        2159861560
:symbole
'symbol'.object_id        2159861560




:symbol.object_id             329788
:symbole
'symbol'.object_id        2159861560
'symbol'.object_id        2159845100



:symbol.object_id             329788
:symbole
'symbol'.object_id        2159861560
'symbol'.object_id        2159845100



:symbol.object_id             329788
:symbol.object_id             329788
:array, :hash
:array, :hash
array = []
array << 'one'
array << 'two'
array << 'three'
:array, :hash
array = []
array << 'one'
array << 'two'
array << 'three'


['one', 'two', 'three']
:array, :hash
array = []
array << 'one'
array << 'two'
array << 'three'          hash = {}
                          hash[:one] = 1
                          hash[:two] = 2
['one', 'two', 'three']   hash[:three] = 3
:array, :hash
array = []
array << 'one'
array << 'two'
array << 'three'                  hash = {}
                                  hash[:one] = 1
                                  hash[:two] = 2
['one', 'two', 'three']           hash[:three] = 3


                          {:one => 1, :two => 2, :three => 3]
:classes
class Wizard
  def initialize(name)
   @name = name
  end
end
:classes
class Wizard
  def initialize(name)
   @name = name
  end
end
                         merlin = Wizard.new 'Merlin'
                         puts merlin.inspect
:classes
class Wizard
  def initialize(name)
   @name = name
  end
end
                         merlin = Wizard.new 'Merlin'
                         puts merlin.inspect


     #<Wizard:0x100124070 @name="Merlin">
:classes
class Wizard
  attr_reader :name

 def initialize(name)
  @name = name
 end
end
:classes
class Wizard
  attr_reader :name

 def initialize(name)
  @name = name
 end
end                       merlin = Wizard.new 'Merlin'
                          puts merlin.name
:classes
class Wizard
  attr_reader :name

 def initialize(name)
  @name = name
 end
end                       merlin = Wizard.new 'Merlin'
                          puts merlin.name

                          Merlin
:modules, :mixins
module Spell
 def cast(spell)
  puts "#{self.name} invokes #{spell}!"
 end
end
:modules, :mixins
module Spell
 def cast(spell)
  puts "#{self.name} invokes #{spell}!"
 end
end                                     class Wizard
                                          include Spell
                                        end
:modules, :mixins
module Spell
 def cast(spell)
  puts "#{self.name} invokes #{spell}!"
 end
end                                     class Wizard
                                          include Spell
 merlin = Wizard.new 'Merlin'           end
 merlin.cast 'Thunder Bolt'
:modules, :mixins
module Spell
 def cast(spell)
  puts "#{self.name} invokes #{spell}!"
 end
end                                     class Wizard
                                          include Spell
 merlin = Wizard.new 'Merlin'           end
 merlin.cast 'Thunder Bolt'

              Merlin invokes Thunder Bolt!
:exemple => Enumerable
• Soit une classe A contenant une collection
  d’objets B
• A possède la méthode de parcours each
• et B la méthode de comparaison <=>
• alors en incluant le module Enumerable
• A obtient plus de 45 nouvelles méthodes
  basées sur les comparaisons et les parcours
:exemple => Enumerable
• Soit une classe A contenant une collection
  d’objets B
• A possède la méthode de parcours each
• et B la méthode de comparaison <=>
• alors en incluant le module Enumerable
• A obtient plus de 45 nouvelles méthodes
  basées sur les comparaisons et les parcours
:implémentation
• Plusieurs versions de la machine virtuelle ruby :
 • jRuby : Java
 • IronRuby : .Net
 • MacRuby : Objective C
 • Rubinius : Ruby lorsque c’est possible, C++
    sinon
:exemple => jRuby
:exemple => jRuby

include Java

frame = javax.swing.JFrame.new()
frame.getContentPane().add(javax.swing.JLabel.new('Hello, World!'))
frame.setDefaultCloseOperation(javax.swing.JFrame::EXIT_ON_CLOSE)
frame.pack()
frame.set_visible(true)
:exemple => jRuby

include Java

frame = javax.swing.JFrame.new()
frame.getContentPane().add(javax.swing.JLabel.new('Hello, World!'))
frame.setDefaultCloseOperation(javax.swing.JFrame::EXIT_ON_CLOSE)
frame.pack()
frame.set_visible(true)
:gems

• Equivalent des packages .deb pour Ruby
• S’installe avec leurs dépendances
• Plus de 14000 gems à ce jour
• Un repository de ces gems :
 • http://rubygems.org/
:ruby_on_rails

• 2 Principes :
 • DRY : Don’t Repeat Yourself
 • Convention over Configuration
• REST : Representational state transfer
• MVC : Modèle - Vue - Contrôleur
:REST
•   l’URI identifie clairement une ressource
•   Operations HTTP :
    •   GET
    •   POST
    •   PUT
    •   DELETE
•   Stateless - chaque opération est auto-suffisante
Démonstration
 It’s gonna be Legend...ary :)
:idée

Mise en place d’une application de
gestion de tâches pour des projets
:awesome
•   Création d’un prototype d’application web et de
    son API en quelques minutes
•   Scaffolding des ressources
•   Abstraction de très haut niveau
•   Des gems et des plugins couvrant tous les usages
    courant
•   1er déploiement en moins d’une minute sur
    Heroku
?
menant.maxime@gmail.com   maxime_menant

Más contenido relacionado

La actualidad más candente

Programmation Orientée Objet et les Traits en PHP 5.4
Programmation Orientée Objet et les Traits en PHP 5.4Programmation Orientée Objet et les Traits en PHP 5.4
Programmation Orientée Objet et les Traits en PHP 5.4halleck45
 
Javascript les générateurs (generators)
Javascript   les générateurs (generators)Javascript   les générateurs (generators)
Javascript les générateurs (generators)Julien CROUZET
 
Présentation de ECMAScript 6
Présentation de ECMAScript 6Présentation de ECMAScript 6
Présentation de ECMAScript 6Julien CROUZET
 
Javascript objet : que fait ce code ?
Javascript objet : que fait ce code ?Javascript objet : que fait ce code ?
Javascript objet : que fait ce code ?Ruau Mickael
 
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...Tarik Zakaria Benmerar
 
Javascript - Tableaux : que fait ce code ?
Javascript - Tableaux : que fait ce code ?Javascript - Tableaux : que fait ce code ?
Javascript - Tableaux : que fait ce code ?Ruau Mickael
 
Javascript un langage supérieur
Javascript un langage supérieurJavascript un langage supérieur
Javascript un langage supérieurFredy Fadel
 
PHP #3 : tableaux & formulaires
PHP #3 : tableaux & formulairesPHP #3 : tableaux & formulaires
PHP #3 : tableaux & formulairesJean Michel
 
Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Ruau Mickael
 
Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013Guillaume Laforge
 
Héritage et polymorphisme- Jihen HEDHLI
Héritage et polymorphisme- Jihen HEDHLIHéritage et polymorphisme- Jihen HEDHLI
Héritage et polymorphisme- Jihen HEDHLIJihenHedhli1
 
CocoaHeads Rennes #1 : Grand Central Dispatch
CocoaHeads Rennes #1 : Grand Central DispatchCocoaHeads Rennes #1 : Grand Central Dispatch
CocoaHeads Rennes #1 : Grand Central DispatchCocoaHeadsRNS
 
HumanTalk - Commentaires, je t'aime un peu, beaucoup, à la folie, pas du tout
HumanTalk - Commentaires, je t'aime un peu, beaucoup, à la folie, pas du toutHumanTalk - Commentaires, je t'aime un peu, beaucoup, à la folie, pas du tout
HumanTalk - Commentaires, je t'aime un peu, beaucoup, à la folie, pas du toutflorentpellet
 
Exploiter php 5
Exploiter php 5Exploiter php 5
Exploiter php 5halleck45
 

La actualidad más candente (19)

Programmation Orientée Objet et les Traits en PHP 5.4
Programmation Orientée Objet et les Traits en PHP 5.4Programmation Orientée Objet et les Traits en PHP 5.4
Programmation Orientée Objet et les Traits en PHP 5.4
 
Javascript les générateurs (generators)
Javascript   les générateurs (generators)Javascript   les générateurs (generators)
Javascript les générateurs (generators)
 
Présentation de ECMAScript 6
Présentation de ECMAScript 6Présentation de ECMAScript 6
Présentation de ECMAScript 6
 
POO
POOPOO
POO
 
Javascript objet : que fait ce code ?
Javascript objet : que fait ce code ?Javascript objet : que fait ce code ?
Javascript objet : que fait ce code ?
 
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
 
Javascript - Tableaux : que fait ce code ?
Javascript - Tableaux : que fait ce code ?Javascript - Tableaux : que fait ce code ?
Javascript - Tableaux : que fait ce code ?
 
Python avancé : Qualité de code et convention de codage
Python avancé : Qualité de code et convention de codagePython avancé : Qualité de code et convention de codage
Python avancé : Qualité de code et convention de codage
 
Javascript un langage supérieur
Javascript un langage supérieurJavascript un langage supérieur
Javascript un langage supérieur
 
PHP #3 : tableaux & formulaires
PHP #3 : tableaux & formulairesPHP #3 : tableaux & formulaires
PHP #3 : tableaux & formulaires
 
Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?
 
Ch06
Ch06Ch06
Ch06
 
Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013
 
Héritage et polymorphisme- Jihen HEDHLI
Héritage et polymorphisme- Jihen HEDHLIHéritage et polymorphisme- Jihen HEDHLI
Héritage et polymorphisme- Jihen HEDHLI
 
CocoaHeads Rennes #1 : Grand Central Dispatch
CocoaHeads Rennes #1 : Grand Central DispatchCocoaHeads Rennes #1 : Grand Central Dispatch
CocoaHeads Rennes #1 : Grand Central Dispatch
 
PHP &amp; MySQL
PHP &amp; MySQLPHP &amp; MySQL
PHP &amp; MySQL
 
Diagramme uml pfe
Diagramme uml pfeDiagramme uml pfe
Diagramme uml pfe
 
HumanTalk - Commentaires, je t'aime un peu, beaucoup, à la folie, pas du tout
HumanTalk - Commentaires, je t'aime un peu, beaucoup, à la folie, pas du toutHumanTalk - Commentaires, je t'aime un peu, beaucoup, à la folie, pas du tout
HumanTalk - Commentaires, je t'aime un peu, beaucoup, à la folie, pas du tout
 
Exploiter php 5
Exploiter php 5Exploiter php 5
Exploiter php 5
 

Similar a Pourquoi Ruby et Ruby On Rais sont geniaux ?

Php mysql cours
Php mysql coursPhp mysql cours
Php mysql courszan
 
Cours j query-id1575
Cours j query-id1575Cours j query-id1575
Cours j query-id1575kate2013
 
Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Guillaume Laforge
 
Héritage et Polymorphisme .pdf
Héritage et Polymorphisme .pdfHéritage et Polymorphisme .pdf
Héritage et Polymorphisme .pdfAabidiHafid
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab ElasticsearchDavid Pilato
 
Introduction à scala
Introduction à scalaIntroduction à scala
Introduction à scalaSOAT
 
09 - creez-propres-modules-ansible-autimatisation
09 - creez-propres-modules-ansible-autimatisation09 - creez-propres-modules-ansible-autimatisation
09 - creez-propres-modules-ansible-autimatisationbibouechristian
 
Préprocesseurs vs CSS natif : Le match !
Préprocesseurs vs CSS natif : Le match !Préprocesseurs vs CSS natif : Le match !
Préprocesseurs vs CSS natif : Le match !Jonathan Levaillant
 
Programmation fonctionnelle
Programmation fonctionnelleProgrammation fonctionnelle
Programmation fonctionnelleGeeks Anonymes
 
Breizh camp intro ruby
Breizh camp   intro rubyBreizh camp   intro ruby
Breizh camp intro rubyNicolas Ledez
 
Bases de PHP - Partie 1
Bases de PHP - Partie 1Bases de PHP - Partie 1
Bases de PHP - Partie 1Régis Lutter
 

Similar a Pourquoi Ruby et Ruby On Rais sont geniaux ? (20)

Ruby Pour RoR
Ruby Pour RoRRuby Pour RoR
Ruby Pour RoR
 
Php mysql cours
Php mysql coursPhp mysql cours
Php mysql cours
 
Cours j query-id1575
Cours j query-id1575Cours j query-id1575
Cours j query-id1575
 
Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013
 
Cours tp2
Cours tp2Cours tp2
Cours tp2
 
Héritage et Polymorphisme .pdf
Héritage et Polymorphisme .pdfHéritage et Polymorphisme .pdf
Héritage et Polymorphisme .pdf
 
Javascript mémo.pdf
Javascript  mémo.pdfJavascript  mémo.pdf
Javascript mémo.pdf
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab Elasticsearch
 
Introduction à scala
Introduction à scalaIntroduction à scala
Introduction à scala
 
09 - creez-propres-modules-ansible-autimatisation
09 - creez-propres-modules-ansible-autimatisation09 - creez-propres-modules-ansible-autimatisation
09 - creez-propres-modules-ansible-autimatisation
 
Héritage et redéfinition de méthode
Héritage et redéfinition de méthodeHéritage et redéfinition de méthode
Héritage et redéfinition de méthode
 
Préprocesseurs vs CSS natif : Le match !
Préprocesseurs vs CSS natif : Le match !Préprocesseurs vs CSS natif : Le match !
Préprocesseurs vs CSS natif : Le match !
 
Programmation fonctionnelle
Programmation fonctionnelleProgrammation fonctionnelle
Programmation fonctionnelle
 
test doc
test doctest doc
test doc
 
Breizh camp intro ruby
Breizh camp   intro rubyBreizh camp   intro ruby
Breizh camp intro ruby
 
PHP.pptx
PHP.pptxPHP.pptx
PHP.pptx
 
Cours php
Cours php Cours php
Cours php
 
Php1
Php1Php1
Php1
 
Php4 Mysql
Php4 MysqlPhp4 Mysql
Php4 Mysql
 
Bases de PHP - Partie 1
Bases de PHP - Partie 1Bases de PHP - Partie 1
Bases de PHP - Partie 1
 

Pourquoi Ruby et Ruby On Rais sont geniaux ?

  • 1. Pourquoi :ruby, :ruby_on_rails sont géniaux? D’un point de vue technique! 9 juillet 2010 Maxime Menant
  • 2. Qui parle? • Maxime Menant • 25 ans • Sophia Antipolis • http://blog.maximemenant.fr • maxime_menant • +2 an de dev Ruby on Rails • +3 ans de dev Web (PHP, Java, ...)
  • 4. :ruby • Libre • Syntaxe proche du langage naturel • 100% Objet • Interprété • Code compact • Multi-paradigme • Méta-programmation
  • 7. :variables Variables : locale @instance @@de_classe
  • 8. :variables Constante : COLORS Variables : locale @instance @@de_classe
  • 9. :variables Constante : COLORS Variables : locale @instance Accesseur : @@de_classe attr_accessor attr_reader attr_writer
  • 11. :conditions if value == 3 then ... elsif value > 3 ... else ... end
  • 12. :conditions if value == 3 then ... unless value < 20 elsif value > 3 ... ... end else ... end
  • 13. :conditions if value == 3 then ... unless value < 20 elsif value > 3 ... ... end else ... end thresold = true if a < 100 thresold = true unless a >= 100
  • 16. :boucles 10.times do |i| puts i books.each do |book| end puts book.name end
  • 17. :boucles 10.times do |i| puts i books.each do |book| end puts book.name end a *= 2 while a < 100 a *= 2 until a >= 100
  • 20. :symbole 'symbol'.object_id 2159861560 :symbol.object_id 329788
  • 21. :symbole 'symbol'.object_id 2159861560 'symbol'.object_id 2159845100 :symbol.object_id 329788
  • 22. :symbole 'symbol'.object_id 2159861560 'symbol'.object_id 2159845100 :symbol.object_id 329788 :symbol.object_id 329788
  • 24. :array, :hash array = [] array << 'one' array << 'two' array << 'three'
  • 25. :array, :hash array = [] array << 'one' array << 'two' array << 'three' ['one', 'two', 'three']
  • 26. :array, :hash array = [] array << 'one' array << 'two' array << 'three' hash = {} hash[:one] = 1 hash[:two] = 2 ['one', 'two', 'three'] hash[:three] = 3
  • 27. :array, :hash array = [] array << 'one' array << 'two' array << 'three' hash = {} hash[:one] = 1 hash[:two] = 2 ['one', 'two', 'three'] hash[:three] = 3 {:one => 1, :two => 2, :three => 3]
  • 28. :classes class Wizard def initialize(name) @name = name end end
  • 29. :classes class Wizard def initialize(name) @name = name end end merlin = Wizard.new 'Merlin' puts merlin.inspect
  • 30. :classes class Wizard def initialize(name) @name = name end end merlin = Wizard.new 'Merlin' puts merlin.inspect #<Wizard:0x100124070 @name="Merlin">
  • 31. :classes class Wizard attr_reader :name def initialize(name) @name = name end end
  • 32. :classes class Wizard attr_reader :name def initialize(name) @name = name end end merlin = Wizard.new 'Merlin' puts merlin.name
  • 33. :classes class Wizard attr_reader :name def initialize(name) @name = name end end merlin = Wizard.new 'Merlin' puts merlin.name Merlin
  • 34. :modules, :mixins module Spell def cast(spell) puts "#{self.name} invokes #{spell}!" end end
  • 35. :modules, :mixins module Spell def cast(spell) puts "#{self.name} invokes #{spell}!" end end class Wizard include Spell end
  • 36. :modules, :mixins module Spell def cast(spell) puts "#{self.name} invokes #{spell}!" end end class Wizard include Spell merlin = Wizard.new 'Merlin' end merlin.cast 'Thunder Bolt'
  • 37. :modules, :mixins module Spell def cast(spell) puts "#{self.name} invokes #{spell}!" end end class Wizard include Spell merlin = Wizard.new 'Merlin' end merlin.cast 'Thunder Bolt' Merlin invokes Thunder Bolt!
  • 38. :exemple => Enumerable • Soit une classe A contenant une collection d’objets B • A possède la méthode de parcours each • et B la méthode de comparaison <=> • alors en incluant le module Enumerable • A obtient plus de 45 nouvelles méthodes basées sur les comparaisons et les parcours
  • 39. :exemple => Enumerable • Soit une classe A contenant une collection d’objets B • A possède la méthode de parcours each • et B la méthode de comparaison <=> • alors en incluant le module Enumerable • A obtient plus de 45 nouvelles méthodes basées sur les comparaisons et les parcours
  • 40. :implémentation • Plusieurs versions de la machine virtuelle ruby : • jRuby : Java • IronRuby : .Net • MacRuby : Objective C • Rubinius : Ruby lorsque c’est possible, C++ sinon
  • 42. :exemple => jRuby include Java frame = javax.swing.JFrame.new() frame.getContentPane().add(javax.swing.JLabel.new('Hello, World!')) frame.setDefaultCloseOperation(javax.swing.JFrame::EXIT_ON_CLOSE) frame.pack() frame.set_visible(true)
  • 43. :exemple => jRuby include Java frame = javax.swing.JFrame.new() frame.getContentPane().add(javax.swing.JLabel.new('Hello, World!')) frame.setDefaultCloseOperation(javax.swing.JFrame::EXIT_ON_CLOSE) frame.pack() frame.set_visible(true)
  • 44. :gems • Equivalent des packages .deb pour Ruby • S’installe avec leurs dépendances • Plus de 14000 gems à ce jour • Un repository de ces gems : • http://rubygems.org/
  • 45.
  • 46. :ruby_on_rails • 2 Principes : • DRY : Don’t Repeat Yourself • Convention over Configuration • REST : Representational state transfer • MVC : Modèle - Vue - Contrôleur
  • 47. :REST • l’URI identifie clairement une ressource • Operations HTTP : • GET • POST • PUT • DELETE • Stateless - chaque opération est auto-suffisante
  • 48. Démonstration It’s gonna be Legend...ary :)
  • 49. :idée Mise en place d’une application de gestion de tâches pour des projets
  • 50. :awesome • Création d’un prototype d’application web et de son API en quelques minutes • Scaffolding des ressources • Abstraction de très haut niveau • Des gems et des plugins couvrant tous les usages courant • 1er déploiement en moins d’une minute sur Heroku
  • 51. ? menant.maxime@gmail.com maxime_menant

Notas del editor