導入
リファクタリングは、既存のコードを改善するための重要な技術です。特に、TypeScriptを用いたプロジェクトでは、型安全性を活かしながらコードの可読性や保守性を向上させることが求められます。本記事では、中級レベルのプログラマーを対象に、リファクタリングの具体的なシチュエーションを考え、その改善方法を探ります。
教科書レベルの解説(リファクタリング)
重要な概念の整理
リファクタリングは、主に以下の目的で行われます。
- コードの可読性を向上させる
- バグを減らし、テストの容易さを向上させる
- 将来的な機能追加や変更に対する柔軟性を持たせる
リファクタリングのプロセスでは、まずコードの現状を理解し、どの部分をどのように改善するかを計画します。特に、複雑なロジックを持つ関数やクラスは、リファクタリングの対象として適しています。
コード例(TypeScript)
function calculateDiscountedPrice(price: number, discount: number): number {
if (discount < 0 || discount > 100) {
throw new Error('Discount must be between 0 and 100');
}
return price - (price * (discount / 100));
}
function printReceipt(items: Array<{ name: string; price: number; discount: number }>) {
let total = 0;
items.forEach(item => {
const discountedPrice = calculateDiscountedPrice(item.price, item.discount);
console.log(`${item.name}: $${discountedPrice.toFixed(2)}`);
total += discountedPrice;
});
console.log(`Total: $${total.toFixed(2)}`);
}
コードの行ごとの解説
calculateDiscountedPrice関数は、価格と割引を受け取り、割引後の価格を計算します。ここでの落とし穴は、割引の範囲チェックが不十分な場合にエラーが発生することです。printReceipt関数は、アイテムのリストを受け取り、各アイテムの割引後の価格を表示し、最終的な合計を計算します。この部分も、アイテムが空の場合の処理や、価格が負になる場合のチェックが不足しています。
練習問題編
以下の問題に取り組んでみましょう。各問題には模範解答と解説がついています。
-
問題1:
calculateDiscountedPrice関数に、割引が0の場合の処理を追加してください。function calculateDiscountedPrice(price: number, discount: number): number { if (discount < 0 || discount > 100) { throw new Error('Discount must be between 0 and 100'); } if (discount === 0) { return price; // 割引が0の場合、元の価格を返す } return price - (price * (discount / 100)); } -
問題2:
printReceipt関数に、アイテムが空の場合の処理を追加してください。function printReceipt(items: Array<{ name: string; price: number; discount: number }>) { if (items.length === 0) { console.log('No items to display.'); return; } // 既存のコード... } -
問題3: 割引が適用された価格が負になる場合の処理を追加してください。
function calculateDiscountedPrice(price: number, discount: number): number { if (discount < 0 || discount > 100) { throw new Error('Discount must be between 0 and 100'); } const discountedPrice = price - (price * (discount / 100)); if (discountedPrice < 0) { throw new Error('Discounted price cannot be negative'); } return discountedPrice; }
まとめ
- リファクタリングは、コードの可読性や保守性を向上させるために不可欠なプロセスです。
- 具体的なシチュエーションに基づいて、リファクタリングを行うことで、実務における問題解決能力が向上します。
- 練習問題を通じて、リファクタリングの具体的な手法を理解し、実践に活かしましょう。