開発合宿でクラス初期化時のインスタンス変数代入を短く書けるgemを作りました

f:id:takanamito:20190830103136j:plain
ZOZO Technologies dev camp 2019 summer

こんにちは。WEARリプレイスチームの id:takanamito です。
先日、開発部のみんなで行った開発合宿でteyuというgemを作ったのでその紹介をしようと思います。

github.com

開発合宿の様子はこちら

techcorp.zozo.com

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を行っています。

techblog.zozo.com

たいていそのMTGの前にRuby trunkのissueを見て疑問に思ったことや、最新のRubyの動向をキャッチアップしているのですが
initializeメソッドの中で引数をインスタンス変数へ代入するコードが冗長で煩わしく思っている人が多いのか、似たようなissueがいくつも上がっていることに気が付きました。

このissueについてMatzさんとお話したときに問題を解決するアイデアの1つとして上がったのが、teyuの様なinitializeメソッドを定義する機能を提供することでした。

ちょうど普段書いているRubyコードで同じようにインスタンス変数への代入を煩わしく思ったことがあったので解決策を調べてみるとattr_extrasというgemを見つけました。

github.com

このgemでは attr_initialize という名前で同様の機能が提供されており、やりたいことは実現できそうでした。
ただ1つ、キーワード引数を表現するのにArrayとして引数を定義する書き方が自分の中で違和感がありました。

attr_initialize :foo, [:bar, :baz!]

もう少し具体的に言語化するのであれば、Arrayからキーワード引数であることが連想しづらいというのが理由として挙げられるかと思います。

そう思っていた時に開発合宿が開催されることとなり、自分が欲しいinitializeメソッドを定義する機能だけをgemとして実装してみることにしました。

次のバージョンでは

初日の朝の時点で設計すらしていない状態で合宿に参加して2日目の昼には成果発表をする必要があったため、クラスや変数の名付けに若干違和感を残したまま駆け足で開発を終えました。
同様にパフォーマンスに関しても考慮するほど余裕がなかったです。
※合宿先の宿には露天風呂があったのでしょうがないですね!

おそらく次のバージョンとしてリリースするのは、リファクタと高速化を含むものになると思います。

まとめ

業務上どうしても普段では丸一日開発に没頭することは難しいのですが、開発合宿では久しぶりにプログラミングへ集中できたのでめちゃくちゃ楽しかったです。
WEARのリプレイスにおいてもteyuを活用できそうなプログラムが既にあるため、開発合宿のアウトプットを業務改善につなげるいいサイクルが作れそうです。

ZOZOテクノロジーズではこういったチャンスを生かして、技術の力で業務を改善することに興味があるエンジニアを募集しています。 ぜひ一緒に次回の開発合宿に参加しましょう。

www.wantedly.com

カテゴリー