Une introduction à Ruby

a marqué ce sujet comme résolu.

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.

Donc, dans la partie 2, les chapitres sur les objets et les classes sont totalement écrits, il manque juste quelques mots sur le SRP. Et le chapitre sur les blocs est quasiment fini, il manque les différences entre Proc et lambda et la première section qui explique la notion de fermeture.

+0 -0

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.

+0 -0

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.

+0 -0

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.

+0 -0

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.

+0 -0

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.

+0 -0

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.

+0 -0

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.

EDIT :

  • La partie 2 est terminée, donc des relectures sont bienvenus (et peuvent sans doute aider pour la validation).
  • Le chapitre sur les énumérables est terminé (et est lonnnnnnnng). En exercice, on recode une partie du module.
  • J’ai commencé à placé des TPs (que j’ai la flemme d’écrire pour le moment) histoire d’avoir plus de pratique dans le tutoriel).
  • Je suis également en train de réécrire le chapitre d’introduction qui sera découpé en deux. En particulier, on expliquera qu’il y a plusieurs implémentations de Ruby, fera installer Ruby avec rbenv, présentera un peu l’histoire de Ruby, quelques ressources bibliographiques, etc.
+0 -0

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.

+0 -0

Voici mes remarques, après une relecture du tutoriel. Sachant que

  • J’ai lu le tutoriel, je n’ai pas cherché à l’appliquer (pas testé les codes par exemple)
  • Je ne connais pas Ruby de base.

Nous pouvons également utiliser les syntaxes %(), %q() et %Q() pour déclarer une chaîne de caractères.

Préciser si il y a une différence entre ces différentes syntaxes ou non ? C’est assez déroutant de voir trois syntaxes de plus sortir de nulle part.

Il y a des ternaires en Ruby <3

Juste avant la section "Contrôler l’exécution du code", tu as un "0 1 2 3 4" dont le "0" est affiché bizarrement. (et ça se répète régulièrement comme situation)

Quand tu parles de la méthode each, tu utilises "|i|", mais tu ne précises pas ce que c’est. Après quelques secondes de bug, j’imagine que c’est ce qui définit la variable dans le bloc ?

Pinaillage

En effet, %W[une chaîne deux] ne donne pas ["une chaîne", "deux"] mais ["une", "chaîne", "deux"]

L’espace entre "une et chaîne" est caché par un espace à la ligne quand je le lis. Je ne sais pas si c’est empêchable ?

A propos des hash de Ruby : j’imagine que c’est comme pour tout autre structure de données similaires : il faut forcément que les clés soient hashables pour pouvoir faire exister un hash, non ? (Je pose la question au cas où Ruby serait encore plus fun que je suis en train de le découvrir :p ) Si c’est le cas, il est possible d’en toucher un mot dans le chapitre sur les hashs ?

Nous les utilisons depuis le premier chapitre de ce tutoriel et nous nous n’avons jamais vraiment répondu à cette question ? [c’est dans le chapitre sur "revenons aux variables"]

C’est tout pour la partie 1. Je relirai sans doute la partie 2 un peu plus tard.

En tout cas, ce tuto a vraiment l’air excellent :)

+3 -0

Merci pour ta relecture. Je réponds à tes différents points (ceux auxquels je ne réponds pas seront bien sûrs pris en compte).

Nous pouvons également utiliser les syntaxes %(), %q() et %Q() pour déclarer une chaîne de caractères.

Préciser si il y a une différence entre ces différentes syntaxes ou non ? C’est assez déroutant de voir trois syntaxes de plus sortir de nulle part.

Je précise les choses à la fin du chapitre avant les exercices. Les syntaxes % et %Q sont équivalentes (% est un raccourci) et correspondent à des guillemets doubles, la syntaxe %q à des guillemets simples. Et je donne également quelques règles d’utilisation. Mais c’est vrai que ça peut être déroutant de les voir apparaître comme ça au milieu du chapitre sans aucune explication. Je devrais peut-être déplacer leur introduction à la fin du chapitre avec ces explications ?

Pinaillage

En effet, %W[une chaîne deux] ne donne pas ["une chaîne", "deux"] mais ["une", "chaîne", "deux"]

L’espace entre "une et chaîne" est caché par un espace à la ligne quand je le lis. Je ne sais pas si c’est empêchable ?

C’est lié au HTML ça. Je vais ruser et placer le code dans un bloc de code !

A propos des hash de Ruby : j’imagine que c’est comme pour tout autre structure de données similaires : il faut forcément que les clés soient hashables pour pouvoir faire exister un hash, non ? (Je pose la question au cas où Ruby serait encore plus fun que je suis en train de le découvrir :p ) Si c’est le cas, il est possible d’en toucher un mot dans le chapitre sur les hashs ?

Il faut effectivement que les clés soient hashables. Mais chaque objet de Ruby a une méthode hash et donc tous les objets sont hashables.

puts 2.hash
puts 'abc'.hash
puts method(:puts).hash
puts 2.class.hash
puts Object.new.hash

Et on peut la redéfinir. Par exemple, si on a une classe C dont on sait que l’attribut x est unique pour chaque instance, on pourrait redéfinit hash pour qu’il corresponde au hash de cet attribut.

class C
  @id = 0

  def self.id
    @id
  end
  
  def self.id=(x)
    @id = x
  end

  attr_reader :x

  def initialize
    @x = C.id
    C.id += 1
  end

  def hash
    @x.hash
  end
end

puts C.new.hash == 0.hash  # => true
puts C.new.hash == 1.hash # => true

Voilà, encore merci pour ta relecture. :)

+0 -0

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.

+0 -0

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.


Après le retour de validation de @adri1, la partie sur la POO est remaniée, dans la partie POO chantier qui sera à terme la partie POO. En voici un plan.

Objets et classes

Ruby et les objets

  • C’est quoi un objet ?
  • Ruby est un langage orienté objet, tout est objet en Ruby.
  • On agit sur les objets à l’aide de méthodes.
  • Création du premier objet avec Objct.new et ajout de méthodes à cet objet.
  • Introduction des attributs et de méthodes pour y accéder et les modifier.

Un modèle de construction

  • Classe = moule pour créer des objets.
  • Création de la première classe.
  • Vocabulaire instances, méthodes d’instance, etc.
  • Constructeur avec méthode initialize.

Des méthodes usuelles

  • Accesseurs et mutateurs avec attr_reader, attr_writer et attr_accessor.
  • Tout ce qui est conversion (to_s, etc.).
  • Opérateurs sont aussi des méthodes.

Exercices

Création d’une classe pour représenter des durées.

Les classes plus en profondeur

Retour sur les méthodes

  • Les méthodes d’instances sont dans les classes, pas dans les objets.
  • On peut ouvrir une classe.
  • Méthodes singletons sont aussi dans une classe appelée classe singleton.
  • Algorithme de lookup => regarder les méthodes d’instances dans la classe singleton, puis celles dans la classe, puis celles dans Object.

Objet courant

  • Quand on écrit method_name, Ruby sait pour quel objet il faut appeler cette méthode => objet courant.
  • Plot twist : puts, print et les méthodes déclarées au top level sont des méthodes de tous les objets ce qui explique qu’on puisse les appeler partout.
  • self permet d’accéder à l’objet courant.
  • Méthodes bang.
  • main = objet courant au top level.

Les classes sont… des objets

  • Classes ont des méthodes.
  • Définir méthodes de classe = définir méthodes singleton pour un objet qui est la classe en question.
  • Utile par exemple pour fournir d’autres constructeurs.
  • En tant qu’objet, a aussi des variables d’instances.
  • Peut mettre constante de classe.
  • Modèle de structure de classe.

Exercices (Non écrit pour le moment)

Gestion de compte en banque. Trois monnaies, le Z, le S et le C avec des taux de change (fixe ou variables ?). Une banque a une monnaie et des frais de change vers les autres monnaies, frais qui ne doivent pas excéder un maximum. Avec un compte on peut ajouter et retirer de l’argent. On peut comparer deux banques pour savoir laquelle est la mieux pour jouer avec un certain type de monnaie. Une banque peut aussi comparer ses clients.

Aller plus loin => rajouter client. Client = humains => possède vrai argent dans devise, peut retirer, ajouter en utilisant un compte, peut obtenir un compte dans une banque, supprimer son compte, etc.

De bonnes classes

Des fournisseurs de services

  • Exemple du chat avec attributs pour l’énergie et la faim.
  • Mais, ces attributs sont internes au chat. Ce qu’on veut c’est savoir s’il est fatigué/a faim.
  • Construire une classe => se demander quels services on doit pouvoir demander à une instance.
  • Solution, méthode hungry? et tired?
  • Tout ça forme l’interface de la classe.
  • Pour avoir une bonne interface, rendre certaines méthodes inaccessibles => visibilité.
  • Méthodes privées et protégées.
  • Visibilité = aide pour le programmeur => rendre privé ce qui doit être privé.
  • Nouveau Modèle de structure de classe.

Une histoire d’invariants

  • Un objet doit rendre son service bien. Par exemple afficher 28:12:03, c’est une erreur.
  • Pour ça, il doit notamment être dans un état correct (s’il y a un attribut hour et que c’est lui qui est affiché, il ne doit pas pouvoir avoir la valeur 28).
  • On doit s’assurer que l’objet garde un état correct de sa création jusqu’à la fin du programme. => Respecter les invariants.
  • Lorsque des méthodes modifient des attributs, il y a des chances d’obtenir un objet dans un état incorrect, faire attention à cela.
  • Une bonne visibilité aide à conserver les invariants.
  • Encapsulation = n’offrir que des services permettant de respecter les invariants.
  • Qu’utiliser lorsque nous programmons la classe, attributs ou accesseurs/mutateurs => faire des choix et rester cohérent. Toujours faire attention au respect des invariants.

De bons et loyaux services

  • L’objectif est de fournir de bons services : code clair, facile à tester et maintenir.
  • Identifier le service, c’est identifier un contrat entre la méthode et son utilisateur : si tu me donnes ça, je te garantis ça => notions de préconditions et de postconditions. Mention du TDD.
  • Pour faciliter tout ça, des services simples, donc des méthodes simples. En particulier, une méthode = un service. Mention du SRP.
  • Avoir une classe permet de donner du sens à certains objets et à certaines opérations et donc d’avoir un code plus clair. Par exemple, on n’additionne pas les températures et les distances. En particulier, rajout (et respect) d’invariants et de contrats facilités (on ne construit pas d’objets incohérents et nos services les gardent dans des états cohérents).
  • Un objet peut être compris comme les services qu’il peut rendre => Duck Typing, une méthode n’attend pas un objet d’une certaine classe, mais juste un objet qui sait rendre les services qu’on lui demandera. print par exemple attend juste un objet qui sait s’afficher avec to_s.

Exercices (Non écrit)

Les modules

Les modules

  • On crée un premier module.
  • Permet de regrouper des méthodes et des constantes.
  • Introduction de module_function.
  • Les modules sont des espaces de noms.
  • On peut inclure un module => analogie avec un tiroir qu’on déverse.

Modules et classes

  • Modules semblables aux classes. Que faut-il utiliser ?
  • Modules ne sont pas instanciables.
  • Modules pour regroupement de méthodes et constantes.
  • On peut imbriquer des modules et des classes dans d’autres modules/classes.
  • Un fichier par module et par class. Utilisation du fichier avec require_relative.

Inclusion de modules

  • include indique à Ruby que les méthodes d’instances du module sont maintenant des méthodes d’instances de Object.
  • module_function déclare des méthodes du module, mais aussi des méthodes d’instances, ce qui permet à include de fonctionner.
  • Un peu plus de complexité dans notre algorithme de lookup. Après avoir regardé les méthodes de Object, on regarde dans les méthodes des modules qu’on a inclus.

Exercices (En cours d’écriture)

solveur de Sudoku

Des objets plus complexes (non écrit)

Très semblable à la version du chapitre précédemment écrite. Puisque certains points ont déjà été abordé précédemment (on a par exemple introduit de plus en plus d’éléments de l’algorithme de lookup, le *duck typing, la composition, les variables d’instances de classes ont déjà été abordées, etc.) il sera un peu plus léger, ce qui permettra de se concentrer vraiment sur l’héritage et les mixins. Avec les mixins, expliquer que les méthodes puts et print sont des méthodes de Kernel qui est mixé à Object.

Chapitre TP avec comme objectif les principes SOLID

Gestion de Discographie, (TP honteusement piqué au tutoriel C++ <3 )…


Et le reste (exceptions et blocs) ne change pas trop.

EDIT : plan modifié

+2 -0

Coucou ! Ce cours m’enjaille de plus en plus. Je vais peut-être y consacrer du temps dans les prochains jours (python me gonfle, et j’ai pas du tout envie de faire du scripting en bash). Bravo pour ton travail.

J’ai une question très humble qui peut paraître totalement méchante et je te prie de bien vouloir ne pas la prendre ainsi. Est-ce que Ruby est encore bien soutenue ? J’en ai beaucoup entendu parler il y a un peu moins d’une dizaine d’années, mais je le vois très peu en ce moment. Désolé si ma question te blesse :s

+0 -0

Coucou ! Ce cours m’enjaille de plus en plus. Je vais peut-être y consacrer du temps dans les prochains jours (python me gonfle, et j’ai pas du tout envie de faire du scripting en bash). Bravo pour ton travail.

Merci, ça veut dire que le tutoriel remplit totalement son objectif. :) je fais également quelques scripts en Ruby et c’est plutôt cool. La bibliothèque standard a de très bons outils pour (je pense notamment à Dir et à File.

J’ai une question très humble qui peut paraître totalement méchante et je te prie de bien vouloir ne pas la prendre ainsi. Est-ce que Ruby est encore bien soutenue ? J’en ai beaucoup entendu parler il y a un peu moins d’une dizaine d’années, mais je le vois très peu en ce moment. Désolé si ma question te blesse :s

Ma blessure est sans égal et saigne à flot. :p En France, il n’est pas forcément le plus populaire, surtout quand on le compare avec Python, mais il reste quand même utilisé. Le langage est toujours maintenu (la version 2.7.1 est sortie en mars). La version 2.7 a notamment apporté un support expérimental du pattern matching. Le but avec toutes ces versions est d’arriver à la version 3 qui apportera plusieurs nouveautés dont du type checking et un nouveau modèle de concurrence.

+0 -0

Owi du pattern matching ! <3 c’est ma raison principale d’aimer OCaml et il est bien trop absent de beaucoup trop de langages à mon sens ! <3

Bref, OK. J’ai découvert que Mastodontes utilisait ROR d’ailleurs, ça me parait être un gage de '’oui, ce langage est toujours d’actualité’' :)

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.

+0 -0

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.

+0 -0

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte