Les variables toujours en privées?

Salut à tous et toutes,

Dans le cours POO Swift il est dit de toujours mettre les variables en privé mais pour Weapon, le corrigé ne suit pas cette règle, pourquoi ?

Si je souhaite mettre les variables en privée puis des get-set avec un init, est-ce bon ainsi ?

Dans ce cas, plus de let possible

Existe t’il un moyen rapide de créer getter-setter rapidement comme dans d’autres langages ?

Merci à vous.

Hello,

Une variable déclarée avec let est est une constante. Une fois qu’une valeur lui est attribuée il n’est plus possible de la changer.
Il est donc inutile de la déclarer private.

Si tu veux utiliser des getters/setters ton second exemple est le bon avec des variables.

Seb

1 J'aime

Hello Seb,

Mais il est possible de modifier un let en dehors de la classe et peut-être que l’on seulement le faire via une variable calculée ou une fonction précise pour lui attribuer ce let ?
Maxime fait ceci pour Bot, où on voit le let en private

Merci pour ton retour.

Dansle cas de variables toujours mettre en privé et puis faire des get-set ?

Non, ça dépend du contexte.

Une classe est une boîte noire gérant ces affaires par elle-même. Un accès direct à une variable publique est une faille potentielle si le domaine de validité des données est restreint.

Par exemple, imagine une classe stockant les données physique d’une personne. Pour des raisons évidentes un âge ne peut pas négatif, et être trop élevé. En utilisant une variable privée et un set pour modifier sa valeur, la classe peut effectuer une vérification de la validité des données avant de modifier l’âge.

Cela évite qu’une erreur dans le code de plus haut niveau n’altère les données en cas d’erreur de frappe. Et ce n’est pas un exemple fictif ! A la fin des années 90, la presse a relayée l’histoire de cette femme de 97 ans, que les gendarmes sont venus chercher pour l’emmener à école, un système informatique étant persuadé qu’elle avait 7 ans, un âge où la scolarité est obligatoire !

Si la modification de la variable peut se faire sans vérification du contenu, ou ne nécessite pas de traitement particulier, le set/get et le statut privé ne sont pas nécessaires.

6 J'aime

Non une constante doit être initialisée lors de l’instantiation de la classe (ou structure)
Ensuite sa valeur est figée tu ne peux pas la modifier.

Pour les variables utiliser un get/set n’est pas la seule solution.
Tu peux passer par des fonctions pour mettre à à jour tes variables ou bien les laisser publiques et les appeler directement.
Comme dit @Draken ça dépend du contexte.

Seb.

Merci mais lorsque l’on commence un projet il nous faut penser plusieurs coups à l’avance et poser des bases « saines » avec private et get-set ?

Mais dans l’exemple plus hat Maxime déclare un let privé qu’il incorpore ensuite dans une variable calculée.

Oui je ne sais pas pourquoi.
Peut-être que c’était une var a la base et que c’est devenu une let par la suite et que le private n’a pas été enlevé.

Bien sûr que non.
Un projet évolue en permanence.

Je te dirais de commencer par créer des constante.
Puis tu les fais évoluer en fonction de ce que tu as besoin.

Si ensuite tu as besoin de modifier sa valeur a l’intérieur de la classe transforme la en private var.

PuIs si finalement tu dois changer sa valeur depuis l’extérieur de la classe créer une fonction qui prend en paramètre la nouvelle valeur.
Ou utilise un get/set.

Il faut commencer simple puis ton code évoluera en fonction de ce que tu auras besoin de faire.

1 J'aime

Merci beaucoup Seb d’avoir pris le temps de me répondre, ça m’a bien appris.

Ryo.

Oui, mais c’est dans la procédure d’initialisation de la classe. Là c’est permis car la variable let n’a pas de valeur à ce moment.

Oui, il faut toujours bien réfléchir à la nature des interactions entre une classe et son environnement, parce que : Loi de Murphy — Wikipédia

2 J'aime

Oui, mais ça c’est une approche à l’ancienne avec une formulation

val monInfo = maClasse.maMethode()

alors que les langages fonctionnels comme Swift cherchent à éviter au maximum les fonctions de classe, pour privilégier les propriétés.

val monInfo = maClasse.maPropriete

Et surtout :

maClasse.unePropriete = 23

Plutôt que :

maClasse.modifierPropriete(valeur:23)

2 J'aime

Merci Draken pour ces réponses. Où lis-tu pour avoir ce savoir sur Swift ?

Je développe depuis plus de 20 ans, cela laisse des traces à la longue.

2 J'aime

Hello, si tu veux protéger certaines variables et en exposer d’autres, le plus propre est de passer par des protocols.

Toutes les variables du protocols sont donc public pour les autres class qui implémentent le protocol, et du coup toutes autres variables de ta class restent donc private.

Le fait d’en mettre private puis d’avoir une autre variable en get/set pour l’éditer est finalement peu utilise a mon sens.

Si tu veux protéger ta class, il faut la déclarer en final class (bloque les surcharge override) et passer en protocol.

1 J'aime