کد ریویو – قسمت دوم | بهینه سازی معماری پروژه (Express)NodeJs
خب بعد از یه وقفه بسیار طولانی بریم به ادامه مبحث Code review
توی این قسمت تصمیم گرفتم بجای ویدیو، از متن استفاده کنم که توی زمان کمتری بشه مطالب رو مطالعه کرد.
میخوایم پروژه دوست عزیزم امیر محمد کرم زاده رو بررسی کنیم و ببینیم کجاهاش رو میتونیم بهبود بدیم. پروژه روی فریمورک ExpressJs در محیط NodeJs اجرا میشه.
قبل از شروع باید بگم در کل پروژه تمیزه و معماری MVC استفاده میکنه، و ما صرفا جاهایی که فکر میکنیم قابل بهبود هست رو بررسی میکنیم. بعضی از قسمت های کد هم برای اینکه سریع تر کد رو بخونیم حذف شده. این نظرات بر اساس تجربه شخصی، تیمی و مطالعه منابع مختلف و مخصوصا این مقاله هستن.
معماری پروژه
خب بریم معماری پروژه رو باهم ببینیم:

بجای اسم فولدر app، اگه از src استفاده کنیم بهتره. چرا؟
۱. چون src مفهوم رو بهتر میرسونه، متداول تره و توی اکثر پروژه های متن باز این اسم انتخاب شده.
۲. اگر پروژه شما شامل چند app (مثلا قرار باشه چند instance از express اجرا بشه) باشه، توی اسم گذاری ها مشکلی پیش نمیاد.
منطق برنامه(logic) توی controller ها نوشته شده. بهتره بجای اینکه منطق رو توی controller بنویسیم، توی یه فولدر جدا به اسم services این کار رو انجام بدیم. چرا؟
۱. با اینکار، لایه http از لایه logic جدا میشه و برای هر action میتونیم یک service مجزا داشته باشیم.
۲. با داشتن service مجزا، service ها قابلیت استفاده مجدد(reusable) پیدا میکنن و میتونیم توی یک service، یک service دیگه رو صدا بزنیم.
۳. با جدا بودن منطق برنامه از http، میتونیم برای هر service، تست های واحد (unit test) بنویسیم. اما اگر بخوایم تست هارو با http انجام بدیم، فقط میتونیم Integration) test) هارو پیاده کنیم.
۴. اگر بخوایم بجای http، از پروتکل دیگه ای مثل tcp، gRPC و … استفاده کنیم، با نداشتن لایه service مجبور به باز نویسی کد های لاجیک برنامه میشیم.
فولدر passport، یک سرویس برای احراز هویت هست و نباید مستقیما زیر مجموعه app قرار بگیره. چرا؟
۱. سورس کد خوده کتابخونه از طریق npm نصب شده، و اینجا یک سری لاجیک اضافه شده که منطبق با نیاز برنامه کار کنه. اینجا میتونیم یه سرویس مثلا به اسم authenticationService
اضافه کنیم و ازش به عنوان سرویس احراز هویت خودمون استفاده کنیم. اینطوری اگر تصمیم بگیریم سرویس احراز هویت خودمون رو عوض کنیم حجم refactor کمتری نیاز داریم و خوانایی برنامه بیشتر میشه.
محتویات فولدر http و transforms رو میشه با فولدر routes ترکیب کنیم. چرا؟
۱. فولدر http شامل middleware، controller و validator هست. همچنین transform برای بهبود یا محدود کردن خروجی controller ها بکار میره. جنس تمامی این ۴ مورد یکی هست و وابسته به پروتکل http. پس ما میتونیم هر ۴ تا رو یکجا استفاده کنیم. همچنین میشه برای هر ماژول، عناصر خودش رو داشته باشه. مثلا به ازای route های مربوط به ماژول بخش کاربران، middleware، controller، validator و transform ها خودشون رو استفاده کنیم.
فولدر های config، public و resource بهتره در app (یا همون src) قرار داده بشن. چرا؟
۱. توی کد برنامه، قراره از محتویات و یا آدرس این فولدر ها استفاده بشه. بنابراین دسترسی بهشون بهتره توی سطح خود برنامه باشه، نه لایه بالاتر.
خب بررسی معماری پروژه تموم شد اما برای انتخاب معماری مناسب پروژه پارامتر های خیلی مهتری هم وجود دارن مثل: حجم کد پروژه، تعداد developer، تعداد کاربران، تعادل بین بازدهی کد و تمیزی کد و …. مثلا اگر بخواین یه پروژه برای ۱۰M کاربر بالا بیارین، قطعا باید تعداد توسعه دهنده ها افزایش پیدا کنه و شاید نیاز باشه سمت معماری microservice برین که بشه پروژه رو هم برای توسعه کد مدیریت کرد و هم برای scale کردن افقی.
به عنوان یه منبع خوب، این لینک توضیحات مناسبی برای معماری یه نرم افزار مبتنی بر express (البته با typescript) گفته.
8
نظرت چیه؟