静的型付け言語でむやみにMapを使わないようにしようという話

下記のようなコードを多用するのをやめてほしいという話です。

1
final hoge = <String, String>{'hoge': 'hoge'};

動的型付け言語の経験が多くて、静的型付け言語の経験が浅い人にありがちな問題だと思っているのだけど、 クラスで書けるところをMapで書いてしまっているのを見かけます。

具体例を上げると、

1
final user = <String, String>{'id': 'abcde', 'name': 'name'};

上記のようなコードは、下記のように書いてほしいという話です。

1
2
3
4
5
6
7
8
final user = User(id: 'abcde', name: 'name');

class User {
  User({this.id, this.name});
  
  final String id;
  final String name;
}

なぜかというと今回のような使い方のMapだと、取りうる値が広すぎて型の保証が弱いからです。

MapのキーにString型ならなんでも入ってしまうので、問い合わせたときに不存在の可能性があります。 クラスで記述されている場合には、取りうるのがidとnameだけに限定されるので不存在になる可能性がありません(コンパイル時点で検出される)。

Built with Hugo
テーマ StackJimmy によって設計されています。