162 votes

Lors de l'utilisation de classes imbriquées et les classes imbriquées dans les modules?

Je suis assez familier avec quand utiliser les sous-classes et de modules, mais plus récemment j'ai été voir des classes imbriquées comme ceci:

class Foo
  class Bar
    # do some useful things
  end
end

Ainsi que les classes imbriquées dans des modules comme:

module Baz
  class Quux
    # more code
  end
end

Que ce soit la documentation et les articles sont fragmentées, je ne suis pas renseigné sur le sujet suffisamment de tâtonner pour les bons termes de recherche, mais je n'arrive pas à localiser beaucoup d'informations sur le sujet.

Quelqu'un pourrait donner des exemples ou des liens à des postes sur le pourquoi/quand ces techniques seraient utilisées?

149voto

Pan Thomakos Points 19946

À quoi vous faites allusion est connu comme un intérieur de classe. En programmation orientée objet, un intérieur de classe sert à la définition d'une classe qui ne peut pas être instancié sans être lié à un haut niveau de classe. Par exemple:

class Car
  class Wheel
  end
end

diffère de

class Car
end

class Wheel
end

parce que la première rend explicite le fait que la Voiture::Roue de classe ne peut que représenter une roue de voiture, plutôt qu'un grand roue. Souvent à l'aide de classes internes est une question de préférence, mais il sert un but dans le sens où il est plus fortement applique un contrat entre les deux classes et ce faisant, fournit plus d'informations sur eux et sur leurs utilisations.

Quant à votre deuxième observation, les classes imbriquées à l'intérieur des modules sont généralement utilisés pour de l'espace de noms de la classe. Par exemple:

module ActiveRecord
  class Base
  end
end

diffère de

module ActionMailer
  class Base
  end
end

Bien que ce n'est pas la seule utilisation des classes imbriquées à l'intérieur des modules, il est généralement la plus courante.

56voto

DigitalRoss Points 80400

En Ruby, en définissant un intérieur classe est similaire à la définition de l'intérieur de la classe dans un module. Il ne fait pas la force d'une association entre les classes, juste un espace de noms.

class A; class B; end; end
A::B.new

La principale différence est que, bien sûr, vous ne pouvez pas créer une instance d'un module à l'aide d'une classe à l'espace de noms une mise en œuvre pourrait suggérer une méthode la plus utilisée pour créer l'objet racine, qui peut être le seul utilisateur de l'API de l'objet.

Je souhaite que j'avais exotique de l'utilisation de cette construction à démontrer, mais c'est juste à garder à la conception modulaire des principes (par exemple, dans un programme plus large, elle rend plus facile de tracer l'utilisation de votre API de retour à votre module) et l'ajout d'un seul nom à la portée globale, afin de réduire le risque de collisions.

J'utilise le modèle même pour les scripts, où l'espace de noms n'est pas beaucoup d'utilisation, il suffit de garder mon OO réflexes d'agir...

class A
  class Realwork_A
    ...
  end
  class Realwork_B
    ...
  end
  ...
  self
end.new.run

15voto

Pablo Fernandez Points 32003

Vous voudrez probablement utiliser ce groupe de vos classes dans un module. Tri d'un espace de noms de la chose.

par exemple, le Twitter gem utilise les espaces de noms pour obtenir ceci:

Twitter::Client.new

Twitter::Search.new

Donc, les deux Client et Search classes vivre sous l' Twitter module.

Si vous souhaitez vérifier les sources, le code pour les deux classes peuvent être trouvés ici et ici.

Espérons que cette aide!

3voto

demas Points 10567

En plus des réponses précédentes: Module en Ruby, c'est une classe

$ irb
> module Some end
=> nil
> Some.class
=> Module
> Module.superclass
=> Object

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