Encapsulation et Extensibilité des Types

La POO est une approche équilibrée pour écrire des logiciels. Les données et les comportements sont regroupés ensemble. Cette encapsulation crée des types de données définis par l'utilisateur, étendant les types de données du langage et les utilisant. L'extensibilité des types est une opportunité pour ajouter au langage des types de données définis par l'utilisateur, qui sont également faciles à utiliser, ainsi que des types de base.

Un type de données abstrait, par exemple, une chaîne de caractères, est la description d'un type de comportement idéal et bien connu.

L'utilisateur de la chaîne de caractères sait que les opérations sur les chaînes, telles que la concaténation ou l'affichage, ont un comportement spécifique. Les opérations de concaténation et d'affichage sont appelées des méthodes.

Une certaine implémentation d'ADT peut avoir quelques restrictions, par exemple, les chaînes de caractères peuvent avoir une longueur maximum. Ces limitations affectent le comportement ouvert à tous. En même temps, les détails internes ou privés d'implémentation n'affectent pas directement la façon dont l'utilisateur voit l'objet. Par exemple, la chaîne de caractères est souvent implémentée sous la forme d'un tableau, tandis que l'adresse de base interne de ce tableau et son nom ne sont pas essentiels.

L'encapsulation est la possibilité de cacher les détails d'implémentation lorsque les interfaces du type défini par l'utilisateur sont fournis. En MQL5, comme en C++, les définitions des classes et des structures (class et struct) sont utilisées en prévision de l'encapsulation en combinaison avec les mot-clés d'accès private, protected et public.

Le mot-clé public indique que l'accès aux membres situés après ce mot est ouvert sans restrictions. Sans ce mot-clé, les membres de classe sont inacessibles par défaut. Les membres privés ne sont accessibles que par les fonctios membres de cette classe.

Les fonctions protected de la classe sont disponibles aux fonctions non seulement de cette classe, mais aussi des classes héritées. Les fonctions publiques de la classe sont disponibles pour toutes les fonctions dans la portée de la déclaration de la classe. Cette protection rend possible de masquer des parties de l'implémentation de la classe, donc de prévenir tout changement inattendu dans la structure des données. La restriction d'accès ou masquage des données est une caractéristique de la programmation orientée-objet.

Habituellement, les fonctions de classe sont protégées et déclarées avec le mot-clé protected , la lecture et l'écriture des valeurs sont effectuées par des méthodes spécifiques set- et get- qui sont définies avec le spécificateur d'accès public.

 

Exemple :

class CPerson
  {
protected:
   string            m_name;                     // nom
public:
   void              SetName(string n){m_name=n;}// définit le nom
   string            GetName(){return (m_name);} // retourne le nom
  };

 

Cette approche offre plusieurs avantages. Premièrement, il est possible de comprendre ce que fait une fonction grâce à son nom - définit (set) ou retourne (get) la valeur d'un membre de la classe. Deuxièmement, il est possible de changer par la suite le type de la variable m_name de la classe CPerson ou de l'une de ses classes dérivées.

Dans ce cas, nous n'aurons qu'à changer l'implémentation des fonctions SetName() et GetName(), tandis que les objets de la classe CPerson pourront être utilisés dans un programme sans changer de code car l'utilisateur ne saura même pas que le type de données de m_name a changé.

Exemple :

struct Name
  {
   string            first_name;                 // prénom
   string            last_name;                  // nom
  };
 
class CPerson
  {
protected:
   Name              m_name;                     // nom
public:
   void              SetName(string n);
   string            GetName(){return(m_name.first_name+" "+m_name.last_name);}
private:
   string            GetFirstName(string full_name);
   string            GetLastName(string full_name);
  };
 
void CPerson::SetName(string n)
  {
   m_name.first_name=GetFirstName(n);
   m_name.last_name=GetLastName(n);
  }
 
string CPerson::GetFirstName(string full_name)
  {
   int pos=StringFind(full_name," ");
   if(pos>0) StringSetCharacter(full_name,pos,0);
   return(full_name);
  }
 
string CPerson::GetLastName(string full_name)
  {
   string ret_string;
   int pos=StringFind(full_name," ");
   if(pos>0) ret_string=StringSubstr(full_name,pos+1);
   else      ret_string=full_name;
   return(ret_string);
  }

Voir aussi

Types de Données