سپهر اویسی
سپهر اویسی
خواندن ۸ دقیقه·۳ سال پیش

مدل C4، مدلی برای تجسم معماری نرم افزار

برای درک نیاز مدل c4 بهتر است با یک مثال شروع کنیم، اگر از کسی که در صنعت ساختمان فعالیت می­کند بخواهید که به صورت بصری معماری موجود در ساختمان را برای شما نمایش دهد، به راحتی با کمک گرفتن از نقشه‌های ساختمان، پلان‌های طبقه‌ها و عکس‌ها جزئیات را برای شما ارائه خواهد داد. در مقابل، از یک توسعه‌دهنده نرم‌افزار بخواهید که معماری نرم‌افزار یک سیستم نرم‌افزاری را با استفاده از نمودارها به اشتراک بگذارد، احتمالاً با یک آشفتگی از جعبه‌ها و خطوط مواجه خواهید شد. این ساختار نیز شاید سلیقه‌ای باشد و از یک معیار و استانداردی تبعیت نکند؛ برای مثال اشکال‌های مختلف، نام‌گذاری مبهم، روابط بدون برچسب، اصطلاحات عمومی، سطح انتزاع مختلط و غیره.

صنعت نرم‌افزار در پاسخ به این نیاز در بین توسعه دهندگان نرم افزار در سال ۲۰۰۷ زبان UML وجود آمد. نبود یک استاندار مشخص برای مدل کردن سیستم با استفاده از نمودار های گرافیکی استاندارد و یکسان، مشکلاتی را برای برنامه نویسان و طراحان نرم افزار به وجود آورده بود. با وجود پیدایش چنین زبان‌هایی، راه موثری برای ارتباط با معماری نرم‌افزار سیستم همچنان ارائه نمی‌شد، باز مشکلات بصری در این صنعت باقی مانده بود؛ و همچنان تیم‌ها تمایل داشتند به نمودارهایی تکیه کنند که روی تخته سفید ترسیم می‌کنند یا با استفاده از ابزارهای نمودارسازی همه‌منظوره مانند Microsoft Visio.

مدل C4 به‌عنوان راهی برای کمک به تیم‌های توسعه نرم‌افزار برای توصیف و برقراری ارتباط معماری نرم‌افزار، هم در طول جلسات طراحی اولیه و هم هنگام مستندسازی یک کد موجود، ایجاد شد است. این مدل راهی است برای ایجاد نقشه‌هایی از کد خود، در سطوح مختلف از جزئیات، به همان روشی که از google map برای بزرگنمایی در منطقه‌ای که به آن علاقه دارید استفاده می‌کنید؛ در این مدل هم این امکانات موجود است که در مستند و طرح­های خود در سطوح مختلف از جزئیات، مروری داشته باشید. خوب بیاید کمی بیشتر و تخصصی­ تر با مدل C4 آشنا شویم.

مدلسازی C4چیست؟

یک مدل 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 ساختارهای ایستا یک سیستم نرم افزاری را از نظر کانتینرها، اجزا و کد در نظر می­گیرد. و شخصی از سیستم­های نرم افزاری که ما می­سازیم، استفاده ­کنند.

  • شخص (Person)

یک شخص نماینده یکی از کاربران انسانی سیستم نرم افزاری شما (به عنوان مثال بازیگران، نقش­ها، شخصیت ها و غیره) است.

  • سیستم نرم افزاری (Software System)

یک سیستم نرم‌افزاری بالاترین سطح انتزاع است و کلیات را توصیف می‌کند. این شامل سیستم نرم افزاری است که شما مدل سازی می­کنید و سایر سیستم­های نرم افزاری که سیستم نرم افزاری شما به آنها وابسته است (یا برعکس). در بسیاری از موارد، یک سیستم نرم افزاری متعلق به یک تیم توسعه نرم افزار است.

  • کانتینر (applications and data stores)

در مدلC4، یک کانتینر یک برنامه کاربردی یا یک فروشگاه داده را نشان می­دهد. کانتینر چیزی است که باید در حال اجرا باشد تا سیستم نرم افزاری کلی کار کند.

یک کانتینر در اصل یک زمینه یا مرزی است که در داخل آن برخی از کدها اجرا شده یا برخی از داده­ها ذخیره ­شود. و هر کانتینر یک چیز یا محیط زمان اجرا به طور جداگانه قابل استقرار ویا اجرا است، که معمولاً (اما نه همیشه) در فضای فرآیند خود اجرا می­شود. به همین دلیل، ارتباط بین کانتینرها معمولاً به شکل ارتباط بین فرآیندی است.

  • مولفه (Component)

کلمه " Component" یک اصطلاح بسیار پربار در صنعت توسعه نرم افزار است، اما در این زمینه یک جزء از مجموعه عملکردهای مرتبط است. اگر از زبانی مانند جاوا یا سی شارپ استفاده می­کنید، ساده ترین راه برای فکر کردن به یک کامپوننت این است که مجموعه­ای از کلاس­های پیاده سازی است. جنبه‌هایی مانند نحوه بسته‌بندی آن مؤلفه‌ها یک نگرانی جداگانه و متعامد است. نکته مهمی که در اینجا باید به آن توجه کرد این است که همه Component داخل یک کانتینر معمولاً در یک فضای پردازش یکسان اجرا می­شوند.

چگونه یک مدل C4 بسازیم

من از ابراز visual-paradigm برای ایجاد یک مدل C4 استفاده کرده­ام. که در این لینک میتوانید به این ابزار دسترسی داشته باشید. توجه داشته باشید که در نسخه رایگان این نرم ­افزار، هنگام export کردن نمودار اسم سایت در نمودار شما نمایش داده میشود.

سناریو که پیش خواهیم برد یک سناریو ساده است که شامل موجودیت های دانشجو، سیستم گلستان، سیستم ایمیل دانشگاه و دانشگاه است. هدف از این سناریو درک بهتر مدل C4 است.

مرحله 1: نمودار را برای سطح Context ترسیم می­کنیم.

در visual-paradigm، یک نمودار جدید باز می‌کنید و از اشکال اصلی برای ساختن نمودار زمینه context استفاده می‌کنید. اشکالی را که نشان دهنده سیستم نرم افزاری شما هستند، از جمله کاربر ویا هر سیستم نرم افزاری متصل به سیستمی که در حال ترسیم آن هستید، بکشید و رها کنید. در حین کشیدن و رها کردن اشکال، برای افزودن متنی که اجزای نمودار شما را برچسب یا توصیف می کند، تایپ کنید. هر شکل در مدل های C4 معمولاً شامل موارد زیر است:

  • نام یک عنصر در نمودار شما
  • شرح مختصری از نقش یک سیستم، پایگاه داده، جزء یا کانتینر
  • فلش­هایی با توضیحاتی که نحوه تعامل عناصر با یکدیگر را توضیح می­دهد

هنگام کار بر روی نمودار زمینه خود، قوانین سبکی را تنظیم کنید که نحوه ترسیم نمودارهای یک مدل C4 را دیکته می­کند. برای مثال، می‌توانید سیستمی را که توضیح می‌دهید به رنگ آبی تیره‌تر استفاده کنید و کاربران شما نیز ممکن است رنگ متفاوتی داشته باشند. این قوانین یکپارچگی بصری ایجاد می­کند که به بینندگان اجازه می­دهد به سرعت هر نمودار را در ارتباط با یکدیگر بخوانند و درک کنند.

در این سطح می­توانید از اشکال زیر استفاده کنید:

مرحله 2: نمودار را برای سطح Container ترسیم می­کنیم.

هنگامی که متوجه شدید که سیستم شما چگونه با محیط در ارتباط است، یک گام بعدی این است که با نمودار Container مرز سیستم را بزرگنمایی کنیم. الان نسبت به سطح context با جزییات سیستم خود را شرح خواهیم داد.

این نمودار شکل سطح بالای معماری نرم افزار و نحوه توزیع مسئولیت­ها در سیستم مورد نیاز را نشان می­دهد. همچنین گزینه­های اصلی فناوری و نحوه ارتباط کانتینرها با یکدیگر را نشان می­دهد.

در این سطح می­توانید از اشکال زیر استفاده کنید:

مرحله 3: نمودار را برای سطح Component ترسیم می­کنیم.

در مرحله بعد می‌توانیم هر Container را بزرگ‌نمایی کرده و بیشتر تجزیه کنید تا بلوک‌های ساختمانی اصلی و تعاملات آن‌ها را شناسایی کنیم.

نمودار کامپوننت نشان می­دهد که چگونه یک کانتینر از تعدادی "مولفه" تشکیل شده است، هر یک از آن اجزا چیست، مسئولیت­های آنها و جزئیات فناوری و اجرای آنها چیست.

در این سطح می­توانید از اشکال زیر استفاده کنید:

مرحله 4: نمودار را برای سطح Code ترسیم می­کنیم.

در نهایت، می‌توانید روی هر مؤلفه بزرگ‌نمایی کنید تا نحوه پیاده‌سازی آن به‌عنوان کد را نشان دهید. با استفاده از نمودارهای کلاس UML، نمودارهای رابطه موجودیت یا موارد مشابه.

در این یک سطح، سطح جزئیات اختیاری و بر اساس درخواست است و اغلب از ابزارهایی برای رسم این سطح میتوان استفاده کرد. در حالت ایده‌آل، این نمودار به طور خودکار با استفاده از ابزار (به عنوان مثال یک ابزار مدل‌سازی IDE یا UML) تولید می‌شود، و شما باید فقط آن ویژگی‌ها و روش‌هایی را نشان دهید که به شما امکان می‌دهند داستانی را که می‌خواهید بگویید، نشان دهد.

مرحله 5: جمع آوری خروجی هر مرحله

الان در هر مرحله یک خروجی داریم، و چون به ترتیب انتزاع در سیستم بحث را بردیم جلو می توانیم بگوییم یک نمودار سلسله مراتبی داریم.

سطح Context سیستم گلستان
سطح Context سیستم گلستان


سطح Container  برای سیستم گلستان
سطح Container برای سیستم گلستان


سطح Component برای Single-Page Application
سطح Component برای Single-Page Application


سطح Code برای Sing In Controller
سطح Code برای Sing In Controller

جمعبندی

مدل C4 یک راه ساده برای برقراری ارتباط با معماری نرم افزار در سطوح مختلف انتزاعی است، به طوری که میتوانید داستان های مختلف را برای مخاطبان مختلف تعریف کنید. ما با مدل C4 با هر ZoomIn کردن با جزییات بیشتری مواجه خواهیم شد.

با استفاده از این مدل c4، با یک آشفتگی از جعبه‌ها و خطوط مواجه نخواهید شد و معماری نرم افزار خود را با بهترین شکل شرح خواهیم داد.

این مطلب، بخشی از تمرینهای درس معماری نرم‌افزار در دانشگاه شهیدبهشتی است.


مراجع:

c4model.com

Wikipedia

C4-Model

معماری_نرم_افزار_بهشتی
شاید از این پست‌ها خوشتان بیاید