この記事はこちらの和訳です。Flutterを触り始めて理解があやしかったBuild_Valueライブラリについて、自分の勉強用にまとめます。
イントロ
Dartは素晴らしいプログラミング言語だが、クラスやEnum周りの実装がじつは大変だったりする。その例として、Serialization、Immutability、Comparisonがある。
Dartの抱えるSerizalizationの問題
どのアプリを開発しても、モデルをシリアライズする場面が発生する。例えば、メモリやデータベースに保存するために、モデルをJSONオブジェクトへ変換しる場合などだ。Dartはデフォルトではオブジェクトをシリアライズ/デシリアライズ(serialize/de-serialize)する機能をサポートしていない。
DartでJSON Serializeをしてみる
例えば、Division
というクラスがあるとする。
class Division {
Division() {}
int id;
String name;
String description;
String displayName;
}
このモデルをシリアライズするには、かなりのコードを書く必要がある。
モデルをJSONに変換
Map<String, dynamic> toJson() =>
{
'id': id,
'name': name,
'description': description,
'displayName': displayName
}
JSONをモデルに変換
Division.fromJson(Map<String, dynamic> json)
: id = json['id']
name = json['name']
description = json['description']
displayName = json['displayName']
モデルが増えるごとにこのコードを書くことを想像してほしい!
Dartの抱えるImmutabilityの問題
オブジェクト志向、ファンクションベースのプログラミングでは、immutableオブジェクトとは生成後に変更できないオブジェクトのことを意味するがDartではサポートされていない。
Dartでオブジェクトを比較してみる
Dartのオブジェクトは参照型であり、値型ではないため、比較が難しい。
final person1 = Person(name: 'Jane Doe');
final person2 = User(name: 'Jane Doe');
print(person1 == person2); // false
person1
とperson2
は同じ人物だと期待するが、Dartでは別人物として判定される。
Built_Value
を使ってみる
Built_Value (built_value)ライブラリは、上記の問題を解決する目的で作られた。Built_Valueを使うとSerialization、Immutability、ComparisonをDartで扱うことができる。さらに、先に挙げた以外にも下記の機能もサポートしている。
- hash valueの生成
- オブジェクトをStringへ変換
- 複雑なデータのシリアライズ など