知識マップ: 代数的データ型を.NET Framework / .NETで使う ── 状態と結果を型で表す設計

記事「代数的データ型を.NET Framework / .NETで使う ── 状態と結果を型で表す設計」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

この記事は、値が取り得る形をコメントではなく型で表す代数的データ型を、.NET Frameworkを含む既存システムと現行.NETの双方でどう実装するかを整理する。直和型はprivateコンストラクター付きの閉じたクラス階層、C# 9以降のrecord階層、F#の判別共用体、OneOfのようなライブラリ、Source Generator、プレビュー段階のC# 15 union型のいずれでも表現でき、Matchメソッドや網羅性検査を組み合わせることで新しいケースの追加時に処理漏れをコンパイルエラーとして検出できる。Option型はnullの代わりに値の有無を、Result型は想定内の業務上の失敗を型で返し、通常は回復できない異常は例外に役割分担することで、既存コードの安全性と見通しを段階的に改善できる。

代数的データ型を.NETで使うための知識マップ直積型と直和型からなる代数的データ型が、閉じたクラス階層・record階層・F#の判別共用体・OneOf・Source Generator・C# 15のunion型プレビューという複数の実装パターンでどう表現され、Matchメソッドや網羅性検査がケース処理漏れをどう防ぎ、Option型とResult型が業務上の失敗と例外の役割分担にどうつながるかを示す図利用する利用する実装を担う実装を担う実装を担う実装を担う実装を担う実装を担う防止する軽減する原因になり得る利用する利用する実装を担う実装を担う実装を担う推奨される対応推奨される対応用いるのは非推奨前提とする前提とする利用する両立しない利用する代数的データ型直和型直積型F#の判別共用体閉じたクラス階層パターンrecord階層OneOfライブラリSource Generator系ライブラリによる直和型生成C# 15のunion型(プレビュー)Matchメソッドパターンケース処理漏れOption型Result型想定内の業務上の失敗.NET例外想定外の異常閉じたケース集合.NET Framework.NET(Core以降)

概念間の関係(全24件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

代数的データ型
直積型と直和型の組み合わせによって、値が取り得る形をコメントや命名規則ではなく型として表現する考え方。
直和型
AまたはBのどちらか1つである、という閉じたケースの集合として値を表す型。
F#の判別共用体
直和型を言語機能として自然に書けるF#の型定義構文で、コンパイラーがmatch式の網羅性を検査する。
閉じたクラス階層パターン
privateコンストラクターを持つ抽象基底クラスと、そのネスト型として定義したsealedなケースクラス、Matchメソッドの組み合わせで直和型を表すC#の実装パターン。
record階層
抽象recordを基底に、ケースごとのsealed recordをネスト型として定義する、C# 9以降で使える直和型の実装パターン。
OneOfライブラリ
専用の基底クラスを作らずに、C#で局所的な直和型の戻り値を表せるNuGetライブラリ。
Source Generator系ライブラリによる直和型生成
属性を付けるだけでSwitch/Map/検証などのコードを生成し、判別共用体風の型を実現するライブラリの総称。
C# 15のunion型(プレビュー)
指定した型のどれか1つであることを宣言できる、C#の提案・プレビュー段階の言語機能。正式リリースまでに仕様が変わる可能性がある。
Matchメソッドパターン
直和型の全ケース分の関数を引数に取り、呼び出し側に全ケースの処理を強制するメソッドを用意する設計手法。
Result型
処理の結果をSuccess(value)またはFailure(error)のどちらかとして表す代数的データ型。
.NET例外
回復不能な異常が起きた箇所からthrowされ、呼び出し元へスタックを遡って伝播し、catchで捕捉される.NETのエラー通知の仕組み。
閉じたケース集合
型が取り得るケースの一覧があらかじめ決まっていて、外部から新しいケースが増えない集合。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。