
Adapterの目的は、
互換性のないクラス同士をつなぐ「変換器(アダプター)」を作る事です。
イメージとしては、
電源プラグの形が違う国で、変換アダプターを使って差し込めるようにするイメージ。
既存コードを変更せずに、新しい仕組みへ対応できるのが特徴ですね。
よく使う場面
既存のAPI(旧仕様)を、新しいインターフェースに合わせたいとき。
外部ライブラリの出力形式が違うときに、整形して使いたいとき。
wrapm(ラップ)すると言う言葉がイメージとしてしっくりきます。
サンプルコード
古いログシステムを、新しい形式に合わせる想定のサンプルコードです。
旧ログクラス(すでに使われている想定)
class OldLogger {
log(message) {
console.log(`[OLD LOG] ${message}`);
}
}
新しいシステムでは「info」「error」などの形式を期待している
class NewLogger {
info(message) {
console.log(`[INFO] ${message}`);
}
error(message) {
console.log(`[ERROR] ${message}`);
}
}
Adapter(旧Loggerを新Loggerのように使えるようにする)
class LoggerAdapter {
constructor(oldLogger) {
this.oldLogger = oldLogger;
}
info(message) {
this.oldLogger.log(message);
}
error(message) {
this.oldLogger.log(`ERROR: ${message}`);
}
}
実行例
const oldLogger = new OldLogger();
const logger = new LoggerAdapter(oldLogger);
logger.info("アプリを起動しました。"); // [OLD LOG] アプリを起動しました。
logger.error("ファイルが見つかりません。"); // [OLD LOG] ERROR: ファイルが見つかりません。
解説ポイント
LoggerAdapter は「変換役」として機能することを理解しましょう。
新しいコード(NewLoggerのようなインターフェース)を変更せず、旧コード(OldLogger)を再利用できるのがポイント。
クラス間の互換性の橋渡しを行うのが目的。
リファクタリングをする際には、必須のやり方ですね。
メリット
・既存コードを修正せずに再利用できる。
・外部ライブラリの差し替えやAPI変更に柔軟に対応できる。
・レガシーコードとの共存がしやすい。
デメリット
・旧API → 新APIの移行対応
・異なるデータフォーマットの吸収
・ライブラリのラッピング(例:古いHTTPクライアントを新しい仕様に合わせる)
あとがき
インターネットが普及して、25年以上経ってきたので、
仕事でよく古いシステムを新しいシステムに再構築してほしいという依頼が増えてきました。
サーバー環境やモジュールも、種類もバージョンも新しくなっているし、プログラムも新しい言語から、バージョンアップ対応など、運用を怠っている会社さんは、システム改修でビジネスがおまく進まなくなってきているトコロも増えているみたいです。
エンジニアはこうした時に、アダプターデザインを理解して対応できると、上手い感じに新旧組み合わせた設計ができるかもしれませんね。
0 件のコメント:
コメントを投稿