at kaneshin

Free space for me.

iOSDC で LT してきました! - Generative Programming in Swift

Generative Programming in Swift // Speaker Deck

Generative Programming とは?

生成的プログラミング(英: Generative programming)とは、ジェネリックなクラス、プロトタイプベース、テンプレート、アスペクト、コード生成などの技法を使ってソースコード作成を自動化し、プログラマの生産性を向上させるプログラミングのスタイルである。ソフトウェアコンポーネントなどのコード再利用の技法とも連携して使用される。

自動プログラミング - Wikipedia

会場には Generative Programming を実施した方がほとんどいないようでしたが、 Generics も Compile 時のことを考えれば C++ のテンプレートと似ていて生成的プログラミングの一種となります。なので、知らず知らずのうちに Generative Programming は大体の Swift 経験者なら経験しています!

今回の LT ではコード生成 (Code Generation) の方をお話したかったので、自分が Swift でクライアントアプリを作るときに使用している ishkawa/APIKit を元にコード生成をするデモコードを前日の夜にちゃちゃっと作ってみました。

github.com

kaneshin/genkit

まだ、デモ程度の実装しかしていないです。

まず、JSON Schema を用意しておき、それを元に genkit を使用します。使用方法は generate.go に書いてありますが

go run /path/to/genkit/cmd/genkit/main.go /path/to/genkit/cmd/genkit/gen.go -path=./Sources -output=apikit_gen.swift ./api.json

の様に使用します。コマンドとしてインストールしててもOKです。

go get github.com/kaneshin/genkit/cmd/genkit
genkit -path=./Sources -output=apikit_gen.swift ./api.json

これを実行すると、 apikit_gen.swift が生成されます。ただ、 Swift には gofmt に相当するものが無いのでコードのインデントが崩れています。

(swiftformat で探してみると案外あるんですね。LT 前に知りたかった…)

github.com

github.com

Swift Code Generators

ちなみに、他にも Generator は存在しています。

github.com

おわりに

別の LT で BaseViewController の話がありましたが、コード生成前提でコードを設計すると、神クラスのような煩雑なコードをつくり上げるようなことがなくなる気がしているので、コード生成はかなりおすすめです。 社内プロジェクトでもコード生成は結構使っているので、実装者はビジネスロジックを考えることに集中することができます。本当におすすめです。


lestrrat さんも builderscon を作っているので、是非参考にすると良いかもです!