Exercice 1 : Héritage multiple   

Soit quatre classes A, B, C, D. On souhaite émuler en Java le fait que D hérite de A, B, C.

Question :

Proposez une solution en UML pour cela. Quel design pattern utiliseriez-vous ?

Exercice 2 : Contrôle technique   

L’ingénieur de notre petite entreprise a développé un logiciel de contrôle suivant le schéma UML ci-dessous. L’idée est la suivante : on a une classe Streamer qui gère un flux de données. Celles-ci sont traitées via une classe ProcessingUnit qui peut exécuter ses calculs soit sur GPU (CUDA) soit sur CPU. Les données ainsi traitées peuvent être affichées par le centre de contrôle via la méthode displayProcessing().

Plus précisément, lors de sa construction, le ControlCenter exécute une thread timedProcess() qui se réveille toutes les 15ms afin de demander au ProcessingUnit qu’il contient s’il y a eu une update des données, auquel cas ces données sont traitées par la méthode getProcessingUpdate() et affichées via la méthode displayProcessing(). Ce processus n’est pas optimal dans la mesure où les updates apparaissent plutôt toutes les 2 ou 3 secondes, mais le logiciel fonctionne malgré tout correctement.

Centre de contrôle

Question :

Récemment embauché dans l’entreprise, on vous demande de mettre à jour ce schéma UML pour qu’il soit SOLID et efficace. En exploitant les design patterns, quel nouveau schéma UML proposez-vous?

Exercice 3 : La valse des tenseurs de Java   

Un tenseur est la représentation informatique d’une table multidimensionnelle. C’est donc une généralisation d’un vecteur (table de dimension 1) et d’une matrice (table de dimension 2). Par exemple, les tableaux numpy de Python sont des tenseurs.

Exemple 1 : 

Ci-dessous, Tens est un tenseur. Si ses dimensions correspondent à des variables x,y,z (dans cet ordre) alors Tens[0,2,1] = Tens[x=0,y=2,z=1] = 2.

x=0 x=1
Tens = y=0y=1y=2 y=0y=1y=2
317 465z=0
872 358z=1

On souhaite ici développer en Java une classe générique Tenseur<T> équivalente aux tableaux numpy et contenant des éléments de type T. Outre un ou plusieurs constructeurs, les seules méthodes publiques de cette classe sont :

L’idée des tableaux multidimensionnels (tenseurs) de numpy est de stocker en interne tous les éléments dans un vecteur (un MyArray<T>) et d’utiliser les informations de shape pour accéder aux éléments.

Dans cet exercice, on souhaite étendre ce stockage en proposant 2 méthodes de stockage :

  1. des vecteurs classiques de type MyArray<T> stockant la totalité des éléments;

  2. des vecteurs creux MySparseArray<T>, qui ne stockent que les éléments différents d’une certaine valeur.

Les éléments de ces deux types de vecteurs sont accessibles uniquement via des index (position depuis le début du vecteur) qui sont des entiers. Par exemple, array[5] correspond au 6ème élément du vecteur (comme dans un tableau usuel).

Les deux méthodes add(x) et mult(x) de la classe Tenseur<T> produisent de nouveaux tenseurs. Si le stockage interne du tenseur x est identique à celui de this, alors on souhaite que le tenseur qu’elles retournent ait le même type de stockage interne (par exemple si this et x utilisent des MySparseArray<T>, les tenseurs résultats utiliseront également des MySparseArray<T>), sinon on impose que ce soit un MyArray<T>.

Attention : on ne veut pas exposer le type de stockage à l’extérieur de la classe Tenseur, autrement dit la classe de tenseur que vous devez proposer est Tenseur<T>.

Question :

Écrivez un diagramme UML permettant de modéliser les tenseurs décrits ci-dessus ainsi que les classes de stockage. Évidemment, vous respecterez les principes SOLID et vous écrirez bien les attributs de vos classes ainsi que leurs méthodes (en précisant leurs paramètres et types de retour).

 
© C.G. 2007 - 2025