وقتی هر قابلیت تازه یعنی دست زدن به کدهای قدیمی

فرض کنید در یک سامانهی مالی، چند نوع تراکنش داریم: واریز، برداشت و انتقال. کد هم مدتهاست کار میکند. گزارشها درستاند، آزمونها سبزند، و کسی دوست ندارد بیدلیل به مسیرهای قدیمی دست بزند.
حالا یک نوع تراکنش تازه اضافه میشود: «برگشت وجه». در ظاهر، تغییر کوچکی است. اما وقتی سراغ پیادهسازی میرویم، میبینیم باید چند فایل قدیمی را باز کنیم: محاسبهی کارمزد، ساخت گزارش، نمایش وضعیت، اعتبارسنجی، و شاید حتی منطق تسویه.
function calculateFee(transaction: Transaction) {
if (transaction.type === 'deposit') {
return 0
}
if (transaction.type === 'withdraw') {
return transaction.amount * 0.01
}
if (transaction.type === 'transfer') {
return 500
}
if (transaction.type === 'refund') {
return 0
}
}
در یک فایل دیگر هم همین الگو تکرار شده است:
function buildReportRow(transaction: Transaction) {
if (transaction.type === 'deposit') {
return {title: 'واریز', sign: '+'}
}
if (transaction.type === 'withdraw') {
return {title: 'برداشت', sign: '-'}
}
if (transaction.type === 'transfer') {
return {title: 'انتقال', sign: '-'}
}
if (transaction.type === 'refund') {
return {title: 'برگشت وجه', sign: '+'}
}
}
کمکم معلوم میشود افزودن یک رفتار تازه، فقط افزودن کد تازه نیست؛ بازکردن چند نقطهی قدیمی است. این همان جایی است که اصل باز و بسته خودش را نشان میدهد.

