c'est djuuuuuuuuuur la conception !!!!!!!! oh la la... qu'est-c' qu'i'
faut et'e con pour vouloir en faire....
supposons que je veuille faire une lib globale qui gere plein de trucs,
qui manipule des entites, disons des livres pour faire concret.
j'instancie ma lib, je l'initialise, et c'est parti mon kiki :
my $lib = MaLib->new();
$lib->init();
mettons que je fasse une methode pour recuperer les livres :
sub get_livres
{
my $self = shift;
my $schema = $self->{_schema};
my @livres = $schema->resultset('Livre')->all;
return @livres;
}
je veux pouvoir recuperer des informations sur un livre :
my @livres = $lib->get_livres;
my $livre = shift @livres;
my $informations = $livre->get_informations;
je vais maintenant coder la methode "get_informations" :
vim lib/MaLib/Schema/Result/Livre.pm
sub get_informations
{
...
return $lib->get_informations( $self );
}
probleme : j'ai besoin d'une reference vers la $lib globale, et je n'ai
pas cette reference. pourquoi j'ai besoin de la $lib globale ? parce
qu'elle a initialise un element dont j'ai besoin pour recuperer ces
informations.
question : comment transmettre cette reference $lib a cet objet ?
c'est djuuuuuuuuuur la conception !!!!!!!! oh la la... qu'est-c' qu'i'
faut et'e con pour vouloir en faire....
supposons que je veuille faire une lib globale qui gere plein de trucs,
qui manipule des entites, disons des livres pour faire concret.
j'instancie ma lib, je l'initialise, et c'est parti mon kiki :
my $lib = MaLib->new();
$lib->init();
mettons que je fasse une methode pour recuperer les livres :
sub get_livres
{
my $self = shift;
my $schema = $self->{_schema};
my @livres = $schema->resultset('Livre')->all;
return @livres;
}
je veux pouvoir recuperer des informations sur un livre :
my @livres = $lib->get_livres;
my $livre = shift @livres;
my $informations = $livre->get_informations;
je vais maintenant coder la methode "get_informations" :
vim lib/MaLib/Schema/Result/Livre.pm
sub get_informations
{
...
return $lib->get_informations( $self );
}
probleme : j'ai besoin d'une reference vers la $lib globale, et je n'ai
pas cette reference. pourquoi j'ai besoin de la $lib globale ? parce
qu'elle a initialise un element dont j'ai besoin pour recuperer ces
informations.
question : comment transmettre cette reference $lib a cet objet ?
c'est djuuuuuuuuuur la conception !!!!!!!! oh la la... qu'est-c' qu'i'
faut et'e con pour vouloir en faire....
supposons que je veuille faire une lib globale qui gere plein de trucs,
qui manipule des entites, disons des livres pour faire concret.
j'instancie ma lib, je l'initialise, et c'est parti mon kiki :
my $lib = MaLib->new();
$lib->init();
mettons que je fasse une methode pour recuperer les livres :
sub get_livres
{
my $self = shift;
my $schema = $self->{_schema};
my @livres = $schema->resultset('Livre')->all;
return @livres;
}
je veux pouvoir recuperer des informations sur un livre :
my @livres = $lib->get_livres;
my $livre = shift @livres;
my $informations = $livre->get_informations;
je vais maintenant coder la methode "get_informations" :
vim lib/MaLib/Schema/Result/Livre.pm
sub get_informations
{
...
return $lib->get_informations( $self );
}
probleme : j'ai besoin d'une reference vers la $lib globale, et je n'ai
pas cette reference. pourquoi j'ai besoin de la $lib globale ? parce
qu'elle a initialise un element dont j'ai besoin pour recuperer ces
informations.
question : comment transmettre cette reference $lib a cet objet ?
c'est djuuuuuuuuuur la conception !!!!!!!! oh la la... qu'est-c' qu'i'
faut et'e con pour vouloir en faire....
supposons que je veuille faire une lib globale qui gere plein de trucs,
qui manipule des entites, disons des livres pour faire concret.
j'instancie ma lib, je l'initialise, et c'est parti mon kiki :
my $lib = MaLib->new();
$lib->init();
mettons que je fasse une methode pour recuperer les livres :
sub get_livres
{
my $self = shift;
my $schema = $self->{_schema};
my @livres = $schema->resultset('Livre')->all;
return @livres;
}
je veux pouvoir recuperer des informations sur un livre :
my @livres = $lib->get_livres;
my $livre = shift @livres;
my $informations = $livre->get_informations;
je vais maintenant coder la methode "get_informations" :
vim lib/MaLib/Schema/Result/Livre.pm
sub get_informations
{
...
return $lib->get_informations( $self );
}
probleme : j'ai besoin d'une reference vers la $lib globale, et je n'ai
pas cette reference. pourquoi j'ai besoin de la $lib globale ? parce
qu'elle a initialise un element dont j'ai besoin pour recuperer ces
informations.
question : comment transmettre cette reference $lib a cet objet ?
Solution la plus directe : il suffit d'ajouter un paramètre à la méthode
get_informations.
Solution plus propre : manifestement la conception n'a pas été très bien
faite car il ne devrait pas y avoir ce type de besoins. Donç il faut
revoir la conception... mais il faudrait plus d'informations sur
l'application.
c'est djuuuuuuuuuur la conception !!!!!!!! oh la la... qu'est-c' qu'i'
faut et'e con pour vouloir en faire....
supposons que je veuille faire une lib globale qui gere plein de trucs,
qui manipule des entites, disons des livres pour faire concret.
j'instancie ma lib, je l'initialise, et c'est parti mon kiki :
my $lib = MaLib->new();
$lib->init();
mettons que je fasse une methode pour recuperer les livres :
sub get_livres
{
my $self = shift;
my $schema = $self->{_schema};
my @livres = $schema->resultset('Livre')->all;
return @livres;
}
je veux pouvoir recuperer des informations sur un livre :
my @livres = $lib->get_livres;
my $livre = shift @livres;
my $informations = $livre->get_informations;
je vais maintenant coder la methode "get_informations" :
vim lib/MaLib/Schema/Result/Livre.pm
sub get_informations
{
...
return $lib->get_informations( $self );
}
probleme : j'ai besoin d'une reference vers la $lib globale, et je n'ai
pas cette reference. pourquoi j'ai besoin de la $lib globale ? parce
qu'elle a initialise un element dont j'ai besoin pour recuperer ces
informations.
question : comment transmettre cette reference $lib a cet objet ?
Solution la plus directe : il suffit d'ajouter un paramètre à la méthode
get_informations.
Solution plus propre : manifestement la conception n'a pas été très bien
faite car il ne devrait pas y avoir ce type de besoins. Donç il faut
revoir la conception... mais il faudrait plus d'informations sur
l'application.
c'est djuuuuuuuuuur la conception !!!!!!!! oh la la... qu'est-c' qu'i'
faut et'e con pour vouloir en faire....
supposons que je veuille faire une lib globale qui gere plein de trucs,
qui manipule des entites, disons des livres pour faire concret.
j'instancie ma lib, je l'initialise, et c'est parti mon kiki :
my $lib = MaLib->new();
$lib->init();
mettons que je fasse une methode pour recuperer les livres :
sub get_livres
{
my $self = shift;
my $schema = $self->{_schema};
my @livres = $schema->resultset('Livre')->all;
return @livres;
}
je veux pouvoir recuperer des informations sur un livre :
my @livres = $lib->get_livres;
my $livre = shift @livres;
my $informations = $livre->get_informations;
je vais maintenant coder la methode "get_informations" :
vim lib/MaLib/Schema/Result/Livre.pm
sub get_informations
{
...
return $lib->get_informations( $self );
}
probleme : j'ai besoin d'une reference vers la $lib globale, et je n'ai
pas cette reference. pourquoi j'ai besoin de la $lib globale ? parce
qu'elle a initialise un element dont j'ai besoin pour recuperer ces
informations.
question : comment transmettre cette reference $lib a cet objet ?
Solution la plus directe : il suffit d'ajouter un paramètre à la méthode
get_informations.
Solution plus propre : manifestement la conception n'a pas été très bien
faite car il ne devrait pas y avoir ce type de besoins. Donç il faut
revoir la conception... mais il faudrait plus d'informations sur
l'application.
Le 14-06-2013, Paul Gaborit a écrit:c'est djuuuuuuuuuur la conception !!!!!!!! oh la la... qu'est-c' qu'i'
faut et'e con pour vouloir en faire....
supposons que je veuille faire une lib globale qui gere plein de trucs,
qui manipule des entites, disons des livres pour faire concret.
j'instancie ma lib, je l'initialise, et c'est parti mon kiki :
my $lib = MaLib->new();
$lib->init();
mettons que je fasse une methode pour recuperer les livres :
sub get_livres
{
my $self = shift;
my $schema = $self->{_schema};
my @livres = $schema->resultset('Livre')->all;
return @livres;
}
je veux pouvoir recuperer des informations sur un livre :
my @livres = $lib->get_livres;
my $livre = shift @livres;
my $informations = $livre->get_informations;
je vais maintenant coder la methode "get_informations" :
vim lib/MaLib/Schema/Result/Livre.pm
sub get_informations
{
...
return $lib->get_informations( $self );
}
probleme : j'ai besoin d'une reference vers la $lib globale, et je n'ai
pas cette reference. pourquoi j'ai besoin de la $lib globale ? parce
qu'elle a initialise un element dont j'ai besoin pour recuperer ces
informations.
question : comment transmettre cette reference $lib a cet objet ?
Solution la plus directe : il suffit d'ajouter un paramètre à la méthode
get_informations.
Solution plus propre : manifestement la conception n'a pas été très bien
faite car il ne devrait pas y avoir ce type de besoins. Donç il faut
revoir la conception... mais il faudrait plus d'informations sur
l'application.
ca fait plusieurs fois qu'on me dit que la conception est mal faite. je
suis pret a le croire, je suis pret a modifier la conception, mais je ne
comprends pas en quoi elle est mal faite, j'ai pas l'impression d'avoir
fait des trucs trop exotiques.
je me suis relu plusieurs fois, le seul point un peu exotique, c'est le
fait d'avoir besoin de la reference vers la lib globale. je vais donc
donner davantage de details a ce sujet pour fixer les idees :
dans la methode "get_informations", les informations sont recuperees a
travers une "rabbitmq" qui a ete initialisee par $lib->init(); voila
pourquoi la methode a besoin de $lib.
Le 14-06-2013, Paul Gaborit <Paul.Gaborit@invalid.invalid> a écrit:
c'est djuuuuuuuuuur la conception !!!!!!!! oh la la... qu'est-c' qu'i'
faut et'e con pour vouloir en faire....
supposons que je veuille faire une lib globale qui gere plein de trucs,
qui manipule des entites, disons des livres pour faire concret.
j'instancie ma lib, je l'initialise, et c'est parti mon kiki :
my $lib = MaLib->new();
$lib->init();
mettons que je fasse une methode pour recuperer les livres :
sub get_livres
{
my $self = shift;
my $schema = $self->{_schema};
my @livres = $schema->resultset('Livre')->all;
return @livres;
}
je veux pouvoir recuperer des informations sur un livre :
my @livres = $lib->get_livres;
my $livre = shift @livres;
my $informations = $livre->get_informations;
je vais maintenant coder la methode "get_informations" :
vim lib/MaLib/Schema/Result/Livre.pm
sub get_informations
{
...
return $lib->get_informations( $self );
}
probleme : j'ai besoin d'une reference vers la $lib globale, et je n'ai
pas cette reference. pourquoi j'ai besoin de la $lib globale ? parce
qu'elle a initialise un element dont j'ai besoin pour recuperer ces
informations.
question : comment transmettre cette reference $lib a cet objet ?
Solution la plus directe : il suffit d'ajouter un paramètre à la méthode
get_informations.
Solution plus propre : manifestement la conception n'a pas été très bien
faite car il ne devrait pas y avoir ce type de besoins. Donç il faut
revoir la conception... mais il faudrait plus d'informations sur
l'application.
ca fait plusieurs fois qu'on me dit que la conception est mal faite. je
suis pret a le croire, je suis pret a modifier la conception, mais je ne
comprends pas en quoi elle est mal faite, j'ai pas l'impression d'avoir
fait des trucs trop exotiques.
je me suis relu plusieurs fois, le seul point un peu exotique, c'est le
fait d'avoir besoin de la reference vers la lib globale. je vais donc
donner davantage de details a ce sujet pour fixer les idees :
dans la methode "get_informations", les informations sont recuperees a
travers une "rabbitmq" qui a ete initialisee par $lib->init(); voila
pourquoi la methode a besoin de $lib.
Le 14-06-2013, Paul Gaborit a écrit:c'est djuuuuuuuuuur la conception !!!!!!!! oh la la... qu'est-c' qu'i'
faut et'e con pour vouloir en faire....
supposons que je veuille faire une lib globale qui gere plein de trucs,
qui manipule des entites, disons des livres pour faire concret.
j'instancie ma lib, je l'initialise, et c'est parti mon kiki :
my $lib = MaLib->new();
$lib->init();
mettons que je fasse une methode pour recuperer les livres :
sub get_livres
{
my $self = shift;
my $schema = $self->{_schema};
my @livres = $schema->resultset('Livre')->all;
return @livres;
}
je veux pouvoir recuperer des informations sur un livre :
my @livres = $lib->get_livres;
my $livre = shift @livres;
my $informations = $livre->get_informations;
je vais maintenant coder la methode "get_informations" :
vim lib/MaLib/Schema/Result/Livre.pm
sub get_informations
{
...
return $lib->get_informations( $self );
}
probleme : j'ai besoin d'une reference vers la $lib globale, et je n'ai
pas cette reference. pourquoi j'ai besoin de la $lib globale ? parce
qu'elle a initialise un element dont j'ai besoin pour recuperer ces
informations.
question : comment transmettre cette reference $lib a cet objet ?
Solution la plus directe : il suffit d'ajouter un paramètre à la méthode
get_informations.
Solution plus propre : manifestement la conception n'a pas été très bien
faite car il ne devrait pas y avoir ce type de besoins. Donç il faut
revoir la conception... mais il faudrait plus d'informations sur
l'application.
ca fait plusieurs fois qu'on me dit que la conception est mal faite. je
suis pret a le croire, je suis pret a modifier la conception, mais je ne
comprends pas en quoi elle est mal faite, j'ai pas l'impression d'avoir
fait des trucs trop exotiques.
je me suis relu plusieurs fois, le seul point un peu exotique, c'est le
fait d'avoir besoin de la reference vers la lib globale. je vais donc
donner davantage de details a ce sujet pour fixer les idees :
dans la methode "get_informations", les informations sont recuperees a
travers une "rabbitmq" qui a ete initialisee par $lib->init(); voila
pourquoi la methode a besoin de $lib.
Donc la méthode "get_informations" ne semble pas liée à un livre mais à
cette "rabbitmq" (même si elle utilise aussi un livre).
L'appel "$lib->get_informations($livre)" ne serait-il pas plus cohérent ?
Donc la méthode "get_informations" ne semble pas liée à un livre mais à
cette "rabbitmq" (même si elle utilise aussi un livre).
L'appel "$lib->get_informations($livre)" ne serait-il pas plus cohérent ?
Donc la méthode "get_informations" ne semble pas liée à un livre mais à
cette "rabbitmq" (même si elle utilise aussi un livre).
L'appel "$lib->get_informations($livre)" ne serait-il pas plus cohérent ?
Donc la méthode "get_informations" ne semble pas liée à un livre mais à
cette "rabbitmq" (même si elle utilise aussi un livre).
L'appel "$lib->get_informations($livre)" ne serait-il pas plus cohérent ?
Une bonne question à se poser est : qui fournit l'information ? Est-ce
le livre ou la "rabbitmq" ? Ici, il semble bien que c'est la "rabbitmq"
(donc $lib). D'où l'appel proposé ci-dessus.
Donc la méthode "get_informations" ne semble pas liée à un livre mais à
cette "rabbitmq" (même si elle utilise aussi un livre).
L'appel "$lib->get_informations($livre)" ne serait-il pas plus cohérent ?
Une bonne question à se poser est : qui fournit l'information ? Est-ce
le livre ou la "rabbitmq" ? Ici, il semble bien que c'est la "rabbitmq"
(donc $lib). D'où l'appel proposé ci-dessus.
Donc la méthode "get_informations" ne semble pas liée à un livre mais à
cette "rabbitmq" (même si elle utilise aussi un livre).
L'appel "$lib->get_informations($livre)" ne serait-il pas plus cohérent ?
Une bonne question à se poser est : qui fournit l'information ? Est-ce
le livre ou la "rabbitmq" ? Ici, il semble bien que c'est la "rabbitmq"
(donc $lib). D'où l'appel proposé ci-dessus.
en somme, c'est un probleme classique de conception auquel je suis
souvent confronte, pas forcement en rapport avec DBIx::Class : une lib
qui gere des entites qui ont besoin de quelque chose qui a ete
initialise dans la lib, et a chaque fois, on me traite de gland parce
que je file une reference de la lib aux entites...
quand on fouille sur le net, on trouve des trucs abstraits comme les
design patterns, des exemples de conception objet avec des animaux, mais
rien qui permette de trancher a coup sur en disant "c'est comme ca qu'il
faut concevoir", alors que ce cas me semble pourtant classique, meme
DBIx::Class y a ete confronte...
en somme, c'est un probleme classique de conception auquel je suis
souvent confronte, pas forcement en rapport avec DBIx::Class : une lib
qui gere des entites qui ont besoin de quelque chose qui a ete
initialise dans la lib, et a chaque fois, on me traite de gland parce
que je file une reference de la lib aux entites...
quand on fouille sur le net, on trouve des trucs abstraits comme les
design patterns, des exemples de conception objet avec des animaux, mais
rien qui permette de trancher a coup sur en disant "c'est comme ca qu'il
faut concevoir", alors que ce cas me semble pourtant classique, meme
DBIx::Class y a ete confronte...
en somme, c'est un probleme classique de conception auquel je suis
souvent confronte, pas forcement en rapport avec DBIx::Class : une lib
qui gere des entites qui ont besoin de quelque chose qui a ete
initialise dans la lib, et a chaque fois, on me traite de gland parce
que je file une reference de la lib aux entites...
quand on fouille sur le net, on trouve des trucs abstraits comme les
design patterns, des exemples de conception objet avec des animaux, mais
rien qui permette de trancher a coup sur en disant "c'est comme ca qu'il
faut concevoir", alors que ce cas me semble pourtant classique, meme
DBIx::Class y a ete confronte...
voici les deux questions que tu t'es posees :
1) a qui la methode est-elle concretement liee ? $lib possede une
reference vers la "rabbitmq", et c'est $lib qui l'a initialisee. $lib
est donc la reponse a cette question.
2) qui fournit l'information ? reponse : $lib.
je vais faire une petite nuance a la question 1) : concretement, la
methode est liee a $lib, mais logiquement, on comprend tres bien qu'elle
soit liee a un livre etant donne qu'elle sert a recuperer des
informations sur un livre.
voici les deux questions que tu t'es posees :
1) a qui la methode est-elle concretement liee ? $lib possede une
reference vers la "rabbitmq", et c'est $lib qui l'a initialisee. $lib
est donc la reponse a cette question.
2) qui fournit l'information ? reponse : $lib.
je vais faire une petite nuance a la question 1) : concretement, la
methode est liee a $lib, mais logiquement, on comprend tres bien qu'elle
soit liee a un livre etant donne qu'elle sert a recuperer des
informations sur un livre.
voici les deux questions que tu t'es posees :
1) a qui la methode est-elle concretement liee ? $lib possede une
reference vers la "rabbitmq", et c'est $lib qui l'a initialisee. $lib
est donc la reponse a cette question.
2) qui fournit l'information ? reponse : $lib.
je vais faire une petite nuance a la question 1) : concretement, la
methode est liee a $lib, mais logiquement, on comprend tres bien qu'elle
soit liee a un livre etant donne qu'elle sert a recuperer des
informations sur un livre.
en somme, c'est un probleme classique de conception auquel je suis
souvent confronte, pas forcement en rapport avec DBIx::Class : une lib
qui gere des entites qui ont besoin de quelque chose qui a ete
initialise dans la lib, et a chaque fois, on me traite de gland parce
que je file une reference de la lib aux entites...quand on fouille sur le net, on trouve des trucs abstraits comme les
design patterns, des exemples de conception objet avec des animaux, mais
rien qui permette de trancher a coup sur en disant "c'est comme ca qu'il
faut concevoir", alors que ce cas me semble pourtant classique, meme
DBIx::Class y a ete confronte...
Les design patterns n'ont rien d'abstrait. Ce que tu vois la s'apparente
au design pattern "flyweight", un compromis assez classique :-)
Premiere question a se poser: tes objets sont-ils independants de la
connexion a la base de donnees ? pourrait-on les lire (ecrire) vers
une autre base. Dans un cadre tres general, ca pourrait etre le cas,
mais pas vraiment.
Donc tu as le choix:
- mettre une back-reference vers ta connexion dans tous les objets.
Ca bouffe de la place.
- decider que ca bouffe trop de place, et donc laisser la connexion
dehors. C'est ce que dit flyweight (enfin, pas exactement, mais c'est
proche).
Bref, entre
$lib->get_info($book); # 1
$book->get_info($lib); # 2
et $book->get_info # 3
pas tant de differences que ca.
Apres, faut savoir ce que ton book va avoir le droit de faire avec sa
reference sur la lib. La tentation peut etre grande d'heriter, histoire
de dire "oh ben, j'ai un $book, j'ai plus besoin de passer la $lib".
Ca *peut* marcher, mais c'est un poil casse-gueule quand meme.
De toutes facons, c'est les joies du multi-methodes, ou pas loin. Au final
pas trop evident de savoir de qui c'est la responsabilite de faire quoi.
La question qui se pose c'est, quel est le code le plus simple a implementer,
et ca donne quoi en perfs ?
Je ne suis pas sur que je prendrais DBIx::Class comme exemple. Pour moi,
c'est l'exemple-meme du monstre trop complexe et over-designe... A la
limite, je prefere tous les DBIx::*Rose de John Syracusa.
en somme, c'est un probleme classique de conception auquel je suis
souvent confronte, pas forcement en rapport avec DBIx::Class : une lib
qui gere des entites qui ont besoin de quelque chose qui a ete
initialise dans la lib, et a chaque fois, on me traite de gland parce
que je file une reference de la lib aux entites...
quand on fouille sur le net, on trouve des trucs abstraits comme les
design patterns, des exemples de conception objet avec des animaux, mais
rien qui permette de trancher a coup sur en disant "c'est comme ca qu'il
faut concevoir", alors que ce cas me semble pourtant classique, meme
DBIx::Class y a ete confronte...
Les design patterns n'ont rien d'abstrait. Ce que tu vois la s'apparente
au design pattern "flyweight", un compromis assez classique :-)
Premiere question a se poser: tes objets sont-ils independants de la
connexion a la base de donnees ? pourrait-on les lire (ecrire) vers
une autre base. Dans un cadre tres general, ca pourrait etre le cas,
mais pas vraiment.
Donc tu as le choix:
- mettre une back-reference vers ta connexion dans tous les objets.
Ca bouffe de la place.
- decider que ca bouffe trop de place, et donc laisser la connexion
dehors. C'est ce que dit flyweight (enfin, pas exactement, mais c'est
proche).
Bref, entre
$lib->get_info($book); # 1
$book->get_info($lib); # 2
et $book->get_info # 3
pas tant de differences que ca.
Apres, faut savoir ce que ton book va avoir le droit de faire avec sa
reference sur la lib. La tentation peut etre grande d'heriter, histoire
de dire "oh ben, j'ai un $book, j'ai plus besoin de passer la $lib".
Ca *peut* marcher, mais c'est un poil casse-gueule quand meme.
De toutes facons, c'est les joies du multi-methodes, ou pas loin. Au final
pas trop evident de savoir de qui c'est la responsabilite de faire quoi.
La question qui se pose c'est, quel est le code le plus simple a implementer,
et ca donne quoi en perfs ?
Je ne suis pas sur que je prendrais DBIx::Class comme exemple. Pour moi,
c'est l'exemple-meme du monstre trop complexe et over-designe... A la
limite, je prefere tous les DBIx::*Rose de John Syracusa.
en somme, c'est un probleme classique de conception auquel je suis
souvent confronte, pas forcement en rapport avec DBIx::Class : une lib
qui gere des entites qui ont besoin de quelque chose qui a ete
initialise dans la lib, et a chaque fois, on me traite de gland parce
que je file une reference de la lib aux entites...quand on fouille sur le net, on trouve des trucs abstraits comme les
design patterns, des exemples de conception objet avec des animaux, mais
rien qui permette de trancher a coup sur en disant "c'est comme ca qu'il
faut concevoir", alors que ce cas me semble pourtant classique, meme
DBIx::Class y a ete confronte...
Les design patterns n'ont rien d'abstrait. Ce que tu vois la s'apparente
au design pattern "flyweight", un compromis assez classique :-)
Premiere question a se poser: tes objets sont-ils independants de la
connexion a la base de donnees ? pourrait-on les lire (ecrire) vers
une autre base. Dans un cadre tres general, ca pourrait etre le cas,
mais pas vraiment.
Donc tu as le choix:
- mettre une back-reference vers ta connexion dans tous les objets.
Ca bouffe de la place.
- decider que ca bouffe trop de place, et donc laisser la connexion
dehors. C'est ce que dit flyweight (enfin, pas exactement, mais c'est
proche).
Bref, entre
$lib->get_info($book); # 1
$book->get_info($lib); # 2
et $book->get_info # 3
pas tant de differences que ca.
Apres, faut savoir ce que ton book va avoir le droit de faire avec sa
reference sur la lib. La tentation peut etre grande d'heriter, histoire
de dire "oh ben, j'ai un $book, j'ai plus besoin de passer la $lib".
Ca *peut* marcher, mais c'est un poil casse-gueule quand meme.
De toutes facons, c'est les joies du multi-methodes, ou pas loin. Au final
pas trop evident de savoir de qui c'est la responsabilite de faire quoi.
La question qui se pose c'est, quel est le code le plus simple a implementer,
et ca donne quoi en perfs ?
Je ne suis pas sur que je prendrais DBIx::Class comme exemple. Pour moi,
c'est l'exemple-meme du monstre trop complexe et over-designe... A la
limite, je prefere tous les DBIx::*Rose de John Syracusa.
voici les deux questions que tu t'es posees :
1) a qui la methode est-elle concretement liee ? $lib possede une
reference vers la "rabbitmq", et c'est $lib qui l'a initialisee. $lib
est donc la reponse a cette question.
2) qui fournit l'information ? reponse : $lib.
je vais faire une petite nuance a la question 1) : concretement, la
methode est liee a $lib, mais logiquement, on comprend tres bien qu'elle
soit liee a un livre etant donne qu'elle sert a recuperer des
informations sur un livre.
Dans ce cas, rien n'empêche de passer $lib comme paramètre à la méthode
get_informations() d'un $livre.
Ou de stocker dans $livre, une référence vers $lib pour que
get_informations() puisse l'interroger. (Dans ce dernier cas, ne pas
oublier que Perl ne sait pas détecter/détruire les références
circulaires. Il faut l'aider.)
Pour choisir parmi ces trois solutions (celle de mon premier message et
les deux solutions du message actuel), on peut tenir compte d'autres
informations : les informations recupérées sont-elles toujours les mêmes
pour un livre ou peuvent-elles varier selon la source ($lib) ?
Vont-elles varier au cours du temps ou non (ou ont-elles la même durée
de vie que l'objet livre ou non) ?
etc.
voici les deux questions que tu t'es posees :
1) a qui la methode est-elle concretement liee ? $lib possede une
reference vers la "rabbitmq", et c'est $lib qui l'a initialisee. $lib
est donc la reponse a cette question.
2) qui fournit l'information ? reponse : $lib.
je vais faire une petite nuance a la question 1) : concretement, la
methode est liee a $lib, mais logiquement, on comprend tres bien qu'elle
soit liee a un livre etant donne qu'elle sert a recuperer des
informations sur un livre.
Dans ce cas, rien n'empêche de passer $lib comme paramètre à la méthode
get_informations() d'un $livre.
Ou de stocker dans $livre, une référence vers $lib pour que
get_informations() puisse l'interroger. (Dans ce dernier cas, ne pas
oublier que Perl ne sait pas détecter/détruire les références
circulaires. Il faut l'aider.)
Pour choisir parmi ces trois solutions (celle de mon premier message et
les deux solutions du message actuel), on peut tenir compte d'autres
informations : les informations recupérées sont-elles toujours les mêmes
pour un livre ou peuvent-elles varier selon la source ($lib) ?
Vont-elles varier au cours du temps ou non (ou ont-elles la même durée
de vie que l'objet livre ou non) ?
etc.
voici les deux questions que tu t'es posees :
1) a qui la methode est-elle concretement liee ? $lib possede une
reference vers la "rabbitmq", et c'est $lib qui l'a initialisee. $lib
est donc la reponse a cette question.
2) qui fournit l'information ? reponse : $lib.
je vais faire une petite nuance a la question 1) : concretement, la
methode est liee a $lib, mais logiquement, on comprend tres bien qu'elle
soit liee a un livre etant donne qu'elle sert a recuperer des
informations sur un livre.
Dans ce cas, rien n'empêche de passer $lib comme paramètre à la méthode
get_informations() d'un $livre.
Ou de stocker dans $livre, une référence vers $lib pour que
get_informations() puisse l'interroger. (Dans ce dernier cas, ne pas
oublier que Perl ne sait pas détecter/détruire les références
circulaires. Il faut l'aider.)
Pour choisir parmi ces trois solutions (celle de mon premier message et
les deux solutions du message actuel), on peut tenir compte d'autres
informations : les informations recupérées sont-elles toujours les mêmes
pour un livre ou peuvent-elles varier selon la source ($lib) ?
Vont-elles varier au cours du temps ou non (ou ont-elles la même durée
de vie que l'objet livre ou non) ?
etc.
si j'instancie 2 MaLib avec des parametres differents, j'aurai 2
instances differentes de MaLib : $lib3 et $lib4. si je recupere les
informations sur un livre avec ces libs, j'obtiendrai des reponses
differentes : dans l'un des cas j'aurais des infos, dans l'autre
j'aurais "Livre inconnu" (un livre n'est repertorie que dans un seul
MaLib). donc, oui, les informations peuvent varier selon la lib.
Vont-elles varier au cours du temps ou non (ou ont-elles la même durée
de vie que l'objet livre ou non) ?
les informations peuvent varier au cours du temps.
si j'instancie 2 MaLib avec des parametres differents, j'aurai 2
instances differentes de MaLib : $lib3 et $lib4. si je recupere les
informations sur un livre avec ces libs, j'obtiendrai des reponses
differentes : dans l'un des cas j'aurais des infos, dans l'autre
j'aurais "Livre inconnu" (un livre n'est repertorie que dans un seul
MaLib). donc, oui, les informations peuvent varier selon la lib.
Vont-elles varier au cours du temps ou non (ou ont-elles la même durée
de vie que l'objet livre ou non) ?
les informations peuvent varier au cours du temps.
si j'instancie 2 MaLib avec des parametres differents, j'aurai 2
instances differentes de MaLib : $lib3 et $lib4. si je recupere les
informations sur un livre avec ces libs, j'obtiendrai des reponses
differentes : dans l'un des cas j'aurais des infos, dans l'autre
j'aurais "Livre inconnu" (un livre n'est repertorie que dans un seul
MaLib). donc, oui, les informations peuvent varier selon la lib.
Vont-elles varier au cours du temps ou non (ou ont-elles la même durée
de vie que l'objet livre ou non) ?
les informations peuvent varier au cours du temps.