کد تمیز توی جاوااسکریپت/نود.جی‌اس

از اینکه 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 = &quotvalue&quot
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 کپی نمیشه. دلیلش رو نمیدونم. :)