اصل مهمی در Clean Code این است که هر تابع فقط یک وظیفهٔ واضح داشته باشد ✨
وقتی یک تابع چند کار مختلف انجام میدهد:
- تستنویسی سخت میشود
- احتمال باگ بالا میرود
- خواندن و تغییر کد زمانبر میشود
به این ایده در Design Principleها میگویند: Single Responsibility Principle (SRP).
نمونهٔ یک تابع شلوغ در Node.js 👇
این تابع هم اعتبارسنجی میکند، هم دیتابیس میزند، هم ایمیل میفرستد؛ یعنی چند مسئولیت در یک جا.
حالا همان منطق را با توابع کوچکتر تمیزتر میکنیم 🧼
حالا:
- تست کردن
- تغییر قانون پسورد، فقط در یک تابع انجام میشود ✅
- خطاها واضحتر و قابل مدیریتتر هستند ✅
برای کدهای React، Express، Next.js و هر محیط JavaScript/TypeScript دیگر همین ایده جواب میدهد: توابع کوچک، با نام خوب و یک کار مشخص.
برای مطالعهٔ بیشتر میتوان از Refactoring.Guru و MDN کمک گرفت.
قدمهای کوچک refactor کردن همین امروز روی یکی از فانکشنهای شلوغ پروژه، بعد از چند هفته تاثیر زیادی در خوانایی و کیفیت کد میگذارد 🚀
🔖 #Javascript #JS #جاوااسکریپت #JavaScript #Clean_Code #Node_js #Refactoring #SRP
👤 Developix
💎 Channel: @DevelopixJavascript
وقتی یک تابع چند کار مختلف انجام میدهد:
- تستنویسی سخت میشود
- احتمال باگ بالا میرود
- خواندن و تغییر کد زمانبر میشود
به این ایده در Design Principleها میگویند: Single Responsibility Principle (SRP).
نمونهٔ یک تابع شلوغ در Node.js 👇
const registerUser = async (req, res) => {
const { email, password } = req.body;
// validate
if (!email || !password || password.length < 8) {
return res.status(400).json({ message: 'Invalid data' });
}
// check duplicate
const existing = await User.findOne({ email });
if (existing) {
return res.status(409).json({ message: 'Email exists' });
}
// hash password
const bcrypt = await import('bcrypt');
const hashed = await bcrypt.hash(password, 10);
// save user
const user = await User.create({ email, password: hashed });
// send welcome email
await sendWelcomeEmail(email);
return res.status(201).json({ id: user.id, email: user.email });
};این تابع هم اعتبارسنجی میکند، هم دیتابیس میزند، هم ایمیل میفرستد؛ یعنی چند مسئولیت در یک جا.
حالا همان منطق را با توابع کوچکتر تمیزتر میکنیم 🧼
const validateRegisterInput = ({ email, password }) => {
if (!email || !password) return 'Email and password are required';
if (password.length < 8) return 'Password too short';
return null;
};
const ensureEmailUnique = async (email) => {
const existing = await User.findOne({ email });
if (existing) throw new Error('EMAIL_TAKEN');
};
const createUser = async ({ email, password }) => {
const bcrypt = await import('bcrypt');
const hashed = await bcrypt.hash(password, 10);
return User.create({ email, password: hashed });
};
const registerUser = async (req, res) => {
const { email, password } = req.body;
const error = validateRegisterInput({ email, password });
if (error) return res.status(400).json({ message: error });
try {
await ensureEmailUnique(email);
const user = await createUser({ email, password });
await sendWelcomeEmail(email);
return res.status(201).json({ id: user.id, email: user.email });
} catch (err) {
if (err.message === 'EMAIL_TAKEN') {
return res.status(409).json({ message: 'Email exists' });
}
return res.status(500).json({ message: 'Server error' });
}
};حالا:
- تست کردن
validateRegisterInput و createUser مستقل و ساده است ✅- تغییر قانون پسورد، فقط در یک تابع انجام میشود ✅
- خطاها واضحتر و قابل مدیریتتر هستند ✅
برای کدهای React، Express، Next.js و هر محیط JavaScript/TypeScript دیگر همین ایده جواب میدهد: توابع کوچک، با نام خوب و یک کار مشخص.
برای مطالعهٔ بیشتر میتوان از Refactoring.Guru و MDN کمک گرفت.
قدمهای کوچک refactor کردن همین امروز روی یکی از فانکشنهای شلوغ پروژه، بعد از چند هفته تاثیر زیادی در خوانایی و کیفیت کد میگذارد 🚀
🔖 #Javascript #JS #جاوااسکریپت #JavaScript #Clean_Code #Node_js #Refactoring #SRP
👤 Developix
💎 Channel: @DevelopixJavascript
👍6❤1