導入
オブジェクト指向設計は、複雑なシステムを構築する際に非常に重要な手法です。特に、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()}`);
コードの行ごとの解説
- Customerクラスの定義: 顧客の基本情報を保持するクラスを作成。
- コンストラクタの定義: 顧客名とメールアドレスを初期化。
- ゲッターの実装: プライベートなプロパティにアクセスするためのメソッドを提供。
- PremiumCustomerクラスの定義: プレミアム顧客用のクラスを作成し、基本クラスを継承。
- 割引率の追加: プレミアム顧客特有の属性を追加。
- インスタンスの生成: 通常顧客とプレミアム顧客のインスタンスを作成。
- 情報の表示: 顧客情報をコンソールに出力。
練習問題編
以下の問題に挑戦し、オブジェクト指向設計の理解を深めましょう。
-
問題1: Customerクラスに「電話番号」を追加し、ゲッターを実装してください。
模範解答:
class Customer { private phoneNumber: string; constructor(name: string, email: string, phoneNumber: string) { this.phoneNumber = phoneNumber; // 他の初期化コード } public getPhoneNumber(): string { return this.phoneNumber; } } -
問題2: PremiumCustomerクラスに「ポイント」を追加し、ポイントを加算するメソッドを実装してください。
模範解答:
class PremiumCustomer extends Customer { private points: number = 0; public addPoints(points: number): void { this.points += points; } } -
問題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を活用することで、型安全性と可読性が向上します。
- 練習問題を通じて、実際の業務に即した設計力を養うことができます。