TypeScript上級

上級 TypeScriptで学ぶリファクタリング|アンチパターン編

導入

リファクタリングは、コードの可読性や保守性を向上させるための重要な手法です。しかし、実際の開発現場では、リファクタリングの過程で「アンチパターン」と呼ばれる誤った実践がしばしば見受けられます。本記事では、TypeScriptを用いた具体的なリファクタリングのケーススタディを通じて、アンチパターンを特定し、それに対する改善策を検討します。

教科書レベルの解説(リファクタリング)

重要な概念の整理

リファクタリングは、既存のコードを改善するためのプロセスであり、機能を変更することなく内部構造を整理します。これにより、コードの理解が容易になり、将来的な変更がしやすくなります。リファクタリングは、バグ修正や新機能の追加と同様に、ソフトウェア開発の重要な一部です。特に、チームでの開発においては、コードの一貫性を保つためにも欠かせない作業です。

コード例(TypeScript)


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

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

    addUser(name: string, age: number) {
        this.users.push(new User(name, age));
    }

    getUsers() {
        return this.users;
    }

    getAdultUsers() {
        return this.users.filter(user => user.age >= 18);
    }
}

コードの行ごとの解説

  1. クラス`User`は、ユーザーの基本情報を保持するためのシンプルな構造体です。
  2. `UserService`クラスは、ユーザーの管理を行うサービスクラスです。
  3. `addUser`メソッドは、新しいユーザーを追加しますが、データのバリデーションが行われていません。
  4. `getUsers`メソッドは、全ユーザーを返しますが、ユーザー情報の取得方法が一貫していません。
  5. `getAdultUsers`メソッドは、成人ユーザーのみをフィルタリングして返しますが、他のメソッドとの一貫性が欠けています。

アンチパターン編

上記のコードにはいくつかのアンチパターンが存在します。特に、データのバリデーションが欠如している点が問題です。例えば、ユーザーの年齢が負の値である場合や、名前が空文字である場合など、無効なデータが追加される可能性があります。このような状況は、アプリケーションの信頼性を損なう原因となります。

この問題を解決するためには、`addUser`メソッドにバリデーションロジックを追加し、無効なデータが追加されないようにすることが重要です。以下に改善後のコードを示します。


addUser(name: string, age: number) {
    if (!name || age < 0) {
        throw new Error("Invalid user data");
    }
    this.users.push(new User(name, age));
}

この修正により、無効なデータが追加されることを防ぎ、アプリケーションの堅牢性が向上します。

まとめ

  • リファクタリングは、コードの可読性と保守性を向上させるための手法です。
  • データのバリデーションを怠ることは、一般的なアンチパターンの一つです。
  • 具体的な改善策を実施することで、アプリケーションの信頼性を高めることができます。