TypeScript中級

中級 TypeScriptで学ぶリファクタリング|練習問題編

導入

リファクタリングは、既存のコードを改善するための重要な技術です。特に、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)}`);
}

コードの行ごとの解説

  1. calculateDiscountedPrice関数は、価格と割引を受け取り、割引後の価格を計算します。ここでの落とし穴は、割引の範囲チェックが不十分な場合にエラーが発生することです。
  2. printReceipt関数は、アイテムのリストを受け取り、各アイテムの割引後の価格を表示し、最終的な合計を計算します。この部分も、アイテムが空の場合の処理や、価格が負になる場合のチェックが不足しています。

練習問題編

以下の問題に取り組んでみましょう。各問題には模範解答と解説がついています。

  1. 問題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. 問題2: printReceipt関数に、アイテムが空の場合の処理を追加してください。

    
    function printReceipt(items: Array<{ name: string; price: number; discount: number }>) {
        if (items.length === 0) {
            console.log('No items to display.');
            return;
        }
        // 既存のコード...
    }
    
  3. 問題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;
    }
    

まとめ

  • リファクタリングは、コードの可読性や保守性を向上させるために不可欠なプロセスです。
  • 具体的なシチュエーションに基づいて、リファクタリングを行うことで、実務における問題解決能力が向上します。
  • 練習問題を通じて、リファクタリングの具体的な手法を理解し、実践に活かしましょう。