はじめに
秘密はね、最後に明かされるんだよ、nikkieです。
このブログでも何回か取り上げているリファクタリング。
直近では「変数の抽出」というテクニックについて気付きがありました。
今回はそれをアウトプットします。
目次
- はじめに
- 目次
- 変数の抽出
- 伝えたいこと:私たちは「変数の抽出」と知らずにこのテクニックを使っているかも
- 『リーダブルコード』 8章 巨大な式を分割する
- もう1冊『現場で役立つシステム設計の原則』(増田本)第1章
- 終わりに
- P.S. 1/21(土) VSCodeConJPあります!
変数の抽出
書籍『リファクタリング』の第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章でも
増田本での破壊的代入、ミノ駆動本では再代入という言葉でした。
「再代入せずに目的ごとに変数を用意しましょう」と説かれます。
目的ごとの変数を用意するにあたり、「変数の抽出」を適用することになりますね。
また、目的はミノ駆動本のキーワードですね。
いろんな設計技術書を広く読んでみると、「責務」を用いて説明するには無理を来たしている印象があって、責務の代わりに「目的」をより多く使って凝集性やモデルを説明している。単一責任原則は単一目的原則。責務や責任といった言葉に縛られる(アンカリングされる)理由はない。
— ミノ駆動 (@MinoDriven) 2023年1月17日
終わりに
『リファクタリング』を読んで知った「変数の抽出」ですが、同様の操作はすでに他書で学んでいて、認識せずにリファクタリングテクニックを使っていたという気付きをアウトプットしました。
「認識していなかったけれどリファクタリングしていたのか!」というのが私には衝撃でした。
リファクタリングはコードの構造を変えて分かりやすく(=読みやすく)することです。
『リーダブルコード』って読みやすいコードを扱った本と認識していますが、読みやすさにつながるテクニックは何でも紹介しているのですね!
P.S. 1/21(土) VSCodeConJPあります!
発表準備の中での気付きを1日1エントリに回しました。
VSCodeConJP、ハイブリット開催です!
興味深いトークがたくさん2ですので、皆さまよろしければご参加ください!
/
— VS Code Meetup (@vscodejp) 2023年1月17日
📢 1月21(土) 開催
VS Code Conference Japan 2022-2023
スピーカー紹介✨
\
🗣 nikkie (@ftnext)
🔵 楽々入門!VS Codeで『リファクタリング』
🔵 Awakening Extension (拡張開発はじまるよ🔰)
▼参加登録はこちらhttps://t.co/3cHQTA7TLq#vscodejp #vscode pic.twitter.com/QFiCWErBgD