472 votes

Différence entre une classe et un module

Je venais de Java, et maintenant je travaille davantage avec Ruby.

Une fonctionnalité linguistique qui ne m'est pas familière est la fonction module . Je me demande ce qu'est exactement un module et quand en utiliser une, et pourquoi utiliser une module sur un class ?

31 votes

549voto

shevchik Points 6781
                class                      module                          

 instantiation  can be instantiated        can *not* be instantiated       

 usage          object creation            mixin facility. provide         
                                             a namespace.                  

 superclass     module                     object                          

 methods        class methods and          module methods and              
                  instance methods           instance methods              

 inheritance    inherits behaviour and can No inheritance                  
                  be base for inheritance                                  

 inclusion      cannot be included         can be included in classes and  
                                             modules by using the include  
                                             command (includes all         
                                             instance methods as instance  
                                             methods in a class/module)    

 extension      can not extend with        module can extend instance by   
                  extend command             using extend command (extends 
                  (only with inheritance)    given instance with singleton 
                                             methods from module)

13 votes

J'ai obtenu la hiérarchie, Classe -> Module -> Objet -> BasicObject. Cool !

0 votes

Pourquoi "module consists of" omet-il les variables, alors que les classes et les modules supportent tous deux les variables de classe ? Voir la réponse acceptée à stackoverflow.com/questions/5690458/

0 votes

Beaucoup de diagrammes dans toutes ces réponses. Un petit exemple de fonctionnement : rubyfiddle.com/riddles/06081

432voto

scottru Points 1610

La première réponse est bonne et donne quelques réponses structurelles, mais une autre approche consiste à réfléchir à ce que vous faites. Les modules ont pour but de fournir des méthodes que vous pouvez utiliser dans plusieurs classes - pensez à eux comme à des "bibliothèques" (comme vous le verriez dans une application Rails). Les classes concernent les objets ; les modules concernent les fonctions.

Par exemple, les systèmes d'authentification et d'autorisation sont de bons exemples de modules. Les systèmes d'authentification fonctionnent sur plusieurs classes d'applications (les utilisateurs sont authentifiés, les sessions gèrent l'authentification, de nombreuses autres classes agissent différemment en fonction de l'état de l'authentification), les systèmes d'authentification agissent donc comme des API partagées.

Vous pouvez également utiliser un module lorsque vous avez des méthodes partagées entre plusieurs applications (là encore, le modèle de la bibliothèque est bon).

7 votes

Le module est-il identique aux interfaces en Java ?

17 votes

@Caffeine pas vraiment car les modules Ruby incluent des implémentations, alors que les interfaces en Java sont abstraites.

0 votes

Ahh ! Je vois ! Les Modules sont des Packages ou des JARs et les Classes sont des Classes !

101voto

Linan Points 101

Je suis surpris que personne n'ait encore dit ça.

Comme la personne qui a posé la question venait d'un milieu Java (et moi aussi), voici une analogie qui peut aider.

Les classes sont tout simplement comme les classes Java.

Les modules sont comme les classes statiques de Java. Pensez à Math en Java. Vous ne l'instanciez pas, et vous réutilisez les méthodes de la classe statique (ex. Math.random() ).

14 votes

Mais les modules peuvent également ajouter des méthodes d'instance à la classe incluse, alors que les classes statiques en Java ne le peuvent pas.

5 votes

Cette affirmation est également vraie si l'on vient d'un environnement C# lourd.

5 votes

Ce n'est pas tout à fait vrai ; les modules n'ont pas de méthodes statiques, ils ont simplement des méthodes. Les modules peuvent "s'étendre eux-mêmes" (la syntaxe est en fait extend self ), en mettant leurs méthodes à la disposition de leurs self La métaclasse de l'entreprise. Il est ainsi possible de répartir une méthode telle que random() sur un Math module. Mais, de par leur nature, les méthodes d'un module ne peuvent pas être appelées sur le module lui-même. self . Cela est lié à la notion de Ruby de self ses métaclasses, et comment fonctionne la recherche de méthodes. Consultez "Metaprogramming Ruby" - Paolo Perlotta pour plus de détails.

42voto

hurcane Points 655

En fait, le module ne peut pas être instancié. Lorsqu'une classe inclut un module, une superclasse proxy est générée et donne accès à toutes les méthodes du module ainsi qu'à celles de la classe.

Un module peut être inclus par plusieurs classes. Les modules ne peuvent pas être hérités, mais ce modèle "mixin" fournit un type utile d'"héritage multiple". Les puristes de l'OO ne seront pas d'accord avec cette affirmation, mais ne laissez pas la pureté vous empêcher de faire votre travail.


(Cette réponse était initialement liée à http://www.rubycentral.com/pickaxe/classes.html mais ce lien et son domaine ne sont plus actifs).

0 votes

Oui, c'est comme ça que ça marche. En tant que tels, les modules sont pas comparable aux classes "statiques" de Java ; la superclasse du proxy (certains l'appellent une "métaclasse") devient le récepteur des messages de répartition des méthodes du module, ce qui rend il est plus comparable à une classe statique en Java, et ses méthodes fonctionnent comme des méthodes statiques. Il en va toutefois de même pour les classes Ruby, qui peuvent adopter des méthodes de type "statique" par le biais de la fonction extend d'une classe. En fait, Ruby ne fait pas du tout la distinction entre les méthodes d'instance et les méthodes de classe/statique, mais seulement entre leurs récepteurs.

8voto

Boris Stitnicky Points 5409

Module en Ruby, dans une certaine mesure, correspond à Java classe abstraite -- possède des méthodes d'instance, les classes peuvent en hériter (par l'intermédiaire de include les gars de Ruby l'appellent un "mixin"), mais n'a pas d'instances. Il existe d'autres différences mineures, mais ces informations sont suffisantes pour vous permettre de démarrer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X