はじめに

この記事は「もくもく会ブログリレー」 9日目 の記事です。

本記事はFlutterを用いたモバイルアプリ開発をしている方向けの記事となります。

Macrosの登場

Dart3.4より新機能Macrosが試験的に導入されました。ざっくりMacrosとは、

  • 静的メタプログラミングを可能にするもの。
  • freezed等のボイラープレートコードの自動生成に掛かる時間を、限りなく少なくしてくれる。
  • Macrosに関する仕様はこちら

といったものでありFlutterアプリ開発者にとっては、
より効率的に開発できると期待されているDartの新機能です。

静的メタプログラミング

普段メタプログラミングを触ることがないと馴染みがないワードだと思うので補足。
Dart公式としては以下のような説明がされております。
公式引用

Metaprogramming refers to code that can do this—code that operates on other code as if it were data. It can take code in as parameters, reflect over it, inspect it, create it, modify it, and return it. Static metaprogramming means doing that work at compile-time. This avoids the safety, performance, and code size problems of runtime metaprogramming. Examples are the C preprocessor, C++ templates, Rust macros, Swift function builders, and compile-time execution in Zig.
Google翻訳
メタプログラミングとは、これを実行できるコード、つまり他のコードをデータであるかのように操作するコードを指します。コードをパラメータとして受け取り、反映し、検査し、作成し、変更し、返すことができます。静的メタプログラミングとは、コンパイル時にその作業を行うことを意味します。これにより、ランタイム メタプログラミングの安全性、パフォーマンス、コード サイズの問題が回避されます。例としては、C プリプロセッサ、C++ テンプレート、Rust マクロ、Swift 関数ビルダー、Zig でのコンパイル時実行などがあります。

つまり、コードを生成するためのコード群を生成するためのプログラムを指すのが「メタプログラミング」です。
また、今回のようにコンパイル時に自動生成してくれるのが「静的メタプログラミング」と呼称されるのですが、
実行時に自動生成してくれるのは「動的メタプログラミング」と呼ばれるようです。

参考: 第 179 回 月例発表会(2017 年 4 月) 知的システムデザイン研究室

JsonCodable

Macrosにおける静的メタプログラミングにはJsonCodable設定が必須となります。
以下参考記事でも詳しく記載されておりますが、JsonCodableでは主にDartの面倒なJsonシリアライズ、デシリアライズ処理がよりシームレスに実現できるとのことです。
本記事はMacros x JsonCodableを用いた検証記事となります。

※参考: Macros ( experimental ) の内容を試してみる

導入手順

公式が手順を準備してくれているので、以下に沿って導入してみましょう。
https://dart.dev/language/macros#set-up-the-experiment

1. beta channelに切り替え

2. 対応版のFlutterSDKをインストール

今回は3.23.0-0.1.preをfvmを用いて導入

3. ファイル関連の下準備

pubspec.yamlにてsdkVer指定

analysis_options.yamlの設定追加

(必要に応じて)package導入

4. 自動生成対象のクラス作成&起動

こんな感じのダミーのクラスを作成



以下でMacrosを有効化

$ dart run --enable-experiment=macros bin/test_json.dart

5. 実際に動かしてみる。

Go to Augmentationをクリックすると自動生成の定義を見れるようになります。

同名ファイルで自動生成ファイルが表示されます。

nameを適当な名前(nameaaaaa)に変更したところリアルタイムで変更が反映されました。

プロパティを追加してみましたが、
基本的な型は大体サポートされているようです。



プロパティを修正すると1秒も掛からないうちに自動生成ファイルが更新される為、
build_runnerの自動生成待ち時間が無くなるため、その点とてもありがたいです。

使ってみた感想

メリット

  • build_runnerの自動生成待ち時間がほぼ0になる点がGood
    • 開発規模やPCスペックにはよるものの、時には1分以上掛かるこのbuild_runnerによるコード生成待ちが無くなる為、かなり便利な機能であると感じました。
  • 自動生成ファイルのPush漏れが無くなる。
    • 私のPJでは自動生成ファイルもGitにあげているのですが、Macrosの場合自動生成ファイルが差分に出てこなくなる為、自動生成ファイルのPush漏れも無くなる点がGood。

デメリット

  • まだ実用的なレベルでは無さそう
    • DateTimeがサポートされていない
    • 現状Macrosのissueに関して、(2024年7月時点)P1相当が(#54922)1件、P2相当が30件程発生しています。
    • 公式曰く、Macrosは2024年後半に安定版リリース、2025年には完全な言語機能としてサポートする予定なので、まだベータ版という位置付けで不具合報告がチラホラあるようです。(公式のTimeline)

freezedでのMacros対応待ち問題

現状Modelクラス等でfreezedを使っている方はかなり多いと思いますが、
freezedがMacrosの導入待ちということで放置されているissueがそこそこあります。

例1

例2

もしfreezedを最新化に伴うエラーが発生した時は、Macros待ちの既知問題かを確認した方が良さそうです。

まとめ

まだMacrosは使える状態ではないというのが総評ですが、実際使えるようになればかなり期待ができそうです。
2024年後半には導入される予定とのことで、今年中に安定版を使えることを待ち望みたいと思います!

明日の記事は、CI事業部 新谷さんの「New RelicエージェントレスでEC2の死活監視をしてみた」です。
明日も「もくもく会ブログリレー」を要チェックです!