J'avais vu que FlexBuilder n'apprécié par l'instruction private devant
le constructeur de la classe... mais je ne m'était pas tout de suite
arrété sur ce "problème"...
c'est sur le news-group de actionscript3_alpha dans le message "private
constructors forbidden" que j'ai enfin compris que cela allait "peut
être" causer quelques ennuis pour ceux qui ont l'habitude de coder en
AS2...
En effet, pour monter un pattern Singleton on prenait l'habitude (en
bien ou en mal) de mettre le constructeur de la classe en privé. Pareil
pour une classe qui ne possède uniquement que des méthodes et propriétés
statiques et qui ne devait pas être instanciée...
Donc du coup ma question est simple. Pourquoi les développeurs de
macromedia ont choisi de forcer le constructeur en public ?
Il est toujours possible de mettre un throw new NoInstancException dans
le constructeur pour que la classe ne soit plus instanciable... mais
c'est tout de même étrange à première vue.
Maintenant il est possible qu'il y est une véritable raison bien précise
qui donne du crédit à cette limitation du constructeur et j'aimerai bien
savoir si quelqu'un sait quelquechose là dessus ?
PS : j'ai commencé à regarder comment faire un Singleton en AS3 en
passant par un throw dans le constructeur une fois que l'unique instance
est était instanciée dans une constante (const) statique de la classe
.... mais j'ai des problèmes au niveau de cette méthode.. Du coup je
développe un peu mon idée là dessus et je verrai si j'arrive à
quelquechose de mieux dans les prochaines heures lol
Maintenant si quelqu'un a une idée là dessus précise sur comment et
quelle est la meilleure méthode pour faire un Singleton en AS3, je suis
preneur :) Cela m'évitera peut être de me prendre trop la tête encore :)
PS2 : en cherchant à tester si j'appelle une fonction en passant par une
autre.. je me suis rendu compte qu'en AS3 ils ont virés le
arguments.caller... je trouve cela bien étrange là encore ??
EKA+ :)
________________________________________
FCNG id: 4a000000 - flexcodeurs
Archive: Sat, 12 Nov 2005 11:17:39 +0100
________________________________________
http://www.buRRRn.com/projects/FCNG.html
Le lien aussi du Singleton sur dofactory :
http://www.dofactory.com/Patterns/PatternSingleton.aspx#_self1
Le constructeur est en protected... en AS2 le private est un protected
en fait... donc en AS3 le constructeur ne peut pas être protected...
impossible de réaliser la méthode proposée sur dofactory.
A noter ce lien :
- http://www.yoda.arachsys.com/csharp/singleton.html
Sur comment implémenter un singleton en C# avec un constructeur
public... cela fonctionne mais difficile ensuite de faire en sorte que
le constructeur ne soit pas instanciable à l'extérieur de la classe...
ou alors j'ai raté un truc :) Je vais continuer à chercher.
EKA+ :)
ekameleon a écrit :
________________________________________
FCNG id: 4b000000 - flexcodeurs
Archive: Sat, 12 Nov 2005 11:23:21 +0100
________________________________________
http://www.buRRRn.com/projects/FCNG.html
>
> J'avais vu que FlexBuilder n'apprécié par l'instruction private devant
> le constructeur de la classe... mais je ne m'était pas tout de suite
> arrété sur ce "problème"...
>
ce n'est pas un probleme
le probleme etait dans AS2
si ton constructeur est privé comment ca se passe quand tu veux en heriter ?
> c'est sur le news-group de actionscript3_alpha dans le message "private
> constructors forbidden" que j'ai enfin compris que cela allait "peut
> être" causer quelques ennuis pour ceux qui ont l'habitude de coder en
> AS2...
>
disons ceux qui ont pris une mauvaise habitude :p
> En effet, pour monter un pattern Singleton on prenait l'habitude (en
> bien ou en mal) de mettre le constructeur de la classe en privé. Pareil
> pour une classe qui ne possède uniquement que des méthodes et propriétés
> statiques et qui ne devait pas être instanciée...
>
> Donc du coup ma question est simple. Pourquoi les développeurs de
> macromedia ont choisi de forcer le constructeur en public ?
parce que il suivent le standard ECMAScript
oui ok Java le fait, mais je le redis la meme chose que je disais
qd les gars declaraient fievereusement "ouhouhou AS2 c'est comme Java"
non ECMAScript ce n'est pas Java, meme si la syntaxe y ressemble.
Il est logique de ne pas avoir de construtor public, car si on suit
betemente comment marche un constructor en ECMAScript
si il est private, et bien on ne peut simplement pas l'instancié.
> Il est toujours possible de mettre un throw new NoInstancException dans
> le constructeur pour que la classe ne soit plus instanciable... mais
> c'est tout de même étrange à première vue.
je trouve ca moins etrange qu un private constructor.
> Maintenant il est possible qu'il y est une véritable raison bien précise
> qui donne du crédit à cette limitation du constructeur et j'aimerai bien
> savoir si quelqu'un sait quelquechose là dessus ?
>
> PS : j'ai commencé à regarder comment faire un Singleton en AS3 en
> passant par un throw dans le constructeur une fois que l'unique instance
> est était instanciée dans une constante (const) statique de la classe
> .... mais j'ai des problèmes au niveau de cette méthode.. Du coup je
> développe un peu mon idée là dessus et je verrai si j'arrive à
> quelquechose de mieux dans les prochaines heures lol
> Maintenant si quelqu'un a une idée là dessus précise sur comment et
> quelle est la meilleure méthode pour faire un Singleton en AS3, je suis
> preneur :) Cela m'évitera peut être de me prendre trop la tête encore :)
>
Bon definissons ce qu'est un Singleton d'abord
Un Singleton c'est pour s'assurer que une class n'a été
instanciée que UNE seule fois et qu'on a un point d'acces
global a cette instance.
je n'ai pas encore testé quelle etait la meilleure strategie, mais perso
j'essayerai un truc qui ressemble a cela
package foo
{
public const bar:_bar = new _bar(); //global car déclaré en dehors d'une
fonction
class _bar //internal au package donc pas d'acces public en dehors du
package
{
function _bar()
{
}
public function test() //a veirfier si le public est necessaire,
normalement oui
{
}
}
}
car
" constSpecifies a constant, which is a variable that can only be assigned a
value once. "
c'est tres proche de ce qu'on veut avec un singleton
par contre a tester voir si on import le package plus d'une fois si
le const cree une erreure ou pas
voir aussi les differentes manieres de declarer un const
p43 de prog_actionscript3
class ConstExample
{
static const EXAMPLE_STATIC:String = "Global access";
public const EXAMPLE_PUBLIC:String = "Public access";
private const EXAMPLE_PRIVATE:String = "Class access";
}
ou alors de maniere plus classique juste declarer une class sans constructor
comme avec l'objet Math
package foo
{
public class Bar
{
public static function test()
{
}
}
}
si pas de constructor on ne peut pas l'instancier une 2nde fois :p
apres il faut aussi penser que on peut executer du code dynamiquement
package
{
//ici on peut mettre du inline code
class X
{
//pas de inline code
}
}
ce que j'appelle "inline code" c'est du code qui s'execute
au moment où le compilo lit le code
ce qu'on ne pouvait pas faire en AS2
bref en toute logique (meme si j'ai pas plus testé que cela)
on devrait pouvoir tester a l interieur d un package
si telle ou telle var est deja instanciée ou pas
dans le genre
package
{
if( blah )
{
//...
}
else
{
//...
}
class X
{
//pas de inline code
}
}
bref, je pense que on peut faire sans le private constructor
ici
http://www.mail-archive.com/flexc...@yahoogroups.com/msg15174.html
j'ai vu ca aussi
package
{
public class MySingleton
{
private static var instance:MySingleton;
public MySingleton( x:PrivateClass )
{
instance = this;
}
public static getInstance():MySingleton
{
if( instance == null )
{
instance = new MySingleton( new PrivateClass() );
}
return instance;
}
private class PrivateClass
{
}
}
mais pfff on me devrait PAS besoin de faire ca avec ECMAScript,
on est au plus pres des objet et on peut faire des instanciation dynamique,
donc un const ou une class static devrait suffire
pour obtenir un Singleton
le but etant qd meme etant de garder un acces simple au Singleton
parce que vraiment si il faut se taper un getInstance() a chaque fois
c'est lourd et pas du tout "elegant"
Singleton.getInstance().foobar() //beurk
alors oui c'est vrai que avec des membres static on ne peut pas
implementer d'interface et on ne peut faire d heritage de class
mais je suis sur que dans la plupart des cas c'est suffisant
apres si on veut vraiment instancier le singleton a partir
d'une class, là l'utilisation d'une constante devrait pouvoir
s'assurer que l'instance n'existe qu une seule fois
Singleton.foobar() //plus propre
> PS2 : en cherchant à tester si j'appelle une fonction en passant par une
> autre.. je me suis rendu compte qu'en AS3 ils ont virés le
> arguments.caller... je trouve cela bien étrange là encore ??
>
regarde la technique avec arguments.callee
http://livedocs.macromedia.com/labs/1/flex/langref/arguments.html
zwetan
________________________________________
FCNG id: 4d000000 - flexcodeurs
Archive: Sat, 12 Nov 2005 14:29:11 +0100
________________________________________
http://www.buRRRn.com/projects/FCNG.html
Ok je comprends mieux.. en fait pas d'héritage sans constructeur.. en
AS2 on peut faire sans mais c'est pas logique.
>>c'est sur le news-group de actionscript3_alpha dans le message "private
>>constructors forbidden" que j'ai enfin compris que cela allait "peut
>>être" causer quelques ennuis pour ceux qui ont l'habitude de coder en
>>AS2...
>>
>
>
> disons ceux qui ont pris une mauvaise habitude :p
>
>
Je comprends mieux maintenant ce que tu appelles une mauvaise habitude à
ce sujet.
J'avais pas du tout penser à ce type de déclaration d'une variable au
niveau du package.. je vais tester aussi si cela marche.. si c'est le
cas c'est clair qu'un global au niveau des packages cela suffit pour
beaucoup de chose.
J'ai vu cette technique mais je trouve pas cela super génial par rapport
à l'ancienne méthode...
Merci pour toutes ces précisions.. me reste à tester tout cela maintenant
EKA+ :)
________________________________________
FCNG id: 50000000 - flexcodeurs
Archive: Sat, 12 Nov 2005 15:03:09 +0100
________________________________________
http://www.buRRRn.com/projects/FCNG.html