Pourquoi l'encapsulation est une caractéristique importante des langages POO? [fermé]

Je suis tombé sur une interview différente où la question m'a été posée pourquoi l'encapsulation est utilisée? Dont l'exigence est réellement l'encapsulation? Est-ce pour les utilisateurs du programme? Ou est-il de co-travailleurs? Ou est-ce pour protéger le code contre les pirates?

21
demandé sur BartoszKP 2013-08-18 19:54:48

5 réponses

L'Encapsulation aide à isoler les détails d'implémentation du comportement exposé aux clients d'une classe (autres classes / fonctions qui utilisent cette classe), et vous donne plus de contrôle sur accouplement dans votre code. Considérons cet exemple, similaire à celui du livre de Robert Martin Clean Code :

public class Car
{
//...
public float GetFuelPercentage() { /* ... */ };

//...

private float gasoline;
//...
}

Notez que le client utilisant la fonction qui vous donne la quantité de carburant dans la voiture ne se soucie pas du type de carburant utilisé par la voiture. Cette abstraction sépare la préoccupation (quantité de carburant) de détail sans importance (dans ce contexte): qu'il s'agisse de gaz, de pétrole ou de toute autre chose.

La deuxième chose est que l'auteur de la classe est libre de faire tout ce qu'il veut avec les internes de la classe, par exemple changer l'essence en huile, et d'autres choses, tant qu'ils ne changent pas son comportement. C'est grâce au fait qu'ils peuvent être sûr qu'on ne dépend de ces détails, parce qu'ils sont privés. Moins il y a de dépendances dans le code le plus flexible et plus facile à maintenir est.

Une autre chose, correctement notée dans la réponse sous-estimée par utnapistim: un faible couplage aide également à tester le code et à maintenir ces tests. L'interface de la classe moins compliquée est, plus il est facile de la tester. Sans encapsulation, avec tout exposé, il serait difficile de comprendre quoi tester et comment.

Pour réitérer quelques discussions dans les commentaires:

  • Non, encapsulation n'est pas la chose la plus importante dans la POO. J'oserais même dire que ce n'est pas très important. Les choses importantes sont celles - ci encouragées par un couplage lâche semblable à l'encapsulation. Mais ce n'est pas essentiel - un développeur prudent peut maintenir un couplage lâche sans encapsuler les variables, etc.. Comme l'a souligné vlastachu , Python est un bon exemple d'un langage qui n'a pas de mécanismes pour appliquer l'encapsulation, mais il est toujours possible pour la POO.

  • Non, cachant votre champs derrière les accesseurs n'est pas encapsulation . Si la seule chose que vous avez faite est d'écrire "privé" devant les variables, puis de fournir une paire get/set pour chacune d'elles, elles ne sont pas encapsulées. Quelqu'un dans un endroit éloigné dans code peut toujours jouer avec le fonctionnement interne de votre classe, et peut encore dépendent sur eux (bon, c'est bien sûr un peu mieux qu'ils dépendent d'une méthode, et non sur un champ).

  • Non, l'objectif principal de l'encapsulation est ne pas éviter les erreurs. Les objectifs primaires sont au moins similaires à ceux énumérés ci-dessus, et penser que l'encapsulation vous défendra de faire des erreurs est naïf. Il y a juste beaucoup d'autres façons de faire une erreur en plus de modifier une variable privée. Et modifier une variable privée n'est pas si difficile à trouver et à corriger. Encore une fois-Python est un bon exemple pour cet argument, car il peut avoir une encapsulation sans l'appliquer.

30
répondu BartoszKP 2017-05-23 12:02:39

L'Encapsulation empêche les personnes qui travaillent sur votre code de faire des erreurs, en s'assurant qu'elles n'accèdent qu'aux choses auxquelles elles sont censées accéder.

17
répondu SLaks 2013-08-18 15:58:09

L'Encapsulation vous permet de formaliser vos interfaces, en séparant les niveaux d'abstraction (c'est-à-dire "la logique de l'application n'accède au code D'E / S que de cette manière").

Ceci à son tour, vous permet de modifier l'implémentation d'un module (les données et les algorithmes à l'intérieur du module) sans changer l'interface (et affecter le code client).

Cette capacité à modifier les modules indépendamment les uns des autres, améliore votre capacité à mesurer vos performances et à faire des prédictions dans un du projet les délais.

Il vous permet également de tester les modules séparément et de les réutiliser dans d'autres projets (car l'encapsulation réduit également les interdépendances et améliore la modularité de votre code).

Ne pas appliquer l'encapsulation a tendance à conduire à l'échec d'un projet (le problème grandit avec la complexité du projet).

12
répondu utnapistim 2013-08-18 16:03:18

Au moins dans la plupart des langues OO, l'encapsulation est à peu près équivalente à la serrure sur la porte d'une salle de bain.

C'est Pas destiné à garder quelqu'un à l'écart s'il insiste vraiment pour entrer.

Il est destiné par courtoisie à faire savoir aux gens que l'entrée conduira principalement à:

  1. embarras, et
  2. un désordre puant.
11
répondu Jerry Coffin 2013-08-18 16:16:46

J'ai conçu un projet accéléré. L'Encapsulation réduit la propagation du changement à travers le système. Les changements coûtent du temps et de l'argent.

Lorsque le code n'est pas encapsulé, une personne doit rechercher de nombreux fichiers pour trouver où effectuer les modifications. Négativement, il y a la question de "Ai-je trouvé tous les endroits?"et l'autre point" quel effet pour l'ensemble du système de faire tous ces changements de dispersion ont?"

Je travaille sur un dispositif médical intégré et la qualité est impérative. De plus, tous les changements doivent être documentés, examinés, testés à l'unité et, finalement, un test du système doit être effectué. En utilisant l'encapsulation, nous pouvons réduire le nombre de modifications et leur localisation, réduisant ainsi le nombre de fichiers qui doivent être retestés.

6
répondu Thomas Matthews 2013-08-18 17:57:52