Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What is going on with this article?

More than 1 year has passed since last update.

@yosshi4486

コードジェネレーターには2種類ある

最近 Sourcery というOSSを使ってSwiftメタプロしてます。

色々使っていると、生成ファイルの一番上に // DO NOT EDIT と書いてあるのを発見しました。そこで、

「自動生成のコードって編集しちゃだめなんだっけ?...そういえば達人プログラマーにコードジェネレーターの章があったな...。読み返そう!」

と思ったので読み直してみたところ、「ソースコードジェネレーターは2種類ある」と記述されていました。

今回はこれについてまとめていきます。

結論を先に言うと、「(たぶん)自動生成のコードは編集して良い」 です。

消極的なコードジェネレーター

目的

タイピング量を削減する。

解決策

パラメーター化されたテンプレートで、入力の組みから指定通りの出力を生成する。

生成コードとコードジェネレーターの関係

成果物を作り出すために一度だけ実行するもの
それ以降、生成コードはコードジェネレーターから独立する。

生成後の扱い

一人前のソースファイルになり、編集、コンパイルされ、ソース管理の対象にもなる。

特徴

完全に正しいものを作る必要がない。精度が100%でなくとも、
(出力を修正するコスト + コードジェネレータに費やした時間) < (普通に書く時のコスト)
が成立していれば良い

積極的なコードジェネレーター

目的

利便性を追求する。

解決策

元となる唯一の知識を読み込み、アプリケーションが必要とするさまざまな形式に変換する。

生成コードとコードジェネレーターの関係

結果が必要となるたびに実行する。
必要に応じて何度もコードジェネレーターを用いて、結果を再生成しなおす。

生成後の扱い

変換された形式は使い捨て。

データベーススキーマの変更に合わせて、対応するソースコードを再生成する。
(iOSなら依存性自動解決してくれるDIライブラリのDIKitが思い当たった)

振り返り

ここまでを見ていくと「自動生成のコードを編集する」という使い方は、消極的なコードジェネレーターに当てはまる事が分かりました。

// DO NOT EDIT と書いてあったのは、作者が 積極的なコードジェネレーター のみをイメージして作成したからかもしれません。

作者の意図とは異なるかもしれないのですが、 「構文解析→メタプロの組み合わせでタイピング量が更に減らせるなら積極的に使っていこう!」と楽観的に捉えています。

あと達人プログラマーは素晴らしい本なのでオススメです!

3
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
3
Help us understand the problem. What is going on with this article?