Clean Architecture کدهایی که مثل موسیقی هارمونی دارند!
معماری تمیز Clean Architecture چیست ؟ 5 مرحله راه اندازی آن < نیک آموز
دایره های بیرونی مربوط به مکانیزم ها و دایره های داخلی مربوط به خط مشی ها هستند. اینکه تمرکز روی یک پروژه وجود دارد و فرد پاسخگوی خروجی خود است مزیت محسوب میشود اما اگر در حالت B بتوانیم این دو خصوصیت را اعمال کنیم ،در کل حالت B مزیت های بیشتری دارد. اینکه چه کارهایی برای بهینه شدن یا agile شدن سیستم باید انجام داد در چارچوب همین معماری قابل دستیابی است. در این نوشته کمی از TypeScript در کد استفاده خواهد شد، اما فقط برای نشان دادن اینکه چگونه از نوعها و رابطها برای توصیف شیها استفاده کنیم. هر کدی که در این نوشته بررسی خواهیم کرد، میتواند بدون استفاده از TypeScript نوشته شود. در این بخش از راه اندازی Clean Architecture ، Dependency Injection بررسی شد.
چون پروژه ما قرار است web api باشد یک پروژه به سولوشن اضافه میکنیم. فرض کنید که ساختار سه لایه نرم افزار را در خانه خود بخواهید پیاده کنید. معماری تمیز شامل یک اصول اولیه است و بعد از آن هر شخص با توجه به این اصول میتواند پیاده سازی های مخصوص به خود را به روش های مختلف داشته باشد. در مقایسه با معماریهای غیرمتمرکز مانند اورکید، معماری تمیز همبستگی قویتری بین منطق کسبوکار و پیادهسازی دارد. در مقایسه با معماری لایهای، در معماری تمیز تمرکز بیشتری بر منطق کسبوکار وجود دارد.
پارامتر TRequest نشاندهنده شی درخواستی خاصی است که به Use Case ارسال و پارامتر TResponse نمایانگر شی پاسخی است که از Use Case برگردانده میشود. هدف اصلی این لایه، حفظ استقلال قوانین اصلی سیستم از هرگونه وابستگی به دیتابیس یا چارچوبها است. یکی از مشکلات دانشجویان و علاقمندان به یادگیری برنامه نویسی نداشتن اطلاعات کافی و دقیق از وضعیت بازار، تکنولوژی های جدید و منابع آموزشی مناسب است. سوالات و اشکالاتی که تنها یک مشاور فنی، باتجربه و آگاه در آن زمینه می تواند پاسخگو آن باشد. تیم آموزشی آتریا همیشه آماده بوده تا سوالات و اشکالات شما را برطرف نموده و مسیر یادگیری صحیح را پیش روی شما قرار دهد.
لایه زیرساخت با استفاده از کلاس ها و رابط های C# پیاده سازی می شود و باید مستقل از لایه های ارائه و دامنه باشد. به عنوان یک واسطه بین لایه های ارائه و دامنه عمل می کند و با فراخوانی متدهای لایه دامنه مناسب، مسئولیت اجرای موارد استفاده را بر عهده دارد. لایه Application همچنین مسئول هماهنگی جریان داده بین لایه های ارائه و دامنه است. این با استفاده از کلاسها و رابطهای C# پیادهسازی میشود و باید مستقل از لایههای ارائه و زیرساخت باشد. هدف معماری پاک ایجاد معماری است که بتواند تغییرات و تغییرات را در طول زمان بدون تأثیر بر کل سیستم تحمل کند.
کار این لایه صرفا هماهنگ کردن جریان داده به Entity ها یا از Entity ها بر اساس Business Rule و Use Case ها می باشد. موارد خارجی مانند UI یا Database نیز نباید تغییری بر لایه Use Case داشته باشد. با این حال ما انتظار داریم تغییرات در عملکرد برنامه روی Use case ها و بنابراین نرم افزار موجود در این لایه تأثیر بگذارد. اگر جزئیات یک Use Case تغییر کند، مطمئناً برخی از کدهای این لایه تحت تأثیر قرار می گیرند. معماری Clean Architecture چندین مزیت را برای توسعه دهندگان فراهم می کند، از جمله جداسازی نگرانی ها (separation of concerns)، قابلیت تست و نگهداری، و انعطاف پذیری و مقیاس پذیری.
سپس، MediatR به جستجو برای Handler مناسب میپردازد و پس از یافتن آن، متد Handle را فراخوانی میکند. پس از ایجاد شدن کاربر جدید توسط هندلر، مقدار True در پاسخ HTTP برگردانده میشود. به منظور درک نحوه پیادهسازی کلاس CreateUserCommnad، به قطعه کد زیر توجه کنید. فرض کنید روزی تصمیم گرفته شود تا یکی از لایههای پروژه، به سرویس دیگری از یک میکروسرویس بزرگتر منتقل شود. در این شرایط، اگر وابستگیهای زیادی بین دو لایه وجود داشته باشند، جداسازی آنها دشوار است و دیگر نمیتوانید یک لایه خاص را به میکروسرویس بزرگتر منتقل کنید. پروژه Application یک Orchestrator از سایر لایهها و Use Case ها تلقی میشود.
این شامل چندین مؤلفه، مانند موجودیت ها، موارد استفاده، رابط ها و کنترلرها، و همچنین چهار لایه، از جمله ارائه، برنامه، دامنه و زیرساخت است. در معماری تمیز (Clean Architecture) تعداد چهار لایه بررسی شده در بالا یک الزام قطعی نیست. این فقط یک ایده است و شما می توانید بسته به نیاز و نوع سیستم تعداد لایه های موجود در معماری تمیز را افزایش دهید. چیزی که مهم است و می بایست رعایت شود Dependency rule و حفظ رعایت آن می باشد. با حرکت به سمت لایه های درونی این معماری سطح انتزاع افزایش پیدا می کند و لایه های بیرونی شامل جزییات پیاده سازی بیشتری خواهند بود. در معماری clean لایه مرکزی انتیتی ها هستند یعنی جایی که قلب نرم افزار است و روی طراحی آن فکر شده است.
دیاگرام شکل تلاشی برای ادغام این معماری ها به یک ایده ی عملیاتی واحد است. با یک مثال شروع میکنم که همین ابتدا به لحاظ ذهنی با هم هماهنگ شویم. این مجموعه کاملا مقدماتیست و برای افرادی پیشنهاد میشود که برنامه نویسی را بلد هستند. مقدار بازگشتی متدهایی که برای Register کردن Dependency ها تعریف کردیم، از نوع IServiceCollection بودند. این متد باید امکان رجیستر کردن دو پکیج نصبشده (MediatR و FluentValidation) را داشته باشد.
البته میتوان پیادهسازیهای مرتبط با اتصال به دیتابیس را در لایه درونیتر، یعنی Persistence، قرار داد. در ادامه این مقاله راه اندازی Clean Architecture ، موضوع Dependency Injection در پروژههای Clean بررسی میشوند. بهطور کلی، لازم است یک کلاس به نام DependencyInjection در تمام لایهها ایجاد شود. هرکدام از کلاسها یک متد دارند و نام متد، ترکیبی از عبارت Add و نام لایه است. حال برای بررسی مقادیر ورودیها، در داخل پوشه Commands، یک کلاس به اسم CreateUserValidator ایجاد میکنیم که از AbstractValidator ارثبری میکند. T نمایانگر نوع شی است که اعتبارسنجی خواهد شد و AbstractValidator (یکی از کلاسهای پکیج Fluent Validation) برای پیادهسازی Rule های مختلف بهکار میبریم.
این آموزش برای افراد مبتدی پیشنهاد نمیشود و حتما باید به خوبی آموزش فلاتر را گذرانده باشید. تصویر فوق Data Flow را نشان میدهد؛ فرض کنید میخواهیم دیتایی را در جدول postدیتابیس ذخیره کنیم. این لایه بطور مستقیم به لایه انتیتی ها یا همان domain models متصل است. تا الان توضیح دادیم چرا مرکزیت دیتابیس را رها کردیم و مرکزیت دامین را به عنوان Clean Architecture بررسی میکنیم. لایهدامین شامل Logic Enterprise و تایپ های آن است و کمتر لاجیک دارد. وابستگیهای سورس کد می بایست به داخل و به سمت خط مشی های سطح بالا اشاره کنند.
ولی آنچه در application است فقط برای یک سیستم طراحی شده است. اینکه در حالت A افراد شرکت شاید بازهی وسیعی از مهارت ها را پیدا کنند هم شکی در آن نیست. چون در حالت B فرد متمرکز روی پیاده سازی های منحصر به خود است و اگر خودش نخواهد شاید همیشه همانجایی که هست باقی بماند (به لحاظ دانش). قسمت ششم پادکست کافه برنامه نویس هم در مورد همین موضوع هست و به محض منتشر شدن لینکش در این پست قرار داده میشه. هر چیزی که در سایر لایه ها جایگاهی ندارد در این لایه جایگذاری می شود.
بنابراین نیاز دارید تا تمام پکیج های زیر را در پروژه خود اضافه کنید. پس میتوان گفت این لایه مسئول یکسان سازی و فرمت دهی خروجی است. امکان جایگزینی لایه persistence باید بدون دستکاری اپلیکیشن وجود داشته باشد. اما نباید اشتباه کرد؛ Presentation و Persistence خیلی مهم هستند اما اینها چیزهایی نیستد که توسعه دهنده برای حل مسائل پیش رو به عنوان موضوع اصلی به آن نگاه کند. اینکه آنچه به استفاده کننده نمایش میدهیم نتیجه لایبرری react است یا با razor و الکترون و ... این متن فقط قسمتی از فصل 22 کتاب Clean Architecture می باشد.
در همین لایه، پورتها نیز وجود دارند که توصیفکنندهی نحوهی ارتباط برنامهی ما با جهان خارجی هستند. معمولاً پورت، یک interface یا به عبارتی قرارداد رفتاری است. پورتها به عنوان یک «buffer zone» بین خواستههای برنامه ما و واقعیت عمل میکنند. اینترفیس ISender برای پکیج MediatR است و به منظور ارسال درخواست توسط این پکیج بهکار میرود. ضمن اینکه درخواستهای ارسالشده توسط هندلرهای مرتبط با آن، دریافت و پردازش میشوند.
برای آغاز راه اندازی Clean Architecture ، ابتدا باید یک پوشه Solution خالی ایجاد کنید که در نهایت حاوی همه پروژههای آتی خواهد بود. در سال 1390 با هدف آموزش عمیق و تخصصی برنامهنویسی تأسیس شد. استفاده از مدرسین با تجربه به همراه تدوین سرفصلهای تخصصی و براساس تکنولوژی روز دنیا باعث شده تا نیکآموز به یکی از قطبهای آموزش کشور تبدیل شود. این لایه وظیفه واسطهگری بین لایههای داخلی و خارجی را بر عهده دارد؛ به عنوان مثال، دادهها از ورودی دریافت شده و به فرمت مناسب تبدیل میشوند. ایمیل و نام و اطلاعات شخصی من را برای دفعه ی بعد که میخواهم نظری ازسال کنم ذخیره کن.
واضح است که تغییرات در عملیات هر application منجر به تغییر use case های مربوط به آن عملیات شده و در نتیجه منجر به ایجاد تغییراتی در این لایه خواهد شد. معماری چند ضلعی و Clean Architecture یکی از روشهای طراحی نرمافزار است که هدف آن ساخت سیستمهایی با قابلیت نگهداری، تست و توسعه آسان میباشد. این معماری توسط “روبرت مارتین” (Robert C. Martin) معرفی شده و به دنبال جداسازی وابستگیها و مسئولیتها در لایههای مختلف نرمافزار است. در این مقاله، نحوه پیادهسازی معماری چند ضلعی و Clean Architecture در یک پروژه جاوا با استفاده از Spring Boot به صورت قدم به قدم شرح داده میشود. معماری پاک چندین مزیت را برای توسعه دهندگان فراهم می کند، از جمله جداسازی نگرانی ها، قابلیت آزمایش و نگهداری، و انعطاف پذیری و مقیاس پذیری.
در نهایت، انتخاب بین Clean Architecture و MVVM بستگی به نیازها و ترجیحات شما دارد. اگر پروژه شما به یک معماری سادهتر و با کمترین وابستگی به فناوریها نیاز دارد، Clean Architecture ممکن است بهترین گزینه باشد. اما اگر به دنبال اتصال مستقیم دادهها به عناصر رابط کاربری و استفاده از ویژگیهای مخصوص MVVM مانند دادهبایندینگ هستید، MVVM میتواند گزینه مناسبی باشد. همچنین، میتوانید این دو الگو را ترکیب کنید و مزایا و ویژگیهایی را که برای پروژه خود مهم است، در پیادهسازی خود استفاده کنید. معماری Clean در اندروید یک الگوی طراحی است که برای ساختاردهی مناسب و قابل توسعهی برنامههای اندروید استفاده میشود. این معماری اصول و الگوهایی را به منظور جداکردن وظایف مختلف در برنامهی شما تعریف میکند و به شما کمک میکند تا کدتان را سازماندهی کنید و تغییرات آینده را به راحتی اعمال کنید.
این امکان وجود دارد که به جای مقدار Boolean، یک GUID برگردانیم. در ادامه، قطعه پیادهسازی هندلر مربوط به ایجاد کاربر قرار داده شده است. در مرحله بعدی، یک هندلر تحت عنوان CreateUserCommandHandler ، برای این Command ایجاد میکنیم. محل نگهداری این کلاس، داخل پوشه Commands (زیرمجموعه پوشه User) خواهد بود. به Convention ای که برای نامگذاری کلاسهای هندلر استفاده میکنیم، دقت کنید.
اینبار چون در فولدر پروژه مربوطه هستیم نصب انجام میشود و میتوان از طریق فایل Post.Data.csproj و یا بخش Nuget در پنجره سولوشن به وجود این لایبرری مطمئن شد. نحوه تعاملِ این سه لایه بر اساس توضیحات خانه ای که توضیح دادیم ساده و تقریبا «تقسیم وظایف شده» است. مثلا لوازم کیک را از یخچال خارج کند کیک را بسازد و دوباره در یخچال قرار دهد. با توجه به تغییرات State در ویجت BlocBuilder اطلاعات مختلفی را به کاربر نمایش میدهیم. فایلی به نام fetch_person_usecase ایجاد کنید و کدهای زیر را در آن قرار دهید.
اینکه خروجی نهایی شرکت A بهتر است یا B بحث معماری نرم افزار نیست. دومین شرکت به روش B کار میکند و افراد شرکت با تمام حرفهای بودن هر کدام روی یک بخش از کار متمرکز هستند. همه در انجام همه پروژهها سهیم هستند اما هر کس روی بخش خاصی کار میکند. پروژهها روی یک چارچوب خاص از قبل پیاده شده سوار میشوند که همه برنامه نویسان آن شرکت نسبت به آن چارچوب تسلط دارند. یک جهت کنترل نشده از وابستگیها میتواند منجر به کدی پیچیده و گیجکننده شود.
در لایه قبل کلاس PostMap.cs به شکل فایل تبدیل کنید ، چون عملیات مربوط به دیتابیس است نباید به لایه Entities منتقل شود. وظیفه این کلاس برقراری ارتباط با دیتابیس است.فعلا این کلاس را رها میکنیم و مدل Post در دیتابیس را تکمیل میکنیم. به کمک ویژوال استودیو ابتدا لایه data را میسازیم تا مدل یا مدل های خود رابسازیم. نکته اول اینکه اگر با زبان های دیگر آشنا دارید مرور مختصری به روندی که در ادامه توضیح داده شده است بیندازید چون تغییر چندانی در منطق پیاده سازی در زبان های مختلف وجود ندارد. برای شروع پوشه ای به نام Entity در این بخش ایجاد کنید و فایلی تحت عنوان person_entity در آن قرار دهید.
همه آن ها یک هدف یکسان دارند و آن separation of concerns (جدایی نگرانی ها) است. همه این معماری ها اعم از معماری پیاز ، معماری تمیز و دیگر معماری ها با تقسیم نرم افزار به لایه های مختلف به separation of concerns دست می یابند. هر کدام از این معماری ها حداقل یک لایه برای قوانین کسب و کار (business rules) و یک لایه Interface دارند. این معماری با تمرکز بر تفکیک منطق کاربری از جزئیات فنی و وابستگیها، باعث ایجاد نرمافزارهایی میشود که قابلیت انعطافپذیری و تغییرات در آنها بسیار بیشتر است. مطابق این گفته طراحی سیستم، جداسازی سیستم به گونهای است که بتوان بعداً آن را ترکیب کرد و بیشتر از همه، این ترکیب باید به راحتی و بدون کار زیادی انجام پذیرد.اما فقط این نیست.
با یک سرویس به نام PostService میتوانیم سه api را پیاده سازی کنیم. فولدر مایگریشن در پروژه Data ساخته شد که حاوی دستوراتی است که باعث اعمال مدل تعریف شده بر روی دیتابیس میشود. فرض کنید به کمک دات نت میخواهیم api هایی را به عنوان مثال پیاده سازی کنیم. معماری تمیز جزو معماری پیچیده میباشد که برای درک کامل آن نیاز به تمرین دارید. در این صفحه با کمک context.read().FetchPersonList(); به کلاس Cubit دسترسی پیدا میکنیم و درخواست دریافت اطلاعات را شروع میکنیم.
اگر حس می کنید بخشی از مطلب نامفهوم است نظر خود را بنویسید تا توضیح بیشتری ارائه کنم؛ قرار نیست فقط بخاطر پر کردن صفحه، مطلبی نوشته شده باشد. با بیش از نیم قرن تجربه در محیطهای نرم افزاری قابل تصور، عمو باب به شما می گوید چه گزینههایی را باید انتخاب کنید و چرا آنها برای موفقیت شما بسیار حياتى هستند. چون ما معماری سه لایه را پیاده میکنیم و در این معماری چیزی به نام Enitites نداریم بهتر است یک فولدر درست کنیم و این دو پروژه را با هم لایه Data بنامیم. میخواهیم به کمک دات نت یک معماری سه لایه ساده را پیاده سازی کنیم. در لایه قبلی پیاده سازی این کلاس را انجام دادیم و در این قسمت فقط مواردی که نیاز به پیاده سازی شدن دارند به بصورت اینترفیس در فلاتر تعریف میکنیم. در اینصورت به کمک دپندنسی اینجکشن آبجکت مورد نیاز را جایگزین اینترفیس کنیم بدون اینکه لایه اپلیکیشن از شکل پیاده سازی اینترفیس با خبر باشد.
برنامه نویسی اپلیکیشن