TypeScript中級

中級 TypeScriptで学ぶデザインパターン|アンチパターン編

導入

ソフトウェア開発において、デザインパターンはコードの再利用性や可読性を高めるための強力な手法です。しかし、正しく適用しなければ逆効果となることもあります。特に中級エンジニアは、デザインパターンの理解が進むにつれて、実務において遭遇する「アンチパターン」に注意を払う必要があります。本記事では、TypeScriptを用いて、実際の業務シーンで見られる具体的なアンチパターンを取り上げ、その改善策について考察します。

教科書レベルの解説(デザインパターン)

重要な概念の整理

デザインパターンは、特定の問題に対する再利用可能な解決策を提供します。これにより、システムの柔軟性や拡張性が向上します。ただし、デザインパターンを適用する際には、システムの複雑さが増すこともあります。特に、パターンを適切に適用しない場合、コードが不必要に複雑化し、メンテナンスが困難になることがあります。

コード例(TypeScript)


class User {
    constructor(public name: string, public age: number) {}
}

class UserService {
    private users: User[] = [];

    addUser(user: User) {
        this.users.push(user);
    }

    getUsers() {
        return this.users;
    }
}

const userService = new UserService();
userService.addUser(new User("Alice", 30));
userService.addUser(new User("Bob", 25));
console.log(userService.getUsers());

コードの行ごとの解説

  1. クラス`User`がユーザーの情報を保持します。名前と年齢をプロパティとして持ちます。
  2. `UserService`クラスは、ユーザーの追加と取得を行うサービスクラスです。
  3. `addUser`メソッドでユーザーを配列に追加し、`getUsers`メソッドでユーザーのリストを取得します。
  4. 最後に、`UserService`のインスタンスを作成し、ユーザーを追加してその結果をコンソールに出力します。

アンチパターン編

上記のコードは一見シンプルで使いやすいですが、実際のプロジェクトでは以下のようなアンチパターンが見られることがあります。

  • 状態の管理が不明確: `UserService`がユーザーの状態を内部で管理していますが、これはテストやデバッグを困難にします。外部から状態を管理できるようにすることで、より柔軟な設計になります。
  • 依存関係の注入が不足: `UserService`の依存関係(例えば、データベースやAPI)を直接内部に持つことは、モジュールの再利用性を低下させます。依存性の注入を用いて、外部から依存関係を渡す設計にすることが推奨されます。

まとめ

  • デザインパターンは強力なツールですが、適切に適用しないとアンチパターンに陥ることがある。
  • 状態管理や依存関係の注入についての設計を見直すことで、コードの可読性と保守性を向上させることができる。