The before code mixes search and filter logic in a single loop, making it hard to extend or maintain. The after code separates search and filter into classes, allowing independent changes and clearer logic. This modular design supports adding more filters or changing search behavior easily.
### Before: Simple linear search and filter without modular design
items = [
{"name": "Red Shirt", "color": "red", "size": "M"},
{"name": "Blue Jeans", "color": "blue", "size": "L"},
{"name": "Green Hat", "color": "green", "size": "S"}
]
query = "shirt"
color_filter = "red"
results = []
for item in items:
if query.lower() in item["name"].lower() and item["color"] == color_filter:
results.append(item)
print(results)
### After: Modular search and filter design
class SearchEngine:
def __init__(self, items):
self.items = items
def search(self, query):
return [item for item in self.items if query.lower() in item["name"].lower()]
class FilterProcessor:
def __init__(self, filters):
self.filters = filters
def apply(self, items):
filtered = items
for key, value in self.filters.items():
filtered = [item for item in filtered if item.get(key) == value]
return filtered
items = [
{"name": "Red Shirt", "color": "red", "size": "M"},
{"name": "Blue Jeans", "color": "blue", "size": "L"},
{"name": "Green Hat", "color": "green", "size": "S"}
]
search_engine = SearchEngine(items)
filter_processor = FilterProcessor({"color": "red"})
search_results = search_engine.search("shirt")
final_results = filter_processor.apply(search_results)
print(final_results)