قبل از خواندن blow one زیر را بخوانید
اصل جایگزینی لیسکوف – یکی از اصول جامد است که توسط باربارا لیسکوف تعریف شده است. این اصل بر اساس رابطه والد-فرزند به عبارت دیگر ویژگی های ارثی OOD (طراحی شی گرا) است. این اصل میگوید: «وقتی کلاس S زیرگروهی از کلاس T است، یک شی از نوع T را میتوان با یک شی از نوع S جایگزین کرد بدون اینکه بر عملکرد/صحت پیادهسازی یا برنامه تأثیر بگذارد».
به عبارت ساده میگوید: «مکانهایی در پیادهسازی (Class/Function) که از یک کلاس پایه استفاده میکنند، به عبارت دیگر سرویس یک کلاس پایه را مصرف میکنند، زمانی که شی کلاس پایه با یک شی کلاس فرزند (کلاس مشتق شده) جایگزین شود، باید به درستی کار کنند. "
اصل جایگزینی لیسکوف در زندگی واقعی
نمونه زیر نمونه ای از لامپ الکتریکی است که در واقع جایگزینی را نقض می کند. هنگامی که لامپ از کار می افتد، با یک لامپ جدید جایگزین می شود. در اینجا در این مثال لامپ قدیمی با لامپ جدید جایگزین شده است.
نکته تعویض کامل
:
در اینجا در این مثال در خانواده لامپ ها، در نظر گرفتن لامپ قدیمی به عنوان والدین همه انواع لامپ و لامپ CFG فرزندی از همان خانواده است که از آن به ارث رسیده است.
وقتی کسی یک لامپ خراب را جایگزین می کند، به عبارت دیگر در برنامه نویسی، لامپ قدیمی را با لامپ جدید جایگزین می کند، باید نوری را فراهم کند که توسط لامپ قدیمی تامین می شود، به عبارت دیگر بدون تأثیر بر صحت یا عملکرد کار می کند (نور ثابتی در خانه ارائه می دهد). . در مثال قبلی، جایگزینی کاملاً کار کرد زیرا هیچ تغییری در عملکرد وجود ندارد.
مثال نقض
تصویر قبلی نقض اصل را نشان می دهد. از آنجایی که جایگزینی با یک لامپ تزئینی (که نور را به شکل دکوراسیون فراهم می کند) به جای لامپ فقط برای تامین نور خانه است. این در واقع یک نقض به معنای اصلاح عملکرد است زیرا یک لامپ تزئینی عملکرد یکسانی را برای مصرف کننده فراهم نمی کند.
مثالی از رعایت نکردن اصل در توسعه اپلیکیشن
ادامه با حساب پس انداز بانکی که قبلا در مقالات قبلی در مورداصل باز- بسته
- Interface ISavingAccount
- {
- //Other method and property and code
- bool Withdrwal(decimal amount);
- }
- Public Class RegularSavingAccount : ISavingAccount
- {
- //Other method and property and code related to Regular Saving account
- Public bool Withdrwal ()
- {
- Decimal moneyAfterWithdrawal = Balance-amount;
- if(moneyAfterWithdrawal >= 1000)
- {
- //update balace
- return true;
- }
- else
- return false;
- }
- }
- Public Class SalarySavingAccount : ISavingAccount
- {
- //Other method and property and code related to Salary Saving account`
- Public bool Withdrwal ()
- {
- Decimal moneyAfterWithdrawal = Balance-amount;
- if(moneyAfterWithdrawal >= 0)
- {
- //update balace
- return true;
- }
- else
- return false;
- }
- }
- Public Class FixDepositSavingAccount : ISavingAccount
- {
- //Other method and property and code related to Salary Saving account`
- Public bool Withdrwal ()
- {
- Throw New Excpetion(“Not supported by this account type”);
- }
- }
در کد قبلی رابط کاربری IsavingAccount توسط نوع دیگری از حساب پس انداز بانک مانند حساب پس انداز معمولی، حقوق و دستمزد و حساب پس انداز ثابت پیاده سازی شده است.
اما طبق قوانین بانکی، یک حساب پس انداز FixDeposit تسهیلات برداشت را ارائه نمی دهد در حالی که یک حساب بانکی دیگر ممکن است تسهیلات برداشت را ارائه دهد.