導入
ソフトウェア開発において、デザインパターンはコードの再利用性や可読性を高めるための強力な手法です。しかし、正しく適用しなければ逆効果となることもあります。特に中級エンジニアは、デザインパターンの理解が進むにつれて、実務において遭遇する「アンチパターン」に注意を払う必要があります。本記事では、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());
コードの行ごとの解説
- クラス`User`がユーザーの情報を保持します。名前と年齢をプロパティとして持ちます。
- `UserService`クラスは、ユーザーの追加と取得を行うサービスクラスです。
- `addUser`メソッドでユーザーを配列に追加し、`getUsers`メソッドでユーザーのリストを取得します。
- 最後に、`UserService`のインスタンスを作成し、ユーザーを追加してその結果をコンソールに出力します。
アンチパターン編
上記のコードは一見シンプルで使いやすいですが、実際のプロジェクトでは以下のようなアンチパターンが見られることがあります。
- 状態の管理が不明確: `UserService`がユーザーの状態を内部で管理していますが、これはテストやデバッグを困難にします。外部から状態を管理できるようにすることで、より柔軟な設計になります。
- 依存関係の注入が不足: `UserService`の依存関係(例えば、データベースやAPI)を直接内部に持つことは、モジュールの再利用性を低下させます。依存性の注入を用いて、外部から依存関係を渡す設計にすることが推奨されます。
まとめ
- デザインパターンは強力なツールですが、適切に適用しないとアンチパターンに陥ることがある。
- 状態管理や依存関係の注入についての設計を見直すことで、コードの可読性と保守性を向上させることができる。