1. Et si on passait à la programmation orientée objet ?
La principale amélioration de Matlab au cours de ces dernières années s’est faite au niveau de la programmation orientée objet.
En effet, Matlab a modifié sa syntaxe dédiée à la Programmation Orientée Objet en reprenant les concepts et les règles d’écriture utilisés dans d’autres langages objet notamment la notion de classe et de référence. Un fichier de définition de classe est reconnu à partir du mot clé classdef. Une classe Matlab définit les propriétés, les méthodes mais aussi les événements. Elle peut être placée dans des paquets pour gérer l’espace de nommage et faciliter la syntaxe lors de leurs appels. Les références vers des objets sont possibles en utilisant le mot clé handle et permettent de manipuler les objets sans les recopier. Toutefois, depuis la R2011a la classe copyable permet d’apporter un comportement de copie par défaut pour les classes handle.
De plus, pour mettre en œuvre des tableaux de consultation, Matlab a créé depuis la R2008b un nouveau type de données containers.Map. Les utilisateurs d’autres langages de scripts comme Python ou Perl seront donc en terrain connu avec cet objet. Ce type permet de récupérer des valeurs en utilisant une indexation par « clé ». Les clés peuvent être des nombres réels ou une chaîne de caractères. Ils fournissent plus de flexibilité pour accéder aux données que les indices, qui doivent être des nombres entiers positifs. Les valeurs stockées peuvent être de tout type (des matrices, des structures, des cellules, des strings, des objets mais aussi d’autres Map). Ce type de données est un compromis entre les structures et les cells arrays qui offre la simplicité de conteneurs des cells arrays et la lisibilité des noms de champs des structures.
% Construction % containers.Map
mesCles = {‘cle1′,’cle2′,’cle3’};
mesValeurs = {ones(3),‘truc’,123};
monObjet = containers.Map(mesCles,mesValeurs);
% Ou bien
monObjet2 = containers.Map({‘cle1′,’cle2′,’cle3’},{ones(3),‘truc’,123});
% Recupération et visualisation des éléments du container
Cle = keys(monObjet)
Valeurs = values(monObjet)
valeur1 = monObjet (‘cle1’)
Cle =
‘cle1’ ‘cle2’ ‘cle3’
Valeurs =
[3×3 double] ‘truc’ [123]
valeur1 =
1 1 1
1 1 1
1 1 1
En programmation, des tâches de nettoyage (fermeture de fichiers, rétablissement de l’état du répertoire courant…) peuvent être spécifiées après exécution d’une fonction à partir de l’objet onCleanup.
%% Exemple onCleanUp pour assurer la fermeture d’un fichier en cas d’erreur
function strText = lireFichier(nomFichier)
% Ouvre le fichier en lecture
fid = fopen(nomFichier, ‘rt’);
if fid<0
error(‘lireFichier:ImpossibleOuvrirFichier’, …
‘Impossible d »ouvrir %s\n’, nomFichier);
end
% Ajout de l’objet onCleanup pour fermer le fichier en sortie de fonction
objCleanup = onCleanup(@() fermeture(fid, nomFichier));
% Lecture du fichier
strText = fread(fid, ‘*char’)’;
% Génère une erreur si le fichier est vide
if isempty(strText)
error(‘lireFichier:FichierVide’, ‘Le fichier est vide’);
end
%% Fonction exécutée par l’objet objCleanUp en sortie de la fonction
function fermeture(fileID, fileName)
fclose(fileID);
fprintf(‘objCleanup : fermeture du fichier « %s »\n’, fileName);
end
end