レガシーコードを扱いやすくするためのデザインパターン
レガシーコードを扱うのは、地雷原を歩いているような感覚になることがあります。
「今にも何かが壊れそうだけど、どこでどうなるかわからない...」
そんなときこそ、デザインパターンが強力な武器になります。
この記事では、Pythonで実装されたサンプルコードを使いながら、レガシーコードの整理や拡張に役立つ代表的なデザインパターンを紹介します。
🧩 1. アダプターパターン(Adapter Pattern)
課題: 古いコードのインターフェースが、新しいシステムに合わない
解決策: ラッパーを使ってインターフェースを変換する
例:
# legacy_system.py
class LegacyPaymentProcessor:
def make_payment(self, amount):
print(f"[Legacy] ¥{amount} の支払いを処理中")
# adapter.py
class PaymentInterface:
def pay(self, amount):
raise NotImplementedError
class LegacyAdapter(PaymentInterface):
def __init__(self, legacy_processor):
self.legacy_processor = legacy_processor
def pay(self, amount):
return self.legacy_processor.make_payment(amount)
使い方:
adapter = LegacyAdapter(LegacyPaymentProcessor())
adapter.pay(1000)
✅ これで PaymentInterface
を通じて新旧システムの橋渡しができます。
🏗️ 2. ファサードパターン(Facade Pattern)
課題: 古いサブシステムが複雑すぎて使いにくい
解決策: 単一の簡易インターフェースを用意して操作を一元化する
例:
class LegacyAuth:
def check_user(self, username, password):
return username == "admin" and password == "1234"
class LegacyLogger:
def log(self, msg):
print(f"[LOG]: {msg}")
class AuthFacade:
def __init__(self):
self.auth = LegacyAuth()
self.logger = LegacyLogger()
def login(self, username, password):
if self.auth.check_user(username, password):
self.logger.log(f"{username} がログインしました。")
return True
self.logger.log("ログイン失敗。")
return False
✅ 複雑な処理を隠し、使いやすいインターフェースにまとめました。
🧪 3. デコレーターパターン(Decorator Pattern)
課題: 既存のコードを変更せずに機能を追加したい
解決策: クラスをラップして動作を拡張する
例:
class LegacyReporter:
def report(self):
print("基本レポートを生成中...")
class TimestampedReporter:
def __init__(self, wrapped):
self.wrapped = wrapped
def report(self):
from datetime import datetime
print(f"レポート生成時刻: {datetime.now()}")
self.wrapped.report()
✅ 元のクラスを一切触れずに、時間スタンプを追加できます。
🧰 4. ストラテジーパターン(Strategy Pattern)
課題: アルゴリズムや処理方法を柔軟に切り替えたい
解決策: 処理を外部化し、戦略として注入できるようにする
例:
class LegacySorter:
def sort(self, data):
return sorted(data)
class ReverseSortStrategy:
def sort(self, data):
return sorted(data, reverse=True)
class SorterContext:
def __init__(self, strategy):
self.strategy = strategy
def sort(self, data):
return self.strategy.sort(data)
✅ ソート方法を柔軟に差し替えることが可能です。
🚦 5. プロキシパターン(Proxy Pattern)
課題: 既存の機能にログや制御を追加したいが、直接変更できない
解決策: アクセスを仲介するクラスを作成する
例:
class LegacyDatabase:
def query(self, sql):
print(f"SQL 実行中: {sql}")
return f"結果: {sql}"
class LoggingProxy:
def __init__(self, db):
self.db = db
def query(self, sql):
print(f"[LOG] クエリ実行前: {sql}")
return self.db.query(sql)
✅ ログ機能などを追加するのに最適な方法です。
✨ まとめ
デザインパターンを活用することで、レガシーコードともうまく付き合っていけます。
ポイント:
- 包む(Wrap)・分離する(Isolate)・差し替える(Inject)
- 少しずつ安全にリファクタリングする
- ユニットテストを必ず書く
もしあなたが今、実際のレガシーコードで困っているなら、そのコードを共有してくれれば一緒に改善していきましょう 💬✨
Related Posts
- Design Patterns ที่ช่วยให้จัดการ Legacy Code ได้ง่ายขึ้น
- Design Patterns That Help Tame Legacy Code (With Python Examples)
- 🧠 レガシーコードに安全に新機能を追加する方法
- วิธีเพิ่มฟีเจอร์ใหม่ในซอฟต์แวร์ Legacy อย่างปลอดภัย
- How to Safely Add New Features to Legacy Code — A Developer’s Guide
- レガシーソフトウェアを安全に近代化 — 全面リライト不要!
- ปรับปรุงซอฟต์แวร์เก่า ให้ทันสมัย โดยไม่ต้องเขียนใหม่ทั้งหมด
- Modernizing Legacy Software — Without Breaking Everything
- DjangoでBasicとPremium機能を分けるベストな戦略とは?
- เลือกกลยุทธ์ที่ใช่ สำหรับการแยกระดับผู้ใช้งาน Basic กับ Premium บน Django
Articles
- Design Patterns ที่ช่วยให้จัดการ Legacy Code ได้ง่ายขึ้น
- Design Patterns That Help Tame Legacy Code (With Python Examples)
- 🧠 レガシーコードに安全に新機能を追加する方法
- วิธีเพิ่มฟีเจอร์ใหม่ในซอฟต์แวร์ Legacy อย่างปลอดภัย
- How to Safely Add New Features to Legacy Code — A Developer’s Guide
- レガシーソフトウェアを安全に近代化 — 全面リライト不要!
- ปรับปรุงซอฟต์แวร์เก่า ให้ทันสมัย โดยไม่ต้องเขียนใหม่ทั้งหมด
- Modernizing Legacy Software — Without Breaking Everything
- OpenSearchの仕組みとは?リアルタイム検索エンジンの内部構造を解説
- OpenSearch ทำงานอย่างไร? เข้าใจระบบค้นหาและวิเคราะห์ข้อมูลแบบเรียลไทม์
- How OpenSearch Works — Architecture, Internals & Real-Time Search Explained
- DjangoでBasicとPremium機能を分けるベストな戦略とは?
- เลือกกลยุทธ์ที่ใช่ สำหรับการแยกระดับผู้ใช้งาน Basic กับ Premium บน Django
- Choosing the Right Strategy for Basic vs Premium Features in Django
- オーダーメイド家具ビジネスをデジタル化しよう — あなたのブランド専用ECプラットフォーム
- เปลี่ยนธุรกิจเฟอร์นิเจอร์ของคุณให้ทันสมัย ด้วยแพลตฟอร์มอีคอมเมิร์ซสำหรับงานเฟอร์นิเจอร์สั่งทำ
- Transform Your Custom Furniture Business with a Modern eCommerce Platform
- simpliPOSのご紹介:ERPNextを基盤にしたスマートPOSシステム
- แนะนำ simpliPOS: ระบบ POS อัจฉริยะบน ERPNext
Our Products
Related Posts
- Design Patterns ที่ช่วยให้จัดการ Legacy Code ได้ง่ายขึ้น
- Design Patterns That Help Tame Legacy Code (With Python Examples)
- 🧠 レガシーコードに安全に新機能を追加する方法
- วิธีเพิ่มฟีเจอร์ใหม่ในซอฟต์แวร์ Legacy อย่างปลอดภัย
- How to Safely Add New Features to Legacy Code — A Developer’s Guide
- レガシーソフトウェアを安全に近代化 — 全面リライト不要!
- ปรับปรุงซอฟต์แวร์เก่า ให้ทันสมัย โดยไม่ต้องเขียนใหม่ทั้งหมด
- Modernizing Legacy Software — Without Breaking Everything
- DjangoでBasicとPremium機能を分けるベストな戦略とは?
- เลือกกลยุทธ์ที่ใช่ สำหรับการแยกระดับผู้ใช้งาน Basic กับ Premium บน Django
Articles
- Design Patterns ที่ช่วยให้จัดการ Legacy Code ได้ง่ายขึ้น
- Design Patterns That Help Tame Legacy Code (With Python Examples)
- 🧠 レガシーコードに安全に新機能を追加する方法
- วิธีเพิ่มฟีเจอร์ใหม่ในซอฟต์แวร์ Legacy อย่างปลอดภัย
- How to Safely Add New Features to Legacy Code — A Developer’s Guide
- レガシーソフトウェアを安全に近代化 — 全面リライト不要!
- ปรับปรุงซอฟต์แวร์เก่า ให้ทันสมัย โดยไม่ต้องเขียนใหม่ทั้งหมด
- Modernizing Legacy Software — Without Breaking Everything
- OpenSearchの仕組みとは?リアルタイム検索エンジンの内部構造を解説
- OpenSearch ทำงานอย่างไร? เข้าใจระบบค้นหาและวิเคราะห์ข้อมูลแบบเรียลไทม์
- How OpenSearch Works — Architecture, Internals & Real-Time Search Explained
- DjangoでBasicとPremium機能を分けるベストな戦略とは?
- เลือกกลยุทธ์ที่ใช่ สำหรับการแยกระดับผู้ใช้งาน Basic กับ Premium บน Django
- Choosing the Right Strategy for Basic vs Premium Features in Django
- オーダーメイド家具ビジネスをデジタル化しよう — あなたのブランド専用ECプラットフォーム
- เปลี่ยนธุรกิจเฟอร์นิเจอร์ของคุณให้ทันสมัย ด้วยแพลตฟอร์มอีคอมเมิร์ซสำหรับงานเฟอร์นิเจอร์สั่งทำ
- Transform Your Custom Furniture Business with a Modern eCommerce Platform
- simpliPOSのご紹介:ERPNextを基盤にしたスマートPOSシステム
- แนะนำ simpliPOS: ระบบ POS อัจฉริยะบน ERPNext