C言語での簡単なリファクタリング:読みやすく、保守しやすいコードを書くために
C言語は、システムプログラミングや組み込み開発の分野で根強い人気がありますが、構文がシンプルな分だけ、可読性や保守性の悪いコードが生まれやすい言語でもあります。この記事では、初心者向けに「C言語での簡単なリファクタリング」の基本を解説します。リファクタリングの実例を交えて、どのようにしてコードを改善できるかを学びましょう。
1. 導入:リファクタリングとは?
リファクタリングとは、「外部から見た振る舞いを変えずに、コードの内部構造を改善すること」です。バグを修正したり、機能を追加したりすることとは違い、コードの見通しを良くしたり、再利用性を高めるために行います。
なぜC言語でリファクタリングが重要か?
- ポインタやメモリ管理が多く、バグを生みやすい
- 小規模なプログラムでもスパゲッティコードになりがち
- コメントなし、長大な関数がよく見られる
2. リファクタリング前後の比較例
ここでは、典型的なリファクタリング対象のコードを例に、改善方法を紹介します。
リファクタリング前のコード
#include <stdio.h> int main() { int score; printf("点数を入力してください: "); scanf("%d", &score); if (score >= 80) { printf("評価: 優\n"); } else if (score >= 70) { printf("評価: 良\n"); } else if (score >= 60) { printf("評価: 可\n"); } else { printf("評価: 不可\n"); } return 0; }
このコードは動作しますが、評価のロジックがmain関数に直接書かれており、再利用性が低く、テストも困難です。
3. リファクタリングの実践
ステップ1:関数に切り出す
#include <stdio.h> const char* get_grade(int score) { if (score >= 80) return "優"; else if (score >= 70) return "良"; else if (score >= 60) return "可"; else return "不可"; } int main() { int score; printf("点数を入力してください: "); scanf("%d", &score); printf("評価: %s\n", get_grade(score)); return 0; }
改善点:
get_grade
関数に評価のロジックを分離main
関数が簡潔に- 単体テストが可能になる
ステップ2:定数・マクロの活用
#define GRADE_EXCELLENT 80 #define GRADE_GOOD 70 #define GRADE_PASS 60 const char* get_grade(int score) { if (score >= GRADE_EXCELLENT) return "優"; else if (score >= GRADE_GOOD) return "良"; else if (score >= GRADE_PASS) return "可"; else return "不可"; }
改善点:
- マジックナンバーを排除し、可読性が向上
- 設定値の変更が容易になる
4. よくあるリファクタリングのパターン
1. 長すぎる関数を分割する
- Before:すべての処理を1つの関数に書く
- After:処理単位で関数を分割することで、再利用やテストが容易になる
2. グローバル変数の削減
- グローバル変数はバグの温床
- 関数の引数として渡す、構造体にまとめるなどの方法で回避
3. 条件分岐の簡素化
- 複雑な
if
文やswitch
文は、関数化やテーブル化によって読みやすくする
5. まとめ
リファクタリングは「動くけど読みにくいコード」を「動いて読みやすいコード」に変える作業です。特にC言語のように低レベルな記述が多くなる言語では、可読性の高いコードを書く努力が、保守性・信頼性の向上に直結します。
今回紹介したような小さな工夫を積み重ねて、より良いC言語プログラムを書いていきましょう。
6. 参考文献・リンク
参考書籍
リンク
リンク
リンク