POO & Design Patterns

Data oriented programming (DOP)
and
Object oriented programming (OOP)

Introduction du Data Oriented Programming en Java

Depuis la version 17 de Java, le langage incorpore des éléments de Data Oriented Programming.

Le Data Oriented Programming est basé sur le fait de travailler des données fortement structurées directement sans encapsulation.

En théorie, cela semble incompatible avec les principes SOLID qui se basent sur l'encapsulation.

En pratique, les deux approches sont complémentaires:

  • OOP permet de modularisé le code et définir des limites,
  • DOP permet de simplifier le code dans les parties délimitées.

Data oriented programming (DOP)

Data oriented programming est centré sur la structure interne des données que l'on manipule.

On parle des données qui ont une forte structure.

  • Les figures dans l'application Paint sont soit des lignes, soit des rectangles, soit des ellipses.
    Une ligne est donnée 4 entiers qui sont les coordonnées de ses extrémités ...
  • Les éléments d'un système de fichiers sont soit des fichiers soit des répertoires.
    Un fichier a un nom, une extension et un chemin.
    Un répertoire a un nom, un chemin et une liste contenant des fichiers et des répertoires.

Algebraic Data Types

Plus précisément,on parle de données qui peuvent s'écrire comme une disjonction cas et où chaque cas correspond à un tuple de valeurs.

Cela correspond à la notion de type algebric ou de data type qu'on retrouve dans les langages fonctionnels comme Haskell et Caml.

 Shape := Line Int Int Int Int 
        | Rectangle Int Int Int Int
        | Ellipse Int Int Int Int
 FileSystemItem := File String String Path 
                | Directory String Path List<FileSystemItem>

Data Oriented Programming (DOP)

Comme son nom l'indique le Data Oriented Programming s'applique sur les portions du code centrée autours de ces données.

  • Données structurées, génériques sans possibilité de représenter des états incohérents
    Algebraic Data Types
  • Données immutables
  • Séparation entre les données et le code.

Très grossièrement, Data Oriented Programming = Algebraic Data Types + Pattern Matching

DOP en Java (1/2)

En Java, les algebraic data types sont modélisés par des interfaces sealed et des records.

public sealed interface Shape {
    record Line(int x1, int y1, int x2, int y2) implements Shape {};
    record Rectangle(int x1, int y1, int x2, int y2) implements Shape {};
    record Ellipse(int x1, int y1, int x2, int y2) implements Shape {};
}
public sealed interface FileSystemItem {

	Path path();
	String name();

	record File(Path path, String name, String extension) 
		implements FileSystemItem { ... }
	record Directory(Path path, String name, List<FileSystemItem> content)
		implements FileSystemItem { ... }
}

DOP en Java (2/2)

Java 17 introduit la possibilité de faire du pattern matching (switch) sur une interface sealed.

On peut donc utiliser du DOP en Java sur des périmètres bien délimités. Cela ne remet pas en cause ce que l'on a vu en OOP mais cela vient le compléter.

De plus, certains design-patterns, sont fortement liés à la DOP. Ces patterns sont :

  • Composite
  • Visiteur