知識マップ: 代数的データ型を.NET Framework / .NETで使う ── 状態と結果を型で表す設計
記事「代数的データ型を.NET Framework / .NETで使う ── 状態と結果を型で表す設計」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
この記事は、値が取り得る形をコメントではなく型で表す代数的データ型を、.NET Frameworkを含む既存システムと現行.NETの双方でどう実装するかを整理する。直和型はprivateコンストラクター付きの閉じたクラス階層、C# 9以降のrecord階層、F#の判別共用体、OneOfのようなライブラリ、Source Generator、プレビュー段階のC# 15 union型のいずれでも表現でき、Matchメソッドや網羅性検査を組み合わせることで新しいケースの追加時に処理漏れをコンパイルエラーとして検出できる。Option型はnullの代わりに値の有無を、Result型は想定内の業務上の失敗を型で返し、通常は回復できない異常は例外に役割分担することで、既存コードの安全性と見通しを段階的に改善できる。
flowchart LR
accTitle: 代数的データ型を.NETで使うための知識マップ
accDescr: 直積型と直和型からなる代数的データ型が、閉じたクラス階層・record階層・F#の判別共用体・OneOf・Source Generator・C# 15のunion型プレビューという複数の実装パターンでどう表現され、Matchメソッドや網羅性検査がケース処理漏れをどう防ぎ、Option型とResult型が業務上の失敗と例外の役割分担にどうつながるかを示す図
algebraic_data_type["代数的データ型"]
sum_type["直和型"]
product_type["直積型"]
fsharp_discriminated_union["F#の判別共用体"]
closed_case_class_hierarchy["閉じたクラス階層パターン"]
record_case_hierarchy["record階層"]
oneof_library["OneOfライブラリ"]
source_generator_union["Source Generator系ライブラリによる直和型生成"]
csharp_union_type_preview["C# 15のunion型(プレビュー)"]
match_method_pattern["Matchメソッドパターン"]
case_handling_omission["ケース処理漏れ"]
option_type["Option型"]
result_type["Result型"]
business_expected_failure["想定内の業務上の失敗"]
dotnet_exception[".NET例外"]
unexpected_system_failure["想定外の異常"]
closed_case_set["閉じたケース集合"]
dotnet_framework[".NET Framework"]
dotnet[".NET(Core以降)"]
algebraic_data_type -->|"利用する"| product_type
algebraic_data_type -->|"利用する"| sum_type
fsharp_discriminated_union -->|"実装を担う"| sum_type
closed_case_class_hierarchy -->|"実装を担う"| sum_type
record_case_hierarchy -.->|"実装を担う"| sum_type
oneof_library -->|"実装を担う"| sum_type
source_generator_union -.->|"実装を担う"| sum_type
csharp_union_type_preview -.->|"実装を担う"| sum_type
match_method_pattern -->|"防止する"| case_handling_omission
fsharp_discriminated_union -->|"軽減する"| case_handling_omission
record_case_hierarchy -.->|"原因になり得る"| case_handling_omission
closed_case_class_hierarchy -->|"利用する"| match_method_pattern
record_case_hierarchy -.->|"利用する"| match_method_pattern
fsharp_discriminated_union -->|"実装を担う"| option_type
closed_case_class_hierarchy -->|"実装を担う"| option_type
closed_case_class_hierarchy -->|"実装を担う"| result_type
result_type -->|"推奨される対応"| business_expected_failure
dotnet_exception -->|"推奨される対応"| unexpected_system_failure
dotnet_exception -->|"用いるのは非推奨"| business_expected_failure
closed_case_set -->|"前提とする"| closed_case_class_hierarchy
algebraic_data_type -.->|"前提とする"| closed_case_set
closed_case_class_hierarchy -->|"利用する"| dotnet_framework
record_case_hierarchy -.->|"両立しない"| dotnet_framework
fsharp_discriminated_union -->|"利用する"| dotnet
概念間の関係(全24件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- 代数的データ型は直積型を利用します。
- 代数的データ型は直和型を利用します。
- F#の判別共用体は直和型の実装を担います。
- 閉じたクラス階層パターンは直和型の実装を担います。
- record階層は直和型の実装を担います。
- OneOfライブラリは直和型の実装を担います。
- Source Generator系ライブラリによる直和型生成は直和型の実装を担います。
- C# 15のunion型(プレビュー)は直和型の実装を担います。
- Matchメソッドパターンはケース処理漏れを防ぎます。
- F#の判別共用体はケース処理漏れを軽減します。
- record階層はケース処理漏れの原因になることがあります。
- 閉じたクラス階層パターンはMatchメソッドパターンを利用します。
- record階層はMatchメソッドパターンを利用します。
- F#の判別共用体はOption型の実装を担います。
- 閉じたクラス階層パターンはOption型の実装を担います。
- 閉じたクラス階層パターンはResult型の実装を担います。
- Result型は想定内の業務上の失敗に対する本記事の推奨です。
- .NET例外は想定外の異常に対する本記事の推奨です。
- .NET例外を想定内の業務上の失敗に用いることは推奨されません。
- 閉じたケース集合は閉じたクラス階層パターンを前提とします。
- 代数的データ型は閉じたケース集合を前提とします。
- 閉じたクラス階層パターンは.NET Frameworkを利用します。
- record階層は.NET Frameworkと両立しません。
- F#の判別共用体は.NET(Core以降)を利用します。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。