🛬

DartでUUIDを生成する?

2024/01/03に公開

趣味で作ってみた!

Xで見つけた気になるソースコードがあったのだが、未完成なのでどう使えばいいのかな〜と、Github Copilotに相談しながら作ってみた。

こちらですね💁‍♂️

自作してみたのはこれです。使い道あるかはわからないが...

abstract class Option<T> {
  const Option();
}

class Some<T> extends Option<T> {
  final T value;

  const Some(this.value);
}

class None<T> extends Option<T> {
  const None();
}

Option<T> none<T>() => None<T>();

bool isValidUid(String str) => RegExp(r'^[a-zA-Z0-9]+$').hasMatch(str);

class Uuid {
  final String uid;

  const Uuid._(this.uid);

  static Option<Uuid> make(String id) =>
      isValidUid(id) ? Some(Uuid._(id)) : none();
}

void main() {
  Option<Uuid> maybeUuid = Uuid.make('1234');

  if (maybeUuid is Some<Uuid>) {
    print('Created a Uuid: ${maybeUuid.value.uid}');
  } else {
    print('Failed to create a Uuid');
  }
}

実行結果:

Created a Uuid: 1234

AIに解説してもらった

このコードは、UUID(Universally Unique Identifier)の生成とそのバリデーションを行うためのものです。UUIDは一意の識別子で、データベースの主キーや一意なリソース識別子など、さまざまな場面で使用されます。

このコードの主な目的は、UUIDが特定の形式(この場合は英数字のみ)に従っていることを確認することです。isValidUid関数は、与えられた文字列が英数字のみで構成されているかどうかをチェックします。

Uuidクラスのmakeメソッドは、与えられたIDが有効な形式である場合にのみ新しいUuidインスタンスを作成します。そうでない場合、Noneを返します。これにより、無効なUUIDがシステムの他の部分に渡されるのを防ぐことができます。

また、このコードはオプション型(Option, Some, None)を使用しています。オプション型は、値が存在するかどうかを表す型で、Null参照の問題を防ぐために使用されます。この型を使用すると、関数が値を返すかどうかが明示的になり、Null参照エラーを防ぐことができます。

正規表現が使われているようだ

hasMatchはDartのRegExpクラスのメソッドで、特定の文字列が正規表現にマッチするかどうかをチェックします。

void main() {
  RegExp exp = RegExp(r'^[a-zA-Z0-9]+$');
  print(exp.hasMatch('abc123')); // true
  print(exp.hasMatch('abc-123')); // false
}

このコードでは、expという名前のRegExpオブジェクトを作成しています。この正規表現は、文字列が英数字のみで構成されているかどうかをチェックします。

その後、hasMatchメソッドを使用して、特定の文字列がこの正規表現にマッチするかどうかをチェックしています。'abc123'は英数字のみで構成されているため、trueを返します。一方、'abc-123'にはハイフンが含まれているため、falseを返します。

最後に

Xで投稿をしていたSandroさんですが、どうやら日本語がわかるらしく、「日本語美しいだろう」といってたので、気になるコードを書いていたら日本語で質問してみるといいかも?
OSSを作ってる人っぽいです?

Discussion