برنانه نویس، مدرس، محقق. عاشق انیمه هستم و دنبال چالش ها جدید.
کد تمیز توی جاوااسکریپت/نود.جیاس
از اینکه clean code رو رعایت نمیکنی خسته شدی؟ این پست (در حال تکمیل) میاد بهت خیلی شسته رفته اصول clean code رو با کد نمونه بهت میگه.
اولین قدم خلاص شدن از شر if else های تو در تو
تو کد زیر بجای نوشتن else اومدم از دستور continue استفاده کردم.
for (let o = 1; o < 10; o++) {
if (o === 5) continue;
console.log(o);
};
خلاص شدن از شر try catch های تو در تو
فایل promise.js رو بساز و توش این خطوط رو کپی بکن:
module.exports.asyncMiddlewareHandler = fn => (req, res, next) =>
Promise.resolve(fn(req, res, next)).catch(next);
module.exports.promiseHandler = promise =>
promise.then(data => [null, data]).catch(error => [error]);
حالا خط اول و دوم برای زمانی هست که میخوای توی میدلویر های async اکسپرسیت، بدون نوشتن try catch بیای ارور های آسنکرون رو catch بکنی. روشش هم اینه.
const { asyncMiddlewareHandler } = require('./promise.js');
router.get('/', asyncMiddlewareHandler((req, res, next) => {
// async I/O
}));
از promiseHandler هم میتونی اینجوری استفاده بکنی:
const { promiseHandler } = require('./promise.js');
let [error, data] = promiseHandler(fs.promises.readFile('pdf.pdf'));
console.log(error) // will print out error if exists
console.log(data) // will print data if exists
استفاده از []
یکی از مورد ها تو جایی هست که میخوای مقدار یه متغییر رو به عنوان کلید توی یه آبجکت دیگه استفاده بکنی.
let var1 = "value"
let tempObj = { [var1]: true };
استفاده از .?
فرض کن میخوای بگی که اگه یه متغیری آبجکت بود و توی اون آبجکت کلید a رو داشت بیا مقدارش رو لاگ کن. چجوری این کار رو میکردی؟ راحت ترین راهش if else هست.
let obj = { b: 1 };
if (obj.a) console.log(obj.a); // or whatever else
else // do something;
راه جایگزین اینه که از علامت سوال نقطه استفاده بکنی. نکته ای که تو اینجا باید بهش دقت بکنی اینه که اگه مقدار بازگشتی مهمه باید از ?? هم استفاده بکنی.
let obj = { b : 10 };
console.log(obj?.a ?? 1);
که تو کیس بالا میتونی بجای ۱ از هر چیز دیگه ای استفاده بکنی.
استفاده از Computed property names
مورد استفاده اینو دقیق نمیتونم توضیح بدم. :)
let obj1 = { a: 'someString' };
let obj2 = {
[obj1.a]: 'something comes here'
};
کپی کردن آرایه/آبجکت تو یه متغیر جدید
برای اینکه یه متغیر (آرایه/آبجکت هست) تو یه متغیر جدید باید به این نکته توجه کنید که وقتی یه آبجت رو مساوی با یه متغیر جدید/قدیمی قرار میدید تنها اتفاقی که میفته اینه، هر دو متغیر به یه مکان تو حافظه اشاره میکنن.
let obj = { item1: 123 };
let newObj = obj;
newObj.item2 = 456;
console.log(obj, newObj);
خب این کد قطعا اون چیزی که من میخواستم نیست. بلکه این کد اون چیزیه که من میخواستم.
let obj = { item1: 123 };
let newObj = {...obj};
newObj.item2 = 456;
console.log(obj, newObj);
ولی مثال نقض این مورد رو هم من دیدم. توی error ها. وقتی err رو توی let error با روش بالا کپی میکنم err.name و err.statusCode کپی میشه ولی err.message و err.stack کپی نمیشه. دلیلش رو نمیدونم. :)
مطلبی دیگر از این انتشارات
نگاهی به State of JavaScript
مطلبی دیگر از این انتشارات
انت دیزاین
مطلبی دیگر از این انتشارات
همه چیز درباره برنامه نویسی JavaScript