Exemples Java et C / Linux Tweet

Cachée et encapsulation en C ++

Nous avons tous entendu parler de l’encapsulation d’informations dans les langues Orienté vers des objets et en C ++. Voyons ici ce qu’il se compose de « astuces » que nous pouvons faire dans le cas spécifique de C ++ et que cela ne vient généralement pas dans les livres de cette langue (bien que dans les livres sur les modèles de conception).

Les points que nous verrons sont:

  • Attaque des trampliers dans une classe
  • Importance de LaneGeNalesulation à compiler en C ++
  • encapsulation via des interfaces

encapsulation des attributs d’une classe

Tout d’abord, il devrait être clair que l’encapsulation, tout comme n’importe quel bien L’habitude de la programmation (comme ne pas sortir, le commentaire, etc.) est utile pour le code qui peut plus tard être réutilisé ou modifié, par d’autres personnes ou par soi-même. Si je fais un programme martienne et que je n’ai jamais prévu de le toucher à nouveau, ce n’est pas importable à quel point je le fais avec des gouts et sans commentaire pendant que je me trouve pendant que je le fais et ça marche. Je vais payer ce «péché» si dans deux mois, je peux penser à l’améliorer ou que je souhaite réutiliser quelque chose de son code pour un autre programme.

Je commencez cela parce que l’encapsulation, entraînée à sa fin, comme c’est le cas du point de terminaison des interfaces, rend la programmation un peu plus compliquée (vous devez faire plus de cours). Cet effort n’est récompensé que si le code est très important (en évitant les recomilats inutiles) ou sera réutilisé à l’avenir (nous pouvons extraire des cours avec moins de dépendances d’autres classes). Cela dit, allons au sujet.

Tout cours d’orientation des objets nous dit qu’il est préférable de mettre les attributs d’une classe protégée ou privée (jamais publique) et d’y accéder par des méthodes publiques que nous mettons dans la classe. Voyons la raison. Supposons, par exemple, que vous demandez un programme qui vous permet d’apporter une liste de personnes avec vos dates de naissance. Entre autres choses, nous avons décidé de nous faire notre classe de date avec plusieurs méthodes merveilleuses comme suit.

Date de la classe: Public:
Int Anho; // l’anho avec quatre chiffres, par exemple. 2004
int mois; // le mois, de 1 à 12
int Jour; // la journée, de 1 à 31
Void Methodomaravilloso1 ();
VOI MODYMARAVILLOS2 ();
};

Nous avons déjà fait la classe. Maintenant, nous effectuons le reste du code et dans plusieurs milliers de lignes de code, nous utilisons des choses comme celle-ci directement.

DATE UNACY;
UNACCHA.ANHO = 2004;
Unaccha.mes = 1;
Unaccha.dia = 25;

Enfin, nous avons terminé notre programme et que tout fonctionne bien. Quelques jours plus tard, ils nous disent que le programme va garder les tropecies mille personnes et qui prennent beaucoup de fichiers que de voir si nous pouvons faire quelque chose à remédier à la réparation. Wow, nous stockons une date avec trois entiers. Si nous utilisons le format de la plupart des ordinateurs, dans lequel la date est le nombre de secondes depuis le 1er janvier 1970 (qui nous renvoie la fonction TIME ()), il suffit d’un entier.

Total, quelles mains sont modifiées, changées notre classe afin qu’elle ait les suivantes:

Date de la classe:

> Intanho; IntMes;
Intidia; * /

longnumersecondes;

voidmetodomaravilloso1 ();
VOI MODYMARAVILLOS2 ();
};

est déjà fait le facile. Maintenant, il vous suffit de passer à travers les Tropecies mille lignes de code en modifiant nos missions et nos lectures aux trois entiers précédents par le nouveau long.

Cela aurait été beaucoup mieux si nous avions fait ces trois entiers et méthodes protégés pour y accéder. Quelque chose comme ça

date de la classe:

NOID TOMAFCHA (INT ANHO, INT MOIS, INTDIA);
int Dous-Domeanho ();
int Damemes ();
Int Damedia ();
Méthodomaravilloso1 ();
VOI MODYMARAVILLOS2 ();
Protégé:
int anho; // l’anho avec quatre chiffres, par exemple. 2004
int mois; // le mois, de 1 à 12
int Jour; // Le jour, de 1 à 31
};

Si nous devons maintenant faire le même changement, modifiez simplement les attributs protégés. Les méthodes TomaxXxx () et DameXXX () sont maintenues en termes de paramètres et de valeurs retournées, mais son code interne est modifié pour rendre l’année, le mois et la journée dans une longue seconde et à l’envers. Le reste du code ne doit pas le toucher du tout.

Il est encore préférable de faire les attributs privés protégés. Les faire protégez, les classes des filles (ceux qui hérités de la date) peuvent accéder directement à ces attributs. Lorsque nous effectuons le changement pendant longtemps, nous devons également modifier le code des classes des filles. Si les attributs sont privés et que nous forcions les classes des filles à les accéder à travers des méthodes, nous n’aurons pas à changer le code de ces classes de filles.

L’accès via des méthodes est moins efficace que de le faire directement, alors même si le principe de dissimulation est préférable de faire des attributs privés, par efficacité, dans certains cas, il est peut-être préférable de les rendre protégés (voire publics ) risquer d’avoir à modifier davantage de lignes de code en cas de changement.

conseils:
Dans la mesure du possible, les attributs d’une classe privée.

importance de l’encapsulation en C ++

avec ce qui est compté jusqu’à présent que nous évitons Avoir à modifier le code en cas de changement de paramètre.

dans le boîtier en béton de C ++ il y a un petit problème supplémentaire. Il est tout à fait normal de définir les classes au moyen de deux fichiers. Dans le cas de la classe de date, nous aurions une date.h avec la définition de la classe et une date.cc (ou .CPP) avec le code des méthodes de classe. Lorsque nous voulons utiliser la classe de date, nous faisons habituellement notre #include < date.h >.

Tout processus de compilation efficace (tel que Linux Faire utilitaire et je suppose que le visuel C ++) est suffisamment prêt pour recompiler uniquement les fichiers qui doivent être recompantés. C’est-à-dire que si nous avons déjà notre projet compilé et que nous jouons un fichier, le compilateur ne compilera que ce fichier et tous ceux qui en dépendent. Ces fonctionnalités sont très importantes dans les grands projets (avec de nombreux fichiers et de nombreuses lignes de code), pour économiser du temps de compilation chaque fois que nous modifions (j’ai travaillé sur des projets qu’il m’a fallu pour compiler à partir de 4 heures).

Quel est le problème? Le problème est que si nous décidons, par exemple, changez à nouveau l’attribut privé de la classe de date pour autre chose, nous devons toucher la date de fichier. Cela rendra tous les fichiers qui font #include < date. Cela à son tour #include la date. Eh bien, ainsi de suite.

La solution est évidente, placez le moins aussi peu que possible à la date. H, spécifiquement les variables #define et globales qui n’est pas nécessaire pour voir d’autres classes.

Par exemple, notre classe de date pourrait avoir une partie #define pour indiquer le nombre minimum et maximum de mois. Il vaut mieux placer ces #define à jour. CC au lieu de la date. H, à moins que quelqu’un ne doive les voir.

// Ce meilleur dans le .cc que dans le .h
#define mes_minimo 1
#define mes_maximo 12
conseils:
Autant que possible, mettant la mise à jour Le # définit, types de définition, constantes globales, etc., à l’intérieur de Delfichero.cc

encapsulation via des interfaces

Nous avons une chose à gauche. Pourquoi devons-nous recompiler beaucoup de choses si nous modifions un attribut privé de la classe? L’idéal serait de pouvoir changer les choses internes de la classe sans avoir à recompiler autre chose, après tout, l’attribut est privé et que personne ne l’utilise directement.

Il est assez courant dans la programmation orientée objet L’utilisation d’interfaces pour que les classes dépendent l’une de l’autre. Dans le cas de C ++, l’utilisation d’interfaces est également utile pour éviter des recompilats inutiles.

Une interface n’est pas plus qu’une classe dans laquelle les méthodes publiques nécessaires sont définies, mais elles ne sont pas implémentées. Ensuite, la classe concrète que nous voulons hériter de cette interface et met en œuvre ses méthodes.

Dans notre cas, nous pouvons faire une classe d’interface, avec des méthodes publiques virtuelles pures (aucun code). Ensuite, la classe de date hérite de l’interface et implémente ces méthodes.

dans le fichier d’interface.h Nous aurions

Interface de classe infectée
{
Public:

VID VID VID TOMACCHA (INT ANHO, INTMES, INT DIA) = 0; Virtual Int Domemeanho () = 0;
Virtual Int Damemes () = 0;
Virtual Int Damedia () = 0; Méthode vide VIDULAIREMARAVILLOSO1 () = 0; Méthodomaravillos2 () = 0;
};

Pour le moment, n’existerait même pas une interface. CC

La classe de date est toujours identique, mais héritée de l’interface.

#include < interfacefea.h >

date de classe: interface publique> Public:
NOID TOMAFA (INT ANHO, INT MOIS, INTDIA);
int Dous-Domeanho ();
int Damemes ();
Int Damedia ();
Méthodomaravilloso1 ();
VOI MODYMARAVILLOS2 ();
Protégé:
int anho; // l’anho avec quatre chiffres, par exemple. 2004
int mois; // le mois, de 1 à 12
int Jour; // Le jour, de 1 à 31
};

Maintenant, tous ceux qui ont besoin d’une date, doivent avoir un pointeur à l’interface au lieu de la date. Quelqu’un va installer la date et le garder dans ce pointeur. C’est-à-dire que nous pourrions faire quelque chose comme ça

#include < date.h >

< interface. >
…Interface infectée * Unacy = null;

Unacho = nouvelle date ();
Unaccha- > Tomacca (2004, 1, 27);

Supprimer l’UNACY;
UNACCHA = NULL;

Si nous regardons un peu, nous n’avons pas encore résolu, sauf si compliqué la matière. Celui qui fait ce code doit faire maintenant #include à la fois interfacefea.h et date.h. Si nous touchons quelque chose à la date. H, ce code sera recompréré.

Ce code a besoin #include < date.h > Pour pouvoir faire la date de date. Vous devez rechercher comment éviter cela nouveau. Il est généralement très habituel de faire une classe (ou d’utiliser la même interface si la langue le permet, de même que le cas de C ++) de mettre une méthode statique que la nouvelle et de le renvoyer à nous.

Dans le cas de Java, en mettant cette méthode, nous n’aurions plus d’interface, mais une classe. Faire des informations sur les informations héritées de la date limite de ne pas hériter d’autre chose (Java ne prend pas en charge plusieurs héritages). Si cela est admissible, nous pouvons le faire de cette façon. Si nous avons besoin de cette date héritée d’une autre classe, au lieu de mettre la méthode statique dans l’interface, nous devons effectuer une troisième génératrice séparément avec cette méthode statique.

Dans notre exemple C ++, la classe d’interface serait laissée.

interface de classeface
{
Public:

Staticinterfacefacea * DachukueVafecha ();

Voitement virtuel (Intanho, IntMes, Int Day) = 0; Virtual Int Domemeanho () = 0;
Virtual Int Damemes () = 0;
Virtual Int Damedia () = 0; Méthode vide VIDULAIREMARAVILLOSO1 () = 0; Méthodomaravillos2 () = 0;
};

Nous avons besoin d’une interface. CC. En lui, nous aurons

#include < interface .h >

« 70d99b01cf »> date.h >

interface * interface infectée :: datchuevafecha ()
{
retour nouvelle date ();
}

Le code qui a précédemment utilisé le pointeur vers l’interface serait maintenant

#include < interface. >

* UNACCHA = NULL;

Unaccha = Interface infectée :: Damenuecha ();
Unaccha- > Tomacca (2004, 1, 27);

Supprimer l’UNACY;
UNACCHA = NULL;

Comme nous le voyons, seul le #include de l’interfacefeafe.h et cela n’inclut pas la date.h (interface. CC, pas le .h). Nous avons fait que ce code ne voit pas du tout à ce jour. Maintenant, nous pouvons jouer sans regarder à la date. H, que ce code n’a pas besoin d’être recompilé.

Un avantage supplémentaire est que vous pouvez modifier la date de date d’une autre date de classe2 au moment de l’exécution. Il suffirait de mettre un attribut statique dans l’interface pour indiquer la date de la classe que nous voulons et rendons la méthode Instantie de la barretteVacha () et renvoie l’une ou l’autre en fonction de cet attribut.

Conseil:
Utilisation Interfaces Paraquelas Clasque Weeep que vous pouvez changer de delProTectoo de DevelycoToo de DeveloToo de Develope.

Ce mécanisme Obtenez une instance d’une classe d’une méthode statique et Une interface, afin de ne pas dépendre de la classe spécifique, je pense que dans le monde des modèles de conception est le modèle d’usine.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *