<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Farid Karami</title>
        <link>https://virgool.io/feed/@faridkarami</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-04-15 04:35:35</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/38129/avatar/itPj10.jpg?height=120&amp;width=120</url>
            <title>Farid Karami</title>
            <link>https://virgool.io/@faridkarami</link>
        </image>

                    <item>
                <title>مروری بر طراحی مبتنی بر دامنه (DDD) برای مبتدیان</title>
                <link>https://virgool.io/@faridkarami/%D9%85%D8%B1%D9%88%D8%B1%DB%8C-%D8%A8%D8%B1-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D9%85%D8%A8%D8%AA%D9%86%DB%8C-%D8%A8%D8%B1-%D8%AF%D8%A7%D9%85%D9%86%D9%87-ddd-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%85%D8%A8%D8%AA%D8%AF%DB%8C%D8%A7%D9%86-lx1crpxzathx</link>
                <description>مقدمهدر دنیای توسعه نرم افزار، روش ها و الگوهای مختلفی برای طراحی سیستم های پیچیده وجود دارد. یکی از این روش ها که توسط اریک ایوانز در سال ۲۰۰۴ معرفی شد، طراحی مبتنی بر دامنه یا Domain-Driven Design (DDD) است. این روش با تمرکز بر منطق اصلی کسب و کار (دامنه)، به توسعه دهندگان کمک می کند تا نرم افزاری منسجم، قابل توسعه و نزدیک به نیاز واقعی کاربران بسازند.در این مقاله، قصد داریم به زبان ساده مفاهیم اصلی DDD را بررسی کنیم. با ما همراه باشید تا بفهمیم DDD چیست، چرا مهم است و چطور می توان آن را در پروژه ها پیاده سازی کرد.بخش اول: DDD چیست؟DDD یک رویکرد طراحی نرم افزار است که بر محور دامنه متمرکز شده است. دامنه همان بخشی از واقعیت یا کسب و کار است که سیستم شما قرار است آن را مدل سازی و پیاده سازی کند.مثال: اگر دارید سیستم رزرو بلیت قطار طراحی می کنید، دامنه شامل مفاهیمی مانند «مسافر»، «ایستگاه»، «قطار»، «بلیط» و «رزرو» است.اریک ایوانز در کتاب معروف خود می گوید:&quot;پیچیدگی اصلی نرم افزار، در قلب دامنه قرار دارد، نه در تکنولوژی.&quot;بخش دوم: چرا DDD مهم است؟۱. تمرکز بر نیاز واقعی کسب و کاردر DDD، ما به جای شروع از پایگاه داده یا ساختار فنی، از مفاهیم کسب و کار شروع می کنیم. این باعث می شود نرم افزار دقیقا همان کاری را بکند که کاربر نهایی نیاز دارد.۲. بهبود ارتباط بین تیم فنی و کارشناسان کسب و کاریکی از مفاهیم کلیدی در DDD، زبان مشترک (Ubiquitous Language) است. این یعنی توسعه دهندگان، تحلیلگران، مدیران محصول و کارشناسان کسب و کار از یک زبان واحد برای توصیف مفاهیم استفاده می کنند.۳. کمک به مدیریت پیچیدگیبا تقسیم دامنه به بخش های کوچکتر (Bounded Context)، DDD به ما کمک می کند که پیچیدگی های سیستم را بهتر مدیریت کنیم.بخش سوم: مفاهیم کلیدی در DDD۱. دامنه (Domain)دامنه همان دنیای واقعی یا موضوع اصلی کسب و کار است که نرم افزار باید آن را پوشش دهد.۲. مدل (Model)مدل، بازنمایی انتزاعی از دامنه است. این مدل شامل موجودیت ها، رفتارها و قوانین دامنه می شود.۳. زبان مشترک (Ubiquitous Language)همه اعضای تیم باید از یک زبان واحد برای صحبت در مورد دامنه استفاده کنند. این زبان در کدها، مستندات، جلسات و تست ها دیده می شود.۴. موجودیت (Entity)موجودیتی است که دارای هویت منحصر به فرد است. مثلا هر مسافر در سیستم یک شناسه خاص دارد، حتی اگر نام و سن او با دیگران یکسان باشد.۵. مقدار (Value Object)اشیایی که تنها بر اساس مقدارشان تعریف می شوند و هویت ندارند. مثلا یک «مکان جغرافیایی» یا «آدرس».۶. سرویس (Service)اگر عملیاتی وجود داشته باشد که به هیچ موجودیت خاصی تعلق نداشته باشد، آن را به عنوان سرویس تعریف می کنیم. مثلا «محاسبه قیمت بلیت».۷. انباشتگر (Aggregate)مجموعه ای از موجودیت ها و Value Object ها که با همدیگر یک واحد منسجم از دامنه را تشکیل می دهند و با یک ریشه مشترک مدیریت می شوند.۸. مخزن (Repository)راهی برای دسترسی به موجودیت ها و انباشتگرها از پایگاه داده است، بدون آنکه جزییات فنی ذخیره سازی مشخص باشد.۹. محدودیت دامنه (Bounded Context)بزرگ ترین ابزار مدیریت پیچیدگی در DDD است. هر Bounded Context یک بخش مستقل از دامنه است که مدل مخصوص به خودش را دارد.بخش چهارم: مثال کاربردی سادهفرض کنید یک سیستم مدیریت سفارشات آنلاین طراحی می کنیم.دامنه: فروشگاه آنلاینموجودیت ها:مشتری (Customer)سفارش (Order)محصول (Product)Value Object ها:آدرس (Address)قیمت (Price)سرویس ها:محاسبه تخفیف (DiscountService)ثبت سفارشمخازن:OrderRepositoryProductRepositoryمحدودیت دامنه ها:فروشانبارداریحسابداریبخش پنجم: چالش ها و نکات مهم۱. شروع با DDD سخت استDDD نیازمند درک عمیق از کسب و کار، همکاری تیمی قوی و تجربه در طراحی نرم افزار است. در پروژه های کوچک یا تیم های تازه کار، بهتر است به تدریج به سمت DDD حرکت کرد.۲. پیاده سازی Bounded Context نیاز به تفکر زیاد داردتفکیک درست محدوده های دامنه، نقش مهمی در موفقیت پروژه دارد. این کار معمولا با گفت و گو با متخصصان کسب و کار و بررسی فرآیندهای واقعی انجام می شود.۳. DDD وابسته به تکنولوژی نیستDDD یک الگوی طراحی است، نه یک چارچوب یا زبان برنامه نویسی. شما می توانید آن را با هر زبان و تکنولوژی پیاده کنید، از جاوا و دات نت گرفته تا پایتون و نود جی اس.بخش ششم: ابزارها و تکنولوژی های مکملCQRS: جداسازی فرمان ها (نوشتن) از پرس و جوها (خواندن)Event Sourcing: ذخیره تغییرات به صورت رویدادهاMicroservices: پیاده سازی Bounded Context ها به عنوان سرویس های مستقلDDD Tactical Patterns: شامل Repository، Factory، Specification، Domain Events و غیرهنتیجه گیریطراحی مبتنی بر دامنه یا DDD یک رویکرد قدرتمند و انعطاف پذیر برای ساخت نرم افزارهای پیچیده و متمرکز بر کسب و کار است. این رویکرد با تمرکز بر دامنه، استفاده از زبان مشترک و تقسیم بندی درست سیستم، کمک می کند تا نرم افزارهایی بسازیم که واقعا پاسخگوی نیازهای واقعی باشند.برای شروع با DDD، توصیه می شود ابتدا از مفاهیم پایه شروع کنید، یک دامنه ساده را مدل سازی کنید و به تدریج با الگوهای تاکتیکی و استراتژیک DDD آشنا شوید. فراموش نکنید که همکاری مستمر با تیم کسب و کار، کلید موفقیت در این مسیر است.</description>
                <category>Farid Karami</category>
                <author>Farid Karami</author>
                <pubDate>Fri, 23 May 2025 15:17:49 +0330</pubDate>
            </item>
                    <item>
                <title>معرفی فریمورک NestJS</title>
                <link>https://virgool.io/@faridkarami/%D9%85%D8%B9%D8%B1%D9%81%DB%8C-%D9%81%D8%B1%DB%8C%D9%85%D9%88%D8%B1%DA%A9-nestjs-brllaqb2od2b</link>
                <description>در دنیای توسعه نرم افزار، انتخاب فریمورک مناسب برای پیاده سازی سیستم های BackEnd نقش بسیار مهمی در موفقیت پروژه دارد. NestJS یکی از فریمورک های مدرن و محبوب برای توسعه BackEnd با استفاده از Node.js و TypeScript است که به خاطر ساختار منظم، قابلیت گسترش بالا و پشتیبانی قوی از معماری های ماژولار، مورد توجه بسیاری از توسعه دهندگان قرار گرفته است. در این مقاله به بررسی کامل NestJS، ویژگی ها، معماری، کاربردها و مزایای آن می پردازیم.معرفی اولیه NestJSفریمورک NestJS یک فریمورک سطح بالا برای توسعه برنامه های سمت سرور است که بر پایه Node.js و با استفاده از زبان TypeScript طراحی شده است. این فریمورک از معماری های شناخته شده در دنیای نرم افزار مانند MVC (Model-View-Controller)، DI (Dependency Injection) و ماژولار بودن پیروی می کند. هدف NestJS فراهم کردن بستری منعطف و قدرتمند برای ساخت برنامه های BackEnd مقیاس پذیر، امن و قابل نگهداری است.فریمورک NestJS در سال های اخیر با استقبال گسترده ای از سوی جامعه توسعه دهندگان مواجه شده و به دلیل ساختار آشنا برای توسعه دهندگانی که تجربه کار با Angular دارند، به سرعت به محبوبیت بالایی رسیده است. این فریمورک نه تنها برای ساخت REST API ها مناسب است بلکه قابلیت توسعه Microservice ها، WebSocket Gateway ها و GraphQL API ها را نیز به خوبی فراهم می کند.مزایای NestJS1. پشتیبانی از TypeScriptفریمورک NestJS به صورت کامل بر پایه TypeScript نوشته شده است و این یعنی از مزایای Type Safety، Intellisense بهتر، و قابلیت های پیشرفته مانند Decorator ها، Interface ها و کلاس های قابل توسعه برخوردار است. این موضوع کمک می کند تا توسعه دهنده ها کدهایی با خوانایی و نگهداری بالا بنویسند.2. معماری ماژولاردر NestJS تمام قابلیت های برنامه به صورت ماژول تعریف می شوند. این موضوع به توسعه دهندگان کمک می کند تا کدها را در بخش های کوچک تر، قابل تست و قابل مدیریت دسته بندی کنند. به عبارتی، هر Feature یک ماژول مجزا دارد که در آن Controller ها، Service ها، و سایر Component ها تعریف می شوند.3. دارای Dependency Injection قدرتمندفریمورک NestJS از یک سیستم DI داخلی استفاده می کند که به طور پیش فرض در هسته فریمورک تعبیه شده است. این ویژگی باعث می شود توسعه دهندگان بتوانند کلاس ها و سرویس ها را به راحتی مدیریت و استفاده کنند و در نتیجه از Coupling بالا و استفاده بی مورد از Singleton ها جلوگیری شود.4. انعطاف پذیری در انتخاب Transport Layerفریمورک NestJS به صورت پیش فرض از Express استفاده می کند، اما این امکان را دارد که با تغییر ساده ای در تنظیمات، از Fastify نیز استفاده شود. Fastify به دلیل عملکرد بهتر در پردازش درخواست ها در بسیاری از پروژه های سنگین ترجیح داده می شود.5. پشتیبانی از انواع تکنولوژی هافریمورک NestJS به صورت Built-in از تکنولوژی هایی مانند WebSocket، GraphQL، Microservice Pattern، gRPC، و حتی Serverless پشتیبانی می کند. این انعطاف، NestJS را به فریمورکی مناسب برای انواع مختلف پروژه های BackEnd تبدیل کرده است.6. دارای CLI قدرتمندفریمورک Nest CLI ابزار خط فرمان رسمی این فریمورک است که با استفاده از آن می توان به راحتی ماژول، سرویس، کنترلر و سایر اجزای پروژه را ایجاد کرد. CLI سرعت توسعه را افزایش می دهد و از بروز خطاهای ساختاری جلوگیری می کند.ساختار پروژه در NestJSساختار پروژه در NestJS به صورت پیش فرض ساختاری بسیار منظم و استاندارد دارد. هر بخش از برنامه در یک پوشه مشخص سازماندهی می شود. مهم ترین اجزای یک برنامه NestJS شامل موارد زیر است.بخش Module: هر ماژول شامل مجموعه ای از قابلیت هاست که با هم مرتبط هستند. ماژول ها در واقع Container هایی هستند که سایر اجزای NestJS در آن ها قرار می گیرند.بخش Controller: مسئول دریافت درخواست های HTTP و بازگرداندن پاسخ به کاربر است. معمولا Logic اصلی در Controller نوشته نمی شود بلکه این وظیفه را به Service ها می سپاریم.بخش Service: شامل Business Logic برنامه است. تمام تعاملات با دیتابیس، پردازش داده و سایر عملکردهای کلیدی در این بخش انجام می شود.بخش Provider: مفهومی کلی تر از Service است که می تواند هر نوع شیئی باشد که در سیستم تزریق شود. این مفهوم در NestJS نقش کلیدی در معماری DI ایفا می کند.اتصال به دیتابیسفریمورک NestJS از ORM های مختلفی مانند TypeORM، Prisma، Sequelize و MikroORM پشتیبانی می کند. با استفاده از این ORM ها می توان به سادگی به دیتابیس های SQL و NoSQL متصل شد. TypeORM به دلیل یکپارچگی بهتر با TypeScript، یکی از انتخاب های پرکاربرد در پروژه های NestJS است.پیاده سازی REST APIفریمورک NestJS به طور کامل از REST API پشتیبانی می کند. با استفاده از Decorator هایی مانند @Get(), @Post(), @Put(), @Delete() و غیره می توان به راحتی EndPoint های مختلف تعریف کرد. علاوه بر این، NestJS از Middleware ها، Pipe ها، Filter ها و Guard ها پشتیبانی می کند که به توسعه دهنده این امکان را می دهد تا کنترل کاملی بر جریان درخواست ها و پاسخ ها داشته باشد.امنیت و احراز هویتیکی از موضوعات حیاتی در هر پروژه BackEnd مسئله امنیت و احراز هویت است. NestJS با استفاده از کتابخانه Passport به راحتی پیاده سازی انواع استراتژی های احراز هویت مانند JWT، Local، OAuth و غیره را ممکن می سازد. همچنین امکان استفاده از Role-Based Access Control و Guards برای محدودسازی دسترسی ها نیز وجود دارد.پیاده سازی Microservicesفریمورک NestJS پشتیبانی خوبی از الگوی Microservice دارد و این امکان را فراهم می کند که سرویس ها از طریق پیام رسان هایی مانند Redis، NATS، MQTT، Kafka یا حتی gRPC با یکدیگر ارتباط برقرار کنند. این قابلیت برای سیستم های بزرگ و مقیاس پذیر حیاتی است.تست نویسی در NestJSفریمورک NestJS از Jest به عنوان فریمورک تست استفاده می کند و ساختار آن به گونه ای است که تست نویسی ساده و مؤثر باشد. به دلیل استفاده گسترده از DI، تست کردن Unit ها بسیار آسان تر از فریمورک هایی است که tightly coupled هستند. Nest CLI همچنین امکان تولید فایل های تست را به صورت خودکار فراهم می کند.مستند سازی API با Swaggerفریمورک NestJS از OpenAPI (Swagger) به صورت رسمی پشتیبانی می کند. با استفاده از ماژول @nestjs/swagger می توان مستندات کاملی از API ها تولید کرد که برای تیم توسعه و همچنین مشتریان بسیار مفید است.نتیجه گیریفریمورک NestJS یک فریمورک قدرتمند، مدرن و حرفه ای برای توسعه برنامه های BackEnd است که بر پایه Node.js و TypeScript طراحی شده است. این فریمورک با ترکیب بهترین ویژگی های دنیای JavaScript و اصول معماری نرم افزار، به توسعه دهندگان این امکان را می دهد که سیستم هایی با کیفیت، امن و مقیاس پذیر ایجاد کنند.استفاده از معماری ماژولار، پشتیبانی از تکنولوژی های مدرن مانند WebSocket، GraphQL، Microservice ها و امکانات پیشرفته مانند DI، Middleware، Pipe و Guard، NestJS را به یکی از بهترین گزینه ها برای پروژه های BackEnd در سال های اخیر تبدیل کرده است.اگر به دنبال توسعه یک API مدرن، گسترش پذیر، و با ساختاری سازمان یافته هستید، NestJS می تواند بهترین انتخاب برای شما باشد.</description>
                <category>Farid Karami</category>
                <author>Farid Karami</author>
                <pubDate>Fri, 23 May 2025 15:12:36 +0330</pubDate>
            </item>
                    <item>
                <title>مغازه فروش استارت آپ!</title>
                <link>https://virgool.io/@faridkarami/%D9%85%D8%BA%D8%A7%D8%B2%D9%87-%D9%81%D8%B1%D9%88%D8%B4-%D8%A7%D8%B3%D8%AA%D8%A7%D8%B1%D8%AA%D8%A2%D9%BE-uyrib9eclj0k</link>
                <description>هرکس که با کامپیوتر کار می کند، مهندس نرم افزار نیست.کاش نرم افزار هم شبیه سخت افزار بود تا اینقدر نمیدیدم استارت آپ ها و پروژه های ایرانی شکست بخورند، اینطوری مغازه های زیادی بودند که ما میتونستیم بریم پشت ویترین و مثل خریدن لباس؛ خوشگل ترین و قشنگ ترین و ارزون ترین نرم افزار خودمون رو بخریم.در کتاب Software Engineering نوشته Roger Pressman آمده است که نرم افزار فرسوده نمی شود بلکه از مُد می افتد. یعنی بعد از مدت زمانی که تعیین دقیق آن کار سختی است، کارایی اش را از دست می دهد. اگر می خواهیم که یک نرم افزار کارایی اش را از دست ندهد باید آن را خوب طراحی کرد.نرم افزار طی فرآیندهای مهندسی خلق (Creation) می شود و ساخته (Build) نمی شود.به نظر من جهان حاصل یک خلقت بی همتا است و نه تولید! و همانطوری که می بینید هر لحظه در حال توسعه است.آن چیزی که ساخته می شود لباس، ماشین، هواپیما، کشتی، مانیتور و... است و شما هرگز نمی توانید با صرف هزینه ای صاحب یک نرم افزار برای پروژه ها و استارت آپ ها شوید.اهالی نرم افزار اهل توسعه اما اهالی سخت افزار اهل تولید هستند.شما وقتی دیدگاه تولیدی داشته باشد همیشه دنبال یک محصول ارزان و خوب و دائمی هستید که کارتان را راه بیاندازد.در ایران اغلب مدیران پروژه های نرم افزاری افراد سخت افزاری و بازاری و کاسب هستند.طی سالیان گذشته و کار در حوزه برنامه نویسی در ایران به ندرت مدیر پروژه ای را دیده ام که اهل نرم افزار باشد، اغلب آنها افرادی بودند که دانش نرم افزاری آنها در حد خیلی پایینی بود.کاسب فروشنده‌ی قطعات کامپیوتری، فروشنده تجهیزات دوربین مدار بسته، نصاب شبکه، فتوشاپ کار، نصاب ویندوز و... شغل اصلی کسانی بود که من به عنوان مدیر پروژه دیده ام.چرا؟ چون این افراد خیلی بهتر و راحت تر با افراد سرمایه دار در ارتباط هستند و چون یک کار مربوط به کامپیوتر برای افراد سرمایه دار انجام داده اند لذا به راحتی به این افراد اطمینان می کنند، غافل از اینکه پروژه و استارت آپ نرم افزاری چیه!حرف پایانی من با افراد سرمایه دار و مدیران محترم سازمان ها این است که لزوما هر کسی که با کامپیوتر و تجهیزات آن کار می کند، مهندس و معمار نرم افزار نیست و نمی تواند به عنوان مدیر پروژه؛ پروژه نرم افزاری و استارت آپ شما را به نتیجه برساند و اینکه برای موفقیت در پروژه و استارت آپ خود ابتدا به دنبال یک مهندس و معمار نرم افزار باشید.</description>
                <category>Farid Karami</category>
                <author>Farid Karami</author>
                <pubDate>Sat, 30 Mar 2019 02:40:23 +0430</pubDate>
            </item>
            </channel>
</rss>