برنامه نویسی S.O.L.I.D

Open/Closed Principle
Liskov Substitution Principle
Interface Segregation Principle
Dependency Inversion Principle

solid  مخفف چهار اصل بالا است که کی از اصول برنامه نویسی شی گرا می باشد.

خب بریم سراغ معرفی این اصول:

Single Responsibility Principle

خلاصه این اصل به این معنی است که هر کلاس فقط و تنها باید یک وظیفه داشته باشد و برای وظایف دیگر باید از کلاس های دیگر استفاده کند.

به طور مثال فرض کنید که ما یک کلاس Customer  داریم که وظیفه اعتبار سنجی مشتریان و درج در دیتا بیس را دارد.

اگر ما در این کلاس وظیفه لاگ کردن هم قرار بدهیم این اصل را زیر پا گذاشته ایم پس یک کلاس loger  می سازیم و وظیفه لاگ کردن را به اون کلاس می سپاریم

کلاس Customer بالا کارهایی را انجام می دهد که قرار نیست انجام بدهد. کلاس Customer باید اعتبارسنجی داده های مشتری را انجام بدهد، لایه دسترسی به داده های مشتری را صدا بزند، اما اگر به بلاک catch نگاه کنیم این کلاس همچنین فعالیت های LOGGING را نیز انجام می دهد. در یک جمله ساده این کلاس مسئولیت های زیادی دارد.

classCustomer
{
publicvoidAdd()
{
try
{
//Databasecodegoeshere
}
catch(Exceptionex)
{System.IO.File.WriteAllText(@"c:\Error.txt",ex.ToString());
}
}
}

Open/Closed Principle

خلاصه این است بدین معنی است که کلاس باید نسبت به تغییرات بسته باشد

به طور مثال بک کلاس خریدار داریم ..بعد ها بر اساس نوع خریدار نقره ای و یا طلایی به آن ها تخفیف می دهیم.ما اجازه نداریم در کلاس اصلی یک شرط بگذاریم و همان جا تخفیف بدهیم

باید دو کلاس مشتق شده از کلاس اصلی قرار بدهیم و همانجا تخفیف بدهیم

به بلاک شرطی “IF” در متد “getDiscount” توجه کنید.

classCustomer
{
privateint_CustType;
publicintCustType
{
get{return_CustType;}
set{_CustType=value;}
}
publicdoublegetDiscount(doubleTotalSales)
{
if(_CustType==1)
{
returnTotalSales-100;
}
else
{
returnTotalSales-50;
}
}

مشکل اینجاست که اگر ما بخواهیم یک نوع مشتری جدید اضافه کنیم باید یک بلاک شرطی “if” دیگر را به متد “getDiscount” اضافه کنیم، به عبارت دیگر ما نیاز داریم که کلاس Customer را ویرایش کنیم.

Liskov Substitution Principle

این اصل مقداری ساده س .اگر کلاس B از C  مشتق بشود.در هر کجای کد ما فرزند را جای پدر قرار بدهیم نباید به ما پیغام خطا بدهد

Interface Segregation Principle

در اینتر فیس ها برای جلوگیری از واسط چاق(متد هایی که کاربرد ندارد ولی کاربر باید پیاده سازی کند)فقط متد هایی را نوشت که واقعا کاربرد دارند

Dependency Inversion Principle

کلاس ها نباید به شکل مستقیم بهم ارتباط داشته باشند (راه حل این مشکل می تواند تزریق وابستگی باشد)