Mohsen Farokhi - محسن فرخی
Mohsen Farokhi - محسن فرخی
خواندن ۲ دقیقه·۵ سال پیش

جایگزین کردن Conditional با Polymorphism

در این مقاله با یک مثال switch case را با polymorphism جایگزین می کنیم و با مزیت های آن آشنا می شویم

مثالی که بررسی خواهیم کرد سبد خرید می باشد که قابلیت تخفیف دارد. سه نوع مشتری داریم که سفارش با توجه به نوع مشتری تخفیف اعمال می کند.

وقتی ما در کدهای خود از switch case استفاده می کنیم، چند اصل برنامه نویسی را زیر سوال می بریم. از آنجایی که هر case یک عمل خاص می باشد، تابع ما چندین عمل را انجام می دهد. بنابراین single
responsibility principle را زیر سوال می بریم.

https://virgool.io/p/of7klkgtgahy/%D8%A7%D8%B5%D9%84%D8%AF%DB%8C%DA%AF%D8%B1%DB%8C%DA%A9%D9%87%D8%B2%DB%8C%D8%B1%D8%B3%D9%88%D8%A7%D9%84%D9%85%DB%8C%D8%A8%D8%B1%DB%8C%D9%85opencloseprinciple%D9%85%DB%8C%D8%A8%D8%A7%D8%B4%D8%AF.%D8%B2%DB%8C%D8%B1%D8%A7%D8%A8%D9%87%D8%A7%D8%B2%D8%A7%DB%8C%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1%D9%87%D8%B1%D8%AA%D8%A7%DB%8C%D9%BE%D8%A7%D8%B2discount%D8%8C%D9%85%D9%86%D9%85%D8%AC%D8%A8%D9%88%D8%B1%D8%AE%D9%88%D8%A7%D9%87%D9%85%D8%A8%D9%88%D8%AF%DB%8C%DA%A9case%D8%A8%D9%87%DA%A9%D9%84%D8%A7%D8%B3%D8%AE%D9%88%D8%AF%D8%A7%D8%B6%D8%A7%D9%81%D9%87%DA%A9%D9%86%D9%85.

و اصل دیگری که زیر سوال می رود dependency inversion principle می باشد. هم خودم وابستگی را تعیین می کنم و هم آن را پیاده سازی می کنم.

اما زمانی که از polymorphism استفاده می کنیم در واقع یکی از اصول OOP را پیاده سازی می کنیم. single responsibility principle در این پیاده سازی رعایت خواهد شد زیرا هر کلاس یک وظیفه بیشتر انجام نمی دهد.

همچنین برای داشتن یک تایپ جدید، کلاس هایی که از قبل وجود داشته است تغییر نمی کند و یک کلاس جدید ایجاد می شود. بنابراین open close principle را هم رعایت می کنیم.

public abstract class Customer { public string FirstName { get; set; } public string LastName { get; set; } public abstract int GetFinalPrice(int price); } public class GoldCustomer : Customer { public override int GetFinalPrice(int price) { return (price - (price * 20 / 100)); } } public class BronzeCustomer : Customer { public override int GetFinalPrice(int price) { return (price - (price * 10 / 100)); } } public class SilverCustomer : Customer { public override int GetFinalPrice(int price) { return (price - (price * 5 / 100)); } } public class Program { static void Main(string[] args) { Customer customer = new GoldCustomer(); var price = customer.GetFinalPrice(2000); } }

اگر شما از strategy pattern برای پیاده سازی استفاده کنید بنابراین dependency inversion principle را هم رعایت خواهید کرد. وقتی که شما implementهای مختلف از کلاس Person داشته باشید، dependency inversion نخواهید داشت. در واقع هر کلاس با توجه به نوع خودش پیاده سازی خودش را دارد.

پایان

polymorphismclean code
شاید از این پست‌ها خوشتان بیاید