TypeScript中級

中級 TypeScriptで学ぶオブジェクト指向設計|練習問題編

導入

オブジェクト指向設計は、複雑なシステムを構築する際に非常に重要な手法です。特に、TypeScriptを使用することで、型安全性が向上し、コードの可読性と保守性が高まります。本記事では、実務で直面しやすい「カスタマー管理システム」を題材に、オブジェクト指向設計の実践的なアプローチを探ります。

教科書レベルの解説(オブジェクト指向設計)

重要な概念の整理

オブジェクト指向設計では、以下の概念が中心となります。

  • カプセル化: データとその操作を一つのユニットにまとめること。
  • 継承: 既存のクラスを基に新しいクラスを作成する手法。
  • ポリモーフィズム: 同じ操作が異なるオブジェクトに対して異なる動作をする能力。

これらの概念を用いることで、ソフトウェアの構造をより柔軟にし、変更に強い設計を実現できます。

コード例(TypeScript)


class Customer {
    private name: string;
    private email: string;

    constructor(name: string, email: string) {
        this.name = name;
        this.email = email;
    }

    public getName(): string {
        return this.name;
    }

    public getEmail(): string {
        return this.email;
    }
}

class PremiumCustomer extends Customer {
    private discountRate: number;

    constructor(name: string, email: string, discountRate: number) {
        super(name, email);
        this.discountRate = discountRate;
    }

    public getDiscountRate(): number {
        return this.discountRate;
    }
}

const customer = new Customer("田中太郎", "tanaka@example.com");
const premiumCustomer = new PremiumCustomer("鈴木花子", "suzuki@example.com", 0.1);

console.log(`${customer.getName()}のメールアドレス: ${customer.getEmail()}`);
console.log(`${premiumCustomer.getName()}の割引率: ${premiumCustomer.getDiscountRate()}`);

コードの行ごとの解説

  1. Customerクラスの定義: 顧客の基本情報を保持するクラスを作成。
  2. コンストラクタの定義: 顧客名とメールアドレスを初期化。
  3. ゲッターの実装: プライベートなプロパティにアクセスするためのメソッドを提供。
  4. PremiumCustomerクラスの定義: プレミアム顧客用のクラスを作成し、基本クラスを継承。
  5. 割引率の追加: プレミアム顧客特有の属性を追加。
  6. インスタンスの生成: 通常顧客とプレミアム顧客のインスタンスを作成。
  7. 情報の表示: 顧客情報をコンソールに出力。

練習問題編

以下の問題に挑戦し、オブジェクト指向設計の理解を深めましょう。

  1. 問題1: Customerクラスに「電話番号」を追加し、ゲッターを実装してください。

    模範解答:

    
    class Customer {
        private phoneNumber: string;
    
        constructor(name: string, email: string, phoneNumber: string) {
            this.phoneNumber = phoneNumber;
            // 他の初期化コード
        }
    
        public getPhoneNumber(): string {
            return this.phoneNumber;
        }
    }
    
  2. 問題2: PremiumCustomerクラスに「ポイント」を追加し、ポイントを加算するメソッドを実装してください。

    模範解答:

    
    class PremiumCustomer extends Customer {
        private points: number = 0;
    
        public addPoints(points: number): void {
            this.points += points;
        }
    }
    
  3. 問題3: Customerクラスに「顧客ランク」を表すプロパティを追加し、ランクに応じた割引率を返すメソッドを実装してください。

    模範解答:

    
    class Customer {
        private rank: string;
    
        public getDiscountRate(): number {
            if (this.rank === "Gold") return 0.2;
            if (this.rank === "Silver") return 0.1;
            return 0;
        }
    }
    

まとめ

  • オブジェクト指向設計は、実務において非常に役立つアプローチです。
  • TypeScriptを活用することで、型安全性と可読性が向上します。
  • 練習問題を通じて、実際の業務に即した設計力を養うことができます。