Singleton comment ça marche ?

2»

Réponses

  • AliGatorAliGator Membre, Modérateur
    13:49 modifié #32
    Pour moi une unique boite à  outil n'est pas forcément la bonne approche. Le PHP est procédural (enfin maintenant le PHP5 et le PHP6 a une approche orientée objet avec des classes et tout, mais je suis pas sûr que tu utilises ces notions de ton côté quand tu codais en PHP j'imagine, sinon tu connaà®trais déjà  toutes ces notions normalement) alors que là  tu codes avec un langage orienté objet.

    Donc pour moi il faut faire une catégorie sur NSString pour ajouter les méthodes agissant sur NSString, genre rajouter une méthode "-(BOOL)isEmpty" ou autre sur NSDate genre "-(NSString*)localizedRepresentation" qui retourne la date formattée comme tu veux dans ton programme en fonction de la NSLocale, etc, etc.
    Rien ne t'empêche de mettre toutes ces catégories dans un fichier .m (et son fichier .h) unique (pas obligé de faire un .h/.m par catégorie de classe quoi).
    Et à  ça rajouter quand les catégories ne sont vraiment pas adaptées à  ton souci, la notion de méthodes statiques sur une classe Toolbox ou encore des fonctions C (une fonction C peut tout ) fait prendre des objets Objective-C en paramètre, ce ne sont que des pointeurs après tout.

    Mais bon, tu me sembles avoir beaucoup de concepts à  apprendre avant de te poser toutes ces questions... il serait plus intéressant pour toi de te poser et apprendre tranquillement toutes ces notions (il y a de quoi faire), on ne s'improvise pas développeur en quelques semaines, surtout si on n'a pas les notions de POO et d'archi de base, y'a pas de secret ça prend du temps tout ça. Je comprend bien que ton temps actuellement est limité pour faire ton appli, mais en même temps y'a pas de miracle non plus, moi non plus je peux pas faire une super appli en 3 jours hein, donc si tu es intéressé pour continuer dans cette voie prend le temps après ton projet pour étudier tout cela à  tête reposée, tu gagneras beaucoup de temps par la suite tu verras !
  • Eric P.Eric P. Membre
    13:49 modifié #33
    Bonjour,

    En déplacement hier, je n'ai pris connaissance de cette passionnante discussion qu'un peu tard.

    Pour revenir sur l'exemple de sekaijin et en le poussant plus loin, si un programme voulait traiter de l'univers, on s'approche dans ce cas de l'objet unique (s'approche car certains font des références à  la S.F. ...) donc l'emploi du singleton est justifié. Non ?

    Pour revenir sur Terre, est-ce qu'un singleton ne pourrait pas représenter l'environnement de mon programme ?
    Ainsi j'ai dedans toutes mes variables "globales", données, préférences, documents...
    Ou bien y-a-t-il d'autres solutions mieux adaptées ?
  • AliGatorAliGator Membre, Modérateur
    13:49 modifié #34
    Si dans ce cas on peut... Et c'est d'ailleurs déjà  le cas (NSUserDefaults qui représente les préférences de l'appli est un singleton par exemple). Pour le cas des variables globales, il y a plusieurs solutions possibles (static const par exemple) mais le singleton est en effet l'une des solutions acceptables
  • naskaanaskaa Membre
    juillet 2010 modifié #35
    Le singleton

    Selon moi,
    tu as une classe X [glow=red,2,300]non statique[/glow] avec une attribut privé [glow=red,2,300]non statique[/glow] 'x' qui est une instance de cette même classe X.
    tu crées ensuite un getter [glow=red,2,300]statique[/glow] sur cette attribut 'x'.
    Une méthode statique : peut être appelée de l'extérieur de la classe sans instance de la classe X.
    Le getter va contenir un if qui vérifie si l'attribut 'x' existe déjà , il le retourne dans ce cas. Sinon il en crée un nouveau.

    Sur wikipédia,
    tu as une classe X [glow=red,2,300]statique[/glow] avec une attribut privé [glow=red,2,300]statique[/glow] qui est une instance de cette même classe X.
    Ma question:
    [glow=red,2,300]L'attribut 'x' est déclaré statique pour éviter de faire le test, cité plus haut, dans le getter ??[/glow]
    tu crées ensuite un getter [glow=red,2,300]statique[/glow] sur cette attribut 'x'.
    Le getter va retourner l'attribut 'x'.

    merci

  • CeetixCeetix Membre
    13:49 modifié #36
    Pour moi il n'y a pas de notion de getter/setter quand on parle d'attribut statique.
  • naskaanaskaa Membre
    juillet 2010 modifié #37
    Re,
    Pour moi il n'y a pas de notion de getter/setter quand on parle d'attribut statique.


    Exemple :

    En java,
    Ce bout de code tiré de Wikipédia

    public class Singleton {
      private static final Singleton INSTANCE = new Singleton();

      // Private constructor prevents instantiation from other classes
      private Singleton() {}

      public static Singleton getInstance() {
          return INSTANCE;
      }
    }


    Tu as besoin d'un getter pour accéder à  l'attribut INSTANCE.


  • sekaijinsekaijin Membre
    13:49 modifié #38
    ceci est nécessaire pour les langages ne connaissant que les classe et les instances
    voici le même code pour un langage connaissant les objets (scala par exemple)
    <br /> //simple class<br /> public class Simple {<br />&nbsp;  ... //members<br /><br />&nbsp;  public Simple() {}<br /> }<br /> // an instance<br /> Simple myObject = new Simple();<br /><br /> //singleton<br /> public class Singleton {<br />&nbsp;  private static final Singleton INSTANCE = new Singleton();<br />&nbsp; &nbsp; ... //members<br /><br />&nbsp;  // Private constructor prevents instantiation from other classes<br />&nbsp;  private Singleton() {}<br /> <br />&nbsp;  public static Singleton getInstance() {<br />&nbsp; &nbsp; &nbsp; return INSTANCE;<br />&nbsp;  }<br /> }<br /> theObject = Singleton::getInstance()<br />
    


    <br /> //simple class<br /> public class Simple {<br />&nbsp;  ... //members<br /><br />&nbsp;  public Simple() {}<br /> }<br /> // an instance<br /> Simple myObject = new Simple();<br /><br /> //an object theObject&nbsp; (singleton)<br /> public object theObject {<br />&nbsp;  ... //members<br /><br /> }
    


    ;)
    A+JYT
  • yoannyoann Membre
    13:49 modifié #39
    Dans ce cas sekaijin, peux tu expliquer la différence entre objet et instance dans ce que tu nous présente, ainsi que la différence engendré à  l'usage.
  • sekaijinsekaijin Membre
    13:49 modifié #40
    dans un langage comme C++ ou Objective-C JAVA ...
    le langage lui même ne permet pas de définir un objet.
    Un objet dans ces langages est obligatoirement une instance d'une classe
    Pour avoir un objet il faut définir une classe et l'instancier.

    dans un langage comme SCALA XLISP ... la notion d'objet fait partie du langage. dans le langage lui-même il n'est donc pas nécessaire de définir une classe ni de l'instancier. pour avoir un objet.

    à  l'usage la notion de singleton n'a pas de sens dans le deuxième cas. car naturellement un objet défini sans classe est unique. donc cet astuce de programmation permettant de garantir l'unicité de l'objet est inutile.

    ça ne change pas grands chose. si on regarde le pseudo code que j'ai fourni les différences sont plutôt faibles.

    écrire l'un ou l'autre finalement ... c'est kif kif


    là  ou ça change tout c'est au niveau de la portée.

    voici le PB j'ai besoin d'un objet unique (singleton) définit uniquement dans un module de mon application. et pas du tout dans le reste.

    dans les langages comme C++ si je fais un singleton alors mon objet est visible de partout
    soit je fais une classe et je l'instancie dans mon module mais alors j'ai le risque qu'il soit instancier plusieurs fois.

    chaque langage va apporter une "astuce de programmation" (parfois rien)
    pour résoudre ce pb.

    dans la plus part des langage portant dans le langage cette notion il est apparut dans la définition même du langage que ce problème se posait.
    dans la définition même du langage a été mis en place une solution.

    de façon générale lorsqu'on défini un "objet" (variable) dans une section de code alors cette variable n'existe que dans cette section. ces langage là  propose tous (ou presque) un moyen de préciser la porté (global : équivalent du singleton C++, local : dans le corps de la méthode, ... ).

    dans l'usage ça ne change pas grand chose
    A+JYT




  • yoannyoann Membre
    13:49 modifié #41
    J'avoue que ta définition n'est pas super clair...

    En gros le seul intérêt de ces objets non instance de classe dans tes langages c'est dans le cas d'un objet unique pour ne pas avoir a gérer soit même la protection du singleton... Une sorte de définition d'objet inline

    ça fait beaucoup de bla bla pour au final pas grand chose de plus non ?
  • naskaanaskaa Membre
    juillet 2010 modifié #42
    dans les langages comme C++ si je fais un singleton alors mon objet est visible de partout


    Selon moi,
    1-Le singleton ne sert pas à  créer une instance globale mais plutôt UNIQUE.
    Exemple: si tu utilises un patron 'factory methode', la Factory n'a pas besoin de plus d'une instance donc on la met singleton.

    2-Si tu ne veux pas la rendre visible dans d'autres modules, [glow=red,2,300]tu ne fais pas de include[/glow].

    p.s. yoann je n'ai jamais entendu parler de ces languages donc pas besoin d'essayer de comprendre :P
    À ma connaissance :
    multimedia --> c#, c++, java
    web --> javascript(jquery), html, python



  • yoannyoann Membre
    13:49 modifié #43
    dans 1279151294:

    p.s. yoann je n'ai jamais entendu parler de ces languages donc pas besoin d'essayer de comprendre :P
    À ma connaissance :
    multimedia --> c#, c++, java
    web --> javascript(jquery), html, python


    Moi non plus mais ça fait pas de mal d'essayer de comprendre ce qui est passé par la tête d'autres développeurs
  • sekaijinsekaijin Membre
    13:49 modifié #44
    je ne fais que répondre aux questions qui m'ont été posées sur le pourquoi de précisait certains point dans mon discours.

    et la réponse et simplement que la diversité des langage fait que le paradigme de Singleton n'est qu'un artifice du au fait que les langage Commun à  base de classe le nécessite. ce qui n'est pas le cas de tous les langage. et qu'il existe des langage qui porte eux même la notion d'objet unique.

    la question suivante à  alors été qu'est-ce que cela apporte.
    et ma réponse quasiment rien (d'où l'impasse faite par beaucoup de langage) Sauf sur la portée.
    De fait les langages type C++ avec le paradigme de singleton se retrouve avec des objet unique qui sont connus au niveau global. alors que d'autre langage permettent d'être plus fins.

    Oui il suffit de ne pas inclure le singleton. mais c'est pareil que pour public, private, protected tout peut être plublic puisqu'il suffit de ...

    enfin je rappelle mon poste initial ou je dis explicitement que le singleton sert à  fabriquer un objet unique. et que malheureusement vu que dans les langages courant il a une porté globale il est dévoyé pour porter des fonction transverse.
    chose qu'il ne faut pas faire.

    je pense qu'en C++
    vous auriez
    //an object theObject&nbsp; (singleton)<br /> public object theObject {<br />&nbsp;  ... //members<br /><br /> }
    
    vous ne vous poseriez même pas la question du singleton. mais qu'au final ça ne changerait pas fondamentalement votre façon de programmer.

    il est juste bon de savoir que ça existe ailleurs et que le singleton ce n'est qu'un moyen d'arriver à  ça

    A+JYT



  • naskaanaskaa Membre
    juillet 2010 modifié #45
    De fait les langages type C++ avec le paradigme de singleton se retrouve avec des objet unique qui sont connus au niveau global.


    Le problème avec la portée globale, c'est que cela brise le principe d'encapsulation mais pas dans le cas du singleton (du moins si tu le codes comme dans l'exemple en haut)

    voir ici pour le principe d'encapsulation :  http://fr.wikipedia.org/wiki/Encapsulation_(programmation)

    Je cite de cette article de wikipedia :

    Ainsi, les propriétés et axiomes associés aux informations contenues dans l'objet seront assurés/validés par les méthodes de l'objet et ne seront plus de la responsabilité de l'utilisateur extérieur. L'utilisateur extérieur ne pourra pas modifier directement l'information et risquer de mettre en péril les axiomes et les propriétés comportementales de l'objet.


    Si ton INSTANCE singleton est private static (voir mon exemple en java du singleton, plus-haut). Ce qui arrive c'est que pour l'accéder [glow=red,2,300]tu as besoin d'un Getter donc le singleton respecte le principe d'encapsulation[/glow]. Seulement vu que la méthode du Getter est statique, tu n'as pas besoin de variable pour appeller le Getter à  l'éxterieur de la classe.
  • KubernanKubernan Membre
    13:49 modifié #46
    dans 1279173224:

    dans 1279151294:

    p.s. yoann je n'ai jamais entendu parler de ces languages donc pas besoin d'essayer de comprendre :P
    À ma connaissance :
    multimedia --> c#, c++, java
    web --> javascript(jquery), html, python


    Moi non plus mais ça fait pas de mal d'essayer de comprendre ce qui est passé par la tête d'autres développeurs


    Lecture très intéressante (longue et en Anglais) http://www.paulgraham.com/avg.html (par celui qui a mis au point le filtrage bayesien des spams). Grosso modo : comment aller à  contre courant en créant un serveur Web de shopping en LISP (utilisé par Yahoo) et en raflant la mise.
  • KubernanKubernan Membre
    13:49 modifié #47
    Bonjour,

    J'arrive peut-être un peu tard dans le débat, mais voilà  :

    J'utilise les singleton pour partager des données (et non des fonctions) dans mon appli. Le singleton est déclaré dans des fichiers à  part (genre MesDonnees.h et MesDonnees.m) que j'inclus là  où j'en ai besoin.
    Pour l'iPhone, ne pas oublier de gérer le memory warning pour évaquer le singleton.

    Pour des "fonctions" dont j'ai régulièrement besoin je créé une classe fourre-tout genre ClasseCommune (fichiers ClasseCommune.h et ClasseCommune.m) que j'utilise par exemple ainsi : [ClasseCommune isX:1.0 lessThanOrEqualToY:2.0] avec la déclaration suivante : +(BOOL)isX:(double)x lessThanOrEqualToY:(double)y

    Enfin, lorsque j'ai besoin d'allocations répétitives - mais coûteuses - sur une classe j'utilise du static. Par exemple :
    <br />- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section // Appelée plein plein plein de fois<br />{<br />	id &lt;NSFetchedResultsSectionInfo&gt; sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];<br />	<br />	static NSDateFormatter *inputDateFormat = nil;<br />	if (inputDateFormat == nil)<br />	{<br />		inputDateFormat = [[NSDateFormatter alloc] init]; // NSDateFormatter est très coûteux, je l&#39;alloue qu&#39;une fois donc.<br />		[inputDateFormat setDateFormat:@&quot;YYYY-MM-dd HH:mm:ss zzz&quot;];<br />	}<br />&nbsp; &nbsp; &nbsp; &nbsp; // Ca continue...<br />}
    


    K.
    K.
  • sekaijinsekaijin Membre
    juillet 2010 modifié #48
    dans 1279191426:

    ....

    Si ton INSTANCE singleton est private static (voir mon exemple en java du singleton, plus-haut). Ce qui arrive c'est que pour l'accéder [glow=red,2,300]tu as besoin d'un Getter donc le singleton respecte le principe d'encapsulation[/glow]. Seulement vu que la méthode du Getter est statique, tu n'as pas besoin de variable pour appeller le Getter à  l'éxterieur de la classe.


    non ce n'est pas de ça que je parle
    rien ne t'empêche quelque soit le morceau de ton code de faire un include puis d'utiliser le getter pour obtenir l'objet en question

    il est donc bien accessible de toute partite de ton code
    d'autre langage permettent d'être plus précis

    fait deux module dans ton application définit un singleton propre au premier module
    tu peux très bien  en C++ de faire un include de la définition du singleton dans le deuxième module et d'appeler le getter pour obtenir l'objet. tu  ne peux pas restreindre la porté de ton singleton au seul premier module.

    je n'ai jamais dis que le singleton cassait le principe d'encapsulation si tu fait
    void foo() {<br /> myObj = new MyClass();<br /> return;<br />}
    


    ton objet myObj est un objet local à  ta fonction
    chose impossible en C++ avec un singleton

    A+JYT
Connectez-vous ou Inscrivez-vous pour répondre.