بهینه سازی code با Polymorphism

عبارت های شرطی اگرچه به تنهایی بد نیستند ، ولی وقتی منطق کاری را با code flow آمیخته می کنن code پیچیده می شه
و ضوابط Single Responsibility و Open Closed رو می شکنن.
برای مثال

    class Vehicle
      attr_reader :type
    
      def initialize(type)
        @type = type
      end
    
      def speed
        case type
        when "Car"
          100
        when "Train"
          200
        when "Plane"
          600
        end
      end

    end

این code مسولیت ها را آمیخته می کنه و در طول زمان که این منطق بزرگ می شه کار و تغییر سخت میشه
Refactor شده


    class Vehicle
      def speed
        0
      end
    
    end
    
    class Car < Vehicle
      def speed
        100
      end
    
    end
    
    class Train < Vehicle
    
      def speed
        200
      end
    
    end
    
    
    class Plane < Vehicle
    
      def speed
        600
      end
    
    end
    
    class VehicleFactory
    
      def self.build(type)
        case type
        when "Car"
          Car.new
        when "Train"
          Train.new
        when "Plane"
          Plane.new
        end
      end
    
    end
    
    VehicleFactory.build("Car").speed

حالا اضافه کردن رفتار آستانتره چون کار object از سا ختن آن جدا شده

6 پسندیده

پلیموفیزم خیلی به قابل توسعه و نگهداری بودن در oop کمک میکنه و این منطق که " هر چیزی صدای اردک در بیارد و مثل اردک راه برود پس اردک است" خیلی به نظر کار رو راحت می کنه اما به این شرط که در استفاده ازش زیاده روی نشه بخصوص توی ریلز که به خودی خود به اندازه کافی پلیمرفیک هست.
مثال خوبی بود اما در مورد اون کد case بالا بهتر و ساده تره که از یک Hash خیلی ساده استفاده بشود.
https://gist.github.com/toomaj/f048222decb345525860

2 پسندیده

بله موافقم با شما هر design pattern خوبی و بدی داره و باید نسبت به نیاز استفاده بشه

2 پسندیده
    class VehicleFactory
      AVAILABLE_VEHICLES = { car: Car, train: Train, plane: Plane }.freeze

      attr_reader :type

      def self.build(type)
        AVAILABLE_VEHICLES.fetch(type.to_sym).new
      end

    end

من البته این طوری مینوشتم hash چون خود speed مخصوص object هست وگرنه می ریم سره خونه اول

2 پسندیده

خیلی کلی منظورم استفاده از case بود نه چیره دیگه.
پیشنهاد میکنم اگر از ruby 2.3 استفاده می کنید freeze یادتون نره.

AVAILABLE_VEHICLES = { car: Car, train: Train, plane: Plane }.freeze
1 پسندیده

نتونستم این جمله رو متوجه بشم:(
اهان :smile: speed method

1 پسندیده

بله شما به نکته خوبی اشاره کردید اصلاح شد.

1 پسندیده

من این پست رو تازه دیدم . برام سوال شده آیا چنین مفهوم و بهینه سازی کد فقط در حالت شی گرایی وجود دارد یا اینکه در زبان های فانکشیونال نیز وجود دارد ؟

1 پسندیده

بله داده های جبری ، protocol ها typeclass ها همه در زبان های فانکشنال وجود دارد

3 پسندیده