خانه /
فرایند توسعه نرمافزار فرایندی پیچیده است که از بخشهای مختلفی تشکیل شده است. یکی از بخشهای حیاتی در فرایند توسعه نرمافزار، طراحی نرمافزار است. تلاش طراح نرمافزار این است که نیازهای کاربر را به شکلی قابل فهم به توسعهدهنده منتقل کند.
در این مقاله قصد داریم با فرایند طراحی نرم افزار، ویژگیها و اهداف این فرایند و جایگاه این فرایند در چرخه عمر توسعه نرمافزار (SDLC) آشنا شویم. همچنین به مراحل لازم برای طراحی نگاهی میاندازیم.
طراحی نرمافزار (Software Design) فرایندی است که نیازهای کاربر را به یک سند قابل درک برای برنامهنویسها تبدیل میکند تا بتوانند از آن برای کدنویسی و پیادهسازی برنامه استفاده کنند.
در این فرایند باید نیازمندیهای کاربر و ذینفعان که در سند نیازمندی نرمافزار (SRS) جمعآوری شدهاند، به شکلی ترجمه شوند که برنامهنویس بتواند آنها را به کمک زبانهای برنامهنویسی پیادهسازی کند. یک طراح نرمافزار خوب باید با مهندسی نرمافزار و اصول برنامهنویسی هم آشنا باشد.
فاز طراحی نرمافزار اولین بخش از چرخه عمر توسعه نرمافزار است که در آن از حوزه مشکل به حوزه راهحل میرویم. به عبارتی تا قبل از این فاز در حال پیدا کردن مشکل هستیم و طراحی جایی است که ارائه راهحل شروع میشود.
در این فاز سیستم نرمافزاری را به شکل مجموعهای از اجزا (Components) و ماژولها میبینیم که رفتار و محدودیتهای هر کدام از آنها به خوبی تعریف شده است.
۶ هدف اصلی برای استفاده از طراحی نرمافزار در فرایند مهندسی و توسعه نرمافزار وجود دارد:
یک طراحی خوب باید صحیح باشد، یعنی ویژگیهای لازم سیستم را به درستی تعریف کرده باشد.
یک طراحی خوب باید بتواند با تغییرات مختلف سازگار شود. در واقع طراحی نرم افزار باید به شکلی باشد که بهینهسازی، مقیاسپذیری و ایجاد تغییرات در آن بدون نیاز به صرف وقت و هزینه زیاد و ایجاد مشکل در سیستم فعلی، ممکن باشد.
یک دیزاین خوب باید به خوبی پاسخگوی زمان، منابع و مشکلات بهینهسازی سیستم باشد.
برای اینکه یک دیزاین قابل فهم باشد، باید ماژولار بوده و در لایههای مختلف طراحی توزیع و مرتب شود.
یک طراحی باید تمام اجزای سیستم مثل ساختار، ماژولها، رابطها (اینترفیسها) و … را در بر بگیرد.
برای اینکه نرمافزار شما در طول زمان قابل نگهداری باشد، باید از اصول طراحی ماژولار و ساختارمند استفاده کنید.
مفاهیم در واقع ایدههای اصلی هستند که برای درک یک موضوع به ما کمک میکنند. مفاهیم طراحی نرمافزار هم به معنی ایدهها و اصول اولیه پشت طرح هستند. این مفاهیم به ما کمک میکنند تا برای طراحی نرمافزار، منطق و توسعه یک سیستم راهحل پیدا کنیم.
مفاهیم Software Design یک ساختار و مدل کمکی و در عین حال مهم را به ما میدهند تا بتوانیم یک سیستم درست را توسعه دهیم. در ادامه ۷ مفهوم را با هم بررسی میکنیم.
یکی از مفاهیم اساسی در برنامهنویسی شیگرا (OOP) طرح انتزاعی است. هدف اصلی این طرح انتزاعی، مدیریت پیچیدگی به کمک پنهان کردن جزئیات داخلی از کاربر است. این کار به کاربر کمک میکند تا بدون نیاز به درک پیچیدگیهای درونی سیستم، منطق قویتر و بهتری را بر اساس طرح انتزاعی ارائه بدهد.
ماژولار بودن به معنی شکستن یک سیستم یا پروژه به بخشهای کوچکتر است تا از پیچیدگی آن کم شود. در طراحی نرمافزار هم به تقسیم طرح کلی سیستم به بخشهای کوچکتر، سادهتر و با وابستگی کمتر، ماژولار میگویند. با تقسیم سیستم به بخشهای کوچک، میتوانید از این بخشها در چندین سیستم مختلف استفاده کنید.
با کمک معماری نرمافزار، میتوانید درباره طراحی رفتار و ساختار کلی سیستم تصمیم بگیرید. معماری به ذینفعان کمک میکند تا رفتار سیستم را در مواقع حیاتی مانند نیاز به تغییر، موارد امنیتی و دسترسپذیری بررسی و به درستی درک کنند.
معماری نرمافزار، نحوه ساخت اجزای یک سیستم و ارتباط بین آنها را هم مشخص میکند. در واقع معماری، طرح برنامه نرمافزار است که یک زیرساخت اولیه برای تیمهای توسعهدهنده فراهم میکند.
در لغت، پالایش به معنی رفع آلودگیها و ناخالصیها و بهبود کیفیت است. ایده پالایش طرح نرمافزاری، شامل فرایند ساخت و ارائه یک نرمافزار با جزئیات و توضیح بیشتر درباره عملکرد سیستم است. مرحله پالایش برای شناخت و پیشگیری از خطاهای احتمالی، بسیار مهم و حیاتی است.
الگوهای طراحی راهحلهای کلی با قابلیت استفاده مجدد هستند که برای حل مشکلاتی که به تکرار رخ دادهاند، ایجاد میشوند. این الگوها در واقع قالبهایی هستند که با کمک روشهایی که برنامهنویسهای با تجربه برای حل مشکلات رایج نرمافزاری استفاده میکنند، طراحی شدهاند.
الگوی طراحی در واقع یک طرح جامع را توضیح میدهد که برای حل چالشهای رایج سیستمهای شیگرا استفاده میشود. این طرح جامع شامل بیان مشکل، راهحل آن، زمان استفاده از الگو و عواقب احتمالی استفاده از آن است.
اگر بخواهیم خلاصه بگوییم، مفهوم پنهان کردن اطلاعات، به دنبال پوشاندن اطلاعاتی است که کاربران و افراد غیرمجاز، نباید آنها را ببینند. برای اینکار، ماژولهایی ساخته میشوند که اطلاعات آنها توسط ماژولهای دیگر قابل مشاهده نیست.
در فرایند بازسازی، هدف اصلی این است که بدون تاثیر روی عملکرد کد، آن را تغییر دهیم و بهینه کنیم. در بازسازی میخواهیم بدون تغییر در رفتار و عملکرد خارجی کد، نمود داخلی یا سورس کد را تمیز و بهینه کنیم. یکی از روشهایی که میتواند به ما در فرایند بازسازی کمک کند، کدنویسی تمیز یا استفاده از clean code است.
در طراحی نرمافزار، سه سطح یا پیچیدگی مختلف وجود دارد: طراحی براساس معماری، طراحی سطح بالا و طراحی با جزئیات.
معماری سیستم میتواند به عنوان ساختار کلی و عامل یکپارچگی مفهومی سیستم معرفی شود. در طراحی بر اساس معماری، نرمافزار به شکل یک سیستم با تعداد زیادی از اجزای مرتبط با هم تعریف میشود. در این سطح دیزاین، طراحی یک دید کلی از دامنه راهحلهای موجود به دست میآورد.
در این سطح از طراحی، بیشتر روی ماژولار بودن سیستم و ارتباطات داخلی آن تمرکز میکنیم. در این فاز مشکل به ماژولهای کوچک تبدیل شده و سپس نوع ارتباط و مسیر ارتباطی بین ماژولها تعریف میشود. خروجی این سطح طراحی، معماری برنامه است.
بعد از طراحی سطح بالا، نوبت به طراحی با جزئیات میرسد. در این مرحله هر ماژول به دقت بررسی میشود تا ساختار داده و الگوریتمهای آن به دست بیاید. خروجی این مرحله یک سند ویژگیهای ماژول است.
برای طراحی یک نرمافزار، باید ابتدا به این حوزه مسلط شوید؛ یعنی باید با اصول توسعه نرمافزار، مهندسی نرمافزار و … آشنا باشید. در حالت کلی، ۵ مرحله برای طراحی نرمافزار وجود دارد:
با داشتن دانش و طی کردن این مراحل، در کنار رعایت اصول و قواعد طراحی نرمافزار و استفاده از ابزارهای لازم مانند لوسید چارت (Lucidchart)، مایکروسافت ویزیو (Visio)، اتوکد (AutoCAD) و …، میتوانید برای سیستم خود یک معماری با کارایی بالا طراحی کنید.
معماری نرمافزار، مانند طرح و برنامه کلی برای ساخت یک سیستم است که به آن مفهوم و نظم میدهد. در واقع معماری، بودن یا نبودن اجزای مختلف، ارتباط بین اجزا و محیط عملیاتی لازم برای اجرای نرمافزار را مشخص میکند.
برخلاف معماری که اجزا و المانهای سیستم را مشخص میکند، تمرکز طراحی نرمافزار روی چگونگی ساخت سیستم است. در طراحی نرمافزار باید به شناخت مشکلات و نیازمندیها، روشهای توسعه سیستم و ویژگیهای ساختاری نرمافزار بپردازید.
هرچند این دو فرایند از نظر عملکردی با هم تفاوت دارند، اما برای اینکه یک سیستم بدون نقص داشته باشید، باید هم به معماری و هم به طراحی توجه کنید. این دو تعریف تقریبا در هم تنیدهاند و در بخشهای اشتراکاتی هم دارند.
در این مقاله با مفهوم کلی طراحی نرمافزار، اصول و ویژگیهای یک طراحی خوب و اینکه برای طراحی به چه ابزارهای نیاز داریم، آشنا شدیم. فراموش نکنید که طراحی نرمافزار شاید در ابتدا کمی وقتگیر به نظر برسد، اما توجه نکردن به این مرحله از چرخه عمر توسعه نرمافزار، میتواند در آینده هزینه و انرژی صرف شده برای بهبود سیستم را دو چندان کند.