مدل C4 (context containers components codes) رویکردی ساده برای یادگیری و ایجاد نمودارهای معماری نرمافزار و نقشههای کد است. مدل C4 یک رویکردی انتزاعی برای ایجاد نمودار معماری نرمافزار بر اساس انتزاع است و نشان میدهد که معماران و توسعهدهندگان نرمافزار چگونه در مورد نرمافزار و ساخت آن فکر میکنند. برای ایجاد نقشههایی از کد ابتدا به یک مجموعهای از انتزاعات مشترک نیاز است تا زبانی مشترک ایجاد شود و برای توصیف ساختار ایستای سیستم نرمافزاری مورد استفاده قرار گیرد. این مدل به تیمهای توسعه نرمافزار برای توصیف و برقراری ارتباط موثر با معماری نرمافزار خود در سطوح مختلف جزئیات، بیان سناریوهای مختلف برای مخاطبان در هنگام انجام طراحی یا مستندسازی در یک پایگاه کد موجود کمک میکند. یک روش نشانهگذاری گرافیکی نادر برای مدلسازی معماری سیستمهای نرمافزاری است و مبتنی بر تجزیه ساختاری یک سیستم به containerها و مؤلفهها است. مدل C4 توسط معمار نرمافزاری به نام Simon Brown در سالهای ۲۰۰۶ تا ۲۰۱۱ ایجاد شد. میتوان از مدل C4 برای میکرو سرویسها به منظور ساخت و توصیف یک سیستم استفاده کرد. نمودار C4 یک چارچوب جایگزین ساده شده برای نمودارهای UML است و میتواند چندین سیستم را توصیف کند.
این مدل دارای 4 سطح نمودار و انتزاع به صورت سلسله مراتبی است که این نمودارها باید به ترتیب رسم شوند. C4 معماری یک سیستم نرمافزاری را با نمایش چند دیدگاه مستند میکند و تجزیه یک سیستم نرمافزاری را به containerها، مؤلفهها، ارتباط بین این عناصر، مکان مناسب و رابطه با کاربران توضیح میدهد. مدل C4 ساختار ایستای یک سیستم نرمافزاری را از نظر محتوا، containerها، مؤلفهها و کد (UML class) در نظر میگیرد و درک خوبی از ساختار ایستا را برای نمایش سایر جنبهها ارائه میدهد. یک سیستم نرمافزاری از یک یا چند container (برنامههای تحت وب، برنامههای موبایل، برنامههای کامپیوتر، پایگاه دادهها، سیستمهای فایل و …) تشکیل شده است که هر container شامل یک یا چند مؤلفه است و هر مؤلفه توسط یک یا چند عنصر کد (کلاسها، interfaceها، اشیا، توابع و …) پیادهسازی شده است. شکل 2 نمایی از سطوح و سلسله مراتب مدل C4 را نمایش میدهد.
سطح ۱: نمودار محتوا (context) سیستم
یک نمودار محتوا یک نقطه شروع خوب برای ترسیم نمودار و مستندسازی یک سیستم نرمافزاری است و نشان میدهد که چگونه یک سیستم نرمافزاری از نظر دامنه با دنیای اطراف خود تناسب دارد. در یک نمودار، سیستم به عنوان جعبهای در مرکز قرار دارد که توسط کاربران و سیستمهای دیگر که با آن در تعامل هستند، محصور شده است. در این نمودار جزئیات مهم نیست و باید بر روی افراد و سیستمهای نرمافزاری به جای فناوریها، پروتکلها و سایر جزئیات سطح پایین تمرکز شود و میتوان این نمودار را به افراد غیر فنی نیز نشان داد. دامنه آن یک سیستم نرمافزاری واحد است. عنصر اصلی، سیستم نرمافزاری در دامنه است. عناصر پشتیبان شامل افراد (کاربران، نقشها،کارکنان یا شخصیتها)، سیستمهای نرمافزاری (وابستگیهای خارجی) است که به طور مستقیم به سیستم نرمافزاری در دامنه متصل شدهاند. معمولا سیستمهای نرمافزاری دیگر در خارج دامنه یا مرز سیستم نرمافزاری مورد نظر قرار میگیرند. مخاطب آن همه افراد فنی و غیر فنی و افراد داخل و خارج تیم توسعه نرمافزار است. سطح محتوا، سیستم را از نظر حوزه و ارتباط با کاربران و سایر سیستمها نمایش میدهد و توصیف کلیتری از عملیات سیستم، دامنه و کاربران سیستم و سیستمهایی که با سیستم مورد نظر در تعامل هستند ارائه میدهد.
سطح ۲: نمودار Container
با استفاده از نمودار container میتوان مرز یک سیستم را بررسی کرد و سیستم نرمافزاری را از نظر دامنه بزرگنمایی و بررسی میکند که docker نیست. container در واقع برنامه تحت وب سمت سرور، برنامه تک صفحهای، برنامه دسکتاپی، برنامه موبایل، طرح پایگاه داده، پایگاه داده ذخیره شده، سیستم فایل و ... است که برای استقرار و اجرای کد و ذخیره دادهها مورد استفاده قرار میگیرد و یک برنامه کاربردی یا یک داده ذخیره شده را نمایش میدهد که در آن تعدادی کد توسعه یافته است. container باید در حال اجرا باشد تا کل سیستم نرمافزاری کار کند. نمودار container معماری نرمافزار در سطح بالا و نحوه توزیع مسئولیتها در آن را نمایش میدهد. همچنین نحوه ارتباط containerها با یکدیگر را نشان میدهد. حوزه و دامنه آن یک سیستم نرمافزاری واحد است. عناصر اصلی، containerهای داخل سیستم نرمافزاری در دامنه و عناصر پشتیبانی افراد و سیستمهای نرمافزاری هستند که به طور مستقیم به containerها متصل شدند. مخاطبان آن افراد فنی در داخل و خارج تیم توسعه نرمافزار، توسعهدهندگان و کارکنان عملیاتی و پشتیبانی هستند. container از مؤلفههایی ساخته شده است. این نمودار یک سیستم را به containerهای مرتبط تجزیه میکند. container یک ظرف یا محیط زمان اجرای قابل استقرار و قابل اجرای مجزا است که معمولا در فضای فرایندهای خود اجرا میشود. به همین دلیل ارتباط بین containerها معمولا به شکل ارتباط بین فرایندی است.
سطح ۳: نمودار مؤلفه (Component)
در این مرحله هر container برای تشخیص بلاکهای ساختار اصلی و تعاملات آنها بزرگنمایی و تجزیه میشوند. یک container از تعدادی مؤلفه تشکیل شده است که هر مؤلفه مسئولیتهای آنها و جزئیات فناوری و پیادهسازی است و از مجموعه قوانین کمتری برای ایجاد نمودار معماری نرمافزار استفاده میکند. دامنه و حوزه مؤلفه، یک container و عناصر اصلی آن مؤلفههای داخل یک container در دامنه است. عناصر پشتیبانی شامل container (در سیستم نرمافزاری در محدوده) به علاوه افراد و سیستمهای نرمافزاری هستند که به طور مستقیم به مؤلفهها متصل شدند. مخاطبان این نمودار معماران و توسعهدهندگان سیستم نرمافزاری هستند. در صورتی نمودارهای مؤلفه ارزش افزوده داشته باشند و برای مستندسازی طولانی مدت در نظر گرفته شوند، ایجاد میشوند. این نمودار یک گروهبندی با ماژولاریتی و مرزبندی خوب و رابط کاربری ساده است که داخل container اجرا میشود. این نمودار container را به مؤلفههای مرتبط تجزیه میکند و مؤلفهها را به سایر containerها و سیستمها، مرتبط میکند. نمودار component یک مجموعه از عملکردهای مرتبط است که واحدهای قابل استقرار مجزا نیستند که در زبانهایی مانند Java و C++ یک مجموعهای از کلاسهای پیادهسازی شده در پشت یک interface است. همه اجزای داخل یک container معمولا در همان فضای فرایند اجرا میشوند. هر مؤلفه از عناصر سطح کد ساخته شدهاند.
سطح ۴: نمودار کد (Code)
در این مرحله میتوان هر مؤلفه را بزرگنمایی و بررسی کرد تا نحوه پیادهسازی کد آن را با استفاده از نمودارهای UML class، نمودارهای ارتباط موجودیت و … نشان دهد. نمودار کد یک سطح اختیاری از جزئیات است و فقط برای مهمترین و پیچیدهترین اجزا به کار میرود و برای اسناد طولانی مدت توصیه نمیشود. برای این منظور نمودارهای موجود مانند UML (زبان مدلسازی یکپارچه)، ERD (نمودارهای رابطه موجودیت) یا IDE (نمودارهای تولید شده توسط محیط توسعه یکپارچه) ایجاد میشود.
در بهترین حالت این نمودار به صورت خودکار با استفاده از ابزار تولید میشود و فقط ویژگیها و متدهایی نمایش داده میشوند که امکان ایجاد یک سناریو را فراهم میکنند. حوزه این نمودار یک مؤلفه واحد است. عناصر اصلی آن همان عناصر اصلی کد یعنی کلاسها، رابطها، اشیا، توابع، جداول پایگاه داده و ... در مؤلفه در دامنه است و مخاطبان آن معماران و توسعهدهندگان نرمافزار هستند. بیشتر IDEها میتوانند این سطح از جزئیات را بر اساس تقاضا تولید کنند. این نمودار جزئیات اضافی درباره طراحی عناصر معماری که میتوانند روی کد نگاشت شوند را ارائه میدهد.
مدل C4 برای سطوح ۱ تا ۳ از ۵ عنصر مدلسازی اصلی شامل افراد،سیستمهای نرمافزاری، containerها، مؤلفهها و روابط استفاده میکند. این روش نسخهای برای طرحبندی، شکل، رنگ و سبک این عناصر ندارد. C4 به استفاده از نمودارهای آسان بر اساس جعبههای تو در تو به منظور تسهیل ترسیم مشارکتی تعاملی توصیه میکند. همچنین شیوههای مدلسازی خوب مانند ارائه عنوان و توضیحات روی هر نمودار و برچسبگذاری بدون ابهام به منظور تسهیل درک مخاطبان را ترویج میدهد. مدل C4 معماری بصری مشارکتی و معماری تکاملی در زمینه تیمهای agile که در روشهای مستندسازی رسمیتر و طراحی معماری اولیه مطلوب نیستند را تسهیل میکند.
نرمافزار Gliffy برای ایجاد مدل C4
برای ایجاد مدل C4 میتوان از نرمافزار Gliffy استفاده کرد. برای این منظور میتوان در دیاگرام از لینکهایی مستقیم بر روی شکلها استفاده کرد و با دو بار کلیک میتوان به سطوح عمیقتر مدل دسترسی پیدا کرد. رسم نمودار C4 با استفاده از این ابزار دارای چند مرحله است که عبارتند از:
1) استفاده از Drag & Drop شکلها برای رسم نمودار context با استفاده از اشکال اصلی برای ساخت نمودار مانند کاربر و سیستمهای متصل به سیستم و اضافه کردن متنی به عنوان برچسب یا توصیف اجزا
2) ایجاد کلیدی برای تصریح و وضوح نمودارها و تنظیم قوانینی نمودارها برای ایجاد نمودارهای اضافی یک مدل C4، ایجاد ویژگیهای بصری مانند رنگ و خواندن و درک آسان هر ۴ نمودار در ارتباط با یکدیگر
3) رسم اتصالات بین مؤلفهها در نمودار با استفاده از ابزار اتصال، drag and drop خطوط بین عناصر، تغییر سبک خطوط، استفاده از پیکانهایی برای نمایش جریان مستقیم داده در سیستم و ایجاد برچسب برای خطوط
4) ایجاد یک لایه جدید در نمودار بعدی در مدل، امکان تغییر نام و کپی لایه، تغییر دید لایهها و قفل کردن لایهها برای جلوگیری از تغییرات تصادفی
5) تکرار مراحل ۱ تا ۴ برای رسم نمودار container و استفاده از اشکال و اطلاعات در آن برای رسیدن به سطح عمیقتر از جزئیات، استفاده از یک شی یا مستطیل به منظور ایجاد مرزی برای عناصر موجود در container و کپی لایه نمودار container به عنوان پایه یا الگویی برای نمودار مؤلفه
6) تکرار مراحل ۱ تا ۴ برای رسم نمودار مؤلفه برای شرح جزئیات کد داخل container در لایه قبلی
7) تکرار مراحل ۱ تا ۴ برای رسم نمودار کد یا کلاس برای شرح جزئیات کد در سیستم، ضروری نبودن این نمودار برای توصیف معماری سیستم و امکان رسم نمودار UML class برای توصیف این کد
8) اضافه کردن پیوندهای هر لایه برای اضافه کردن هر لایه، استفاده از ویژگیهای پیوند لایه پویا برای ایجاد لایه جدیدی به نام نمای لایه و سپس ایجاد ۴ دکمه برای انتخاب، جابهجایی و تغییر وضعیت در لایههای مدل C4
9) ذخیره، جاسازی و اشتراکگذاری مدل
این مطلب، بخشی از تمرینهای درس معماری نرمافزار در دانشگاه شهید بهشتی است.
منابع و مراجع: