La programmation orienté objet en Python

a marqué ce sujet comme résolu.

Après réflexion, je me dis de plus en plus que le LSP s'applique (ou devrait s'appliquer) à tous les polymorphismes. Pas seulement à celui des objets. I.e., il est aussi valide avec le polymorphisme paramétrique.

Dans "On nomme encapsulation cette notion de visibilité des attributs et méthodes d'un objet.", je dirai plutôt: "On nomme encapsulation cette notion de protection des attributs d'un objet pour garantir le respect des invariants de l'objet en offrant une interface dédiée de manipulation de l'objet." (très mal dit). Bref, on ne cache pas pas pour cacher. On cache pour être sûr qu'un tiers couillon, ou nous après une soirée bien arrosée, ne vienne pas altérer, depuis n'importe où et n'importe comment, des données qui participent à une certaine stabilité.

Exemples :

  • changer un mot de passe crypté sans passer par la procédure sécurisée qui vérifie l'ancien mot de passe ;
  • altérer le dénominateur d'un nombre rationnel alors qu'on l'exploite en supposant qu'il soit toujours strictement positif et la fraction réduite ;
  • changer directement (ou mettre directement) un élément à l'intérieur d'une séquence triée

Après techniquement, l'encapsulation s'appuie souvent sur la notion de visibilité pour être mise en oeuvre. À noter que de son coté Eiffel autorise l'accès en lecture aux attributs, mais pas celui en écriture. On a un type d'accessibilité encore différent du public/protégé/privé/package que l'on trouve ailleurs.

Bref, j'ai trouvé la présentation de l'encapsulation trop axée comment (visibilité) et pas assez finalité (à quoi ça sert, pourquoi…). Encapsulation et invariant de classe/instance sont deux notions intimement liées.

Dans le chapitre sur la surcharge des méthodes, j'ai trouvé qu'il fallait peut être donner plus d'explication sur ce qu'il se passait réellement quand nous surchargeons la méthode __init__ de la classe fille.

En définissant la classe Guest nous n'avions besoin, ni du salt, ni d’encrypter la mot de passe car nous n'avions pas besoin de ce dernier. Dans sa version revisité, nous surchargeons __init__ pour répercuter les possibles futur changements fait à User.

Il serait intéressant de souligné le fait que lors de la surcharge de __init__, le salt et le mot de passe ne seront plus égale au string vide '' mais qu'il aurons les valeurs de crypt.mksalt() et crypt.crypt(...) et que nous pouvons consentir à avoir des données inutile à notre objet pour justement faciliter la maintenance du code. Ce sera plus claire pour le lecteur et ça lui donnera une meilleure idée sur ce que fait super().

+0 -0

J'étais plutôt dans l'optique de passer outre ces détails sur les variables membres inutiles qui sont crées dans ce cas.

Par contre, je ne vois pas bien ce que tu veux dire par « plus d'explications sur ce qu'il se passait réellement » ? Plus d'explications sur la redéfinition de la méthode, ou plus d'explications sur le mécanisme de super ?

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l'adresse suivante :

Merci d'avance pour vos commentaires.


Désolé pour le temps mort depuis quelques semaines. J'ai maintenant intégré vos différentes remarques. J'aimerais notamment vos commentaires sur le paragraphe des invariants.

Toute remarque est bonne à prendre, donc oui. J'ai envoyé en validation car l'état me paraissait satisfaisant, et que les commentaires se faisaient plus rares.

J'ai notamment laissé ouvert le sujet de la beta pour le 6ème chapitre que je commencerai prochainement (= après le bouclage de l'import du cours de Gérard Swinnen, et l'article sur Python 3.6).

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte