SharpMao
Messages postés1024Date d'inscriptionmardi 4 février 2003StatutMembreDernière intervention 7 juin 2010
-
19 oct. 2006 à 09:26
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014
-
1 nov. 2006 à 22:31
Hello,
On m'a posé une question récemment à laquelle j'ai été bien embêter pour répondre.
On présente souvent des exemples avec des propriétés simples :
private string _text=""
public string Text
{
get
{return _text;}
set
{_text=value;}
}
La question était : dans un cas aussi simple, quel est l'avantage réel de mettre Text comme property plutôt que de mettre public la variable ?
Dans un cas plus compliqué, ou si on ne veut pas de set, je peux comprendre, mais dans un cas simpliste comme celui-ci, le seul effet que je vois, est de ralentir un peu le programme.
Si vous pouviez me donner une bonne raison d'utiliser les properties dans des cas semblabes, j'aurai apris quelque chose aujourd'hui.
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 19 oct. 2006 à 09:47
Pourtant, c'est vrai que dans un cas aussi simple que celui de ton exemple, c'est pas si facile de trouver une utilité.
Mais j'adhère aux reponses des mes collegues, principe de prog objet.
Mais j'ai eu moins une utilité reelle en tete : DataBinding. On utilise les propriétés pour le binding, pas les champs.
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 19 oct. 2006 à 10:00
Petit article sur MSDN sur le sujet.
Il m'avait pourtant sembler lire un jour qu'une variable public pouvait poser des problèmes de sécurité.
Ma mémoire me jouerait t'elle (déjà) des tours?
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 19 oct. 2006 à 09:34
Salut,
Je ne connais pas les détails (malheureusement) mais il s'agit d'une question de sécurité... il ne faut en prinicipe pas exposer les variables au monde extérieur (c'est à dire, les rendre publique).
De plus, je ne pense pas qu'une Property soit plus lente...
Peut-être que quelqu'un d'autre pourra te donner un peu plus d'infos....
SharpMao
Messages postés1024Date d'inscriptionmardi 4 février 2003StatutMembreDernière intervention 7 juin 201069 19 oct. 2006 à 10:48
Hello,
Merci pour vos réponses. Je retiens donc
<li>le principe de POO (oui, mais un principe se devrait d'avoir une raison solide)</li>
<li>Le DataBindimg</li>
<li>La sécurité ? Si quelqu'un retrouve un article à ce sujet, je suis preneur.</li>
Quant à la question de la vitesse, oui, c'est plus rapide d'accéder à une variable qu'à une propriété. J'ai fait le test suivant :
Class1
c1 =
new
Class1
();
Class2
c2 =
new
Class2
();
DateTime
dt1 =
DateTime
.Now;
for
(
int
i = 0; i <
int
.MaxValue; i++)
c1.Count = i;
TimeSpan
ts1 =
DateTime
.Now - dt1;
DateTime
dt2 =
DateTime
.Now;
for
(
int
i = 0; i <
int
.MaxValue; i++)
c2.Count = i;
TimeSpan
ts2 =
DateTime
.Now - dt2;
Class1 exposant sa variable Count, et Class2 ayant une propriété Count.
Les nombres représentent les ticks écoulés. Le premier chiffre avec la variable, le deuxième avec la property, une fois en lecture et une fois en écriture.
Constat (j'ai fait le teste quelque fois, et j'obtients des résultats similaires)
- La lecture semble plus rapide avec une Property
- L'écriture semble un peu plus lente avec la Property, mais le coefficient est très faible.
SharpMao
Messages postés1024Date d'inscriptionmardi 4 février 2003StatutMembreDernière intervention 7 juin 201069 19 oct. 2006 à 12:15
Hello,
J'ai refait mon test en utilisant les Stopwatch.
J'ai même fait une boucle vide pour regarder le temps de la boucle elle-même. Et mes résultats sont toujours les mêmes, pire encore si on enlève le temps de la boucle :
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 19 oct. 2006 à 12:31
Hum, comment t'as codé les deux classes?
public class Class1
{
public string test = "salut";
}
public class Class2
{
private string _test = "salut";
public string Test { get { return this._test; } set { this._test = value; } }
}
Un rapport de quasiement 7x me paraît assez peu probable je dois dire...
Mais j'explique toutefois pas le fait que nos tests soient autant différents...
TMONOD
Messages postés256Date d'inscriptionmardi 25 novembre 2003StatutMembreDernière intervention 6 novembre 20091 28 oct. 2006 à 12:14
Vous avez tout faux messieurs :
- d'abord, vu la rapidité des processeurs d'aujourd'hui on ne cherche plus à gagner la milliseconde
- Deuzio, les propriétés permettent de créer un niveau d'abstraction qui autorise de changer l'implémentation interne d'un objet sans obliger les utilisateurs de l'objet à s'adapter : ca s'appelle l'encapsulation.
- Par exemple, si votre objet travail avec une liste de strings , vous pouvez tres bien travailler en interne avec une List(of string) un arraylist ou tout autre chôse et n'exposer à l'utilisateur que les fonctions d'accès à cette liste (Item(...) , Add(), Count, delete....).
- Terzio, utiliser une property plutot qu'une variable publique permet de vérifier les contraintes sur les valeurs directement à l'endroit où la valeur est lu ou écrite.
- Quatrezio, Quand vous voulez faire du readonly déclarer votre variable en readonly, cela ne doit pas être une raison de créér une property avec seulement GET. On crée une property quand on veux masquer l'implémentation interne d'un objet.
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 29 oct. 2006 à 04:53
"Vous avez tout faux messieurs :"
Heureusement que tu es là alors..
"- d'abord, vu la rapidité des processeurs d'aujourd'hui on ne cherche plus à gagner la milliseconde"
Si si, même ( surtout ) en code managé, un peu d'optimisation ça ne fait pas de mal.. Et puis on parlait du principe, on ne t'a pas demandé si on voulait ou pas gagner quelques millisecondes.
"- Deuzio, les propriétés permettent de créer un niveau d'abstraction qui autorise de changer l'implémentation interne d'un objet sans obliger les utilisateurs de l'objet à s'adapter : ca s'appelle l'encapsulation."
Oui oui le principe de la POO, ça été cité par Sebmafate et MorpionMx.
"- Terzio, utiliser une property plutot qu'une variable publique permet de vérifier les contraintes sur les valeurs directement à l'endroit où la valeur est lu ou écrite."
Oui mais là, la question portait clairement sur un cas de figure ou justement il n y a aucun test de contraintes ou de valeurs.
"- Quatrezio, Quand vous voulez faire du readonly déclarer votre variable en readonly, cela ne doit pas être une raison de créér une property avec seulement GET. On crée une property quand on veux masquer l'implémentation interne d'un objet."
TMONOD
Messages postés256Date d'inscriptionmardi 25 novembre 2003StatutMembreDernière intervention 6 novembre 20091 29 oct. 2006 à 10:18
- Merci. Mais je persiste à préférer un programme bien fait et lisible même si il est plus lent. Mais bon, si tu fais du temps réél, la y a pas de doute il faut aller chasser la microseconde.
- Mais qui voudrait faire du temps réél en dotnet ?.
Je dois cependant avouer que je n'utilise pas ilsdam, et que mes utilisations de la plateforme sont purement "bureautique" et réseau. Je ne suis donc pas le mieux placé pour juger.
Quoi qu'il en soit,j'apprécie et respecte le franc parler et la passion qui vous anime !
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 1 nov. 2006 à 22:31
Salut,
J'arrive largement après la bataille, mais tant pis, je vais quand même donner mon avis ^^
C'est vrai que dans ce cas simple on ne voit pas forcément l'intérêt, et on pourrait s'arrêter aux pertes de temps causés par l'appel de méthode.
Mais au final pour moi la lisibilité, la continuité avec le restant du code (pour lequel les propriétés se "justifient") et surtout l'aspect évolution prédominent.
Et si dans la v2 on veut réagir à un changement de valeur du texte, effectuer un traitement quelconque dessus etc, on est bien embêtés avec notre champs :p (sans briser le code existant)
Il s'agit d'un membre exposé publiquement, comment faire la validation de la valeur qui s'impose sur un champs ? (je pense que ça rejoint en partie l'argument du problème de sécurité cité précédemment). Et si on se dit "pas besoin de validation là" et que par la suite on s'aperçoit qu'il s'agissait d'une énorme erreur, comment ajouter la validation sans briser le code existant si c'est un champs ?
Sinon, en vrac :
- on ne peut définir de champs dans une interface
- on ne peut surcharger un champs
- avec une propriété, on peut ajouter du code de debug, trace...
- j'aime les propriétés ! (ok, celui là ne compte pas :p)
Voilà, s'il y avait besoin d'un autre avis, c'est fait :p
Après pour tout ce qui est optimisation et différences en profondeur, j'avoue ne pas m'être pencher suffisamment sur le fond du sujet.