Skip to content

Scala で学ぶ関数型デザイン

はじめに

本記事シリーズは、関数型プログラミングにおける設計原則とデザインパターンを Scala を使って実践的に学ぶためのガイドです。Scala のオブジェクト指向と関数型のハイブリッドな特性を活かし、従来のデザインパターンを関数型パラダイムでどのように表現し、活用できるかを探求します。

記事構成

第1部: 関数型プログラミングの基礎原則

  1. 不変性とデータ変換

    • case class と不変データ構造
    • データ変換パイプライン
    • 副作用の分離
  2. 関数合成と高階関数

    • andThen と compose による関数合成
    • カリー化と部分適用
    • 高階関数の活用
  3. 多態性の実現方法

    • sealed trait と代数的データ型
    • トレイトとミックスイン
    • 型クラスによる既存型の拡張

第2部: 仕様とテスト

  1. データ検証

    • 型によるバリデーション
    • Either によるエラーハンドリング
    • カスタムバリデータの作成
  2. プロパティベーステスト

    • ScalaCheck の基本
    • ジェネレータの作成
    • プロパティの定義と検証
  3. TDD と関数型プログラミング

    • ScalaTest によるテスト
    • Red-Green-Refactor サイクル
    • テストファーストの関数設計

第3部: 構造パターン

  1. Composite パターン

    • 再帰的なデータ構造
    • ADT によるツリー構造
    • fold による走査
  2. Decorator パターン

    • 関数合成によるデコレーション
    • 高階関数でのラッピング
    • 振る舞いの動的追加
  3. Adapter パターン

    • 関数アダプター
    • プロトコル変換
    • レガシーコードとの統合

第4部: 振る舞いパターン

  1. Strategy パターン

    • 第一級関数としての戦略
    • 動的な戦略切り替え
    • 戦略の合成
  2. Command パターン

    • 不変コマンドオブジェクト
    • コマンドの履歴と Undo
    • マクロコマンド
  3. Visitor パターン

    • パターンマッチによる訪問
    • fold ベースのビジター
    • 拡張可能なビジター

第5部: 生成パターン

  1. Abstract Factory パターン

    • 関数ファクトリー
    • 型クラスベースの生成
    • 依存性注入
  2. Abstract Server パターン

    • トレイトによる抽象化
    • 実装の差し替え
    • テスタブルな設計

第6部: ケーススタディ

  1. ゴシップ好きなバスの運転手

    • 不変状態の管理
    • シミュレーションの実装
    • 再帰的な処理
  2. 給与計算システム

    • ドメインモデリング
    • 多態的な計算
    • レポート生成
  3. レンタルビデオシステム

    • 状態遷移の管理
    • イベントソーシング
    • ビジネスルールの実装
  4. 並行処理システム

    • 状態マシン
    • イベントバス
    • AtomicReference による同期
  5. Wa-Tor シミュレーション

    • セルオートマトン
    • 不変グリッドの更新
    • シミュレーションループ

第7部: まとめと応用

  1. パターン間の相互作用

    • Composite + Decorator
    • Command + Observer
    • パターンの組み合わせ
  2. ベストプラクティス

    • データ中心設計
    • IO モナド
    • 関数デコレーター
    • テスタブルな設計
  3. OO から FP への移行

    • 移行戦略(Strangler Fig、アダプター)
    • イベントソーシング
    • 段階的な関数抽出
    • ADT による多態性

本シリーズの特徴

Scala の特性を活かした実装

Scala 3 の新機能(enum、given/using、拡張メソッドなど)を活用し、モダンな関数型プログラミングを学びます。

実践重視

すべてのパターンは ScalaTest による実際に動作するテストコードを含みます。理論だけでなく、実装を通じて理解を深めることを重視しています。

段階的な学習

基礎から応用へと段階的に内容が進行します。各章は独立して読むこともできますが、順番に読むことでより深い理解が得られます。


対象読者

  • 関数型プログラミングに興味がある Scala 開発者
  • Scala を学習中の開発者
  • オブジェクト指向デザインパターンの知識があり、関数型での表現を学びたい開発者
  • Clojure 版と比較して学習したい開発者

前提知識

  • プログラミングの基礎知識
  • Scala の基本的な文法(case class、trait、パターンマッチングなど)
  • デザインパターンの基本概念(推奨)

開発環境

本シリーズのコードは以下の環境で動作確認しています:

  • Scala 3.3.1
  • sbt 1.9.7
  • ScalaTest 3.2.17
  • Nix による環境管理

環境構築

# Nix を使用した開発環境の起動
nix develop .#scala

# テストの実行
cd apps/scala/part1
sbt test

参考書籍

本シリーズは以下の書籍の内容を参考にしています:

  • 「Functional Design: Principles, Patterns, and Practices」Robert C. Martin
  • 「Functional Programming in Scala」Paul Chiusano, Rúnar Bjarnason
  • 「Programming in Scala」Martin Odersky, Lex Spoon, Bill Venners
  • 「Scala with Cats」Noel Welsh, Dave Gurnell