The before code shows the new service tightly coupled to the legacy data format, using legacy keys directly. The after code introduces an anti-corruption layer that translates legacy data into a clean, consistent model. The new service interacts only with this layer, preventing legacy model pollution.
### Before: Direct legacy coupling
class LegacySystem:
def get_user_data(self, user_id):
# Returns data in legacy format
return {'usr_id': user_id, 'nm': 'John Doe', 'addr': '123 St'}
class NewService:
def __init__(self, legacy):
self.legacy = legacy
def get_user_profile(self, user_id):
data = self.legacy.get_user_data(user_id)
# Directly uses legacy keys
return f"User {data['nm']} lives at {data['addr']}"
### After: Using Anti-Corruption Layer
class LegacySystem:
def get_user_data(self, user_id):
return {'usr_id': user_id, 'nm': 'John Doe', 'addr': '123 St'}
class AntiCorruptionLayer:
def __init__(self, legacy):
self.legacy = legacy
def get_user_profile(self, user_id):
legacy_data = self.legacy.get_user_data(user_id)
# Translate legacy data to clean model
return {
'id': legacy_data['usr_id'],
'name': legacy_data['nm'],
'address': legacy_data['addr']
}
class NewService:
def __init__(self, acl):
self.acl = acl
def get_user_profile(self, user_id):
profile = self.acl.get_user_profile(user_id)
return f"User {profile['name']} lives at {profile['address']}"