nikkie-ftnextの日記

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

私は「変数の抽出」をリファクタリングテクニックと認識せずにこれまで使っていたのか!

はじめに

秘密はね、最後に明かされるんだよ、nikkieです。

このブログでも何回か取り上げているリファクタリング
直近では「変数の抽出」というテクニックについて気付きがありました。
今回はそれをアウトプットします。

目次

変数の抽出

書籍『リファクタリング』の第6章で紹介される基本のリファクタリングテクニックの1つです。

変数の抽出は、言い換えると式に名前を付けることです。
Pythonで書いたコード例で見ていきましょう。

def price(order):
    # price = base price - quantity discount + shipping
    return (
        order.quantity * order.item_price
        - max(0, order.quantity - 500) * order.item_price * 0.05
        + min(order.quantity * order.item_price * 0.1, 100)
    )

価格(price)を計算する関数です。
コメントはpriceの計算を説明しています。
例えばorder.quantity * order.item_priceがbase priceに当たります。

変数の抽出は

base_price = order.quantity * order.item_price

のように式を変数に抽出します。
コメントの内容をコードで表現するわけですね(この例で変数の抽出を繰り返すと、コメントは不要1になります)。
旧版では「説明用変数の導入」と呼ばれていました。

伝えたいこと:私たちは「変数の抽出」と知らずにこのテクニックを使っているかも

リファクタリング』で「変数の抽出」とカタログに載っているテクニックですが、「変数の抽出」という名前を知らずに使っているケースもありそうです。
今回確認した範囲では、このテクニック自体は以下の本でも紹介されていました。

  • 『リーダブルコード』
  • 『現場で役立つシステム設計の原則』(増田本)
  • 『良いコード/悪いコードで学ぶ設計入門』(ミノ駆動本)

私は「変数の抽出」と認識せずに長らく使っていました。
リファクタリングと思わずに、リファクタリングしていたのです!

『リーダブルコード』 8章 巨大な式を分割する

8.1 説明変数

8.1では、式を表す変数=説明変数が紹介されます。
これはまさにbase_priceの例で示したものです(base_priceは説明変数の例なのです)!

『リーダブルコード』を読んでいるときは、これがリファクタリングテクニックの1つと認識していませんでした。
そして説明変数が使えそうなシーンがあれば、試してコードを読みやすくしてきました。
ただこれはリファクタリングテクニック「変数の抽出」の適用で、立派なリファクタリングです。
私はリファクタリングテクニックと認識せずに、リファクタリングしていたのです!

8.2 要約変数

8.2では「大きなコードの塊を小さな名前に置き換え」ると、要約変数を紹介しています。
私にはこれも「変数の抽出」のように思われます。
「変数の抽出」には説明用の変数だけでなく、要約変数の抽出もあるのですね。

もう1冊『現場で役立つシステム設計の原則』(増田本)第1章

第1章には「目的ごとに変数を用意する」という項目があります。
ここでは変数の使い回しによる、コードの理解しにくさに対処します。
書籍の例は変数priceを3つの用途に使いまわして再代入(破壊的代入)しています。

目的別に専用のローカル変数を用意し、コードの意図を変数名で説明するこのやり方を説明用の変数の導入と呼びます。(Kindle の位置No.514-516)

変数を使いまわして再度代入・繰り返し代入することを「破壊的代入」と呼んでいます。
変数の抽出により破壊的代入をなくし、コードを理解しやすく・変更しやすくしていきます。

ミノ駆動本 第2章でも

増田本での破壊的代入、ミノ駆動本では再代入という言葉でした。
「再代入せずに目的ごとに変数を用意しましょう」と説かれます。
目的ごとの変数を用意するにあたり、「変数の抽出」を適用することになりますね。

また、目的はミノ駆動本のキーワードですね。

終わりに

リファクタリング』を読んで知った「変数の抽出」ですが、同様の操作はすでに他書で学んでいて、認識せずにリファクタリングテクニックを使っていたという気付きをアウトプットしました。
「認識していなかったけれどリファクタリングしていたのか!」というのが私には衝撃でした。

リファクタリングはコードの構造を変えて分かりやすく(=読みやすく)することです。
『リーダブルコード』って読みやすいコードを扱った本と認識していますが、読みやすさにつながるテクニックは何でも紹介しているのですね!

P.S. 1/21(土) VSCodeConJPあります!

発表準備の中での気付きを1日1エントリに回しました。

VSCodeConJP、ハイブリット開催です!
興味深いトークがたくさん2ですので、皆さまよろしければご参加ください!



  1. リファクタリング』の3章 Code Smellの章で「コメントを(Smellを消す)消臭剤として使わない」と説かれます。「コメントの必要性を感じたときにはリファクタリングを行って、コメントを書かなくとも内容がわかるようなコードを目指すこと。(Kindle の位置No.2542-2543)」
  2. 1/21(土)にハイブリッド開催のVS Code Conference Japan 2022 - 2023、プレイベントのセッション紹介を聞いて、私すごく楽しみなんです! #vscodejp - nikkie-ftnextの日記