6月11日、insidejavaで「When to use Data-Oriented Programming v1.1 – Inside.java」と題した記事が公開された。この記事では、データ指向プログラミング(DOP)と関数型プログラミング(FP)、オブジェクト指向プログラミング(OOP)との比較について詳しく紹介されている。以下に、その内容を簡潔にまとめて紹介する。

データ指向プログラミング(DOP)とは
基本原則
データを型で表現する:
- データを透明かつ不変にモデル化する(通常はレコードを使用)。
- シールドインターフェースで代替案をモデル化する。
- データを可能な限り正確にモデル化し、合法な状態のみを表現する。
操作を他のクラスのメソッドとして実装する:
- 主にシールドインターフェース上で網羅的な
switch
文を使用し、default
ブランチを使用しない。 - パターンマッチングを使用してデータを識別し、分解する。
- 主にシールドインターフェース上で網羅的な
推奨されるJavaバージョン
データ指向プログラミングを効果的に活用するためには、JDK 21以降のバージョンが推奨される。JDK 17ではレコードとシールドタイプが利用可能だが、switch
文のパターンはJDK 21で最終化されている。単一アンダースコアによる名前のないパターンはJDK 22で最終化されたが、これは必須ではなく、省略しても対応可能である。
コードサンプル
以下は、データ指向プログラミングの基本概念を示すコードサンプルである。
// データクラスの定義
public sealed interface Shape permits Circle, Rectangle {
}
public record Circle(double radius) implements Shape {
}
public record Rectangle(double length, double width) implements Shape {
}
// 操作の実装
public class ShapeAreaCalculator {
public double calculateArea(Shape shape) {
return switch (shape) {
case Circle c -> Math.PI * c.radius() * c.radius();
case Rectangle r -> r.length() * r.width();
};
}
}
この例では、Shape
インターフェースを実装するCircle
とRectangle
クラスを定義し、それぞれの面積を計算するメソッドを持つShapeAreaCalculator
クラスを実装している。switch
文を使用して各形状の面積を計算する部分に注目してほしい。
データ指向プログラミング(DOP)と関数型プログラミング(FP)、オブジェクト指向プログラミング(OOP)の比較
- DOP:データの透明性と不変性を強調し、シールドインターフェースとパターンマッチングを活用する。
- FP:関数の第一級市民性、イミュータビリティ、関数合成を重視する。
- OOP:オブジェクトのカプセル化、継承、ポリモーフィズムを重視する。
それぞれのアプローチには利点と欠点があり、具体的なユースケースに応じて適切に選択することが重要である。
詳細はWhen to use Data-Oriented Programming v1.1 – Inside.javaを参照していただきたい。