هر تابع فقط یک دلیل برای تغییر دارد: یک کار مشخص با ورودی و خروجی روشن.
تابع خوب شبیه جملهٔ خبری است: فاعل (نام)، مفعول (ورودی) و نتیجه (خروجی). وقتی بدنهٔ تابع را میخوانی نباید غافلگیر شوی: نه ورودی پنهان، نه اثر جانبی مخفی.
def discounted(price, percent):
"""قیمت بعد از تخفیف را برمیگرداند؛ هیچچیز را عوض نمیکند."""
return price * (1 - percent / 100)
این تابع خالص است: خروجی فقط از ورودی میآید. تابع خالص را میشود بدون ترس تست کرد، کش کرد و موازی اجرا کرد.
اشتباه رایج
تابع هرچه بیشتر کار کند بهتر است، چون کد کمتر میشود.
تصحیح
تابعی که سه کار میکند در سه سناریوی متفاوت میشکند و تستش سه برابر سخت است. کوتاهیِ فایل هدف نیست؛ ارزانیِ تغییر هدف است.