Comment répondre à la question de l'entretien: qu'est-ce qu'un singleton et comment l'utiliseriez-vous? [fermé]

StackOverflow https://stackoverflow.com/questions/815528

Question

J'ai lu les questions sur S.O. en ce qui concerne Singleton et a juste regardé une conversation d'une heure google tech. Autant que je sache, dans le monde OO, le consensus semble être que les singletons sont davantage un anti-modèle qu'un modèle de conception utile.

Cela étant dit, je suis en train d’interviewer ces jours-ci et la question se pose souvent: qu'est-ce qu'un singleton, et comment l'utiliseriez-vous?

Quelle est la meilleure façon de répondre à cette question? Dois-je simplement décrire le modèle de conception puis dire que la seule utilisation acceptable dont j'ai entendu parler est la journalisation, et qu'elle est souvent mal utilisée pour un état global?

Était-ce utile?

La solution

Tricky. De nombreuses personnes pensent que les singletons sont essentiellement des anti-modèles, comme vous l'avez dit (y compris moi), mais beaucoup pensent également que c'est simplement une façon acceptable de faire de la globalisation.

Si l'intervieweur est dans ce camp, alors oui, je pense qu'il a tort, mais ce n'est peut-être pas la meilleure chose à dire pendant l'interview. ;)

Donc, j'essaierais probablement d'être neutre et de m'en tenir aux faits. Vous ne savez pas dans quel camp tombe votre enquêteur, alors tenez-vous en aux faits indiscutables. Que fait un singleton? Et pour démontrer l'utilisation, tenez-vous-en aux quelques cas où la plupart des gens peuvent s'accorder pour dire qu'un singleton est une réponse acceptable. Ou expliquez votre expérience (puisque les gens ne peuvent pas être en désaccord avec cela non plus).

Mais que vous soyez "pour" ou " contre " singletons, une interview n’est probablement pas le bon moment pour partir en croisade pour cette cause. ;)

Autres conseils

Partez de votre propre expérience d’utilisation / non utilisation. C'est la meilleure réponse chaque jour. Si vous ne l'avez pas utilisé, mais que vous savez ce que c'est, allez-y et dites-le. La plupart du temps, c’est l’intervieweur qui ne s’aventurerait pas au-delà de Singletons - alors essayez-vous-en.

Tant que vous êtes prêt pour une discussion, je pense que la réponse que vous proposez est bonne. Mais sachez que certains d’entre nous trouvent encore que les singletons sont une idée utile. Certaines données ont naturellement une portée mondiale et les singletons constituent un moyen judicieux de les extraire. Vous pouvez bien sûr aussi utiliser des singletons à des portées plus limitées, par exemple dans un espace de noms spécifique, si votre langue supporte une telle construction.

Un singleton.

Par définition, il s’agit d’un objet qui n’a qu’une seule instance dans l’ensemble de l’application. Cela peut être garanti en rendant le constructeur privé et en fournissant une instance statique via une propriété publique dans la définition de l'objet.

Il s'agit d'un modèle utile lorsque vous gérez une ressource où un seul objet peut y accéder à la fois.

Cependant, il y a beaucoup de compromis à faire. L’instance singleton a souvent ses propres exigences, ce qui rend difficile le test de toute classe qui l’utilise, car elle doit remplir ses conditions préalables, ainsi que celles de la classe testée.

De plus, cela peut poser un problème lors de la maintenance d'un projet et de la tentative de modification d'une partie de l'abstraction. Je trouve donc préférable d’abstraire un singleton via une interface. Conservez le " instance unique " en tant que détail d'implémentation et transmettez l'instance singleton comme interface, ce qui signifie que le code d'appel n'est pas lié à la définition de la classe (et à la propriété statique). Cela facilite les tests et les résumés ultérieurs au détriment de la plomberie architecturale (par exemple, en le transmettant à Ctors ou aux propriétés du paramètre).

De même, rappelant à tout le monde que le monde existait avant le GoF, j'ajouterai que l'on peut également utiliser des modifications du modèle Singleton pour ne garantir qu'une instance par session, par thread ou par tout le reste. Utilisez simplement par session ou par thread ou par état quelconque pour contenir l'instance une par instance.

Ma réponse:

  

Oh allez, tu ne pourrais pas au moins trouver le    deuxième question la plus populaire sur   ce vieux sujet fatigué? Tu devais y aller pour le premier? Je pars.   l'interview est terminée.

Ou alors j'aimerais que ce soit ...

Ma réponse serait:

  

Un Singleton est un motif de conception qui   spécifie une méthode pour garantir que   1 seule instance d'un objet existe sur   runtime.

     

Je l'utiliserais avec discrétion.

Qu'en est-il des singletons qui n'ont pas d'état? Je suis plus particulièrement intéressé par certaines stratégies concrètes idempotentes possibles dans le modèle de stratégie, algorithme pur, pas de données.

Ou les classes Java Enum, qui sont des singletons. Je trouve quelque chose comme ça utile:

public enum StringComparator implements Comparator {

  CASE_SENSITIVE {
    int compare(Object lhs, Object rhs) {
      // check for null omitted for brevity
      return lhs.equals(rhs);
    }
  },

  CASE_INSENSITIVE {
    int compare(Object lhs, Object rhs) {
      return String.CASE_INSENSITIVE_ORDER( lhs, rhs ) ;
    }
  };

  boolean equals( Object o ) {
   return this == o ;
  }
} 

Il y a quelques utilisations que j'ai rencontrées. L'enregistrement est évident. Une autre est la sortie de la console en utilisant nCurses. J'ai créé une bibliothèque qui utilise des objets Panel, mais chacun devait communiquer avec un seul contrôleur qui contrôlait des éléments tels que les ordres z et autres. Un autre est un générateur de nombre aléatoire pour une partie. Voulez-vous vraiment réensemencer ce mersenne twister dans chaque fonction ou le transmettre partout?

Mais dans la plupart des cas, ils causent une mauvaise conception.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top