طراحی نرمافزار
فرایند توسعه نرمافزار فرایندی پیچیده است که از بخشهای مختلفی تشکیل شده است. یکی از بخشهای حیاتی در فرایند توسعه نرمافزار، طراحی نرمافزار است. تلاش طراح نرمافزار این است که نیازهای کاربر را به شکلی قابل فهم به توسعهدهنده منتقل کند.
در این مقاله قصد داریم با فرایند طراحی نرم افزار، ویژگیها و اهداف این فرایند و جایگاه این فرایند در چرخه عمر توسعه نرمافزار (SDLC) آشنا شویم. همچنین به مراحل لازم برای طراحی نگاهی میاندازیم.
طراحی نرم افزار چیست؟
طراحی نرمافزار (Software Design) فرایندی است که نیازهای کاربر را به یک سند قابل درک برای برنامهنویسها تبدیل میکند تا بتوانند از آن برای کدنویسی و پیادهسازی برنامه استفاده کنند.
در این فرایند باید نیازمندیهای کاربر و ذینفعان که در سند نیازمندی نرمافزار (SRS) جمعآوری شدهاند، به شکلی ترجمه شوند که برنامهنویس بتواند آنها را به کمک زبانهای برنامهنویسی پیادهسازی کند. یک طراح نرمافزار خوب باید با مهندسی نرمافزار و اصول برنامهنویسی هم آشنا باشد.
فاز طراحی نرمافزار اولین بخش از چرخه عمر توسعه نرمافزار است که در آن از حوزه مشکل به حوزه راهحل میرویم. به عبارتی تا قبل از این فاز در حال پیدا کردن مشکل هستیم و طراحی جایی است که ارائه راهحل شروع میشود.
در این فاز سیستم نرمافزاری را به شکل مجموعهای از اجزا (Components) و ماژولها میبینیم که رفتار و محدودیتهای هر کدام از آنها به خوبی تعریف شده است.
اهداف اصلی طراحی نرم افزار
۶ هدف اصلی برای استفاده از طراحی نرمافزار در فرایند مهندسی و توسعه نرمافزار وجود دارد:
- صحت (Correctness):
یک طراحی خوب باید صحیح باشد، یعنی ویژگیهای لازم سیستم را به درستی تعریف کرده باشد.
- انعطافپذیری (Flexibility):
یک طراحی خوب باید بتواند با تغییرات مختلف سازگار شود. در واقع طراحی نرم افزار باید به شکلی باشد که بهینهسازی، مقیاسپذیری و ایجاد تغییرات در آن بدون نیاز به صرف وقت و هزینه زیاد و ایجاد مشکل در سیستم فعلی، ممکن باشد.
- کارایی و بهرهوری (Efficiency):
یک دیزاین خوب باید به خوبی پاسخگوی زمان، منابع و مشکلات بهینهسازی سیستم باشد.
- قابل فهم بودن (Understandability):
برای اینکه یک دیزاین قابل فهم باشد، باید ماژولار بوده و در لایههای مختلف طراحی توزیع و مرتب شود.
- کامل بودن (Completeness):
یک طراحی باید تمام اجزای سیستم مثل ساختار، ماژولها، رابطها (اینترفیسها) و … را در بر بگیرد.
- قابل نگهداری (Maintainable):
برای اینکه نرمافزار شما در طول زمان قابل نگهداری باشد، باید از اصول طراحی ماژولار و ساختارمند استفاده کنید.
مفاهیم (Concepts) در طراحی نرم افزار
مفاهیم در واقع ایدههای اصلی هستند که برای درک یک موضوع به ما کمک میکنند. مفاهیم طراحی نرمافزار هم به معنی ایدهها و اصول اولیه پشت طرح هستند. این مفاهیم به ما کمک میکنند تا برای طراحی نرمافزار، منطق و توسعه یک سیستم راهحل پیدا کنیم.
مفاهیم Software Design یک ساختار و مدل کمکی و در عین حال مهم را به ما میدهند تا بتوانیم یک سیستم درست را توسعه دهیم. در ادامه ۷ مفهوم را با هم بررسی میکنیم.
طرح کلی و انتزاعی (Abstraction)
یکی از مفاهیم اساسی در برنامهنویسی شیگرا (OOP) طرح انتزاعی است. هدف اصلی این طرح انتزاعی، مدیریت پیچیدگی به کمک پنهان کردن جزئیات داخلی از کاربر است. این کار به کاربر کمک میکند تا بدون نیاز به درک پیچیدگیهای درونی سیستم، منطق قویتر و بهتری را بر اساس طرح انتزاعی ارائه بدهد.
ماژولار بودن (Modularity)
ماژولار بودن به معنی شکستن یک سیستم یا پروژه به بخشهای کوچکتر است تا از پیچیدگی آن کم شود. در طراحی نرمافزار هم به تقسیم طرح کلی سیستم به بخشهای کوچکتر، سادهتر و با وابستگی کمتر، ماژولار میگویند. با تقسیم سیستم به بخشهای کوچک، میتوانید از این بخشها در چندین سیستم مختلف استفاده کنید.
معماری (Architecture)
با کمک معماری نرمافزار، میتوانید درباره طراحی رفتار و ساختار کلی سیستم تصمیم بگیرید. معماری به ذینفعان کمک میکند تا رفتار سیستم را در مواقع حیاتی مانند نیاز به تغییر، موارد امنیتی و دسترسپذیری بررسی و به درستی درک کنند.
معماری نرمافزار، نحوه ساخت اجزای یک سیستم و ارتباط بین آنها را هم مشخص میکند. در واقع معماری، طرح برنامه نرمافزار است که یک زیرساخت اولیه برای تیمهای توسعهدهنده فراهم میکند.
پالایش (Refinement)
در لغت، پالایش به معنی رفع آلودگیها و ناخالصیها و بهبود کیفیت است. ایده پالایش طرح نرمافزاری، شامل فرایند ساخت و ارائه یک نرمافزار با جزئیات و توضیح بیشتر درباره عملکرد سیستم است. مرحله پالایش برای شناخت و پیشگیری از خطاهای احتمالی، بسیار مهم و حیاتی است.
الگوهای طراحی (Design Patterns)
الگوهای طراحی راهحلهای کلی با قابلیت استفاده مجدد هستند که برای حل مشکلاتی که به تکرار رخ دادهاند، ایجاد میشوند. این الگوها در واقع قالبهایی هستند که با کمک روشهایی که برنامهنویسهای با تجربه برای حل مشکلات رایج نرمافزاری استفاده میکنند، طراحی شدهاند.
الگوی طراحی در واقع یک طرح جامع را توضیح میدهد که برای حل چالشهای رایج سیستمهای شیگرا استفاده میشود. این طرح جامع شامل بیان مشکل، راهحل آن، زمان استفاده از الگو و عواقب احتمالی استفاده از آن است.
پنهان کردن اطلاعات و داده (Information hiding)
اگر بخواهیم خلاصه بگوییم، مفهوم پنهان کردن اطلاعات، به دنبال پوشاندن اطلاعاتی است که کاربران و افراد غیرمجاز، نباید آنها را ببینند. برای اینکار، ماژولهایی ساخته میشوند که اطلاعات آنها توسط ماژولهای دیگر قابل مشاهده نیست.
بازسازی (Refactoring)
در فرایند بازسازی، هدف اصلی این است که بدون تاثیر روی عملکرد کد، آن را تغییر دهیم و بهینه کنیم. در بازسازی میخواهیم بدون تغییر در رفتار و عملکرد خارجی کد، نمود داخلی یا سورس کد را تمیز و بهینه کنیم. یکی از روشهایی که میتواند به ما در فرایند بازسازی کمک کند، کدنویسی تمیز یا استفاده از clean code است.
سطوح طراحی نرمافزار
در طراحی نرمافزار، سه سطح یا پیچیدگی مختلف وجود دارد: طراحی براساس معماری، طراحی سطح بالا و طراحی با جزئیات.
طراحی براساس معماری
معماری سیستم میتواند به عنوان ساختار کلی و عامل یکپارچگی مفهومی سیستم معرفی شود. در طراحی بر اساس معماری، نرمافزار به شکل یک سیستم با تعداد زیادی از اجزای مرتبط با هم تعریف میشود. در این سطح دیزاین، طراحی یک دید کلی از دامنه راهحلهای موجود به دست میآورد.
طراحی سطح بالا
در این سطح از طراحی، بیشتر روی ماژولار بودن سیستم و ارتباطات داخلی آن تمرکز میکنیم. در این فاز مشکل به ماژولهای کوچک تبدیل شده و سپس نوع ارتباط و مسیر ارتباطی بین ماژولها تعریف میشود. خروجی این سطح طراحی، معماری برنامه است.
طراحی با جزئیات
بعد از طراحی سطح بالا، نوبت به طراحی با جزئیات میرسد. در این مرحله هر ماژول به دقت بررسی میشود تا ساختار داده و الگوریتمهای آن به دست بیاید. خروجی این مرحله یک سند ویژگیهای ماژول است.
چگونه نرم افزار طراحی کنیم؟
برای طراحی یک نرمافزار، باید ابتدا به این حوزه مسلط شوید؛ یعنی باید با اصول توسعه نرمافزار، مهندسی نرمافزار و … آشنا باشید. در حالت کلی، ۵ مرحله برای طراحی نرمافزار وجود دارد:
- نیازمندیهای کاربران و ذینفعان خود را بشناسید
- با دقت به هر بخش و عملکرد و رفتاری که باید داشته باشد فکر کنید
- معماری را به بخشهای کوچکتر تقسیم کنید
- نمونه اولیه بسازید
- نیازمندیهای غیرعملکردی را هم بشناسید و آنها را به صورت کمّی تعریف کنید
با داشتن دانش و طی کردن این مراحل، در کنار رعایت اصول و قواعد طراحی نرمافزار و استفاده از ابزارهای لازم مانند لوسید چارت (Lucidchart)، مایکروسافت ویزیو (Visio)، اتوکد (AutoCAD) و …، میتوانید برای سیستم خود یک معماری با کارایی بالا طراحی کنید.
تفاوت طراحی نرم افزار با معماری نرم افزار
معماری نرمافزار، مانند طرح و برنامه کلی برای ساخت یک سیستم است که به آن مفهوم و نظم میدهد. در واقع معماری، بودن یا نبودن اجزای مختلف، ارتباط بین اجزا و محیط عملیاتی لازم برای اجرای نرمافزار را مشخص میکند.
برخلاف معماری که اجزا و المانهای سیستم را مشخص میکند، تمرکز طراحی نرمافزار روی چگونگی ساخت سیستم است. در طراحی نرمافزار باید به شناخت مشکلات و نیازمندیها، روشهای توسعه سیستم و ویژگیهای ساختاری نرمافزار بپردازید.
هرچند این دو فرایند از نظر عملکردی با هم تفاوت دارند، اما برای اینکه یک سیستم بدون نقص داشته باشید، باید هم به معماری و هم به طراحی توجه کنید. این دو تعریف تقریبا در هم تنیدهاند و در بخشهای اشتراکاتی هم دارند.
جمعبندی
در این مقاله با مفهوم کلی طراحی نرمافزار، اصول و ویژگیهای یک طراحی خوب و اینکه برای طراحی به چه ابزارهای نیاز داریم، آشنا شدیم. فراموش نکنید که طراحی نرمافزار شاید در ابتدا کمی وقتگیر به نظر برسد، اما توجه نکردن به این مرحله از چرخه عمر توسعه نرمافزار، میتواند در آینده هزینه و انرژی صرف شده برای بهبود سیستم را دو چندان کند.