طراحی نرم‌افزار

فرایند توسعه نرم‌افزار فرایندی پیچیده است که از بخش‌های مختلفی تشکیل شده است. یکی از بخش‌های حیاتی در فرایند توسعه نرم‌افزار، طراحی نرم‌افزار است. تلاش طراح نرم‌افزار این است که نیازهای کاربر را به شکلی قابل فهم به توسعه‌دهنده منتقل کند.

در این مقاله قصد داریم با فرایند طراحی نرم افزار، ویژگی‌ها و اهداف این فرایند و جایگاه این فرایند در چرخه عمر توسعه نرم‌افزار (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) و …، می‌توانید برای سیستم خود یک معماری با کارایی بالا طراحی کنید.

تفاوت طراحی نرم افزار با معماری نرم افزار

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

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

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

جمع‌بندی

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

الگوی طراحی Flyweight
الگوی طراحی Flyweight یک راه حل هوشمندانه برای مدیریت حافظه و بهبود کارایی برنامه‌هاست. در مواجهه با برنامه‌هایی که تعداد زیادی اشیا با اطلاعات مشابه ایجاد می‌کنند، الگوی Flyweight با اشتراک‌گذاری اطلاعات عمومی بین اشیا، به کاهش مصرف حافظه و بهبود عملکرد کمک می‌کند. این الگو از الگوهای Singleton و Factorymethod هم بهره می‌برد تا اشیا به صورت اشتراکی ایجاد[...]
بررسی الگوی طراحی Abstract Factory

بررسی الگوی طراحی Abstract Factory

نویسنده:رحیم لطفی

دسته بندی: طراحی نرم‌افزار
1402/09/15
1 نظر
7 دقیقه زمان مطالعه
الگوی طراحی Abstract Factory، جزء الگوهای طراحی سازنده (Creational) و هدف آن مدیریت ساخت اشیاء است. این الگوی طراحی نرم‌افزار به شما این امکان را می‌دهد که خانواده‌ای از اشیا مرتبط را بدون نیاز به ساخت کلاس‌های جداگانه و متعدد ایجاد کنید. Abstract Factory معمولا زمانی استفاده می‌شود که کاربر به صورت کامل از نوع شی‌ای که می خواهد ایجاد[...]
الگوی طراحی Facade

الگوی طراحی یا Facade چیست؟

نویسنده:رحیم لطفی و پویان فهیمی

دسته بندی: طراحی نرم‌افزار
1401/09/01
0 نظر
8 دقیقه زمان مطالعه
الگوی طراحی Facade، یکی از الگوی‌های کابردی در توسعه و طراحی نرم‌افزار است. Facade به معنی نمای خارجی یا بیرونی است. به عنوان مثال نمای خارجی یک ساختمان را در نظر بگیرید که جزئیات و پیچیدگی‌های داخلی را مخفی می‌کند. الگوی نما نیز به همین منظور استفاده می‌شود و پیچیدگی‌های یک سیستم با تعداد زیادی کلاس‌ را از دید کاربر[...]
الگوی طراحی Adapter

الگوی طراحی آداپتور Adapter چیست؟

نویسنده:رحیم لطفی

دسته بندی: طراحی نرم‌افزار
1401/03/03
1 نظر
5 دقیقه زمان مطالعه
الگوهای طراحی، انواع مختلفی دارند که شامل رایج‌ترین الگوها مانند پروتوتایپ، Factory و … می‌شوند. یکی دیگر از الگوهای شناخته‌شده طراحی نرم‌افزار، الگوی طراحی Adapter است. در این مقاله قصد داریم با مثال و قطعه کد، این الگو را بررسی کنیم. الگوی طراحی آداپتور یا تبدیل‌کننده (Adapter) چیست؟ همانطور که از اسم این الگو مشخص است، زمانی که دو کلاس[...]
الگوی طراحی Prototype

الگوی طراحی پروتوتایپ Prototype چیست؟

نویسنده:رحیم لطفی

دسته بندی: طراحی نرم‌افزار
1400/12/03
0 نظر
5 دقیقه زمان مطالعه
امروزه و در دنیای برنامه نویسی، همه چیز درباره هزینه‌ها است. صرفه‌جویی یک مسئله بزرگ در مهندسی نرم‌افزار محسوب می‌شود و ساخت اشیا از کلاس‌ها، یک گام پرهزینه است. برای بهبود کارایی، هنگامی در مورد ساخت اشیا از کلاس‌ها حرف می‌زنیم که یک الگوی طراحی بسیار جالب با ایده مناسبی وجود داشته باشد. ایده اصلی الگوی طراحی پروتوتایپ Prototype این[...]
Factory-Method

الگوی طراحی Factory Method چیست؟

نویسنده:رحیم لطفی

دسته بندی: طراحی نرم‌افزار
1400/07/18
0 نظر
10 دقیقه زمان مطالعه
الگوی طراحی Factory Method یکی از الگوهای دسته ایجادی است. مفهوم الگوی كارخانه، دقیقا از معنی لغوی آن مشخص است. كارخانه مكانی است كه در آن كالاها و محصولاتی تولید می‌شود و در بحث الگوهای طراحی، یك Factory كلاسی است كه نمونه‌هایی از كلاس‌های دیگر را با توجه به پارامترهایی كه برای آن ارسال می‌شود، ایجاد می‌كند. منظور از الگوی[...]
طراحی دامنه محور یا Domain Driven Design چیست؟

Domain Driven Design یا طراحی دامنه محور (DDD) چیست؟

نویسنده:الناز بکتاش

دسته بندی: طراحی نرم‌افزار
1400/05/27
0 نظر
12 دقیقه زمان مطالعه
مدتی است که تفکر طراحی دامنه محور یا Domain Driven Design در حوزه توسعه نرم افزار به شدت مورد توجه قرار گرفته است؛ رویکردی که به اختصار DDD نامیده می‌شود. در این مقاله از بلاگ آسا قصد داریم که در مورد تفکر و رویکرد DDD، آشنایی با مفاهیم آن و Subdomain, Domain, Bounded Context و Context Map صحبت کنیم. با[...]
الگوهای طراحی (Design Patterns) چیست؟

الگوهای طراحی یا دیزاین پترن (Design Patterns) چیست؟

نویسنده:رحیم لطفی

دسته بندی: طراحی نرم‌افزار
1400/04/15
0 نظر
15 دقیقه زمان مطالعه
کسانی که تجربه کافی در زمینه طراحی شی‌گرا نداشته باشند، وقت زیادی را در طراحی از دست می‌دهند؛ زیرا به دنبال این هستند که چه طرحی خوب و چه طرحی بد است و حتی بین کار مجبور می‌شوند طراحی را از اول شروع کنند. بهترین راه حل برای این مشکل، استفاده از تجربه دیگران یا الگوهای طراحی است. به مسائلی[...]