Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk,...

93
Technologies du commerce électronique Le langage de programmation Ruby

Transcript of Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk,...

Page 1: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Technologies du commerce

électroniqueélectronique

Le langage de programmation Ruby

Page 2: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Plan (première partie)

� Le langage Ruby

� Comment écrire un programme Ruby

� Instructions d'affichage � Instructions d'affichage

� Lecture de valeur du clavier

� Fonctions

� Structures de contrôle

2

Page 3: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

C'estC'est quoi Ruby ?quoi Ruby ?

3

C'estC'est quoi Ruby ?quoi Ruby ?

Page 4: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Ruby est …

“… programming … programming language with language with a focus on simplicity and a focus on simplicity and

4

a focus on simplicity and a focus on simplicity and productivity. It has an elegant productivity. It has an elegant syntax that is natural to read and syntax that is natural to read and easy to write.”easy to write.”

Source : http://www.ruby-lang.org

Page 5: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Le langage Ruby

� Open source� Interprété � Typage dynamique � Optimisé pour les développeurs� Optimisé pour les développeurs

� Facile à lire et à écrire � Puissant � On prends du fun à développer avec Ruby

� Tout est objet� Pas de type primitifs

5

Page 6: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Le langage Ruby (suite)

� Procédural� Modulaire� Purement orienté objet (tout est objet)� Offre quelques concepts de la programmation � Offre quelques concepts de la programmation fonctionnelle

� Bien adapté pour la méta-programmation� Facilité l'écriture de langages spécifiques au domaine (DSL)

6

Page 7: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Interpréteurs Ruby

� Ruby 1.8.x

� Le plus utilisé (implémentation en C)

� Ruby 1.9.1

� Implémentation plus efficace (implémentation en C)

� JRuby

� Ruby sur la machine virtuelle de Java� Ruby sur la machine virtuelle de Java

� MacRuby

� Portage de Ruby pour s’exécuter sur la machine virtuelle de Objective-C de Mac OS X

� IronRuby

� Ruby dans l’environnement .NET

� Rubinuis

� Interpréteur Ruby ... écrit (presque) complètement en Ruby

7

Page 8: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Interpréteurs Ruby

Code Ruby

Machine virtuelle ou physique

Interpréteur

8

Page 9: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Comment écrire un programme Ruby ?

� Créer un fichier avec extension .rb et ajouter des instructions Ruby à l'intérieurdes instructions Ruby à l'intérieur

9

Page 10: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Les commentaires

� Deux façons différentes pour insérer les commentaires dans du code Ruby � # ceci est un commentaire sur une seule ligne� # ceci est un commentaire sur une seule ligne

� =begin

commentaire sur

plusieurs lignes

=end

10

Page 11: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Instructions d'affichage

� puts "puts ajoute des "

� puts "sauts de ligne."

� print "print n'ajoute pas"

� print " de sauts de ligne."

11

Pas de point virgule à la fin d'une

instruction

Page 12: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Lecture de valeur à partir du clavier

� puts "What is your name?"

� name = STDIN.gets

� puts "Salut "+name� puts "Salut "+name

� Ou bien :

� puts "Salut #{name}"

12

Page 13: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Fonctions � Déclaration d'une fonction :

def welcome(nom)

puts "Salut #{nom}"

end

� Ou bien : def welcome nom def welcome nom

puts "Salut #{nom}"

end

� Appelle de la fonction :welcome("Toto")

� Ou bien : welcome "Toto"

13Les parenthèses sont optionnelles

Page 14: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Fonctions (suite)

� Avec retour de valeur :def multiply(a,b)

product = a * b product = a * b

return product

end

� puts multiply(2,3)

14

Page 15: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Fonctions (suite)

� Avec retour de valeur … sans utiliser le mot clé return :def multiply(a,b)

product = a * b # la dernière valeur calculée sera retournéeproduct = a * b # la dernière valeur calculée sera retournée

end

� puts multiply(2,3)

15

Page 16: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Fonctions (suite)

� Avec retour de valeur … sans utiliser le mot clé return et sans variable intermédiaire :def multiply(a,b) def multiply(a,b)

a * b

end

� puts multiply(2,3)

16

Page 17: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Fonctions (suite)

� Paramètres optionnels :def test(a=1,b=2,c=a+b)

puts "#{a},#{b},#{c}" end end

� Appel de la méthode : � test # => 1,2,3

� test 5 # => 5,2,7

� test 4, 6 # => 4,6,10

� test 3, 4, 6 # => 3,4,6

17

Page 18: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Fonctions (suite)

� Paramètres optionnels :def test(a=1,b=2,c=a+b)

puts "#{a},#{b},#{c}" end end

� Appel de la méthode : � test # => 1,2,3

� test 5 # => 5,2,7

� test 4, 6 # => 4,6,10

� test 3, 4, 6 # => 3,4,6

18

Page 19: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Fonctions (suite)

� Retour de plusieurs valeurs : def getConstAndTaxes

chaine = "salut"

taxes = 30

return chaine , taxesreturn chaine , taxesend

� Appel de la méthode : � cost, taxes = getConstAndTaxes

� puts "cost = #{cost}, taxes = #{taxes}"

19

Page 20: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Structures de Structures de contrôlecontrôle

20

Structures de Structures de contrôlecontrôle

Page 21: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Affectations

puts "----Chaque affectation retourne la valeur affectée "puts a = 4 #=> 4

puts "----Les affectations peuvent être enchaînées"puts a = b = 4 #=> 4puts a+b #=> 8

puts "----Racourcis"puts a += 2 #=> 6puts a += 2 #=> 6puts a = a + 2 #=> 8

puts "----Affectations parallèles"a, b = b, aputs a #=> 4puts b #=> 8

puts "----Décomposition d’un tableau"array = [1,2]a, b = *arrayputs a #=> 1puts b #=> 2

21

Page 22: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Instructions conditionnelles

puts "----if/else"if (1 + 1 == 2)puts “Un plus Un est égal à deux"

elseputs “Pas de chance !"

end

puts "----if et unless"

If condition1# instructions

elsif condition2#instructions

else# instructions

end

puts "----if et unless"puts “La vie est belle !" if (1 + 1 == 2)puts “Surprenant !" unless (1 + 1 == 2)

unless (1+1 ==2) puts “Faux”

end

puts "---- operateur ternaire "puts (1 + 1 == 2)? ‘Vrai‘ : ‘Faux'

unless condition# instructions end

objet = (condition)? valeur1 : valeur2

22

instructions unless conditioninstructions unless condition

instructions if conditioninstructions if condition

Page 23: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Instructions conditionnelles (suite 1)

case objet

end

case objetwhen valeur1

# code Ruby when valeur2#code Ruby

else # code Ruby

end

case objetwhen valeur1…valeurN1

# code Ruby when valeur2…valeurN2#code Ruby

when valeur3#code Rubyendend

end

#code Rubyelse # code Ruby

endobjet = case

else

end

objet = casewhen condition1

# retourner une valeur à objet when condition2# retourner une autre valeur à objet

else # retourner une autre valeur à objet

end

23

Page 24: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

a= 2

r = casewhen a==1

"a est égal à 1"

when a==2

"a est égal à 2"

Instructions conditionnelles (suite 2)

a= 2

case awhen 1

p "a est égal à 1"

when 2..10"a est égal à 2"

else

"ce n\’est ni 1 ni 2"

end

puts r

p "a ente 2 et 10"

else

p "ce n\’est ni 1 ni entre 2 et 10"

end

24

Page 25: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Structures d’itération

puts "---- while 1"while (i < 10)i *= 2

endputs i #=> 16

puts "---- while 2"

while condition# instructions end

puts "---- while 2"i *= 2 while (i < 100)puts i #=> 128

puts "---- while avec begin/end"begini *= 2

end while (i < 100)puts i #=> 256

instructions while (condition)

end while(condition)

begin #instructions

end while(condition)

25

Page 26: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Structures d’itération (suite 1)

puts "---- until"i *= 2 until ( i >= 1000)puts i #=> 1024

puts "---- loop"loop do

i *= 2

instructions until (condition)

loop doi *= 2break if (i >= 4000)

endputs i #=> 4096

puts "---- times"4.times doi *= 2

endputs i #=> 65536

loop dobreak condition# instructions end

end

number.times do # instructions

end

26

Page 27: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Structures d’itération (suite 2)

puts "---- array"r =[1,2,3,4]for i in rp i

endputs "---- intervalle” for i in 1..4p i

for i in intervalle# instructions

end

for i in array# instructions

end

p iendputs "---- each” [1,2,3,4].each |i| do

p iendputs "---- each” (1..4).each |i| do

p iend

endend

array.each |i| do# instructions

end

intervalle.each |i| do# instructions

end

27

Page 28: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Types de base de Ruby

� Chaînes de caractères

� Nombres

Tableaux � Tableaux

� Tables de hachage

� Symboles

28

Page 29: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Types Ruby :Types Ruby :

29

Types Ruby :Types Ruby :

NombresNombres

Page 30: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Nombres : Fixnum et Bignum

� Dans Ruby, les nombres sont des objets

� 123456 : Fixnum

� 123_456_789_123_456_789 : Bignum

� Les soulignements sont ignorés

� 123_456 : 123456

� 12_34_56 : 123456

� 123_456_789_123_456_789 : 123456789123456789

30

Page 31: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Types Ruby :Types Ruby :

ChaînesChaînes de de caractèrescaractères

31

ChaînesChaînes de de caractèrescaractères

Page 32: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Types de base de Ruby

� Une façon de créer une chaîne de caractères en Ruby consiste à utiliser les simples ou doubles guillemets pour créer ce qu’on appelle une chaîne littérale � puts "Hello World!"

� puts ‘Hello World!’� puts ‘Hello World!’

� Les doubles guillemets permettent d’intégrer les variables ou du code Ruby à l’intérieur d’une chaîne littérale. Ceci est communément référencé comme de l’interpolation� nom = “Toto”

puts “Votre nom est #{nom}“ # Votre nom est Toto

puts 'Votre nom est #{nom}' # Votre nom est #{nom}

32

Page 33: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Affichage de chaînes dans la sortie standard

avec puts et print

� puts : insère automatiquement une nouvelle ligne après chaque texte � >> puts "Say", "hello"

Sayhellohello

� print : n’insère une nouvelle ligne que si spécifié explicitement� >> print "Say", "hello", "\n“, “again”

Sayhello

again

� Remarque : � La méthode ‘p’ est une abréviation de la méthode ‘puts’

33

Page 34: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Types Ruby :Types Ruby :

34

Types Ruby :Types Ruby :

Tableaux Tableaux

Page 35: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Tableaux : Array

� Un tableau est une collection de données pouvant être insérées/retrouvées via un indice

� Dans Ruby les tableaux peuvent contenir des objets de différents types différents types

� Déclaration d’un tableau � mon_tableau1 = Array.new

� mon_tableau2 = []

� mon_tableau3 = ["un élément", 2, "un troisième élément"]

35

Page 36: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Tableaux : Array (suite 1)

� Accès aux éléments d’un tableau � puts tableau[0]� puts tableau[0]� tableau[0] = “Salut”

36

Page 37: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

La notation %

� %w : cause le découpage d’une chaîne de caractères en éléments d’un tableau à la rencontre des espacesen éléments d’un tableau à la rencontre des espaces� %w(a b c) : ["a", "b", "c"]

37

Page 38: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Types Ruby : Types Ruby :

38

Types Ruby : Types Ruby :

Tables de Tables de hachagehachage

Page 39: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Tables de hachage : Hash

� Les tables de hachage sont la généralisation des tableaux � Un tableau indexe les éléments par des entiers (0,1, 2, ...)

� Les clés sont des entiers� Les clés sont des entiers

� Avec une table de hachage, on peut spécifier les objets qui vont jouer le rôle de clés

� Dans une table de hachage � Chaque clé est présente au plus une fois

39

Page 40: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Tables de hachage : Hash (suite)

� Création d’une table de hachage� table_hachage1 = Hash.new

� table_hachage2 = {}

� table_hachage3 = {"a" => 1, "b" => 2, "c" => 3} table_hachage3 = {"a" => 1, "b" => 2, "c" => 3}

� Accès aux éléments d’une table � puts table_hachage3[“a”]

� table_hachage3[“d”] = “4”

40

Page 41: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Types Ruby :Types Ruby :

Les Les symbolessymboles

41

Les Les symbolessymboles

Page 42: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

C’est quoi un symbole ?

� Un symbole en Ruby est la représentation interne d’un nom

� C’est une classe dans le langage Ruby� :mon_symbole.class #=> Symbol� :mon_symbole.class #=> Symbol

� Un symbole se construit en précédent un nom de deux points� :mon_symbole

42

Page 43: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

C’est quoi un symbole ? (suite)

� Un symbole est � atomique : non décomposable

� immutable : ne peux être transformé en un autre type

� et unique : toutes les références à un symbole référent au même � et unique : toutes les références à un symbole référent au même objet

� :mon_symbole.equal?(:mon_symbole) #=> true

� “ma_chaine".equal?("ma_chaine") #=> false

43

Page 44: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Symboles vs. Chaînes de caractères

� Les symboles sont interchangeables avec les chaînes de caractères� La où on peut utiliser une chaîne de caractère, on peut utiliser un symbole

� Pourquoi utiliser un symbole à la place d’une chaîne ?� Si la même chaine est répétée dans un code 10000 fois, ça coutera 10000 fois

plus en espace mémoire de la chaîne

� Si par contre on utilise un symbole 10000 fois, il n’engendrera l’occupation que

44

� Si par contre on utilise un symbole 10000 fois, il n’engendrera l’occupation que de l’espace mémoire d’un symbole seulement

� Autres raisons d’utiliser les symboles à la place des chaînes de caractères� Les symboles sont plus faciles à saisir que les chaînes de caractères

� La différence de syntaxe permet de distinguer les clés des valeurs (cas des tables de hachage)

� :name => ‘Toto‘

Page 45: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Symboles vs. Chaînes de caractères (suite)

� 1000.times dosome_object.getProperty("name")

end

� La chaîne de caractères “name” sera créée 1000 fois

45

La chaîne de caractères “name” sera créée 1000 fois

� 1000.times dosome_object.getProperty(:name)

end

� Le symbole :name ne sera créé qu’une seule fois

Page 46: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Où sont utilisés les symboles ?

� Les symboles sont souvent utilisés en tant que :

� Clés de tables de hachage (:name => 'Brian', :hobby => 'golf')

� Paramètres de méthodes (:name, :title)

� Noms de méthodes (:poster_un_commentaire) � Noms de méthodes (:poster_un_commentaire)

� Pour faire référence au nom d’une méthode, on peut utiliser un symbole

� Car en définissant une méthode, un symbole est créé et porte le même nom que la méthode en question

46

Page 47: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Plan (deuxième partie)

� Les objets

� Les classes

� Méthodes

� Paramètres, visibilité, méthode avec “!” � Paramètres, visibilité, méthode avec “!”

� Variables

� Modules

� Opérateurs Ruby

� Convention de nommage dans Ruby

47

Page 48: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

L’objetL’objet dansdans RubyRuby

48

L’objetL’objet dansdans RubyRuby

Page 49: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Dans Ruby tout est objet

� Comme Smalltalk, Ruby est un langage purement orienté objet � Tout est objet

� Contrairement à d’autres langages tel que C#, C++ et Java qui sont des langages hybrides langages hybrides � Qui divisent le monde en types primitifs et objets

� L’approche hybride fournit une meilleure performance pour quelques applications, mais l’approche purement orientée objet est plus consistante et plus facile à utiliser

� Il n’est pas nécessaire d’envelopper une variable de type primitif dans un objet pour pouvoir l’utiliser en tant qu’objet

49

Page 50: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

C’est quoi un objet ?

� Un objet est une entité qui peut effectuer trois choses différentes� Un objet peut contenir des données, incluant des références à d’autres � Un objet peut contenir des données, incluant des références à d’autres

objets

� Un objet peut contenir des méthodes qui sont des fonctions qui ont un accès spécial aux données de l’objet

� Une méthode d’un peut appeler/exécuter d’autres méthodes

50

Page 51: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Variables et objets

� Créer un objet de type chaîne de caractères contenant le texte "Stephen Colbert“

>> comedien = "Stephen Colbert“

� Nous avons aussi dit à Ruby d’utiliser la variable "comedien" pour faire référence à cet objet qui est sauvegardé en mémoire

Stephen Colbertcomedien

51

Page 52: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Les classes RubyLes classes Ruby

52

Les classes RubyLes classes Ruby

Page 53: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Classes Ruby

� Tout objet en Ruby a une classe

� Pour retrouver la classe d’un objet, on appelle la méthode class � “Ceci est une chaîne de caractères".class #=> String� “Ceci est une chaîne de caractères".class #=> String

� 9.class #=> Fixnum

� [“Ceci",“est",“un",“tableau"].class #=> Array

� {:ceci => “est", :une => "hash"}.class #=> Hash

� :symbole.class #=> Symbol

53

Page 54: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Définir une classe

� Utiliser le mot clé class

class Chocolat� class Chocolat

# code de la classe à mettre iciend

54

Page 55: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Instanciation d’objets

� Un objet est créé via un processus appelé instanciation

� Dans Ruby ceci est principalement réalisé à travers l’appel à la méthode de classe new� objet1 = MaClasse.new(parametres)

� Cette méthode crée l’objet en mémoire et par la suite délégue le contrôle� Cette méthode crée l’objet en mémoire et par la suite délégue le contrôleà la méthode initialize de la classe si elle est présente

� La méthode itnitialize est le constructeur de la classe� class MaClasse

def initialize(nom)

@nom = nomend

endobjet = MaClasse.new(“Toto”)

55

Page 56: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Méthodes

� Déclaration d’une méthode� class UneClasse

def nom_method(parametres)

#code de la méthode

end

endend

� Appelle d’une méthode : � À partir d’un objet :

� objet.nom_methode(parametres)

� objet.nom_methode parametres

� Méthode indépendante� nom_methode(parametres)

� nom_methode parametres

56

Page 57: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Les classes Ruby : Les classes Ruby : HéritageHéritage

57

Page 58: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Héritage

� Une classe hérite des fonctionnalités (comportements) et des variables (états) d’une superclasse � Une superclasse est appelée classe parente ou classe de base

� Ruby ne supporte pas l’héritage multiple � Une classe en Ruby peut avoir une seule super classeUne classe en Ruby peut avoir une seule super classe

� Toutes les variables et méthodes sont héritées par une classe enfant de sa superclasse

� Exemple � class ClasseEnfant < ClasseParent

end

58

Page 59: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Redéfinition de méthodes

� Une classe hérite des méthodes (comportements) et des variables (états) d’une superclasse

� Si une classe redéfinit une méthode de sa superclasse, on peut toujours appeler la méthode de la superclasse en utilisant le mot clé super

59

Page 60: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Redéfinition de méthodes (suite)

� Exemple

class ParentClass

def a_methodputs 'b'

endendend

class ChildClass < ParentClassdef a_methodsuper # appelle la méthode a_method de ParentClassputs 'a'

endend

instance = ChildClass.newinstance.a_method

60

Page 61: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Variables Variables

61

Variables Variables

Page 62: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Types de variables

� Variables locales

� Variables d’instance

� Variables de classe� Variables de classe

� Variables globales

62

Page 63: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Types de variables

� Variables locales

� Variables d’instance

� Variables de classe� Variables de classe

� Variables globales

63

Page 64: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Variables locales

� Une variables locale est accessible seulement dans le contexte où ellea été définie� Souvent à l’intérieur d’une méthode

� Exemple

i0 = 1loop {i1 = 2print defined?(i0), "\n" # i0 a été initialisée à l’extérieur du blcokprint defined?(i1), "\n" # i1 a été initialisée dans le block courantbreak

}print defined?(i0), "\n" # i0 a été initalisée dans ce block print defined?(i1), "\n" # nil; i1 n’est pas accessible

64

Page 65: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Types de variables

� Variables locales

� Variables d’instance

� Variables de classe� Variables de classe

� Variables globales

65

Page 66: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Variables d’instance

� Une variables dont le nom commence par ‘@’� @nom

� Une variable d’instance, appartient à l’objet lui même� Une variable d’instance, appartient à l’objet lui même� Elle est visible à l’intérieur des méthodes de l’objet seulement

� Les variables d’instance non initialisées ont la valeur nil

66

Page 67: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Types de variables

� Variables locales

� Variables d’instance

� Variables de classe� Variables de classe

� Variables globales

67

Page 68: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Variables de classe

� Une variables dont le nom commence par ‘@@’� @@nom

� Les variables de classes sont partagées par toutes les instances de la classe, de la superclasses et des sous-classes de la classe, de la superclasses et des sous-classes

� Une variable de classe est accessible aux niveau de toutes les méthodes de la classe

68

Page 69: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Variables de classe (suite)

� Exemple

class Polygon

@@sides = 10

def self.sides

@@sides@@sides

end

end

class Triangle < Polygon

@@sides = 3

end

# Class variables are shared in the class hierarchy

puts Triangle.sides # => 3

puts Polygon.sides # => 3

69

Page 70: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Types de variables

� Variables locales

� Variables d’instance

� Variables de classe� Variables de classe

� Variables globales

70

Page 71: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Variables globales

� C’est une variable dont le nom commence par '$‘� $variable_globale

� Sa portée est globale

� Elle peut être accédée de n’importe quelle place dans le programmeprogramme

� Les variables globales sont à utiliser avec précaution� Dangeureuses car elles peuvent être accédées/modifiées n’importe où

� La surutilisation des variables globales rend la détection de bug difficile

71

Page 72: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

MéthodesMéthodes

72

MéthodesMéthodes

Page 73: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Méthode de classe vs. Méthode

d’instance

� Une méthode de classe est accessible sans instanciation� MaClasse.methode_classe

� Une méthode d’instance n’est accessible qu’après instanciation� mon_objet = MaClasse.new

mon_objet.methode_d_instance

� Une classe peut contenir des méthodes de classe et/ou des méthodes � Une classe peut contenir des méthodes de classe et/ou des méthodes d’instance

� Les méthodes de classes sont définies en utilisant le mot clé self� self.def nom_methode_classe

# code ruby

end

� def self.nom_methode_classe

# code ruby

end

73

Page 74: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Méthode de classe vs. Méthode

d’instance (exemple)

class MyClass

def self.classe_method

#code

end

def my_instance_method

#code

end

end

MyClass.classe_method

my_object = MyClass.new

my_object.my_instance_method

74

Page 75: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Méthodes: Méthodes: Visibilité Visibilité

75

Méthodes: Méthodes: Visibilité Visibilité

Page 76: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Déclarer la visibilité

� Par défaut, toutes les méthodes des classes Ruby sont publiques � Accessibles pour tout le monde

� Si nécessaire, cet accès peut être restreint avec � Si nécessaire, cet accès peut être restreint avec les mots clés � private� protected

76

Page 77: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Visibilité : private & protected

� Les parenthèses autour des paramètres peuvent être omises

� Si private ou protected sont utilisées sans paramètres, toutes les méthodes qui vont suivre ces appels seront privées ou protégés (suivant le cas)

� Une méthode privée peut être appelée seulement à l’intérieur du même objet

� Une méthode protégée peut être appelée à l’intérieur du même objet ou par des objets de la même classe et de ses sous-classespar des objets de la même classe et de ses sous-classes

class Exampledef methodAendprivate # toutes les méthodes qui vont suivre seront privéesdef methodP1enddef methodP2end

end

77

Page 78: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Déclarer la visibilité : private

� La méthode private peut être invoquée avec des paramètres� Seulement les méthodes indiquées dans les paramètres seront privées

class Exampledef methodAendend

def methodPend

private :methodP # change la visibilité de methodP à privateend

78

Page 79: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

MéthodesMéthodes ::

MéthodeMéthode avec ! (Bang) avec ! (Bang)

79

MéthodeMéthode avec ! (Bang) avec ! (Bang)

Page 80: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Méthodes avec ! (Bang)

� Dans Ruby, les méthodes dont les noms se terminent pas un point d’exclamation modifient l’objet appelant

� Si par contre une méthode ne contient pas le point d’exclamation, alors l’objet appelant n’est pas modifié

� Exemple � nom = “Toto”

� nom2= nom.upcase # contenu de nom = “Toto”, et nom2 : “TOTO”

� nom.upcase! # nom sera : “TOTO”

80

Page 81: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Modules Modules

81

Modules Modules

Page 82: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

C’est quoi un Module ?

� Dans Ruby, les modules peuvent regrouper des méthodes, des variables et des classes

� Un module se comporte comme une classe sauf qu’un module � Un module se comporte comme une classe sauf qu’un module ne peut pas être instancié

� Les modules est un mécanisme efficace pour l’extension de classes/objets

82

Page 83: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Déclaration d’un module

module NotrePremierModule

# methodes# variables# variables# classes

end

83

Page 84: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Mixage (Mix-in)

� Un module peut être inclus dans une classe en utilisant le mot clé include suivi du nom du module

module MixAlotdef say_what?"hello"

endendend

class Mcinclude MixAlot

# ... method say_what? est disponibleend

a = Mc.newa.say_what? # hello

84

Page 85: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Importer un module

� Si un module est déclaré dans un autre fichier, on doit en premier lieu importer ce module avec le mot clé require avant de pouvoir l’utiliser

# module MixAlot sauvegardé dans un fichier nommé : mixalot.rb

module MixAlotdef say_what?def say_what?"hello"

endend

# et la classe Mc sauvegardée dans un fichier nommé mc.rb# (dans le même répertoire )require “mixalot”class Mcinclude MixAlotend

85

Page 86: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

OpérateursOpérateurs Ruby Ruby

86

OpérateursOpérateurs Ruby Ruby

Page 87: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Opérateurs Ruby

� a+=b : a = a + b

� a-=b : a = a - b

� a*=b : a = a * b� a*=b : a = a * b

� a/=b : a = a / b

� a and b : et logique vaut true ou false

� a or b : ou logique vaut true ou false

87

Page 88: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Opérateurs Ruby (suite)

� a || b : a est évalué en premier. � Si a est différent de nil et de false, alors l’évaluation s’arrête et l’expression retourne a

� Sinon c’est b qui est retourné� Sinon c’est b qui est retourné

� Souvent utilisé pour retourver une valeur par défaut lorsqu’une variable n’a pas été initialisée

� a ||= b : équivalent à a = a || b

88

Page 89: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Conventions de Conventions de

89

Conventions de Conventions de

nommage nommage

Page 90: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Conventions de nommage

� Fichier Ruby : extension .rb� monprogramme.rb

� Exécuter un fichier Ruby � >>ruby monprogramme.rb

� Noms de classes et de modules : minuscules +majuscules� MaClasse� MonModule

� Méthodes : minuscules + soulignés� ma_premiere_methode

� Variables locales: idem que les méthodes� ma_premiere_variable

� Variables d’instance : @ comme préfixe au nom de la variable� @ma_variable_d_instance

90

Page 91: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Conventions de nommage (suite)

� Variables de classe : @@ comme préfixe au nom de la variable� @@ma_variable_de_classe

� Variables globales : $ comme préfixe au nom de la variable� Variables globales : $ comme préfixe au nom de la variable� $ma_variable_globale

� Constantes : majuscules + soulignes� MA_CONSTANTE

91

Page 92: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Méthodes récursives

� Une méthode est dite récursive si elle s'appelle elle même

� Example

� Calcul du factoriel d'un nomber

def factoriel(n)

if (n > 1)

return n * factoriel (n-1)return n * factoriel (n-1)

else

return 1

end

end

Ou :

def factoriel(n)

(n > 1) ? (n * factoriel (n-1)) : 1

end

92

Page 93: Technologies du commerce électroniquedift2035/e2009/cours/introduction_a_ru… · Comme Smalltalk, Ruby est un langage purement orienté objet Tout est objet Contrairement à d’autres

Références

� Ruby à partir du navigateur

� http://tryruby.hobix.com/

� Vidéos sur les concepts de base de Ruby

� http://www.tekniqal.com/

� Huw Collingbourne, The book Of Ruby. 2009.

� http://www.sapphiresteel.com/The-Book-Of-Ruby� http://www.sapphiresteel.com/The-Book-Of-Ruby

� Cours de Sang Shin

� http://www.javapassion.com/rubyonrails/

� Cours introductifs à ruby

� http://www.techotopia.com/index.php/Ruby_Essentials

� Tutorial ruby avec des exemples

� http://www.fincher.org/tips/Languages/Ruby/

� Why’s (poignant) guide to ruby. Livre gratuit sous forme d’une bande dessinée

� http://poignantguide.net/ruby/whys-poignant-guide-to-ruby.pdf

93