Programmation Orientée Objet
Classes
Création et instanciation d’une classe
Un classe se crée à l’aide du mot clé class puis s’instencie avec la méthode new.
Variables d’instance et constructeur
En Ruby, les variables d’instance sont symbolisées par un @ et sont définit directement au niveau du constructeur, lui-même définit avec la méthode initialize.
Méthodes d’instance
Les méthodes d’instance se définissent au sein de la classe comme des méthodes classiques et suivent les même conventions. (nommage, ? si renvoie booléen, ! si modifie l’objet…)
Il est possible d’appeler une autre méthode d’instance depuis une méthode comme on appellerait une fonction depuis l’exterieur de la classe. (Pas de this)
Setter et Getter
- Methode naïve
- Utilisation de
attr_accessor,attr_readeretattr_writer
Ces 3 méthodes sont en fait des méthodes de classes qui permettent de créer les getter et setter qui est appelée statiquement à l’intérieur de la classe.
Méthodes privées
Les méthodes privées doivent être déclarées après le mot-clé private. Elles restent accessibles à l’intérieur de la classe.
Méthodes et Variables de classe
- Méthodes de classe
Les méthodes de classe ne sont pas rattachées à une instance de la classe et se déclarent avec le mot-clé self.
Pour appeler une méthode de classe depuis une méthode d’instance, il faut utiliser self.class.<nom_methode>.
- Variables de classe
Les variables de classe se déclarent avec @@. Dans les méthodes de classe ou d’instance, on accède toujours aux variables de classe directement.
Ouverture des classes
En Ruby, les classes restent toujours ouvertes, il est donc possible de les modifier après leur déclaration.
Soit en créant une méthode de classe à l’exterieur de celle-ci :
Soit en réutilisant la même déclaration :
Il est ainsi possible de “modifier” les méthodes internes à Ruby comme les méthodes de la classe String par exemple…
Méthodes “spéciales” et opérateurs
- methode
class
La méthode class, appelée sur un objet, renvoie le Class de cet objet.
<et>
Il est possible d’implémenter les opérateurs de supériorité et d’infériorité sur des objets en définissant ces méthodes qui prennent chacune l’élément sur lequel s’applique la comparaison :
L’héritage
L’héritage se fait en Ruby avec le symbole <.
Ainsi, HeritedClass “hérite” de toutes les méthodes et tous les attributs de BaseClass. Et il est aussi possible d’en ajouter de nouveaux ou de les surcharger. Dans ce cas, la méthode parente est accessible via le mot-clé super.
Warning
En Ruby, super correspond bien à la méthode parente et non à l’objet parent. De plus, utiliser super appelle la méthode (par défaut, avec les même paramètres que la méthode surchargée).
Info
De la même manière que la méthode class, appeler class.superclass donne des informations sur la classe de base. Si on remonte dans la hiérarchie, toutes les classe de base héritent de Object qui, elle-même, hérite de BaseObject.
Les exceptions
- Lancement d’une exception
En Ruby, une exception se lève avec la méthode raise.
- Capture d’une exception
Une exception peut être capturer entre un begin et un rescue (qui prend en paramètre le type d’exception qu’on veut capturer) :
- Execution de code même si erreur
Le mot-clé ensure permet d’exécuter du code même si une exception a été capturée :
- Créer une classe d’erreur
En général, on ne fait pas hériter les classes d’erreur de RuntimeError mais on crée une classe Error pour le module, qui hérite de RuntimeError, et ensuite les classes d’erreur héritent de cette Error. Cela permet de capturer en une seule fois toutes les erreurs possibles pour le module en question au niveau du rescue :