برای درک نیاز مدل c4 بهتر است با یک مثال شروع کنیم، اگر از کسی که در صنعت ساختمان فعالیت میکند بخواهید که به صورت بصری معماری موجود در ساختمان را برای شما نمایش دهد، به راحتی با کمک گرفتن از نقشههای ساختمان، پلانهای طبقهها و عکسها جزئیات را برای شما ارائه خواهد داد. در مقابل، از یک توسعهدهنده نرمافزار بخواهید که معماری نرمافزار یک سیستم نرمافزاری را با استفاده از نمودارها به اشتراک بگذارد، احتمالاً با یک آشفتگی از جعبهها و خطوط مواجه خواهید شد. این ساختار نیز شاید سلیقهای باشد و از یک معیار و استانداردی تبعیت نکند؛ برای مثال اشکالهای مختلف، نامگذاری مبهم، روابط بدون برچسب، اصطلاحات عمومی، سطح انتزاع مختلط و غیره.
صنعت نرمافزار در پاسخ به این نیاز در بین توسعه دهندگان نرم افزار در سال ۲۰۰۷ زبان UML وجود آمد. نبود یک استاندار مشخص برای مدل کردن سیستم با استفاده از نمودار های گرافیکی استاندارد و یکسان، مشکلاتی را برای برنامه نویسان و طراحان نرم افزار به وجود آورده بود. با وجود پیدایش چنین زبانهایی، راه موثری برای ارتباط با معماری نرمافزار سیستم همچنان ارائه نمیشد، باز مشکلات بصری در این صنعت باقی مانده بود؛ و همچنان تیمها تمایل داشتند به نمودارهایی تکیه کنند که روی تخته سفید ترسیم میکنند یا با استفاده از ابزارهای نمودارسازی همهمنظوره مانند Microsoft Visio.
مدل C4 بهعنوان راهی برای کمک به تیمهای توسعه نرمافزار برای توصیف و برقراری ارتباط معماری نرمافزار، هم در طول جلسات طراحی اولیه و هم هنگام مستندسازی یک کد موجود، ایجاد شد است. این مدل راهی است برای ایجاد نقشههایی از کد خود، در سطوح مختلف از جزئیات، به همان روشی که از google map برای بزرگنمایی در منطقهای که به آن علاقه دارید استفاده میکنید؛ در این مدل هم این امکانات موجود است که در مستند و طرحهای خود در سطوح مختلف از جزئیات، مروری داشته باشید. خوب بیاید کمی بیشتر و تخصصی تر با مدل C4 آشنا شویم.
یک مدل C4 معماری نرم افزار را در سطوح مختلف جزئیات توصیف یا تعریف میکند. مدل C4 مجموعه ای از نمودارها است که زمینه، کانتینرها، اجزا و کد یک نرم افزاررا نشان می دهد. سلسله مراتب این نمودارها به مخاطبان مختلف اجازه میدهد تا معماری نرم افزار را در سطح جزئیات مورد نیاز خود درک کنند.
چهار سطح در مدل C4وجود دارد که هر کدام برای مخاطبان متفاوتی است و هر سطر دارای جزئیات متفاوتی است. که مدل معماری نرم افزار شما را می سازند.
سطح 1: context
این سطح کلیترین توصیفی هستند که سیستم شما چه کاری انجام میدهد، چه کسی از آن استفاده خواهد کرد و با چه سیستمهای دیگری تعامل خواهد داشت. یک نمودار زمینه به شما کمک میکند تا محدوده پروژه خود را توصیف کنید و نیز تا مشخص کنید که کاربر سیستم شما چه کسی است و پاسخگو چه سیس را میخواهید حل کنید.
سطح 2: containers
این سطح اولین گام را برای توصیف سیستم نرمافزاری برداشته و API ها، پایگاه دادهها و میکروسرویسهایی را که سیستم از آنها استفاده خواهد کرد، نشان میدهد. هر یک از این برنامهها با یک کانتیر نشان داده میشوند و تعاملات بین آنها در سطح بالایی نشان داده میشود.
سطح 3: components
یک گام عمیقتر از نمودار کانتینر، نمودار مؤلفه است که در آن گروههای کد را در یک کانتینر به تفصیل شرح میدهد. این مؤلفهها انتزاعی از کد شما را نشان میدهند.
این نوع نمودار با نمودار مؤلفههای UML قابل مقایسه است، اما برای ایجاد نمودار معماری نرمافزار از مجموعهای از قوانین دقیقتر پیروی میکند.
سطح 4: Code
آخرین سطح به جزئیات زیادی نیاز دارد تا نشان دهد چگونه کد یک جزء واحد در سیستم در واقع پیاده سازی میشود. در این سطح به نمادهای موجود مانند زبان مدل سازی یکپارچه (UML)، نمودارهای رابطه موجودیت (ERD) یا نمودارهای تولید شده توسط محیطهای توسعه یکپارچه (IDE) متکی است.
بسته به پروژه شما و اجزایی که باید توصیف کنید، در نهایت مجموعهای از چهار یا چند نمودار خواهید داشت که مدل C4 شما را نشان میدهد. اگر یک مدل C4میسازید، میتوانید مستقیماً از خطوط بر روی اشکال در نمودارهای خود استفاده کنید تا به کاربران اجازه دهید تا به سطوح عمیقتر مدل شما دسترسی داشته باشند و متوجه فرق انتزاع سطوح شوند.
برای سطح 1 تا 3، مدل C4 از 5 عنصر اصلی نمودار استفاده میکند: افراد، سیستمهای نرمافزاری، کانتینرها، اجزا و روابط. این مدل تکنیکی برای چیدمان، شکل، رنگ و سبک این عناصر ندارد و کاملا ارتباط به سلیقه و یا ابزار مدل سازی C4 دارد. در عوض،مدل C4 فقط از نمودارهای ساده مبتنی بر جعبههای تو در تو را به منظور تسهیل ترسیم تعاملی بودن سیستم، توصیه میکند.
مدل C4 معماری بصری مشترک و معماری تکاملی را در چارچوب تیمهای چابک تسهیل میکند، و تیمهایی که روشهای مستندسازی رسمیتری را دنبال میکنند، مناسب نسیت.
برای ایجاد نقشههایی از کد شما، ابتدا به مجموعهای از انتزاعات مشترک نیاز داریم تا زبانی فراگیر ایجاد کنیم که بتوانیم از آن برای توصیف ساختار ایستا یک سیستم نرمافزاری استفاده کنیم. مدل C4 ساختارهای ایستا یک سیستم نرم افزاری را از نظر کانتینرها، اجزا و کد در نظر میگیرد. و شخصی از سیستمهای نرم افزاری که ما میسازیم، استفاده کنند.
یک شخص نماینده یکی از کاربران انسانی سیستم نرم افزاری شما (به عنوان مثال بازیگران، نقشها، شخصیت ها و غیره) است.
یک سیستم نرمافزاری بالاترین سطح انتزاع است و کلیات را توصیف میکند. این شامل سیستم نرم افزاری است که شما مدل سازی میکنید و سایر سیستمهای نرم افزاری که سیستم نرم افزاری شما به آنها وابسته است (یا برعکس). در بسیاری از موارد، یک سیستم نرم افزاری متعلق به یک تیم توسعه نرم افزار است.
در مدلC4، یک کانتینر یک برنامه کاربردی یا یک فروشگاه داده را نشان میدهد. کانتینر چیزی است که باید در حال اجرا باشد تا سیستم نرم افزاری کلی کار کند.
یک کانتینر در اصل یک زمینه یا مرزی است که در داخل آن برخی از کدها اجرا شده یا برخی از دادهها ذخیره شود. و هر کانتینر یک چیز یا محیط زمان اجرا به طور جداگانه قابل استقرار ویا اجرا است، که معمولاً (اما نه همیشه) در فضای فرآیند خود اجرا میشود. به همین دلیل، ارتباط بین کانتینرها معمولاً به شکل ارتباط بین فرآیندی است.
کلمه " Component" یک اصطلاح بسیار پربار در صنعت توسعه نرم افزار است، اما در این زمینه یک جزء از مجموعه عملکردهای مرتبط است. اگر از زبانی مانند جاوا یا سی شارپ استفاده میکنید، ساده ترین راه برای فکر کردن به یک کامپوننت این است که مجموعهای از کلاسهای پیاده سازی است. جنبههایی مانند نحوه بستهبندی آن مؤلفهها یک نگرانی جداگانه و متعامد است. نکته مهمی که در اینجا باید به آن توجه کرد این است که همه Component داخل یک کانتینر معمولاً در یک فضای پردازش یکسان اجرا میشوند.
من از ابراز visual-paradigm برای ایجاد یک مدل C4 استفاده کردهام. که در این لینک میتوانید به این ابزار دسترسی داشته باشید. توجه داشته باشید که در نسخه رایگان این نرم افزار، هنگام export کردن نمودار اسم سایت در نمودار شما نمایش داده میشود.
سناریو که پیش خواهیم برد یک سناریو ساده است که شامل موجودیت های دانشجو، سیستم گلستان، سیستم ایمیل دانشگاه و دانشگاه است. هدف از این سناریو درک بهتر مدل C4 است.
در visual-paradigm، یک نمودار جدید باز میکنید و از اشکال اصلی برای ساختن نمودار زمینه context استفاده میکنید. اشکالی را که نشان دهنده سیستم نرم افزاری شما هستند، از جمله کاربر ویا هر سیستم نرم افزاری متصل به سیستمی که در حال ترسیم آن هستید، بکشید و رها کنید. در حین کشیدن و رها کردن اشکال، برای افزودن متنی که اجزای نمودار شما را برچسب یا توصیف می کند، تایپ کنید. هر شکل در مدل های C4 معمولاً شامل موارد زیر است:
هنگام کار بر روی نمودار زمینه خود، قوانین سبکی را تنظیم کنید که نحوه ترسیم نمودارهای یک مدل C4 را دیکته میکند. برای مثال، میتوانید سیستمی را که توضیح میدهید به رنگ آبی تیرهتر استفاده کنید و کاربران شما نیز ممکن است رنگ متفاوتی داشته باشند. این قوانین یکپارچگی بصری ایجاد میکند که به بینندگان اجازه میدهد به سرعت هر نمودار را در ارتباط با یکدیگر بخوانند و درک کنند.
در این سطح میتوانید از اشکال زیر استفاده کنید:
هنگامی که متوجه شدید که سیستم شما چگونه با محیط در ارتباط است، یک گام بعدی این است که با نمودار Container مرز سیستم را بزرگنمایی کنیم. الان نسبت به سطح context با جزییات سیستم خود را شرح خواهیم داد.
این نمودار شکل سطح بالای معماری نرم افزار و نحوه توزیع مسئولیتها در سیستم مورد نیاز را نشان میدهد. همچنین گزینههای اصلی فناوری و نحوه ارتباط کانتینرها با یکدیگر را نشان میدهد.
در این سطح میتوانید از اشکال زیر استفاده کنید:
در مرحله بعد میتوانیم هر Container را بزرگنمایی کرده و بیشتر تجزیه کنید تا بلوکهای ساختمانی اصلی و تعاملات آنها را شناسایی کنیم.
نمودار کامپوننت نشان میدهد که چگونه یک کانتینر از تعدادی "مولفه" تشکیل شده است، هر یک از آن اجزا چیست، مسئولیتهای آنها و جزئیات فناوری و اجرای آنها چیست.
در این سطح میتوانید از اشکال زیر استفاده کنید:
در نهایت، میتوانید روی هر مؤلفه بزرگنمایی کنید تا نحوه پیادهسازی آن بهعنوان کد را نشان دهید. با استفاده از نمودارهای کلاس UML، نمودارهای رابطه موجودیت یا موارد مشابه.
در این یک سطح، سطح جزئیات اختیاری و بر اساس درخواست است و اغلب از ابزارهایی برای رسم این سطح میتوان استفاده کرد. در حالت ایدهآل، این نمودار به طور خودکار با استفاده از ابزار (به عنوان مثال یک ابزار مدلسازی IDE یا UML) تولید میشود، و شما باید فقط آن ویژگیها و روشهایی را نشان دهید که به شما امکان میدهند داستانی را که میخواهید بگویید، نشان دهد.
الان در هر مرحله یک خروجی داریم، و چون به ترتیب انتزاع در سیستم بحث را بردیم جلو می توانیم بگوییم یک نمودار سلسله مراتبی داریم.
مدل C4 یک راه ساده برای برقراری ارتباط با معماری نرم افزار در سطوح مختلف انتزاعی است، به طوری که میتوانید داستان های مختلف را برای مخاطبان مختلف تعریف کنید. ما با مدل C4 با هر ZoomIn کردن با جزییات بیشتری مواجه خواهیم شد.
با استفاده از این مدل c4، با یک آشفتگی از جعبهها و خطوط مواجه نخواهید شد و معماری نرم افزار خود را با بهترین شکل شرح خواهیم داد.
این مطلب، بخشی از تمرینهای درس معماری نرمافزار در دانشگاه شهیدبهشتی است.
مراجع: