nikkie-ftnextの日記

イベントレポートや読書メモを発信

エディタの機能を知って身につけるリファクタリング 〜VS CodeでExtract編〜

この記事は、リファクタリングでシステムを安定化!日頃の取り組みや工夫を教えてください by カオナビ Advent Calendar 2022 7日目の記事です。
昨日は、おっと! 枠がまだ空いているようですね。
リファクタリングに興味があるそこのあなた! よろしければ時を戻した投稿をしてみませんか?
プレゼントチャンスもあるそうですよ〜

はじめに

エディタは(かつてはExcel)今はVS Code使い、nikkieです。

Visual Studio CodeVS Code)をはじめ、各種エディタにはリファクタリングを補助する機能が備わっていますよね。
今回はVS Codeで"抽出"にまつわる機能(小ネタ)を取り上げます。

目次

この記事で伝えたいこと

📣VS CodeのExtract Variable・Extract Methodで楽々リファクタリングできるよ!

書籍『リファクタリング』で紹介されたテクニックはIDEの操作と結び付くという仮説を持っています1
そこから、エディタの操作を繰り返してリファクタリングテクニックを身体で覚えられそうだなーと考えており、思考の整理として今回アウトプットしています。

VS Codeで抽出(Extract)

メソッド(関数)や変数を選択してExtract(抽出)するリファクタリング機能が提供されています。

  • Extract Method
  • Extract Variable

上のドキュメント(「Refactoring actions」の部分)では、gifでExtract Variable(変数の抽出)の様子が見られますよ。
ドキュメントの例はTypeScriptですが、私が主に書くPythonでも動きますよー(いつも助けてもらっています)

書籍『リファクタリング』との対応

Martin Fowler著、リファクタリングテクニックのカタログ『リファクタリング』。

VS Codeの機能でできると紹介した2つは、「Chap.6 リファクタリングはじめの一歩」に載っています!

  • 関数2の抽出(Extract Function)
  • 変数の抽出(Extract Variable)

6章は基本的なリファクタリングテクニックが紹介される章です。
VS Codeでもサポートされる2つの抽出、どんなときにやるのか・なぜやるのかといったことが解説されています。
一部紹介しますが、原典に当たるのがオススメです!

関数の抽出

何をしているか調べなければわからないコードの断片があるとしたら、「何」をしているかを示す名前の関数として抽出すべきです。(『リファクタリング(第2版)』 Kindle の位置No.3029-3031)

関数の抽出の使い所を知り、思い出したのは、ミノ駆動本(『良いコード/悪いコードで学ぶ設計入門』)と増田本(『現場で役立つシステム設計の原則』)。

ミノ駆動本 2.3 ベタ書きせず,意味のあるまとまりでメソッド化

増田本 第1章の中の「メソッドとして独立させる」

これらは抽出という感じは受けませんでしたが、意味のある単位で何をしているか示す名前を付けるという点で、達成したい状態は「関数の抽出」と共通と思われます。

変数の抽出

リファクタリング』では変数の抽出は、式に名前を付けることと説明されます。
自分の経験においても、込み入った式を部分ごとに変数に切り出していったら読みやすくなったという経験があり、読んだときは「あれには名前が付いていたんだな」という感覚でした。

『リーダブルコード』でも8章で「説明変数(8.1)」「要約変数(8.2)」が紹介されます。
名称こそ違いますが、「変数の抽出」と同じゴールに向かうテクニックかなと思います(リファクタリングテクニックも紹介していたんだ!)

VS Codeでもっとリファクタリング(Future Works)

「書籍『リファクタリング』で紹介されたテクニックはIDEの操作と結び付く」、この視点で引き続き見ていきたいですね。

今回取り上げた抽出ですが、逆の操作はインライン化です。
リファクタリングを進める中で、関数・変数に抽出してある状態よりも、埋め込んだ方が分かりやすいときに行われます。
この機能、VS Codeでどうやるのかは探している最中です。

もう一つ、Pythonを書いていてExtract Methodが思ったとおりにいかないこともありました。

args = parser.parse_args()

# args.foo と args.bar を使った処理

args.fooargs.bar を使った処理を関数に抽出したとき、argsだけを引数とする関数が抽出されました。
私が欲しかったのはf(foo, bar)という抽出なのですが3、ここまでやるのはやはり難しいんですかねー?
必要があれば実装も覗いてみたいなと思っています。

終わりに

VS CodeのExtract機能を『リファクタリング』に絡めて紹介しました。
リファクタリングテクニックとしては基本的なものだと思いますが、『リーダブルコード』をはじめいろんな本でリファクタリングテクニックと冠さずに)紹介されていたんですね!
思わぬつながりを発見して興味深かったです。

リファクタリング』の「関数の抽出」には「コードの自己文書化を可能にする」とあります。
自己文書化、甘美な響き😋ですし、そういったコードに近づけていきたいですねー。
また、変数の抽出はメリットを感じていたテクニックでした。
エディタの操作(=簡単に安全にできる方法)と結びつけられたので、これらは継続して、そして加速してやっていけそうです。

普段使いはVS Codeの方、「いいな」と思ったらぜひ試してみてください(一緒に身体で覚えましょう)。
また、『リファクタリング』とIDEを絡めて、推しリファクタリング機能があれば教えていただけるととても嬉しいです〜

明日のリファクタリングでシステムを安定化!日頃の取り組みや工夫を教えてください by カオナビ Advent Calendar 2022 8日目はchangeworldさんです。
ネタは当日までのお楽しみ! ワクワクしますね〜

P.S. 前回までのリファクタリング関係のアウトプット

これまでVS CodeのF2を紹介しました(これは本当にオススメ!プログラミング観が変わりました)

また、リファクタリングは非常に小さいステップの繰り返しとして実践しています(『リファクタリング』のテクニックの手順の1つ1つがリファクタリングの単位ととらえています)。



  1. IntelliJ IDEAを触り、驚くほど多様なリファクタリングが楽にできた経験から、この仮説を持っています(例:シグネチャの変更)
  2. かたやメソッド、かたや関数と言葉は違いますが、『リファクタリング(第2版)』には、関数という用語はメソッドも指すと書かれており、同じものを指す別の呼び方と理解しています。
  3. argsだけを引数とする関数も全然有用だと思います。好みの話ですが、このときの私はプリミティブな型を引数とする関数がほしかったのです(ref: 7:コレクションを引数にせずintやstrを受け取る(『自走プログラマー』)