Closed6

TSKaigi 2024 - TypeScript 関数型バックエンド開発のリアル の理解

high-ghigh-g

参考動画

https://www.youtube.com/watch?v=qBf910_YiqA

モチベ

  • 本動画に出てくる諸々の知識を理解し、正しく動画の内容を理解する

分からない or 理解が浅い知識 or 忘れてる or 更に理解したい

  • 関数型
    • 関数型と手続き型の比較
  • DDD
    • 値オブジェクト
    • エンティティ
    • ドメインオブジェクト
  • 代数的データ型
  • Result型
  • workflow
  • neverthrow
  • Railway Oriented Programing
  • haskel
    • モナド
high-ghigh-g

関数型プログラミング

関数型プログラミングとは?

データに何らかの処理を加えることの連続で、処理全体を組み立てるという考え方。
データに何らかの処理を加えること → 純粋関数 である必要がある

関数型プログラミングの対義語は、手続型(命令型)プログラミングで、代入文、for文、if文などの連続で変数の値を徐々に変えていくスタイル。

純粋関数とは?

引数以外に入力がなく、返り値以外に出力がない関数のこと。
関数内で外部変数に対する代入が発生している場合、純粋関数ではない。

データ → f(データ) → データα → f(データα) → データβ の様な感じ。

カリー化

複数の引数を取る関数を一つずつ受け取る形にし、その処理が終わり次第、後で別の関数で引数をとる対応すること
参考記事より参照

// 普通の関数
const add = (x: number, y: number): number => x + y;
console.log(add(1, 2)); // 3

// カリー化された関数
const curriedAdd = (x: number) => (y: number) => x + y;
console.log(curriedAdd(1)(2)); // 3

カリー化されている関数の場合、引数に値がすべて揃っていなくても処理が実行でき、途中での処理の中止もやりやすく、柔軟な実装ができる。
カリー化されていない関数の場合、引数ですべての値が揃っている必要があり、内部実装が手続的になりやすい。

参考

https://qiita.com/stkdev/items/5c021d4e5d54d56b927c
https://postd.cc/an-introduction-to-functional-programming/
https://qiita.com/rokumura7/items/033a930354b2733e097a

high-ghigh-g

値オブジェクト、エンティティ、ドメインモデル(ドメインオブジェクト)

値オブジェクト(バリューオブジェクト)

  • ドメインオブジェクトの中心的な要素
  • プリミティブ型よりも厳密に値を表現する事ができるオブジェクト
  • 不正な値を存在させないルールを持つ
  • ISBNコードの様にその値自体が意味のある概念を表す場合に有効
  • 不変
  • ライフサイクルがない

エンティティ

  • バリューオブジェクトと並び、ドメインモデルの中心的な要素
  • 可変
  • ライフサイクルがある(create, change, deleteメソッド)

ドメインモデル(ドメインオブジェクト)

  • 値オブジェクトやエンティティを用いてドメインを表現したクラス、オブジェクト

5:30
本セッションの場合、ドメインオブジェクトは型で構造を定義
→ class ではなく、interface

オブジェクトの変更は関数適用による状態遷移としてイミュータブル
→ オブジェクトの内部状態の書き換え目入れいではなく、関数適用により状態を移す

関数型プログラミングと型が最近セット

参考

https://qiita.com/FAL-coffee/items/66006349890b99fc5381
https://zenn.dev/yamachan0625/books/ddd-hands-on/viewer/chapter8_value_object
https://zenn.dev/shunpay/articles/956a44e59795c3

このスクラップは23日前にクローズされました