§ Premiers pas OO
a- La première notion de service rejoint celle d'abstraction. Cette notion n’est pas propre à l’OO. D’ailleurs, FILE
c’est abstrait, ça rend des services (via des fonctions libres), on ne sait pas comment c’est foutu. Les invariants sont protégés, sans même utiliser private
.
b- IOW, les services ne sont pas limités aux seules fonctions membres. Cf le célèbre point de GOTW/XC++ au sujet de l’interface monolithique de std::string
.
c- J’ai du mal à affirmer qu’aucun service n’est associé à int
. Il y a des services qui font complètement abstraction du champs de bits sous-jacent de compléments à 2, de zero-initialisation…
d- Je n’aime carrément pas InformationPersonnelle::se_presenter()
. On a un agrégat sans invariant et on lui rajoute une fonction d’affichage. Brrrrr.
On frôle le piège dans lequel tombe trop de cours d’OO: confondre BdD avec OO. Ici, je ne vois pas un vrai service OO — oui je sais, je me contredis p/r aux services d'int
…
e- Dans TC++PL, B. Stroustrup définit method comme définition alternative à virtual member function. C’est le seul à utiliser cette appellation. Mais historiquement, c’est son langage, il fait ce qu’il veut. Accessoirement en UML une méthode est une spécialisation d'opération, ce qui est loin d’être différent de la définition du TC++PL.
Bref, terme impropre que je préfère éviter.
Certains pinaillent maintenant sur attribut avec l’arrivé des attributs du C++11
f- L’invariant de la machine à café, c’est de ne pas faire de court-jus pour moi. Qu’il reste du café est une précondition à préparer le café
.
g- A propos de fonctions qui peuvent être privés: il y a la réduction dans le cas des nombres rationnels. Elle peut ainsi servir à renforcer l’invariant à PGCD(d,r)==1 && d > 0
.
h- Pour ce qui est d’avoir des attributs publics. Je dirai que par consistance, on évite de mélanger des attributs publics et des privés. Et que pour les agrégats (sans invariants), tout en public, ça marche très bien: nul besoin de faire semblant d’encapsuler quoique ce soit.
i- Le lancer d’exception dans le constructeur, je me dis de plus en plus que c’est en fait faire de la programmation défensive. En PpC, on aurait juste un report (sans adaptation ici) de l’invariant d != 0
.
§ valeurs
j-
Rule of three
Historiquement, nous avons eu
- FCOC (Coplien — big four)
- big three, car OSEF du constructeur par défaut — mais j’en envie de dire, qu’il doit au moins y avoir un/des constructeurs qui toujours garantir le respect des invariants
- big two (cf article sur artima), car le RAII nous permet de nous passer du destructeur
- 0/5 et autres variantes comme le tout ou rien qui s’appliquent aussi aux entités. Pour les premiers il faudrait étendre la notion de définition à dire "qu’interdire c’est aussi définir" ce qui n’était historiquement pas le cas: comme des bourrins écervelés on définissait vraiment…
k- Dans mes formations j’ai fini par choisir de sortir la sémantique de mouvement du chapitre sur les valeurs. En effet, un ressource non copiable (mutex, fichier…), ça se déplace très bien. Pareil pour protected
, l’héritage privé, et l’héritage multiple: c’est indépendant des 2 notions de valeur/entité.
l- Mon exo de matrice se résume à faire en sorte de supporter
Matrix id(3,3);
for (size_t i = 0; i != id.M() ; ++i)
id(i,i) = 1;
Matrix a(3,3);
for (size_t i = 0; i != id.M() ; ++i)
for (size_t ij= 0; j != id.N() ; ++j)
id(i,j) = i+j;
std::cout << (a+id+a) << "\n";
C’est déjà un bon début. Après, il y a potentiellement 3 façons de faire (je raye d’emblée double**
): double*
, vector<double>
, unique_ptr<double[]>
. Chacune avec ses implications en terme de 0/2/5
§ Entités
m-
Héritage publique
s/publique/public
n- l’OCP est important, c’est le commencement de tout. On a une commonality (vocabulaire Multiparadigm Design de Jim O Coplien) et des points de variations (dynamiques dans notre cas OO), et on est capable de traiter de nouvelles situations sans avoir à modifier le code de la commonality. De façon totalement transparente, le système évolue naturellement: on lui plugge une nouvelle spécialisation, et on peut jouer — c’est plug’n’play!
Mon exemple: virer la poussière par terre depuis la mise en service de l’appareil, la collecte, l’élimination, et le rangement final que l’on ait balai, aspirateur, aspirateur centralisé, etc