Divide and Conquer: My Workflow for Complex Logic
if-else chain is a ticking time bomb. I learned this the hard way while building a report generator that had to aggregate data from three different APIs, apply complex business rules, and render a PDF. Every time I tried to tweak a currency conversion or a date calculation, I ended up breaking the caching layer. It was a classic "big ball of mud" scenario where the cognitive load of understanding the whole function outweighed the actual coding time.The fix wasn't a new library or a fancy design pattern, but a strict adherence to the divide-and-conquer mindset. The goal is to find the "seams" in the workflow—the natural points where the data changes state—and split the logic there. For this project, the seams were clear: data acquisition, business logic processing, and output rendering.
The "Big Ball of Mud" Approach
In my first draft, I mixed I/O, transformation, and rendering in one place. This is a nightmare for debugging because you can't test the business rules without actually hitting the APIs and generating a physical file.
def generate_report(start_date, end_date):
# 1️⃣ Pull raw data (mixed concerns)
raw_a = fetch_api_a(start_date, end_date)
raw_b = fetch_api_b(start_date, end_date)
raw_c = fetch_api_c(start_date, end_date)
# 2️⃣ Normalize (scattered logic)
data = []
for item in raw_a + raw_b + raw_c:
if item['type'] == 'sale':
data.append({
'amount': item['value'] * 1.08, # tax hard‑coded
'date': item['timestamp'][:10],
'category': map_category(item['code'])
})
# … many more elif branches …
# 3️⃣ Apply business rules (tangled with loops)
total = 0
for d in data:
if d['date'] >= '2024-01-01':
d['amount'] *= 1.05 # promo
if d['category'] == 'electronics':
d['amount'] *= 0.9 # discount
total += d['amount']
# 4️⃣ Render PDF (mixed with data prep)
pdf = FPDF()
pdf.add_page()
pdf.set_font("Arial", size=12)
pdf.cell(0, 10, f"Report Total: {total:.2f}", ln=1)
for d in data:
pdf.cell(0, 8, f"{d['date']} | {d['category']} | {d['amount']:.2f}", ln=1)
pdf.output("report.pdf")Refactoring into a Clean AI Workflow
To turn this into a professional deployment, I broke it into three isolated layers. This is essentially how I now prompt my LLM agents: I don't ask for the whole feature; I ask for the data layer, then the logic layer, then the view layer.
# -------------------------------------------------
# 1️⃣ Data acquisition layer
# -------------------------------------------------
def fetch_all_data(start_date, end_date):
raw_a = fetch_api_a(start_date, end_date)
raw_b = fetch_api_b(start_date, end_date)
raw_c = fetch_api_c(start_date, end_date)
return raw_a + raw_b + raw_c
# -------------------------------------------------
# 2️⃣ Business rule engine (Pure Function)
# -------------------------------------------------
def apply_business_rules(data):
processed = []
for item in data:
# Logic is now isolated and easily unit-testable
val = calculate_tax(item)
val = apply_promotions(val, item['date'])
processed.append({'date': item['date'], 'amount': val})
return processed
# -------------------------------------------------
# 3️⃣ Output generation layer
# -------------------------------------------------
def render_pdf_report(data, total):
pdf = FPDF()
# ... rendering logic ...
pdf.output("report.pdf")By treating each section as a standalone module, I can now write a practical tutorial for my teammates on how to add a new API without touching the PDF logic. This modularity is the secret to scaling any AI workflow—keep the concerns separate, and the code stays maintainable.