HOME > ソフテックだより > 第453号(2024年7月3日発行) 技術レポート「Visual Studioによるリファクタリング」

「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。

ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ


ソフテックだより 第453号(2024年7月3日発行)
技術レポート

「Visual Studioによるリファクタリング」

1. はじめに

近年ソフトウェアは大規模化しています。大規模なソフトウェアは運用中に変更を加えながら長期間使うことが多いです。 ソフテックにも20年以上前、数十人で製作したソフトウェアがあり、現在も変更を繰り返しながら保守しています。私もその保守を担当しています。 しかし、変更を繰り返すうちにソースコードの可読性が下がり、変更による影響が把握し辛くなるなどの問題が生じてきます。
そのような問題を少しでも取り除いて品質を維持向上するために、外部仕様はそのままでソースコードを改善することをリファクタリングと言います。
今回はVisual Studio(Microsoft社が提供しているソフトウェア統合開発環境ソフト)の機能を使っておこなうリファクタリングを2つ紹介します。
なお、Visual Studioのバージョンは2022、言語はC++を対象に説明します。

2. リファクタリングとは

上述のとおり、リファクタリングとは、外部仕様を変えずにソースコードの可読性・保守性などを改善することです。
例えば次のようなソースコードはリファクタリングの対象です。
 a) クラス・関数・変数などの名前から意味・役割が分からない
 b) 同じ処理がたくさんある(クローンコード)
 c) 関数が長い
 d) 条件分岐が複雑過ぎる
 e) ソースにコメントが無い。コメントがあっても何を行うかが把握できない

次項から、上記 a) と b) のリファクタリングをVisual Studioの機能を用いて行う方法を説明します。

3. Visual Studioの機能によるリファクタリング

3-1. 「クラス・関数・変数などの名前から意味・役割が分からない」のリファクタリング

この場合はVisual Studioの機能「名前の変更」を使うと便利です。

「検索と置換」で変更したい名前を検索すると、修正するべき箇所だけではなく、修正が不要な箇所も表示されます。
それに対して「名前の変更」は、変更したい名前がある場所から、影響範囲のみに絞り込んだ箇所を変更候補として、プレビュー画面に表示してくれます。
例えば、「クラスが10個あり、そのすべてに同じ変数名があるとします。このなかの1クラスのみ機能が異なるため変数名を変えたい」
このような場合に「名前の変更」を使うことで、変更したいクラスの変数の宣言やその変数を使っている箇所だけが変更できます。
詳細は後述しますが、変更する箇所はプレビュー画面にリストアップされ、事前に確認してから変更を実施できます。
このように、変更するべき箇所のみを変更できるメリットがあります。

それでは実際の操作方法を説明します。

a) 使い方
メンバ変数「m_pFtpConn」を「m_pFtpConnection」に変更する例で説明します。

① 変更したい文字列を選択します。

範囲選択

② 以下のいずれかの操作をします。
  • マウスを右クリックして[名前の変更]を選択する
  • 「Ctrl」を押したまま「R」「R」と打つ
  • メニューから[編集]→[リファクター]→[名前の変更]と操作する。

編集メニュー

③ 「名前の変更」画面が表示されます。

名前の変更

新しい名前を入力し「検索スコープ」を選択して「プレビュー」を押します。
なお、「検索スコープ」の選択肢は下記に示す4つがあります。 このなかの「外部アイテムを含む」を選択するときは、標準クラスのソースが含まれますので、プレビュー画面で慎重に選択する必要があります。
  • 現在のプロジェクト(外部アイテムを含む)
  • 現在のプロジェクト
  • ソリューション全体
  • ソリューション全体(外部アイテムを含む)

④ 「変更のプレビュー」画面が表示されます。
変更対象を選択して「適用」を押します。

名前の変更

⑤ 以上で選択した箇所が新しい名前に変更され、ソースに出力されます。
また、変更箇所のファイル名と行番号の一覧が、「出力」画面に表示されます。

名前の変更

⑥ 元に戻したいときは「Ctrl+Z」を押します。全ての箇所が変更前に戻ります。

3-2. 「同じ処理がたくさんある(クローンコード)」をリファクタリングする

例えば、
「もともと配列Aの初期化処理があり、その後、仕様変更で配列Bが必要になり初期処理に配列Aの処理をコピー&ペーストして作った。 さらにその後、配列Cの初期化処理も同様にコピー&ペーストで作った」
このように、クローンコードが増えていくと可読性が落ちていきます。
怖いのは、「配列A,B,C全てが修正対象の仕様変更のときに、配列A,Bしか修正しなかった」と見落としが起こり、不適合(バグ)につながることです。

このような場合は、初期化する関数を作ることで、同じ処理の記述を無くすことが出来ます。
Visual Studioの機能「クイックアクションとリファクタリング」は、関数化したい処理を選択することで、 必要となる引数を持つ関数が自動的にコーディングされるためリファクタリングの省力化に貢献します。
ただし、作成された関数は、コメント等を含め人間がカスタマイズするのが現実的な使い方です。 また、関数の呼び出し処理は、人間のコーディングが必要です。そのため、コードの確認は人間がしっかりと行う必要があります。

それでは実際の操作方法を説明します。

a) 使い方
選択した範囲の処理をAryDataUpdateと言う関数にする例で説明します。

① 関数化したい処理を範囲選択します。

名前の変更

② 以下のいずれかの操作をします。

名前の変更

③ ポップアップメニューが表示されますので「Extract関数」を選択します。
また、変更箇所のファイル名と行番号の一覧が、「出力」画面に表示されます。

名前の変更

④ 関数/メソッドの抽出画面が表示されます。

名前の変更

「新しい関数またはメソッドの名前」に関数名を入力し、OKを押します。
なお、必要に応じて、関数の位置・関数の種類(Free、メンバー)を選択します。
各項目の意味は以下の通りです。
  • Above current関数:選択した関数の上に新関数を生成する
  • Below current関数:選択した関数の下に新関数を生成する
  • Free関数:グローバル関数として生成する
  • メンバー関数:選択範囲のクラスのメンバー関数として生成する

⑤ 以上で、選択した範囲の処理が、関数として生成されます。
• CPPファイル

名前の変更

• ヘッダーファイル

名前の変更


⑥ 元に戻したいときは「Ctrl+Z」を押します。
また、変更箇所のファイル名と行番号の一覧が、「出力」画面に表示されます。

⑦ 既存のクローンコードを生成された関数呼び出しに置き換えます。

4. おわりに

今回は、Visual Studioを使ったリファクタリングを2つ紹介しました。
リファクタリングで不適合を出してしまっては、元も子もないです。
そのため、確実な変更が出来る方法が重要です。
今回ご紹介した2つの機能で、100%確実に変更できるわけではありませんが、確実な変更のサポートになってくれると考えます。
2つとも簡単に試せる機能ですので、試してメリットを体感して欲しいと思います。
本レポートが、皆様のリファクタリングの参考になれば幸いです。
最後までお読みいただき、ありがとうございました。

(N.K.)


関連ページへのリンク

関連するソフテックだより

ページTOPへ