CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++] Getter et Setter

Shiba_the_Inu
Shiba_the_Inu
Niveau 85
18 décembre 2019 à 18:04:40

Coucou à vous :)

Petite question qui me turlupine en C++ pour les classes/struct/objets.
Mais, quel est l'intérêt des getter et setter ?
Je veux dire, les getter pour éviter de se planter avec des affectations par erreur, à la limite ok, mais les setters.... Si on veut toucher modifier une variable, autant la laisser en Public dans ce cas, non ?
Pour moi ça tue un peu le principe de public/private, de ce que j'en comprends, et ça me sonne plus à l'oreille comme une mauvaise gestion de sa classe (ou de la manière dont elle a été pensée) qu'un truc réellement utile. Sachant que (encore une fois de ce que j'en comprends) ça rajoute juste un élément, et donc un espace mémoire, inutile puisqu'il peut être utilisé via le terme public, et au lieu d'avoir une ligne de code on en a 3 par variables...

Bref, j'ai l'impression que c'est comme mettre un cadenas à une porte, mais en laissant la porte ouverte au cas où paume son code ?

Désolé si la question parait stupide, mais y a t-il quelque chose qui m'échappe ?
En javascript je crois que ça pouvait ajouter des fonctionnalités, et que ça pouvait éviter de s'appliquer à toutes les références qui découlaient d'un object principal, mais là j'ai pas l'impression que ça en soit le cas ?

Message édité le 18 décembre 2019 à 18:05:06 par Shiba_the_Inu
[Black_Spirit]
[Black_Spirit]
Niveau 19
18 décembre 2019 à 18:09:54

Un setter peut-être utile si t'as besoin de faire une vérification quant à la valeur de la variable que tu veux assigner.

L'exemple basique c'est que si t'as une classe Cercle, et un attribut pour le rayon, ça peut être une bonne idée de mettre cet attribut en privé et passer par un Setter qui va vérifier que la valeur que tu assignes au rayon n'est pas un nombre négatif.

createurdechaos
createurdechaos
Niveau 10
18 décembre 2019 à 18:20:23

Il faut pas voir l'objet uniquement comme une variable de stockage de données mais comme une entité qui propose un ou plusieurs services. Les données permettent à l'objet de fournir ces services là.

A partir de là il est plus facile de concevoir que l'accès et la modification des données sont justement des services proposées, qui ne sont pas systématiquement nécessaire et que par conséquent, les données doivent être privées.

Message édité le 18 décembre 2019 à 18:20:40 par createurdechaos
Shiba_the_Inu
Shiba_the_Inu
Niveau 85
19 décembre 2019 à 23:13:20

Le 18 décembre 2019 à 18:09:54 [Black_Spirit] a écrit :
Un setter peut-être utile si t'as besoin de faire une vérification quant à la valeur de la variable que tu veux assigner.

L'exemple basique c'est que si t'as une classe Cercle, et un attribut pour le rayon, ça peut être une bonne idée de mettre cet attribut en privé et passer par un Setter qui va vérifier que la valeur que tu assignes au rayon n'est pas un nombre négatif.

Je reste sceptique quand même. [[sticker:p/1lmk]]
Pour moi, si on part du principe que l'on va devoir l'utiliser, autant le passer en public dès le départ.

Le 18 décembre 2019 à 18:20:23 CreateurDeChaos a écrit :
Il faut pas voir l'objet uniquement comme une variable de stockage de données mais comme une entité qui propose un ou plusieurs services. Les données permettent à l'objet de fournir ces services là.

A partir de là il est plus facile de concevoir que l'accès et la modification des données sont justement des services proposées, qui ne sont pas systématiquement nécessaire et que par conséquent, les données doivent être privées.

Justement, pour moi ce qui est public est possiblement nécessaire, et ce qui est private devrait être strictement non utilisable, c'est justement ce que je ne comprends pas, on dirait que c'est avoir le c*l entre 2 chaises.
Les services étant du coup de l'ordre public, et les initialisation de l'ordre private.

Honnêtement je suis pas super convaincu pour l'instant. Surtout que je vois souvent la remarque "mettez le plus possible vos éléments en private" mais les gars mettent la blinde de setters derrière, perso je trouve ça plutôt paradoxal comme approche...

Bon, peut être qu'à force de coder j'y verrais un peu plus d'inspiration, mais pour le moment j'avoue que je reste un peu sceptique de scepticisme :doute:

NurseryRhyme
NurseryRhyme
Niveau 9
20 décembre 2019 à 00:05:53

Si t'as besoin de validation plus tard, tu fais comment si t'as déjà fait des affectations directes si t'as exposé tes propriété a poil ? Faut retrouver toutes les instances dans ton code ou tu fais Classe.Propriété = Valeur et les remplacer par le setter qui applique la vérification. La représentation interne de ta propriété peut parfois être plus complexe ou juste différente de la représentation alternative exposée au reste du code. A ce moment la le traitement se fait via les getter/setters. Lorsque tu fais hériter une nouvelle classe tu peux surcharger les getters/setters et ca peut être utile. Et y'en a encore d'autres avantages, je vais faire une dissert.

Diei
Diei
Niveau 7
20 décembre 2019 à 08:14:53

Je ne trouve pas utile non plus les setter et getter simples, sans surcharge. Mais ils ne se cantonnent pas à ce rôle.

Le setter peut remplir une fonction de filtrage des valeurs assignées. L'exemple du rayon du cercle supérieur à 0 est tout à fait explicite, ta classe effectue par ce setter un contrôle d'entrée et n'assigne à la variable privée la valeur que si la valeur est compatible à son fonctionnement. Tu as mis un cadenas à ta porte, et tu n'as pas distribué la clé à tout le monde. Tu peux également déclencher des appels à une fonction, par exemple, pour mettre à jour des valeurs ou déclencher des actions.

En outre, ils permettent dans un IDE de poser des points d'arrêt pour le debug.

Message édité le 20 décembre 2019 à 08:17:44 par Diei
futurmononoke
futurmononoke
Niveau 10
20 décembre 2019 à 12:19:06

Partons sur un exemple simple:
Dans ton application tu as une classe A contenant un attribut "durée" qui est un entier (nombre de seconde).
Admettons que tu ne fasses pas de getter. Dans l'ensemble de ton code, les utilisateurs de la classe A vont s'attendre à recevoir un entier naturel.

Un jour vous voulez rajouter des fonctionnalités (donc du nouveau code) et ton chef de projet veut que les durées soient des tableaux ['heure','minute','seconde'].

On touche pas au code déjà produit, mais dans le nouveau code les utilisateurs s'attendent à recevoir un triplet.
Tu va redefinir une classe A_fille qui hérite de A et qui fournit le triplet. Sans getter tu fais comment ?

-Tu définie un nouvel attribut durée_format_triplet, mais du coup tu vas stocké 2 fois la même information dans la mémoire. (car ta classe A_fille, héritant de classe_A, doit toujours contenir la durée sous format d'entier naturel) et c'est moche de définir à chaque fois un nouvel attribut qui contient la même information.

En utilisant des getters, il suffit définir un getter dans classe A_fille qui renvoie le triplet à partir de l'attribut "durée".

Message édité le 20 décembre 2019 à 12:20:52 par futurmononoke
Shiba_the_Inu
Shiba_the_Inu
Niveau 85
20 décembre 2019 à 14:14:31

Ah, comme ça je vois un peu mieux l'utilité oui, je vais essayer d'intégrer ça un peu dans mes petits projets d'apprentissage pour que ça vienne un peu plus naturellement, d'ailleurs c'est peut être parce que je me cantonne justement à des petit projets pour le moment que j'en voyais moins l'utilité.
D'ailleurs avec l'exemple du temps ça revient du coup à ce que j'avais lu pour les setter/getter en javascript, donc ça s'applique finalement quand même au c++ aussi.

Merci en tout cas pour vos différentes explications :)

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment