چه تکنولوژی می‌خواهید یاد بگیرید؟

نظرات و انتقادات خود را با ما در میان بگذارید.

آپدیت روزانه

بیش از 1000 پست آموزشی

نیازهای روز

5 اصل پایه طراحی شی‌گرا - بخش 3

اولین اصل پایه در مدیریت وابستگی(Dependency Managemet) در توسعه‌ی برنامه‌های شی‌گرا، Single Responsibility Principle یا به اختصار S.R.P پست آموزشی ارسال گردید، اکنون اصل دوم طراحی سیستم‌های شی‌گرا می‌پردازیم. یکی دیگر از اصول اساسی طراحی سیستم‌های شی‌گرا اصل Open Closed Principle یا به اختصار O.C.P است که بیان ساده آن، هر موجودیت تعریف شده در برنامه(کلاس، ماژول، متد و ...) تغییرات(Modification) در آن بسته و راه توسعه پذیری(Extension) باز باشد.

Objects or entities should be open for extension, but closed for modification.

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

یک بانک را در نظر بگیرید که انواع مختلف حساب پس انداز به منظور پاسخگوی به نیازهای بسیاری از مشتریان خدمت رسانی ‌می‌کند که البته در نظر خواهیم داشت هر بانک سیاست و قوانین خاصی در خصوص محاسبه بهره، انواع حساب پس انداز را شامل خواهد شد و اگر از یک شخص برنامه‌نویس درخواست شود یک کلاس در خصوص محاسبه منافع یک حساب کاربری پیاده سازی نماید ممکن است به صورت زیر اقدام کند:

Public class SavingAccount  
{  
    //Other method and property and code   
    Public decimal CalculateInterest(AccountType accountType)  
    {  
        If(AccountType==”Regular”)  
        {  
            //Calculate interest for regular saving account based on rules and   
            // regulation of bank  
            Interest = balance * 0.4;  
            If(balance < 1000) interest -= balance * 0.2;  
            If(balance < 50000) interest += amount * 0.4;  
        }  
        else if(AccountType==”Salary”)  
        {  
            //Calculate interest for saving account based on rules and regulation of   
            //bank  
            Interest = balance * 0.5;  
        }  
    }  
} 

متد CalculateInterest همیشه در معرض تغییرات خواهد بود و همین عامل موجب نقص دومین اصل پایه(O.C.P) خواهد شد که به منظور اثبات می‌توان اینگونه فرض نمود که در آینده نیاز باشد نمونه دیگری از محاسبه بهره از طرف بانک درخواست شود از این رو برای اعمال محاسبه جدید لازم است این متد دستخوش تغییرات شود. همچنین متدهای می‌تواند موجب نقص اولین اصل پایه طراحی سیستم‌های شی‌گرا شوند. متد بیش از یک مسئولیت بر عهده دارد و در واقع می‌توان گفت این دو اصل مکمل همدیگر می‌باشند.

ارث‌بری تنها راهی است که می‌توان به منظور پیاده سازی اصل O.C.P بکارگرفت چرا که پایه طراحی شی‌گرای است که اجازه توسعه پذیری و گسترش قابلیت کلاس‌های موجود را خواهد بود(گاها دیده می‌شود از متدهای الحاقی هم بدین منظور استفاده می‌شود). به منظور پیاده سازی اصل O.C.P می‌توان از interface، کلاس abstract، متد abstract و متدهای virtual در این خصوص بهره برد. کدهای فوق را به صورت زیر تغییر خواهیم داد:

Interface ISavingAccount  
{  
   //Other method and property and code  
   decimal CalculateInterest();  
}  
Public Class RegularSavingAccount : ISavingAccount  
{  
  //Other method and property and code related to Regular Saving account  
  Public decimal CalculateInterest()  
  {  
    //Calculate interest for regular saving account based on rules and   
    // regulation of bank  
    Interest = balance * 0.4;  
    If(balance < 1000) interest -= balance * 0.2;  
    If(balance < 50000) interest += amount * 0.4;  
  }  
}  
  
Public Class SalarySavingAccount : ISavingAccount  
{  
  //Other method and property and code related to Salary Saving account`  
  Public decimal CalculateInterest()  
  {  
    //Calculate interest for saving account based on rules and regulation of   
    //bank  
    Interest = balance * 0.5;  
  }  
} 

دو کلاس جدید ایجاد و از اینترفیس پایه(ISavingAccount) ارث‌بری می‌کنند و متد آن را پیاده سازی خواهیم کرد. اکنون در صورتی که بانک نوع دیگری از محاسبه یا حساب پس انداز تعریف نماید لازم به تغییر منطق کلاس موجود نیست و تنها کافیست از طریق ارث بری از اینترفیس قابلیت جدیدی توسعه داد.

...

امید نصری

0 نظر:

تعداد دیدگاه‌های کاربران : 0 دیدگاه
مهمان گرامی! برای ارسال نظر نیاز است وارد سایت شوید.


You must log on to comment.