La différence entre une classe et un module de
Je suis venu de Java, et maintenant je travaille plus avec Ruby.
Une langue fonctionnalité que je ne suis pas familier avec le module
. Je me demande ce qu'est exactement un module
et de le faire lorsque vous utilisez l'un, et pourquoi utiliser un module
sur une class
?
Vous devez vous connecter pour publier un commentaire.
La première réponse est la bonne et donne quelques réponses structurelles, mais une autre approche est de penser à ce que vous êtes en train de faire. Les Modules sont sur la fourniture de méthodes que vous pouvez utiliser sur plusieurs classes de penser à eux comme des "bibliothèques" (comme vous pouvez le voir dans une application Rails). Les Classes sont des objets; les modules sont sur les fonctions.
Par exemple, l'authentification et l'autorisation de systèmes sont de bons exemples de modules. Les systèmes d'authentification d'un travail sur plusieurs app-classes de niveau (les utilisateurs sont authentifiés, des séances de gérer l'authentification, beaucoup d'autres classes d'agir différemment, en fonction de l'authentification de l'état), de sorte que les systèmes d'authentification loi partagé Api.
Vous pouvez également utiliser un module lorsque vous avez des méthodes partagées entre plusieurs applications (encore une fois, le modèle de bibliothèque est bon ici).
Enumerable
module comporter: nécessite un peu de méthode (:each
dans ce cas), puis de fournir une autre méthode basée sur celle exigée. Cela semble comme une demande de programmeurs de deux langues.public abstract class Test {}
iamnotmaynard
déjà parlé sur une autre réponse: les Modules peuvent ajouter des méthodes d'instance à l', y compris la classe.Je suis surpris que quelqu'un n'a pas dit encore.
Puisque le demandeur est venu de Java arrière-plan (et j'en faisais), voici une analogie qui permet de.
Classes sont tout simplement comme des classes Java.
Modules sont comme Java les classes statiques. Pensez à
Math
classe en Java. Vous n'avez pas l'instancier, et vous réutiliser les méthodes dans la classe statique (par exemple.Math.random()
).extend self
), ce qui rend leurs méthodes à la disposition de leursself
's métaclasse. Cela rend possible l'envoi d'une méthode commerandom()
sur unMath
module. Mais, de par leur nature, d'un module méthodes ne peuvent pas être appelée sur le module propreself
. Cela a à voir avec le Rubis de la notion deself
, son metaclasses, et comment la méthode de recherche travaille. Découvrez "la Métaprogrammation Ruby" - Paolo Perlotta pour plus de détails.Fondamentalement, le module ne peut pas être instanciée. Lorsqu'une classe comporte un module, un proxy de la superclasse est généré, qui donne accès à toutes les méthodes de module ainsi que les méthodes de la classe.
Un module peut être utilisée par plusieurs classes. Les Modules ne peuvent pas être héréditaire, mais ce "mixin" modèle fournit un utile type de "plusieurs inheritrance". OO les puristes ne seront pas d'accord avec cette affirmation, mais ne laissez pas la pureté obtenir de la manière de faire le travail.
(Cette réponse à l'origine lié à
http://www.rubycentral.com/pickaxe/classes.html
, mais ce lien et son domaine ne sont plus actifs.)extend
ing une classe. Ruby ne fait pas de distinction entre les "instance" et de "classe/static" méthodes à tous, seuls les récepteurs d'entre eux.Module
en Ruby, à un degré, correspond à Java classe abstraite - a méthodes d'instance, les classes peuvent hériter de celui-ci (viainclude
, Ruby les gars, c'est un "mixin"), mais n'a pas d'instances. Il y a d'autres différences mineures, mais cette quantité d'informations est assez pour vous obtenir a commencé.espace de noms: modules sont des espaces de noms...qui n'existe pas en java 😉
J'ai aussi changé de Java et python, Ruby, je me souviens avoir eu exactement la même question...
Donc la réponse la plus simple est que le module est un espace de noms, ce qui n'existe pas en Java. En java la plus proche de la mentalité de l'espace de noms est un paquet.
Donc un module en ruby, c'est comme ce que en java:
classe? Aucune
interface? Aucune
classe abstraite? Aucune
paquet? Oui (peut-être)
méthodes statiques à l'intérieur de classes en java: de même que les méthodes à l'intérieur de modules en ruby
En java, l'unité minimale est une classe, vous ne pouvez pas avoir une fonction à l'extérieur de la classe. Cependant, en ruby, c'est possible (comme python).
Donc ce qui se passe dans un module?
des classes, des méthodes, des constantes. Module protège en vertu de cet espace de noms.
Aucune instance: modules ne peuvent pas être utilisés pour créer des instances
Mixte ins: parfois l'héritage des modèles ne sont pas bonnes pour les classes, mais en termes de fonctionnalité souhaitez regrouper un ensemble de classes/méthodes/constantes ensemble
Règles sur les modules en ruby:
- Les noms de Module sont UpperCamelCase
- les constantes dans les modules sont TOUS les BOUCHONS (cette règle est la même pour tous les rubis constantes, non spécifiques des modules)
- les méthodes d'accès: utilisation . opérateur
- l'accès des constantes: utilisation : symbole
exemple simple d'un module:
comment utiliser des méthodes à l'intérieur d'un module:
comment utiliser les constantes d'un module:
Autres conventions sur les modules suivants:
L'utilisation d'un module dans un fichier (comme ruby classes, une classe par fichier ruby)
Bottom line: Un module est un croisement entre un statique/classe utilitaire et un mixin.
Mixin sont réutilisables morceaux de "partielle" de la mise en œuvre, qui peuvent être combinés (ou composé) dans un mix & match de la mode, à aider à écrire de nouvelles classes. Ces classes peuvent en outre disposer de leur propre etat et/ou du code, bien sûr.
Classe
Lorsque vous définissez une classe, vous définissez un plan pour un type de données.
classe contenir des données, des méthodes que d'interagir avec ces données et sont utilisées pour instancier des objets.
Module
Modules sont un moyen de regrouper des méthodes, des classes et des constantes.
Modules de vous donner deux avantages majeurs:
=> Modules de fournir un espace de noms et d'éviter les collisions de noms.
Espace de noms permettre d'éviter des conflits avec des fonctions et des classes avec le même nom et qui ont été écrits par quelqu'un d'autre.
=> Modules de mettre en œuvre le mixin installation.
D'abord, quelques similitudes qui n'ont pas encore été mentionnés. Ruby prend en charge l'ouverture des classes, mais les modules ouvrir trop. Après tout, la Classe hérite de Module dans la Classe de l'héritage de la chaîne et donc de Classe de Module et ont certains comportements similaires.
Mais vous devez vous demander quel est le but de disposer d'une Classe et d'un Module dans un langage de programmation? Une classe est destinée à être un modèle pour la création des instances, et chaque instance est rendu compte de la variation du plan d'action. Une instance est seulement rendu compte de la variation d'un plan (la Classe). Naturellement, ensuite, les Classes de fonction en tant que création de l'objet. En outre, puisque nous avons parfois besoin d'un plan de dériver à partir d'un autre plan, les Classes sont conçues pour supporter l'héritage.
Modules ne peuvent pas être instanciées, ne pas créer d'objets, et ne prennent pas en charge l'héritage. Alors, n'oubliez pas l'un module de ne PAS hériter d'une autre!
Alors quel est l'intérêt d'avoir des Modules dans une langue? Une évidence, l'utilisation de Modules est de créer un espace de noms, et vous verrez cela avec d'autres langues aussi. Encore une fois, ce qui est cool à propos de Ruby est que les Modules peuvent être rouvertes (tout comme les Classes). Et c'est un grand usage si vous souhaitez réutiliser un espace de noms dans différents Ruby:
Mais il n'y a pas d'héritage entre les modules:
La Pomme module n'avait pas hérité de toutes les méthodes de la Green module et quand nous Apple inclus dans le Fruit de la classe, les méthodes de la Pomme de module sont ajoutés à l'ancêtre de la chaîne d'Apple de cas, mais pas les méthodes de la Green module, même si le Vert module est défini dans l'Apple module.
Alors, comment pouvons-nous accéder à la méthode vert? Vous devez inclure explicitement dans votre classe:
Mais Ruby est un autre élément important de l'utilisation des Modules. C'est le Mixin facilité, je l'ai décrit dans une autre réponse sur DONC. Mais pour résumer, mixin vous permettent de définir des méthodes dans l'héritage de la chaîne d'objets. Par le biais de mixin, vous pouvez ajouter des méthodes à l'héritage de la chaîne d'instances de l'objet (include) ou le singleton_class de soi (étendre).