فارسی
باز کردن در Telegram

پست ‏تمیز کردن Controller با تکنیک Extract Function 🧹

6 مه 2026
|
| کانال توسعه‌دهندگان وب |
‏تمیز کردن Controller با تکنیک Extract Function 🧹 یکی از ساده‌ترین و تاثیرگذارترین تکنیک‌های refactor در وب، مخصوصاً توی backend، Extract Function هست: جدا کردن بخش‌های منطقیِ یک تابع بزرگ به چند تابع کوچک، واضح و قابل تست. 👌 وقتی یک controller یا handler همه‌چیز را خودش انجام می‌دهد (validation، لاگ، query، mapping، ارسال response)، سریع تبدیل به کد شلوغ و سخت‌قابل‌تغییر می‌شود؛ همون چیزی که تو Clean Code بهش می‌گن God Function یا Long Method. بیایید یک مثال Node.js & Express ببینیم. قبل از Extract Function (کد شلوغ) app.post('/api/users', async (req, res) => { const { email, password } = req.body; if (!email || !password) { return res.status(400).json({ message: 'Invalid data' }); } console.log('Creating user', email); const exists = await User.findOne({ email }); if (exists) { return res.status(409).json({ message: 'User exists' }); } const hash = await bcrypt.hash(password, 10); const user = await User.create({ email, password: hash }); return res.status(201).json({ id: user.id, email: user.email, }); }); این تابع "کار می‌کند"، اما: • چندین سطح responsibility قاطی شده 🔥 • تست کردنش سخت‌تر است • توسعه بعدی (مثل اضافه‌کردن audit log یا event) ریسک bug دارد بعد از Extract Function (کد تمیزتر) function validateCreateUser(body) { const { email, password } = body; if (!email || !password) { throw new Error('INVALID_DATA'); } } async function ensureUserNotExists(email) { const exists = await User.findOne({ email }); if (exists) { throw new Error('USER_EXISTS'); } } async function createUser(email, password) { const hash = await bcrypt.hash(password, 10); return User.create({ email, password: hash }); } app.post('/api/users', async (req, res) => { try { validateCreateUser(req.body); const { email, password } = req.body; await ensureUserNotExists(email); const user = await createUser(email, password); return res.status(201).json({ id: user.id, email: user.email, }); } catch (err) { if (err.message === 'INVALID_DATA') { return res.status(400).json({ message: 'Invalid data' }); } if (err.message === 'USER_EXISTS') { return res.status(409).json({ message: 'User exists' }); } return res.status(500).json({ message: 'Server error' }); } }); الان هر تابع یک کار مشخص انجام می‌دهد: • validateCreateUser → فقط validation • ensureUserNotExists → فقط چک کردن business rule • createUser → فقط ساختن user چند مزیت مهم: • تست واحد برای validation و منطقِ وجود کاربر مستقل از Express ✅ • خوانایی خیلی بهتر؛ controller مثل یک سناریو step-by-step شده 📖 • آماده‌ برای reuse در endpoint یا سرویس‌های دیگر ♻️ برای مطالعه بیشتر درباره Extract Function و refactoring: refactoring.guru/extract-method این نوع refactorهای کوچک، در طول زمان معماری backend و حتی frontend (مثلاً در handlerهای React/Next.js) را بسیار تمیزتر و قابل‌نگه‌داری‌تر می‌کند. امروز روی یک متد شلوغ امتحانش کنید و تفاوت را در خوانایی حس کنید. 🚀 🔖 #Web #وب #Frontend #Backend #refactoring #clean_code #nodejs #express #backend #extract_function #controller 👤 Developix 💎 Channel: @DevelopixWeb
3 · 866 ·

در همان حوالی فید

|| کانال توسعه‌دهندگان وب |در نمونه‌کد بالا، در نسخهٔ اشتباه همهٔ event listenerها روی window ثبت می‌شوند اما هرگز در زمان نیاز حذف نمی‌شوند و همین موضوع می‌تواند در یک Single Page Applic|| کانال توسعه‌دهندگان وب |🚀 ترفند کوچک برای لود سریع‌تر JS با defer خیلی وقت‌ها اسکریپت‌های سنگین باعث می‌شوند لود اولیه صفحه کند شود و First Paint دیر اتفاق بیفته. یک راه ساده و امن برا
این پیام
|| کانال توسعه‌دهندگان وب |در کد زیر سعی شده در یک route مربوط به Express داده‌ها از یک API خارجی گرفته شده و به صورت JSON برگردانده شود، اما یک اشتباه/Anti Pattern جدی در استفاده از asyn|| کانال توسعه‌دهندگان وب |اسکرول‌ صفحات روی موبایل اگه کلی event listener مثل touchstart و wheel داشته باشه، راحت لگ می‌زنه. یه ترفند ساده توی جاوااسکریپت کمک می‌کنه این مشکل خیلی کمتر ب
|| کانال توسعه‌دهندگان وب || کانال توسعه‌دهندگان وب |@DevelopixWeb · کانال · فناوری
3 038مشترک340میانگین دسترسی پست
فید انجمن باز کردن در Telegram

فید عمومی باز از ایندکس جست‌وجو ChatCrawler — «Google برای Telegram عمومی»؛ با خزش انجمن به‌روز می‌شود. زمان‌ها به UTC است.

فقط محتوای عمومی، API رسمی Telegram. دربارهٔ ما · پرسش‌ها · محدودیت‌های ایندکس · حذف یک صفحه · کاتالوگ · جست‌وجو · روش محاسبهٔ ما