Pourquoi Ruby et Ruby On Rais sont géniaux ?


  • Share on Pinterest

Pourquoi Ruby et Ruby On Rais sont géniaux ?

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 Ruby

: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 #

: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

? [email protected] maxime_menant