پرش به مطلب اصلی

یک پست با برچسب "Presenter"

یادداشت‌هایی درباره Presenter، Humble Object و مرز رابط کاربری

مشاهده تمام برچسب‌ها

هرچه رابط کاربری کم‌ادعاتر باشد، آزمون‌پذیری بیشتر می‌شود

· ۱۱ دقیقه مطالعه
مهدی مالوردی
مهندس نرم‌افزار و نویسندهٔ این سایت

یک بخش ساده‌ی نمایش در کنار بخشی که داده‌های خام را مرتب، تصمیم‌ها را اعمال، و خروجی آماده‌ی نمایش تولید می‌کند.

فرض کنید صفحه‌ای داریم که وضعیت حساب کاربر را نمایش می‌دهد. این صفحه باید تصمیم بگیرد آیا حساب فعال است یا نه، متن مناسب را نشان دهد، رنگ وضعیت را انتخاب کند، مبلغ را قالب‌بندی کند، پیام هشدار بسازد، و اگر کاربر محدودیت برداشت دارد، دکمه‌ی برداشت را غیرفعال کند.

در آغاز، شاید طبیعی به نظر برسد که همه‌ی این تصمیم‌ها را همان‌جا در خود رابط کاربری بنویسیم. بالاخره خروجی قرار است در همین صفحه دیده شود:

function AccountSummary({account}: {account: Account}) {
const isBlocked = account.status === 'blocked'
const isLowBalance = account.balance < 100_000
const canWithdraw = account.status === 'active' && account.balance > 0

const statusText = isBlocked ? 'مسدود' : 'فعال'
const statusColor = isBlocked ? 'red' : 'green'
const balanceText = `${account.balance.toLocaleString('fa-IR')} تومان`
const warningText = isLowBalance
? 'موجودی حساب کم است'
: null

return (
<section>
<h2>{account.ownerName}</h2>
<span className={statusColor}>{statusText}</span>
<p>{balanceText}</p>
{warningText && <p>{warningText}</p>}
<button disabled={!canWithdraw}>برداشت</button>
</section>
)
}

این کد در نگاه نخست کوچک است، اما چند تصمیم مهم را در جایی گذاشته که آزمون‌کردنش معمولاً سخت‌تر از آزمون یک تابع ساده است. برای اطمینان از درستی این منطق، باید کامپوننت را رندر کنیم، وضعیت‌های مختلف را بسازیم، متن‌ها و دکمه‌ها را از خروجی پیدا کنیم، و گاهی حتی با رفتار مرورگر یا کتابخانه‌ی رابط کاربری درگیر شویم.

مسئله این نیست که رابط کاربری بد است. مسئله این است که رابط کاربری جای خوبی برای پنهان‌کردن منطق تصمیم‌گیری نیست.