🐣

ジェネリック型のニモニック規約について

2025/02/24に公開

この記事について

ジェネリック型のパラメータを命名する際、<T><K, V>を使用しますが、他にどんな種類があるのか調べてみました。

ジェネリック型の書き方

Effective Dart を見るとニモニック規約に則って命名することが推奨されています。
DO follow existing mnemonic conventions when naming type parameters

  • コレクション内の要素型の場合:
    Element を省略した E
class IterableBase<E> {}
class List<E> {}
class HashSet<E> {}
class RedBlackTree<E> {}
  • 連想コレクション内のキーと値の型の場合:
    Key, Value を省略した K,V
class Map<K, V> {}
class Multimap<K, V> {}
class MapEntry<K, V> {}
  • 関数またはクラスのメソッドの戻り値の型として使用される型:
    Return を省略した R
abstract class ExpressionVisitor<R> {
R visitBinary(BinaryExpression node);
R visitLiteral(LiteralExpression node);
R visitUnary(UnaryExpression node);
}
  • 単一の型:
    Type を省略した T
    さらに他の型を使いたい場合は S,U,V,W,X,Y,Z...となります。
    ( S が使われるのは単に T の隣だからのようです。)
class Future<T> {
Future<S> then<S>(FutureOr<S> onValue(T value)) => ...
}
  • 上記に当てはまらない場合:
    他のアルファベットを使用したり、説明的な名前でも問題なし
class Graph<Node, Edge> {
  final List<Node> nodes = [];
  final List<Edge> edges = [];
}

終わりに

T が Type の略で、S 以降は特に意味がなかったのが意外でした!

GitHubで編集を提案

Discussion