ok donc j'utilise ce livre: Core Java Volume I - Fondamentaux.
Il définit l'encapsulation comme suit: P>
encapsulation (parfois appelé information cachée) est un concept clé en travaillant avec des objets. Formellement, l'encapsulation se combinent simplement Données et comportement dans un package et cacher les détails de la mise en œuvre des utilisateurs de l'objet. p> BlockQuote>
de la recherche de la recherche, je sais que cette cachette d'encapsulation et d'information sont des concepts distincts mais utilisés conjointement. Mais collaborons à la définition du livre (qui dit encapsulation == mise en œuvre-cache-cache), car cette question utilise les exemples du livre. P>
xxx pré> Le livre dit Cela ne casse pas l'encapsulation comme une constante. Mais le code ci-dessus ne casse-t-il pas la "forte> la mise en oeuvre de la mise en oeuvre forte> partie de l'encapsulation (par la définition du livre) puisque PI est visible pour non seulement la classe mais reste du programme. P>
Ma question est en fait, un deplicaté possible de ceci: Une variable de const-coiffe publique réorganise l'idéologie d'encapsulation? (étiqueté avec C ++) mais le Réponse dit que cela violera l'encapsulation (contradictoire au livre) et c'est bon. Je comprends si ma question est fermée à cause de cette duplication éventuelle p>
EDIT: Je vais simplement poster un autre code comme un commentaire mentionné PI n'est pas considéré comme un détail de mise en œuvre p>
xxx < / pré> p>
3 Réponses :
Je ne pense pas que Static vient sous le principe de OOP. Donc il ne viole ni ne manque. P>
Les littéraux statiques ne font partie d'aucun objet, ce ne sont que des données attribuées à une variable globale pour convaincre.
Ainsi, ce n'est pas une violation de l'encapsulation en soi, mais un manque total d'orientation de l'objet.
La voie de l'OOP n'est pas de ne pas avoir une constante globale du tout et de définir un objet qui répond à votre problème.
interface Figure { double perimeter(); } class Circle implements Figure { private final double radius; @Override public double perimeter() { return this.radius * 2 * (float) 3.1416926; } }
Eh bien, Java ne vous permet pas d'avoir des constantes en dehors des classes, mais vous pouvez les avoir dans d'autres langues qui permettent au moins de OO, comme C ++, Perl, Python.
Grande question. Je ne pense pas que les exemples que vous avez fournis l'encapsulation de pause, du moins pas strictement.
Le premier exemple que vous avez donné est le PI constant et le second est un exemple qui donne accès à la constante de sortie dans le système; Vraisemblablement pour utiliser un code tel que une manière utile. Pour penser à l'encapsulation, c'est penser à ce qui serait nécessaire pour violer l'encapsulation. Efficace Java 3rd Edition décrit ce puits dans le point 16, suggérant que sans encapsulation appropriée "Vous ne pouvez pas modifier la représentation sans changer l'API, vous ne pouvez pas appliquer les invariants et vous ne pouvez pas prendre des mesures auxiliaires lorsqu'un champ est accessible. " p> Une violation très claire de ce qui précède serait la classe suivante (également dans le point 16 de Java efficace): p> Tous les champs sont publics et Les utilisateurs de cette API seraient obligés d'utiliser directement les champs. Si, plus tard, l'auteur a décidé d'ajouter une vérification de la validation avant examinons maintenant le deuxième exemple que vous avez fourni: p> ceci Semble très similaire à l'exemple de Espère que cela aide. P> p> system.out.println ("helloworld!"); code>. Comme d'autres les ont déjà mentionnés,
pi code> est efficacement juste une constante et des utilisateurs de la constante n'ont aucun moyen par lequel modifier ou influencer la valeur. Les utilisateurs de
PI code> doivent encore référencer la constante (qui constitue l'API ici) dans leur code. Si
PI code> a été modifié (improbable, mais qui sait qui sait) les utilisateurs seraient à l'abri de l'implication de ce changement car ils seraient obligés de recompiler le code de toute façon. P>
x code> ou
y code> peut être consulté ou modifié, il serait alors impossible de le faire sans casser potentiellement les clients existants. L'API devrait être significativement modifiée et briser probablement le comportement des utilisateurs en aval. P>
PI code> ci-dessus, mais il y a une différence clé: le champ en question est une imprimante. Tandis que le champ
OUT CODE> est une partie claire de cette API qui peut maintenant être difficile à modifier (maintenant que les clients exposés vont utiliser et compter sur elle), le
PrintStream code > Type est une classe qui est en fait ce qui est intéressant ici: les utilisateurs seront des méthodes de référencement sur la classe. Ici, nous avons la fonctionnalité clé dans l'API de
PrintStream code> qui peut être évolué au fil du temps sans casser l'utilisation. Il est également possible à l'avenir d'avoir le
constant code> modifié pour se reporter à un autre
impressionnant code> Sous-classe et les utilisateurs de l'API ne doivent pas être affectés. P>
Désolé pour la réponse ultérieure, qu'entendez-vous par les clients, sont-ils simplement des trucs qui interagissent avec votre classe? Aussi, pourriez-vous réduire le paragraphe pour moi: "Vous ne pouvez pas modifier la représentation sans changer l'API, vous ne pouvez pas appliquer les invariants et vous ne pouvez pas prendre une action auxiliaire lorsqu'un champ est accessible." code>. J'ai du mal à comprendre que
Mais ai-je raison de dire que l'essence principale de votre réponse est que tant que les clients interagissant avec votre classe ne sont pas affectés sans défense lorsque la conception de données / données elle-même est modifiée dans la classe, nous ne rompons pas l'encapsulation, au moins pas strictement. Mais strictement, nous rompons l'encapsulation pour le 2e exemple
@Helloworld Je dirais que vous avez raison de l'essence. Permettez-moi de clarifier de manière à répondre également à votre première question sur la reclaridification du texte cité. Tout d'abord, les «clients» font référence à tout code qui utilise votre code en appelant / en utilisant l'API exposée. Pour reformuler ce qui précède: Si vous avez conçu votre classe de manière à ce que cela passe à la représentation interne des données et de l'utilisation de ces données puisse être effectué de manière à ne pas affecter négativement les utilisateurs actuels et futurs de votre code, puis vous avoir obtenu l'encapsulation. Faites-moi savoir si vous avez besoin de plus de clarification.
@Helloworld Je ne m'inquiéterais pas trop trop sur ce qui est "strictement" adhérant à la définition. La conception de l'API est un peu d'art et je préfère être plus préoccupée par la façon de concevoir votre code d'une manière facile à utiliser (par d'autres) et facile à changer (par vous-même) sans avoir un impact négatif sur les autres utilisateurs. Parfois, la bonne conception est en fait d'utiliser une classe comme la classe code> de la classe code> que j'ai montrée ci-dessus tant qu'elle est inaccessible aux utilisateurs (peut-être dans une classe de paquet-privé uniquement).
Pi est une constante. Il n'y a pas de mise en œuvre à cacher.
La mise en œuvre n'est-elle que des informations? Alors, pas l'information PI n'est plus cachée?
Dans ce second cas: Oui, il enfreint l'encapsulation et vous devez généralement éviter d'utiliser des constantes, à l'exception des choses qui ne sont que, par définition, constantes.
@Taschi, il est donc acceptable de casser l'encapsulation alors? Le livre a dit que c'est bien depuis que sa valeur ne peut pas être modifiée. Mais l'encapsulation n'est-elle pas comme un principe que nous devons adhérer à OOP (je suis un débutant, je me trompe)?
@Taschi désolé j'ai réalisé que je pose maintenant une question totalement différente. Je vais faire un post séparé
Non, la mise en œuvre n'est pas seulement des informations. C'est la technique. Par exemple, il existe plusieurs formules pour PI, et si l'une de celles-ci avait été utilisée, il serait approprié de le cacher derrière une interface fonctionnelle. Mais comme il s'agit également d'une des constantes les plus connues de l'univers, enseignées en troisième année, il n'y a aucune raison de la dissimuler.
@Marquisoflorne ahh je vois, cela signifie donc que le 2ème exemple ne devrait pas trop violer l'encapsulation aussi
Ça ne veut pas dire "une telle chose. Je ne peux pas suivre votre processus de pensée. Une constante de l'univers n'a rien à voir avec un
PrintStream code>.
Désolé je suis confus, 2nd exemple fait l'encapsulation de casse alors