Vous pouvez utiliser un trait de soulignement principal dans le nom pour indiquer aux lecteurs du code que le nom en question est un détail interne et qu'ils ne doivent pas compter dessus dans les futures versions. Une telle convention est vraiment tout ce dont vous avez besoin - pourquoi peser la langue avec un mécanisme d'application? Les données, tout comme les méthodes, doivent être publiques (nommées sans un soulignement principal) si elles font partie de l'API conçue de votre classe et que vous avez l'intention de les prendre en charge à l'avenir. En C++ ou en Java, cela est peu probable parce que si vous voulez changer le membre de données en méthode accesseur, vous n'avez pas de chance - vous devrez casser votre API et chaque client de la classe devra changement. En Python, et d'autres langages supportant une construction semblable à property
, ce n'est pas le cas - vous pouvez toujours remplacer un membre de données par une propriété qui appelle les méthodes d'accesseur de façon transparente, l'API ne change pas, ni le code client. Donc, en Python et dans d'autres langages avec des constructions similaires à property
(je crois que les langages .NET sont comme ça, au niveau du code source mais pas forcément au niveau du bytecode), vous pouvez aussi laisser vos données publiques quand elles font partie de l'API aucun accesseur n'est actuellement nécessaire (vous pouvez toujours ajouter des méthodes d'accesseur à des versions d'implémentation ultérieures si nécessaire, et ne pas casser l'API).
Donc, ce n'est pas vraiment un problème général d'OO, c'est spécifique à la langue: un langage donné supporte-t-il une construction semblable à une propriété. Python fait.
+1 .. aime la réponse ... spécialement où vous avez dit "pourquoi peser la langue avec un mécanisme d'exécution?" – Perpetualcoder
Le commentaire sur les langages .NET est faux. Le passage d'un champ à une propriété est un changement d'API. – porges
@Porges Vous voulez dire au niveau du bytecode, correct? – fredoverflow