اصول solid پنج اصل طلایی در طراحی شیگرا هستند که به توسعهدهندگان کمک میکنند تا کدهایی تمیز، قابل توسعه، انعطافپذیر و با قابلیت نگهداری بالا بنویسند. رعایت اصول solid کمک میکنند تا نرمافزاری بسازید که به سادگی قابل توسعه باشد و تغییرات در آن بدون دردسر انجام شود. شرایطی را تصور کنید که کدهایی که امروز با زحمت زیاد نوشتهاید، چند ماه دیگر تبدیل به کابوسی بزرگ برای تغییر یا توسعه شوند. گاهی اوقات یک تغییر کوچک میتواند عملکرد کلی برنامه را با اشکال مواجه کند. در نتیجه، برای برطرف کردن مشکل نیاز است که زمان زیادی را صرف کنید. این مشکلی رایج است که بسیاری از توسعهدهندگان هنگام کار بر روی پروژههای بزرگ با آن مواجه میشوند. راهحل برطرف کردن این مشکل استفاده از اصول solid در سی شارپ برای طراحی نرمافزار است.
آنچه در این مطلب میآموزید:
-
با اصول SOLID در طراحی نرمافزار و کاربرد آنها در زبان سیشارپ آشنا خواهید شد.
-
برای هر اصل، مثالهایی واقعی از دنیای برنامهنویسی را بررسی خواهید کرد.
-
میآموزید چگونه این اصول به بهبود کیفیت طراحی و توسعهپذیری کمک میکنند.
-
با چالشهای رایج در طراحی نادرست نرمافزار و پیامدهای رعایتنکردن اصول SOLID آشنا میشوید.
-
راهکارهای اصلاح طراحی و جلوگیری از شکست پروژهها در اثر ضعف معماری را خواهید آموخت.

بر همین اساس در این مطلب از مجله فرادرس به زبان ساده و کاملاً عملی با مثالهای واقعی اصول solid در سی شارپ آموزش داده شده است. برای درک بهتر اصول solid ابتدا هر کدام از اصول solid به همراه چالشی که حل میکنند، توضیح داده میشوند. سپس، با کدهای سی شارپ نحوه پیادهسازی این اصول در پروژههای عملی نشان داده میشود.
اصول solid در سی شارپ چیست؟
اصول solid پنج اصل در طراحی نرمافزار هستند که به توسعهدهندگان در برطرف کردن مشکلات طراحی نرمافزار کمک میکنند. توسعهدهندگان با رعایت این اصول میتوانند نرمافزارهایی با کیفیت، انعطافپذیر، خوانا و با قابلیت استفاده مجدد بنویسند. برای آشنایی بیشتر با اصول سالید میتوانید فیلم آموزش اصول طراحی SOLID در سی شارپ از فرادرس را مشاهده کنید که لینک آن در ادامه آورده شده است.
اصول solid نخستین بار توسط رابرت سی مارتین در اوایل دهه ۲۰۰۰ میلادی (۱۳۸۰ شمسی) معرفی شدند. هدف از ارائه اصول solid ترویج و بهکارگیری شیوههای درست در «برنامه نویسی شیگرا» (Object-Oriented Programming | OOP) بود. به زبان ساده، توسعهدهندگان با رعایت اصول solid میتوانند مشکلات رایج ناشی از رشد و پیچیدگی سیستمهای نرمافزاری را برطرف کنند. سی شارپ یک زبان برنامه نویسی شیگرا است که اگر قصد توسعه نرمافزار با این زبان برنامه نویسی را دارید، باید با اصول solid در سی شارپ آشنا باشید. در ادامه اصول solid در سی شارپ آورده شدهاند.
- «اصل تک مسئولیتی» (Single Responsibility Principle | SRP)
- «اصل باز – بسته» (Open/Closed Principle | OCP)
- «اصل جایگزینی لیسکوف» (Liskov Substitution Principle | LSP)
- «اصل جداسازی اینترفیسها» (Interface Segregation Principle | ISP)
- «اصل وارونگی وابستگی» (Dependency Inversion Principle | DIP)
در ادامه این بخش هر کدام از اصول ارائه شده در بالا را مورد بررسی قرار خواهیم داد.

اصل تک مسئولیتی در اصول solid در سی شارپ
اصل تک مسئولیتی به این نکته مهم اشاره میکند که هر کلاس فقط و فقط باید یک مسئولیت یا هدف داشته باشد. به زبان ساده، بر مبنای این اصل باید کلاسهایی متمرکز ایجاد کرد که تنها یک وظیفه واحد و مشخص را انجام دهند. پیادهسازی کلاسهایی که چندین کار مختلف را انجام میدهند با این اصل در تضاد است. تقسیم کردن کلاسها به واحدهایی کوچکتر درک، نگهداری و آزمایش کد را در آینده آسانتر میکند.
اصل مسئولیت واحد بیان میکند که هر کلاس باید فقط یک دلیل برای تغییر داشته باشد. به بیان سادهتر، اگر نیاز به تغییر در یک بخش از نرمافزار وجود داشته باشد آنگاه فقط یک کلاس باید تغییر کند.
مثالی از دنیای واقعی برای اصل تک مسئولیتی
در ادامه برای درک بهتر اصل تک مسئولیتی مثالی از دنیای واقعی آورده شده است. یک رستوران فرضی را در نظر بگیرید. در این رستوران کارکنان مختلف هر کدام یک مسئولیت مشخص دارند.
- سرآشپز: مسئولیت پختن غذا را برعهده دارد.
- پیش خدمت: غذا مشتریها را تحویل میدهد.
- صندوقدار: مسئولیت تسویه حساب مشتریان را برعهده دارد.
- نظافتچی: میزهای رستوران را تمیز میکند.
در این شرایط تمامی کارها به درستی پیش میروند و اختلالی در عملکرد کارکنان نیز دیده نمیشود. حالا شرایطی را در نظر بگیرید که آشپز رستوران هم غذا بپزد، هم سفارش مشتریان را تحویل دهد و مسئولیت تسویه حساب مشتریان را نیز برعهده داشته باشد. همچنین، میزهای رستوران را نیز تمیز کند. در این شرایط اتفاقات زیر رخ خواهد داد.
- نظم رستوران از بین میرود و کارها قاطی میشوند.
- اگر مشکلی در هر بخش رخ دهد، باید تمام بخشها تغییر کنند.
- پیدا کردن مشکل نیز سخت خواهد شد.

اصل باز – بسته در اصول solid در سی شارپ
این اصل بیان میکند که موجودیتهای نرمافزاری همچون کلاسها، توابع، ماژولها و سایر موارد دیگر باید برای توسعه باز و برای اصلاح بسته باشند. در واقع، این اصل به این نکته اشاره دارد که برنامه باید بتواند بدون تغییر کد اصلی توسعه پیدا کند. برای رسیدن به این هدف نیز توصیه میکند که کد موجود باید از انتزاع، «چندریختی» (Polymorphism) و وراثت برای توسعه استفاده کند. برای آشنایی بیشتر با اصول برنامه نویسی شیگرا در سی شارپ میتوانید فیلم آموزش شی گرایی در سی شارپ از فرادرس را مشاهده کنید که لینک آن در ادامه آورده شده است.
در نقطه مقابل، کد موجود برای تغییر باید بسته باشد، یعنی نباید کد برای افزودن ویژگیهای جدید دستکاری شود تا از ایجاد خطا برای بخشهای با عملکرد صحیح جلوگیری شود.
چرا باید از اصل باز – بسته استفاده کنیم؟
از جمله مهمترین مزایای اصل باز – بسته به موارد زیر میتوان اشاره کرد.
- کاهش ریسک خرابی سیستم: کد فعلی برای افزودن قابلیتهای جدید تغییر نمیکند و تنها ماژولهای جدید اضافه میشوند. در نتیجه، احتمال خرابی سیستم کم خواهد شد.
- توسعه سریعتر: ماژولهای جدید مستقل از کد قبلی هستند و توسعه برنامه سریعتر انجام میشود.
- قابلیت نگهداری آسان: ماژولهای اضافه شده جداگانه هستند و در نتیجه، امکان خطایابی سریعتر وجود خواهد داشت.
- تست آسان برنامه: به دلیل مستقل بودن ماژولها تست واحد سریعتر انجام میشود و نیازی به اجرای کل سیستم نیست.
مثالی از دنیای واقعی برای اصل باز – بسته
برای درک بهتر اصل باز – بسته از اصول solid به مثال زیر توجه کنید. یک پریز برق که روی دیوار خانه نصب شده است را در نظر بگیرید. این پریز دقیقاً اصل باز و بسته را رعایت میکند.
- بسته برای تغییر: بعد از نصب پریز بر روی دیوار دیگر سیمکشی داخلی آن را تغییر نمیدهید. برای تغییر سیمکشی باید دیوار را خراب کنید که کاری خطرناک و پرهزینه است.
- باز برای توسعه: بدون نیاز به تغییر پریز و تنها با استفاده از سوکت استاندارد میتوانید هر وسیله برقی جدیدی همچون شارژر موبایل، لپ تاپ، تلویزیون و سایر موارد دیگر را به آن وصل کنید.
در مثال بالا، پریز برق کد موجود را نشان میدهد که نباید تغییر کند. همچنین، وسایل برقی جدید نیز نقش ماژولهای اضافه را دارند. اگر اصل باز – بسته در این مثال رعایت نشود، برای هر وسیله برقی جدید باید پریز را تغییر داد. به عنوان مثال، برای شارژر موبایل، لپ تاپ یا سایر وسایل دیگر باید پریزهای جدیدی نصب کرد. در نتیجه، خانه پُر از پریزهای متنوع خواهد شد که با هر تغییر خطر برق گرفتگی وجود خواهد داشت.
اصل جایگزینی لیسکوف در اصول solid در سی شارپ
این اصل بیان میکند که هر کلاس مشتق شدهای را باید بتوان به جای کلاس والد استفاده کرد و کاری کرد که این کلاس بدون تغییر به همان شیوه کار کند. در واقع، هر شی از یک زیر کلاس باید دقیقاً رفتاری مشابه با شی از کلاس والد داشته باشد تا هر کد نوشته شده از روی کلاس والد بدون تغییر با زیرکلاس نیز کار کند.

به زبان ساده، بر اساس اصل جایگزینی لیسکوف اگر در برنامهای کلاسB از کلاسA ارثبری کند، آنگاه باید بتوان در هر بخشی از کد کلاسA را با کلاسB جایگزین کرد و از همه مهمتر عملکرد برنامه نیز دچار اختلال نشود. در مجموع میتوان گفت که اصل جایگزینی لیسکوف درباره سازگاری رفتاری در ارثبری است. این بدین معنا است که زیرکلاسها باید بتوانند بدون ایجاد مشکل جایگزین کلاسهای پایه شوند. با رعایت این اصل در برنامه کد نوشته شده قابل اعتمادتر و منعطفتر خواهد بود. پیشتر در مطلب زیر مفهوم ارثبری در سی شارپ به صورت کامل مورد بررسی قرار گرفته است.
چرا باید از اصل جایگزینی لیسکوف استفاده کرد؟
سادهترین تعریف برای اصل جایگزینی لیسکوف این است که اگر کلاسA قادر به انجام کاری مشخص است، آنگاه تمام کلاسهای ارثبری شده از این کلاس نیز باید بتوانند این کار را انجام دهند. در واقع، اگر زیرکلاسی همانند والد خود رفتار نکند یا رفتار جدیدی به صورت ناگهانی از خود بروز دهد، آنگاه اصل جایگزینی لیسکوف نقض شده است. برقرار بودن اصل جایگزینی لیسکوف در برنامه مزایای زیر را به همراه دارد.
- قابلیت نگهداری بالا
- کاهش باگ و خطا
- گسترش راحتتر قابلیتها
- خوانایی و سادگی
- تستپذیری بهتر برنامه
به صورت خلاصه نیز میتوان عنوان کرد که اصل جایگزینی لیسکوف باعث میشود که زیرکلاسها در برنامه قابل جایگزینی باشند و منطق کلی برنامه حفظ شود. نتیجه رعایت این اصل کدهایی تمیزتر، قابل اعتمادتر و راحتتر برای توسعه و نگهداری خواهد بود.
مثالی از دنیای واقعی برای اصل جایگزینی لیسکوف
به منظور درک بهتر اصل جایگزینی لیسکوف شرایطی را در نظر بگیرید که برای در ورودی خانه یک کلید اصلی دارید. این کلید دو ویژگی مهم زیر را دارد.
- در را باز میکند.
- در را قفل میکند.
در همین حال یک کلید جایگزین یا یدک برای سایر اعضای خانواده میسازید. بر اساس اصل جایگزینی لیسکوف کلید یدک باید بدون مشکل جایگزین کلید اصلی شود و کارهای زیر را انجام دهد.
- در صورت قفل بودن در را باز کند.
- اگر در باز باشد، آن را قفل کند.
این کلید یدک هیچ گونه رفتار غیر منتظرهای از خود نشان نمیدهد و تمام انتظارات از یک کلید را برآورده میسازد. بنابراین، حتی در صورت گم شدن کلید اصلی نیز میتوان با خیال راحت از کلید یدک استفاده کرد. در این مثال کلید اصلی در نقش کلاس والد و کلید یدک نیز در نقش زیرکلاس مشتق شده عمل میکند.
اصل جداسازی اینترفیسها در اصول solid در سی شارپ
بر اساس این اصل هیچ کلاسی نباید اینترفیسهایی را پیادهسازی کند که به آنها نیازی ندارد. در واقع، بر اساس این اصل به جای تعریف یک اینترفیس شلوغ بهتر است که چندین اینترفیس کوچک با عملکردهای مشخص در برنامه تعریف شوند. به منظور درک بهتر اصل جداسازی اینترفیسها در اصول SOLID میتوانید فیلم آموزش اصول طراحی SOLID در سی شارپ از فرادرس را مشاهده کنید که لینک آن در ادامه آورده شده است.
اگر با مفهوم اینترفیس در برنامه نویسی آشنایی زیادی ندارید، باید عنوان کرد که اینترفیسها برای تعیین رفتار کلاس مورد استفاده قرار میگیرند و کلاس باید آنها را پیادهسازی کند. به زبان ساده، اینترفیس مشخص میکند که چه کاری باید انجام شود، اما چگونگی انجام آن را به عهده کلاسهای پیادهسازی کننده میگذارد. در یک کلام اینترفیس را میتوانید همانند نقشه فنی برای ساخت یک دستگاه در نظر بگیرید که:
- این نقشه جزئیات دستگاه و قابلیتهای آن را مشخص میکند.
- اما این نقشه چگونگی ساخت قطعات دستگاه را مشخص نمیکند.
مثالی از دنیای واقعی برای اصل جداسازی اینترفیسها
برای درک بهتر اصل جداسازی اینترفیسها شرایطی را در نظر بگیرید که شرکت تولیدکننده وسایل آشپزخانه دستگاهی همهکاره را طراحی کرده است که تمام عملکردهای زیر را به صورت همزمان ارائه میکند.
- آبمیوهگیر
- قهوهساز
- تست نان
مشکلی که در اینجا وجود دارد این است که مشتریانی داریم که فقط یک دستگاه آبمیوهگیری ساده نیاز دارند، ولی با خرید این دستگاه گزینههای قهوهساز و تست نان را هم در اختیار دارند که به آنها نیازی ندارند و از آنها استفاده نمیکنند. در واقع، این دستگاه همهکاره اصل جداسازی اینترفیسها را نقض میکند. برای حل این مشکل باید ۳ دستگاه تخصصی به صورت جداگانه ساخته شود.
- یک دستگاه آبمیوهگیر
- یک دستگاه قهوهساز
- یک دستگاه تست نان
با تفکیک دستگاهها در مثال بالا اصل جداسازی اینترفیسها به صورت کامل رعایت میشود. رعایت این اصل از پیچیدگی سیستم جلوگیری میکند و خطاها را نیز به میزان قابل توجهی کاهش میدهد.

چرا باید از اصل جداسازی اینترفیسها استفاده کرد؟
این اصل به زبان ساده بیان میکند که هر کلاس تنها باید اینترفیسهایی را پیادهسازی کند که به آنها نیاز دارد. رعایت این اصل مهم مزایای زیر را به همراه دارد.
- سادگی، خوانایی و شفافیت کد
- جلوگیری از پیادهسازی متدهای غیرضروری
- انعطافپذیری بیشتر در توسعه
- تست آسان
به شکل خلاصه در یک کلام رعایت این اصل موجب میشود که کد نوشته شده تمیزتر، قابل فهمتر، تستپذیرتر و قابل توسعهتر باشد.
اصل وارونگی وابستگی در اصول solid در سی شارپ
اصل وارونگی وابستگی یکی دیگر از اصول مهم solid است. این اصل به موارد زیر اشاره میکند.
- ماژولهای سطح بالا نباید به صورت مستقیم به ماژولهای سطح پایین وابسته باشند.
- تمام ماژولهای برنامه هم سطح بالا و هم سطح پایین باید به یک انتزاع وابسته باشند.
- انتزاعها نباید به جزئیات وابسته باشند، بلکه جزئیات باید به انتزاعها وابسته باشند.
به بیانی دیگر اصل وارونگی وابستگی عنوان میکند که وابستگیهای برنامه را باید به سمت اینترفیسها یا کلاسهای انتزاعی هدایت کرد و از پیادهسازی آنها خودداری کرد. بر اساس اصل وارونگی وابستگی اجزای سیستم نباید به صورت مستقیم به هم وابسته باشند، بلکه باید به یک استاندارد مشترک (کلاس انتزاعی یا اینترفیس) وابسته شوند.
مثالی از دنیای واقعی برای اصل وارونگی وابستگی
برای درک بهتر مفهوم اصل مهم وارونگی وابستگی به مثال زیر توجه کنید. یک پریز برق و دستگاههای برقی مختلف همچون یخچال، موبایل، تلویزیون و لپ تاپ را در نظر بگیرید. به طور قطع هر کدام از وسیلههای برقی ذکر شده برای عملکرد صحیح باید به پریز برق وصل شوند. در این حالت سناریوهای زیر رخ خواهد داد.
- بدون رعایت اصل وارونگی وابستگی: در این شرایط هر وسیله برقی به پریز مخصوص خود نیاز دارد. به عنوان مثال، موبایل، تلویزیون و یخچال هر کدام باید به پریز جداگانهای متصل شوند. مشکلی که در این حالت رخ میدهد این است که در صورت تغییر پریز تمام وسایل برقی نیز باید عوض شوند. همچنین، باید چندین پریز مختلف در خانه برای هر وسیله قرار داد.
- با رعایت اصل وارونگی وابستگی: در این حالت یک پریز استاندارد تعریف میشود که تمام وسایل برقی مطابق با این استاندارد ساخته میشوند. تمام پریزهای ساخته شده استاندارد مورد نظر را رعایت میکنند. در نتیجه، هر وسیله برقی را میتوان به پریز متصل کرد و در صورت خراب شدن پریز میتوان آن را با پریز دیگری جایگزین کرد.
به صورت خلاصه اصل وارونگی وابستگی میگوید که وقتی دو قطعه باید با هم کار کنند، به جای وابسته کردن مستقیم آنها به یکدیگر باید یک قرارداد مشترک (اینترفیس) بین آنها مشخص کرد.
مزایای استفاده از اصل وارونگی وابستگی چیست؟
اصل وارونگی وابستگی بیان میکند که به جای وابستگی به چیزهای جزئی و خاص به یک ایده کلی وابسته باشید تا بتوانید بدون دردسر اجزای سیستم را عوض کنید یا گسترش دهید. رعایت این اصل سبب میشود تا قطعات با استاندارد مشترک به هم متصل شوند و میتوان هر قطعه را بدون تغییر کل ساختار جایگزین کرد. از جمله مهمترین مزایای اصل وارونگی وابستگی به موارد زیر میتوان اشاره کرد.
- کاهش وابستگی شدید
- انعطافپذیری بیشتر
- قابلیت استفاده مجدد
- نگهداری و توسعه آسان
در مجموع، رعایت این اصل زمان و هزینه توسعه برنامه را به میزان قابل توجهی کاهش میدهد.

چرا بسیاری از برنامه ها شکست می خورند؟
توسعهدهندگان برنامهها و نرمافزارهای متعددی را بر اساس تجربه و دانش خود توسعه میدهند. اما همین برنامهها که در ابتدا عملکرد بسیار خوبی دارند، با گذشت زمان با اشکالات و باگهای متعددی روبرو میشوند. همچنین، گاهی اوقات نیاز است که قابلیتهای جدیدی به برنامه اضافه شود. در این شرایط باید تغییراتی در کد نویسی و طراحی برنامه صورت گیرد.
از سویی دیگر، تغییرات بخشی جدایی ناپذیر از فرایند توسعه نرمافزار هستند و زمانی این تغییرات تبدیل به چالش میشوند که برای انجام سادهترین موارد آنها نیز باید کارهای زیادی انجام داد. در واقع، برای انجام یک تغییر ساده در برنامه باید دانش کاملی از عملکرد کلی سیستم داشت و زمان زیادی را برای اعمال آن تغییر صرف کرد. در این شرایط تمام اشکالات به نحوه طراحی برنامه باز میگردد. در واقع، طراحی برنامه در ابتدا به گونهای صورت گرفته است که اکنون برای انجام هر تغییر توسعهدهنده با چالشهای متعددی روبرو میشود. بنابراین، طراحی اصولی برنامه بسیار حائز اهمیت است و باید به شکلی صورت گیرد که خطایابی یا اعمال تغییرات در برنامه در کوتاهترین زمان و با صرف کمترین انرژی انجام شود.
رعایت نکردن چه مواردی در طراحی نرمافزار باعث بروز خطا می شود؟
همان طور که اشاره شد، طراحی برنامه از اهمیت بسیار بالایی برخوردار است و رعایت اصول طراحی از بروز خطاهای پیشبینی نشده در آینده جلوگیری میکنند. همچنین، طراحی صحیح نرمافزار امکان افزودن ویژگیهای جدید به برنامه بدون نیاز به بازنویسی تمام کدها را فراهم میکند. برای آشنایی بیشتر با معماری نرمافزار میتوانید فیلم آموزش رایگان معماری نرم افزار چیست از فرادرس را مشاهده کنید که لینک آن در ادامه آورده شده است.
علاوه بر این، در نظر نگرفتن برخی موارد در طراحی نرمافزار موجب آسیب به برنامه میشوند. رعایت نکردن موارد زیر در طراحی نرمافزار سبب بروز خطا در برنامه خواهند شد.
- اختصاص عملکردهای زیاد به یک کلاس: اختصاص مسئولیتهای بسیار به یک کلاس موجب اختلال در عملکرد کلاس میشود. در واقع، نباید عملکردهای زیادی را به یک کلاس اختصاص داد و این عملکردها باید بین چندین کلاس مختلف تقسیم شوند.
- وابستگی کلاسها به یکدیگر: وابسته کردن کلاسها به یکدیگر باعث میشود که انجام تغییرات در یک کلاس بر عملکرد سایر کلاسها تاثیر بگذارد.
- کدهای تکراری: نوشتن کدهای تکراری در بخشهای مختلف برنامه موجب بروز خطا در آینده خواهد شد.

چه راه حل هایی برای طراحی صحیح برنامه وجود دارد؟
برای جلوگیری از بروز خطا در آینده باید ساختار برنامه در شروع کار به گونهای صحیح طراحی شود. بر همین اساس راه حلهای متعددی برای طراحی ساختار برنامه وجود دارد که در ادامه به آنها اشاره شده است.
- انتخاب معماری صحیح: امروزه الگوهای معماری متعددی برای ساخت برنامهها وجود دارند. از جمله مهمترین الگوهای معماری میتوان به معماری لایهای، MVC ،MVVP و سایر موارد دیگر اشاره کرد.
- رعایت اصول SOLID و DRY: رعایت اصول SOLID در طراحی کلاسها و اصل «خودت را تکرار نکن» (Dont Repeat Yourself | DRY) به منظور جلوگیری از تکرار کد تاثیر زیادی در بهبود عملکرد برنامه دارند.
- انتخاب الگوهای طراحی مناسب: با توجه به نوع برنامه مورد توسعه و مشخصات آن باید الگوهای طراحی صحیحی را انتخاب کرد تا بهترین نتیجه حاصل شود.
- توسعه مبتنی بر تست: به منظور تضمین عملکرد و سازگاری برنامه باید تستهای مختلفی همچون «تست واحد» (Unit Test)، «تست یکپارچهسازی» (Integration Test) و «تستهای رفتاری» (Behavior-Driven Test) برای برنامه نوشته شود.
- مستندسازی و ارتباط تیمی: استفاده از ابزارهای مختلف به منظور مستندسازی فرایند توسعه و داشتن ارتباط قوی با سایر اعضای تیم توسعه تاثیر زیادی در طراحی صحیح برنامه دارند.
علاوه بر راه حلهای ارائه شده در بالا، موارد دیگری نیز وجود دارند که توجه به آنها برای طراحی صحیح برنامه ضروری است.

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

زبان برنامه نویسی سی شارپ به عنوان یک زبان محبوب و با کاربردهای متعدد شناخته میشود. سی شارپ در حوزههای مختلفی از ساخت اپلیکیشن موبایل و دسکتاپ گرفته تا ساخت بازی و طراحی سایت کاربرد دارد. بنابراین، یادگیری سی شارپ میتواند فرصتهای شغلی متعددی را برای علاقهمندان فراهم کند. با توجه به همین مورد نیز آموزشهای سی شارپ در فرادرس حوزههای مختلف از بازی سازی گرفته تا طراحی وب و سایر موارد دیگر را شامل میشوند. در ادامه تعدادی از دورههای موجود در مجموعه آموزش برنامه نویسی سی شارپ فرادرس آورده شده است.
با مراجعه به سایت فرادرس ضمن مشاهده دورههای ارائه شده در بالا میتوانید از سایر آموزشهای مفید و کاربردی موجود دیدن کنید.
آموزش اصول solid در سی شارپ با مثال عملی
درک صحیح اصول solid و استفاده از آنها در طراحی نرمافزار به توسعهدهندگان کمک میکند تا برنامههایی قابل توسعه و با کیفیت بسازند. هر کدام از اصول solid به منظور حل مسئله مشخصی ارائه شدهاند و یکی از چالشهای توسعه را برطرف میکنند.
بعد از آشنایی با اصول solid و درک چرایی آنها در این بخش در قالب مثال عملی به بررسی اصول solid در سی شارپ خواهیم پرداخت. بر همین اساس نحوه پیادهسازی هر کدام از اصول solid در برنامههای سی شارپ آموزش داده شده است.
مثال عملی اصل تک مسئولیتی در اصول solid در سی شارپ
بر اساس اصل تک مسئولیتی هر کلاس یا ماژول در برنامه فقط باید یک مسئولیت خاص را برعهده داشته باشد. اگر یک کلاس چندین وظیفه را برعهده داشته باشد، آنگاه تغییر در یکی از وظایف سبب بروز مشکل در وظایف دیگر میشود. برای درک بهتر این اصل به مثال زیر توجه کنید.
در مثال بالا کلاسOrder مسئولیت مدیریت سفارشات را برعهده دارد. این کلاس ۳ مسئولیت مختلف یعنی محاسبه قیمت، ذخیرهسازی و ارسال ایمیل را به صورت همزمان انجام میدهد. در صورت نیاز به تغییر روش ذخیرهسازی اطلاعات باید کلاسOrder تغییر کند. همچنین، در صورت تغییر قالب ایمیل نیز مجدد باید کلاسOrder را تغییر داد. بر همین اساس این کلاس اصل تک مسئولیتی از اصول solid را نقض میکند.

نمونه کلاس اصلاح شده بر اساس اصل تک مسئولیتی
برای برقرار شدن اصل تک مسئولیتی باید وظایف کلاس را به صورت جداگانه تعریف کرد. بر همین اساس کلاسهای زیر باید تعریف شوند.
در مثال بالا کلاسOrder برای مدیریت سفارش، کلاسOrderRepository برای ذخیرهسازی اطلاعات و کلاسEmailService برای ارسال ایمیل تعریف شدهاند. هر کلاس در مثال بالا تنها یک مسئولیت دارد. بنابراین، اصل تک مسئولیتی از اصول solid در سی شارپ رعایت شده است.
مثال عملی اصل باز – بسته در اصول solid در سی شارپ
اصل باز – بسته از اصول solid بیان میکند که موجودیتهای نرمافزاری همچون کلاسها، توابع و ماژولها باید برای توسعه باز و برای تغییر بسته باشند. به زبان ساده برای افزودن قابلیتهای جدید به برنامه نباید کد اصلی تغییر کند. برای درک بهتر این مفهوم قطعه کد زیر را در نظر بگیرید.
در مثال بالا کلاسSalaryCalculator حقوق کارمندان را بر اساس نوع کارمند (تمام وقت یا پاره وقت) محاسبه میکند. برای اضافه کردن یک نوع کارمند جدید به عنوان مثال کارمند قراردادی باید کد تغییر کند. در نتیجه، این کلاس اصل باز – بسته از اصول solid در سی شارپ را نقض میکند.
نمونه کلاس اصلاح شده بر اساس اصل باز – بسته
با استفاده از مفاهیم پلی مورفیسم و وراثت در برنامه نویسی شیگرا میتوان این مشکل را برطرف کرد و کد را به گونهای نوشت که اصل باز – بسته از اصول solid رعایت شود.
در مثال بالا یک کلاس پایه از نوعEmployee تعریف شده است. بنابراین، برای اضافه کردن یک نوع کارمند جدید کافی است تا یک کلاس جدید تعریف شود و این کلاس از کلاسEmployee ارثبری کند. در نتیجه، کد برای توسعه نیازی به تغییر ندارد و اصل باز – بسته از اصول solid در این کد رعایت شده است.
مثال عملی اصل جایگزینی لیسکوف در اصول solid در سی شارپ
اصل جایگزینی لیسکوف بیان میکند که هر کلاس پایه باید بتواند بدون مشکل با کلاس مشتق شده خود جایگزین شود. به بیانی دیگر، زیر کلاسها نباید رفتاری غیر منتظره از خود نشان دهند. این اصل اطمینان حاصل میکند که وراثت به درستی در برنامه پیادهسازی شود. به منظور آشنایی بیشتر با مفاهیم ارثبری در سی شارپ میتوانید فیلم آموزش وراثت در شی گرایی سی شارپ در فرادرس را مشاهده کنید که لینک آن در ادامه آورده شده است.
برای درک بهتر مفهوم اصل جایگزینی لیسکوف به مثال زیر توجه کنید.
در مثال بالا اینترفیسIVehicle تعریف شده است که دارای متدDrive() برای حرکت روی جاده و متدSail() برای حرکت روی آب است. سپس، کلاسCar و کلاسBoat از این اینترفیس مشتق شدهاند. مشکلی که در اینجا وجود دارد این است که کلاسCar به متدSail() نیازی ندارد، زیرا ماشین نمیتواند روی آب حرکت کند. همچنین، کلاسBoat نیز به متدDrive() نیازی ندارد، زیرا قایق نمیتواند بر روی جاده حرکت کند. بنابراین، اصل جایگزینی لیسکوف در این مثال نقض شده است.
نمونه کلاس اصلاح شده بر اساس اصل جایگزینی لیسکوف
برای حل این مشکل کافی است اینترفیسها به صورت جداگانه تعریف شوند.
در مثال بالا اینترفیسهایIDrivable وISailable به صورت جداگانه تعریف شدهاند. بنابراین، با توجه به نیاز هر شی جدید میتواند از اینترفیس مورد نظر ارثبری کند. همچنین، میتوان وسیله جدیدی تعریف کرد که هر دو اینترفیس را پیادهسازی کند.
قطعه کد بالا یک وسیله جدید را نشان میدهد که هر دو اینترفیس را پیادهسازی کرده است.
مثال عملی اصل جداسازی اینترفیس ها در اصول solid در سی شارپ
اصل جداسازی اینترفیسها بیان میکند که نباید اینترفیسهایی شلوغ در برنامه داشت. به بیانی دیگر کلاینتها نباید مجبور به پیادهسازی اینترفیسهایی شوند که از آنها استفاده نمیکنند. بنابراین، باید سعی کرد که اینترفیسهای بزرگ را به اینترفیسهای کوچکتر تقسیم کرد.
اگر یک اینترفیس متدهای زیادی داشته باشد که همه کلاینتها به آن نیازی نداشته باشند، آنگاه کلاینتها مجبور به پیادهسازی متدهایی میشوند که برای آنها بی معنی است. در نتیجه، این مورد باعث افزایش وابستگیهای غیرضروری و پیچیدگی در برنامه میشود. برای درک بهتر این اصل مهم از اصول SOLID در سی شارپ به مثال زیر توجه کنید.
در مثال بالا کلاسIMachine تعریف شده است که نشان دهنده عملکردها و قابلیتهای یک دستگاه است. این کلاس دارای ۳ تابعPrint() ، Scan() و Fax() است که به ترتیب نشان دهنده توانایی پرینت، اسکن و فکس هستند. بنابراین، برای یک دستگاه پرینتر ساده داشتن قابلیتهای اسکن و فکس بی معنی است. حال شرایطی را در نظر بگیرید که کلاس پرینتر اینترفیسIMachine را پیادهسازی کند.
با توجه به نکات گفته شده پرینتر ساده نیازی به قابلیتهای اسکن و فکس ندارد. بنابراین، قطعه کد بالا اصل جداسازی اینترفیسها از اصول solid در سی شارپ را نقض میکند.
نمونه کلاس اصلاح شده بر اساس اصل جداسازی اینترفیس ها
برای برقرار شدن اصل جداسازی اینترفیسها کافی است هر کلاس تنها اینترفیسهای مورد نیاز خود را پیادهسازی کند. بر همین اساس، میتوان اینترفیسIMachine را به ۳ اینترفیس جداگانه تقسیم کرد.
بنابراین، هر کلاس جدید تنها اینترفیس مورد نیاز خود را پیادهسازی میکند. در مثال بالا کلاسSimplePrinter نشان دهنده یک دستگاه پرینتر ساده است و تنها اینترفیسIPrinter را پیادهسازی میکند.
مثال عملی وارونگی وابستگی در اصول solid در سی شارپ
اصل وارونگی وابستگی یکی از اصول مهم solid در سی شارپ است که بیان میکند در برنامه نویسی ماژولهای سطح بالا (کلاسهای اصلی برنامه که کار بزرگی انجام میدهند) نباید به صورت مستقیم به ماژولهای سطح پایین (کلاسهای برنامه که کارهای جزئی را انجام میدهند) وابسته باشند. به جای وابستگی مستقیم بهتر است که هر دو به یک اینترفیس یا انتزاع وابسته شوند.
برای درک بهتر اصل وارونگی وابستگی شرایطی را در نظر بگیرید که میخواهید یک سیستم اطلاعرسانی بسازید که بتواند پیامها را به روشهای مختلف (ایمیل یا پیامک) ارسال کند. قطعه کد زیر پیادهسازی این سیستم را بدون در نظر گرفتن اصل وارونگی وابستگی نشان میدهد.
در مثال بالا کلاسNotificationService ماژول سطح بالا و کلاسEmailSender ماژول سطح پایین به صورت مستقیم به یکدیگر وابسته شدهاند. این نوع پیادهسازی مشکلات زیر را به وجود میآورد.
- انعطافپذیر نیست: برای تغییر شیوه ارسال از ایمیل به پیامک باید کلاسNotificationService تغییر کند.
- قابل تست نیست: تست کردن کلاسNotificationService بدون ارسال واقعی ایمیل بسیار دشوار است.
- قابلیت استفاده مجدد ندارد: کلاسEmailSender تنها برای ارسال ایمیل مورد استفاده قرار میگیرد و نمیتوان این کلاس را به راحتی با سایر روشهای اطلاعرسانی جایگزین کرد.
نمونه کلاس اصلاح شده بر اساس اصل وارونگی وابستگی
برای برقرار شدن اصل وارونگی وابستگی باید یک اینترفیس جداگانه ساخته شود. سپس، کلاسهای مربوط به ارسال ایمیل و پیامک به این کلاس وابسته شوند. در نهایت باید ماژول سطح بالا در برنامه را به اینترفیس وابسته کرد.
قطعه کد بالا نمونه اصلاح شده کد قبلی با رعایت اصل وارونگی وابستگی از اصول solid در سی شارپ را نشان میدهد. در این مثال اینترفیسINotifier به صورت جداگانه تعریف شده است که ماژولهای سطح بالا و پایین به آن وابسته شدهاند. رعایت اصل وارونگی وابستگی موجب انعطافپذیری، قابلیت تست و کاهش وابستگی کد شده است.
چگونه با سی شارپ پروژه های کاربردی ایجاد کنیم؟
بهترین روش برای یادگیری سی شارپ بررسی، تمرین و انجام پروژههای واقعی است. پیادهسازی پروژههای واقعی و مثالهای عملی کمک میکند با چالشهای موجود در فرایند توسعه بیشتر آشنا شوید. همچنین، با انجام پروژههای مختلف برای ورود به بازار کار نیز آمادهتر خواهید شد و نیازهای بازار کار را نیز بهتر درک خواهید کرد. با توجه به اهمیت این موضوع فرادرس نیز آموزشهای پروژه محور متعددی در زمینه برنامه نویسی سی شارپ منتشر کرده است. فیلمهای آموزشی پروژه محور سی شارپ فرادرس در مجموعه فیلمهای آموزش پروژه محور برنامه نویسی سی شارپ از فرادرس قابل دسترسی هستند که لینک آن در ادامه آورده شده است.
فیلمهای آموزشی پروژه محور سی شارپ فرادرس به شما کمک میکنند تا آموختههای خود را به صورت عملی پیادهسازی کنید. بنابراین، دیدن این آموزشها به یادگیری هر چه بهتر زبان برنامه نویسی سی شارپ کمک میکند. در ادامه تعدادی از فیلمهای پروژه محور سی شارپ آورده شده است.
برای دیدن سایر فیلمهای آموزشی بر روی تصویر زیر کلیک کنید تا به صفحه اصلی این مجموعه آموزشی هدایت شوید.

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