چه زمانی باید از defdelegate در الکسیر استفاده کنیم ؟


#1

با درود خدمت دوستان امروز داشتم در مورد defdelegate در الکسیر سرچ می کردم و همینطور کارایی اون رو متوجه شدم به عنوان مثال

https://hexdocs.pm/elixir/Kernel.html#defdelegate/2

defmodule MyList do
  defdelegate reverse(list), to: Enum
  defdelegate other_reverse(list), to: Enum, as: :reverse
end

MyList.reverse([1, 2, 3])
#=> [3, 2, 1]

MyList.other_reverse([1, 2, 3])
#=> [3, 2, 1]

مشکل اینجاست که وقتی می شه ماژولشو فراخوانی کرد هرجا چرا باید یک فانکشن معرف اون ماژول در ماژول دیگه ای آورد. کجا و چرا باید از اون استفاده کنیم ؟


#2

فکر میکنم با مثال بهتر میشه کاربرد defdelegate نشان داد
فرض کن تمام کد محاسبه رسید خرید در یک module داری بشکل زیر

defmodule GenerateInvoice do
  def calculate_amount(order) do
    order.amount + calculate_tax(order) + calculate_shipping(order) 
  end

  def calculate_tax(order) do
    order.amount * .10  
  end
end

حالا فرض کن module های دیگه همه جای کد از calculate_tax

استفاده میکنند و این function خیلی پیچیده شده و میخواهی module خودشو داشته باشه

defmodule GenerateInvoice do
  defdelegate calculate_tax(order), to: TaxCalculator

  def calculate_amount(order) do
    order.amount + calculate_tax(order) + calculate_shipping(order) 
  end
end


defmodule TaxCalculator do
  def calculate_tax do
  end
end

این یک شکر سینتکس فقط میتونی از function معمولی هم برای همین کار استفاده کنی


#3

ممنون سام عزیز و همیشه همراه. پس تنها برای دسته بندی مناسب و کم کردن پیچیدگی این کار انجام می شه !! تشکر


#4

شهریار جان منم اینو اضافه میکنم که شما میتونید یک برنامه رو به صورتی که ماشین اجرا میکنه بنویسید و همه چیز فانکشنها و پرویسژورهای خطی باشند، اما خب از code organization استفاده میکنیم که نگهداری کد ساده تر باشه. مورد دوم اینه که از روش delegate در oop هم استفاده میشه اما یکمی تفاوت داره با الیکسر، اما در oop هم هدف مدیریت کد هست.
فکر کنم defdelegate در زمان impl کردن پروتوکل ها هم خیلی به کار میاد