LoginSignup
3
4

More than 5 years have passed since last update.

goのinterfaceのstub生成する君

Posted at

本題

ATOMのパッケージ作ったよ!(宣伝)

何のために?

GoでDIとかゴニョゴニョしてると、しばしばinterfaceの実装を書くシーンに直面しますが、
interfaceが大きく複雑になってくるとだいぶつらたんですよね。

大きいinterfaceを書くな、小さいinterfaceの組み合わせにしろ、って話は踏まえてもやっぱり辛いんじゃないかなと。

なので、interfaceを指定したらば実装のスタブを自動で生成して、スニペットのように貼り付けられるパッケージを作ってみました。

何ができるの?

1. スタブの生成

コマンドパレットからGo Impl: Find Declaration、またはキーバインドctrl-iで、カーソルの当たっているinterfaceから、スタブを生成できます。

go-impl-01.gif

2. スタブの貼付け

コマンドパレットからGo Impl: Put Declaration、またはキーバインドctrl-shift-iで、カーソル位置に最後に生成したスタブをスニペットのように貼り付けられます。
貼り付けると自動で各メソッドのレシーバを選択した状態になるので、そのままレシーバを書き換えられます。

go-impl-02.gif

3. 履歴から選んで貼付け

コマンドパレットからGo Impl: Toggle、またはキーバインドctrl-alt-iで、生成されたスタブの履歴から選択して、スニペットのように貼り付けられます。

go-impl-03.gif

改善点

ゴミが残る危険性

動画内だと、さも当然のようにstruct内にinterfaceを埋め込み表記してますが、これ自体にinterfaceを実装するという宣言のような意味はありません。golanginterface実装はダックタイピングですし。
言語仕様通り「埋め込まれる」だけなので、邪魔にしかなりません。ゴミです。消しましょう。

ソース中にゴミを(一時的とは言え)置かざるを得ない実装は少々不本意です。

だのでGo Impl: Toggleでは、履歴を検索するだけでなく、入力された値からそのままinterfaceを検索して、スタブを生成する機能を付け加えたいところです。

少しばかり重い

さらに言えば、すべてのinterfaceを内部でキャッシュしているわけではないので、毎度gopath以下を検索しています。
これは使用しているImplにおける制約ですが、こちらもなんとかしたいところ。
autocomplete-goの持ってる内部キャッシュなど上手いこと掠め取流用すれば、ある程度平易に実装できる気がしています。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4