こんにちは。WEARリプレイスチームの id:takanamito です。
先日、開発部のみんなで行った開発合宿でteyuというgemを作ったのでその紹介をしようと思います。
開発合宿の様子はこちら
teyu
このgemは、クラスをnewするときに渡した引数を、そのままインスタンス変数に代入するコードが簡潔に書けるようになるgemです。
日本語で説明するより実際のコードを見たほうがわかりやすいと思うので以下に記載します。
通常の引数の場合
通常のRubyコードでこう書くクラスを
class Sample def initialize(foo, bar, baz) @foo = foo @bar = bar @baz = baz end end
teyuを使うとこう書けます
require 'teyu' class Sample extend Teyu teyu_init :foo, :bar, :baz end
キーワード引数の場合
class Sample def initialize(foo:, bar:, baz:) @foo = foo @bar = bar @baz = baz end end
teyuを使うとこう書けます
require 'teyu' class Sample extend Teyu teyu_init :foo!, :bar!, :baz! end
デフォルト値つきキーワード引数の場合
class Sample def initialize(foo: 'foo', bar: 'bar', baz: 'baz') @foo = foo @bar = bar @baz = baz end end
teyuを使うとこう書けます
require 'teyu' class Sample extend Teyu teyu_init foo: 'foo', bar: 'bar', baz: 'baz' end
開発の経緯
以前からZOZOテクノロジーズは技術顧問のMatzさんと月1回のMatz MTGを行っています。
たいていそのMTGの前にRuby trunkのissueを見て疑問に思ったことや、最新のRubyの動向をキャッチアップしているのですが
initializeメソッドの中で引数をインスタンス変数へ代入するコードが冗長で煩わしく思っている人が多いのか、似たようなissueがいくつも上がっていることに気が付きました。
- Feature #5825: Sweet instance var assignment in the object initializer - Ruby master - Ruby Issue Tracking System
- Feature #8563: Instance variable arguments - Ruby master - Ruby Issue Tracking System
- Feature #12820: Shorter syntax for assigning a method argument to an instance variable - Ruby master - Ruby Issue Tracking System
このissueについてMatzさんとお話したときに問題を解決するアイデアの1つとして上がったのが、teyuの様なinitializeメソッドを定義する機能を提供することでした。
ちょうど普段書いているRubyコードで同じようにインスタンス変数への代入を煩わしく思ったことがあったので解決策を調べてみるとattr_extrasというgemを見つけました。
このgemでは attr_initialize
という名前で同様の機能が提供されており、やりたいことは実現できそうでした。
ただ1つ、キーワード引数を表現するのにArrayとして引数を定義する書き方が自分の中で違和感がありました。
attr_initialize :foo, [:bar, :baz!]
もう少し具体的に言語化するのであれば、Arrayからキーワード引数であることが連想しづらいというのが理由として挙げられるかと思います。
そう思っていた時に開発合宿が開催されることとなり、自分が欲しいinitializeメソッドを定義する機能だけをgemとして実装してみることにしました。
次のバージョンでは
初日の朝の時点で設計すらしていない状態で合宿に参加して2日目の昼には成果発表をする必要があったため、クラスや変数の名付けに若干違和感を残したまま駆け足で開発を終えました。
同様にパフォーマンスに関しても考慮するほど余裕がなかったです。
※合宿先の宿には露天風呂があったのでしょうがないですね!
おそらく次のバージョンとしてリリースするのは、リファクタと高速化を含むものになると思います。
まとめ
業務上どうしても普段では丸一日開発に没頭することは難しいのですが、開発合宿では久しぶりにプログラミングへ集中できたのでめちゃくちゃ楽しかったです。
WEARのリプレイスにおいてもteyuを活用できそうなプログラムが既にあるため、開発合宿のアウトプットを業務改善につなげるいいサイクルが作れそうです。
ZOZOテクノロジーズではこういったチャンスを生かして、技術の力で業務を改善することに興味があるエンジニアを募集しています。 ぜひ一緒に次回の開発合宿に参加しましょう。