برنامه نویسی

آهنگسازی آمپرهای گیتار خودمان از Gear به ارث رسیده

آمپر شدن

من قبلاً یک توضیح ساده از تقویت کننده را پیشنهاد کردم. آنها صداها را با کمک دو جزء تقویت می کنند: یک تقویت کننده اولیه و یک تقویت کننده قدرت. صدا با پیشروی از طریق تقویت کننده و تقویت کننده پاور تغییر می کند. در نهایت از طریق بلندگو پخش می شود.

class Amplifier
  def amplify(sound)
    pre_amp_stage(sound)
    power_amp_stage(sound)
  end
end
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با این کار، سیستم ما می تواند صدا را تولید کند. این یک پست وبلاگ بسیار کوتاه خواهد بود – اما کار ما تمام نشده است. گیتاریست‌ها دوست دارند با وسایل بازی کنند. انواع مختلفی از تقویت کننده ها وجود دارد که آنها ممکن است استفاده کنند.

آمپر لوله

یک آمپلی فایر لوله از لوله های خلاء برای خروجی صدا استفاده می کند که به همین دلیل نام خود را گرفته است. گیتاریست ها این آمپلی فایرها را به دلیل تغییر صدای گیتار دوست دارند. صدایی که از یک آمپلی فایر لوله بیرون می آید اغلب گرم توصیف می شود. و با فشار دادن آمپر به ولوم های بالاتر، صدا حتی گرمتر می شود.

class TubeAmp
  def pre_amp_tone
    if low_volume? || mid_volume?
      "💡"
    elsif high_volume?
      "🔥"
    end
  end
end
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

متاسفانه، این لوله های خلاء نسبتا هستند سنگین قطعات الکتریکی این خیلی خوب است که صدای آنها بسیار خوب است. آنقدر خوب که یک گیتاریست حاضر است سلامتی پشت خود را به خطر بیندازد و آنها را روی صحنه و خارج از صحنه ببرد.

> amp = TubeAmp.new
> amp.weight
=> :heavy
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در حال حاضر، آمپلی فایر ما می تواند صدا را تغییر دهد تا گرمای خاص خود را ارائه دهد. همچنین می تواند شما را در معرض خطر ماه ها فیزیوتراپی قرار دهد. یک کاری که هنوز نمی تواند انجام دهد این است که آن صدا را تولید کند. ما قبلاً آن عملکرد را با ما ساخته ایم Amplifier کلاس ما آن را با به ارث بردن از تقویت کننده ای که قبلا ساخته ایم به آمپلی فایر لوله خود اضافه می کنیم.

class TubeAmp < Amplifier
end

> amp = TubeAmp.new
> amp.respond_to?(:amplify)
=> true
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

آمپر حالت جامد

آمپرهای حالت جامد دارای مشخصات صدای متفاوتی نسبت به آمپرهای لوله ای هستند. آنها به عنوان صدایی تمیز توصیف می شوند – به وضوح شیشه. این لحن بدون توجه به اینکه چقدر آمپر را فشار می‌دهید باقی می‌ماند. بر خلاف آمپرهای لوله ای که حتی گرمتر می شوند، شفافیت نسبی خود را حفظ می کند.

class SolidStateAmp
  def pre_amp_tone
    "🫙"
  end
end
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

آمپر حالت جامد از ترانزیستور برای ارسال سیگنال به بلندگو استفاده می کند. این لوله‌ها بسیار سبک‌تر از لوله‌های خلاء هستند و روی پشت شما راحت‌تر هستند.

> amp = SolidStateAmp.new
> amp.weight
=> :light
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

یک آمپلی فایر حالت جامد نیز باید صدا را مانند آمپر لوله ای تقویت کند. بیایید همین کار را انجام دهیم و از آن ارث ببریم Amplifier کلاس برای به دست آوردن آن رفتار.

class SolidStateAmp < Amplifier
end

> amp = SolidStateAmp.new
> amp.respond_to?(:amplify)
=> true
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

وراثت

هم با آمپلی فایر لوله و هم آمپلی فایر حالت جامد، از یک کلاس تقویت کننده به ارث برده ایم. را Amplifier تمام رفتارهای سازگار بین انواع مختلف آمپر را دارد. با ارث بردن از آن، آمپرها بدون نیاز به بازنویسی آن رفتار و ساختار را به دست می آورند. سپس آن آمپرها تخصص خود را در بالای آن اعمال می کنند. هر دو آمپر صدای متفاوتی تولید می کنند. اجزای الکتریکی مختلفی که استفاده می کنند باعث وزن های متفاوت می شوند.

وراثت در اینجا به خوبی کار می کند زیرا هر یک از این تقویت کننده ها هستند هنوز یک تقویت کننده آنها داده ها و رفتارهای اولیه یکسانی را به اشتراک می گذارند، و باید همچنان به آن مشترک باشند. آنها قطعاتی دارند که تعامل یا استفاده از آن داده ها یا رفتار را خاص می کند.

ما آن تخصص را در آن کلاس رمزگذاری می کنیم و همچنان از رفتار اصلی استفاده می کنیم. Amplifier#amplify صدای ما را از طریق آن هل می دهد pre_amp_stage روش. آن مرحله صدا را با آمپ تغییر می دهد pre_amp_tone. این به آمپر لوله اجازه می دهد تا گرمای مشخص خود را داشته باشد و آمپر حالت جامد برای اعمال شفافیت خود.

آمپر هیبریدی

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

ما رفتار لوله و حالت جامد را می خواهیم. بیایید همان رویکرد ارثی را که تاکنون استفاده کرده ایم، امتحان کنیم.

class HybridAmp < TubeAmp, SolidStateAmp
end
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هنگامی که ما کنسول خود را بارگذاری می کنیم، یک خطا در مورد کلاس خود خواهیم دید.

(irb):1: syntax error, unexpected ',', expecting ';' or '\n' (SyntaxError)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

روبی از وراثت چندگانه پشتیبانی نمی کند. ما فقط می توانیم یک کلاس واحد داشته باشیم که از آن به ارث برده ایم. اما ما خودمان را می دانیم HybridAmp نیاز به رفتاری دارد که مشابه هر یک از این طبقات دیگر باشد. برای در نظر گرفتن یک رویکرد متفاوت، اجازه دهید تعریف خود را از تقویت کننده بازبینی کنیم.

class Amplifier
  def amplify(sound)
    pre_amp_stage(sound)
    power_amp_stage(sound)
  end
end
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هر آمپلی فایر دارای یک آمپلی فایر و یک تقویت کننده قدرت است. بیایید ماژول های جداگانه ای برای رفتار هر یک از این اجزا بسازیم.

یک آمپلی فایر هیبریدی دارای یک آمپلی فایر لوله است که گرمایش را تکرار می کند.

module TubePreAmp
  def pre_amp_tone
    if low_volume? || mid_volume?
      "💡"
    elsif high_volume?
      "🔥"
    end
  end
end
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با گنجاندن این ماژول در آمپر ما، هر HybridAmp نمونه ها تمام رفتار ماژول را به دست خواهند آورد.

class HybridAmp
  include TubePreAmp
end

> amp = HybridAmp.new(volume: 10)
> amp.pre_amp_tone
=> "🔥"
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

module SolidStatePowerAmp
  def power_amp_weight
    :light
  end
end
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برخلاف وراثت، ما می‌توانیم هر تعداد ماژول را که می‌خواهیم اضافه کنیم. اجازه دهید همچنین شامل SolidStatePowerAmp رفتار در ما HybridAmp.

class HybridAmp
  include TubePreAmp, SolidStatePowerAmp
end

> amp = HybridAmp.new(volume: 10)
> amp.power_amp_weight
=> :light
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

آمپلی فایر هیبریدی هنوز هم نوعی آمپلی فایر است و همچنان به توانایی تقویت صدا نیاز دارد. به این ترتیب، ما هستیم همچنین در اینجا از وراثت استفاده می شود. آمپر هیبریدی ما تخصص آن است Amplifierدرست مانند آمپر لوله یا حالت جامد. تخصص های آن از ماژول هایی است که شامل می شود.

class HybridAmp < Amplifier
  include TubePreAmp, SolidStatePowerAmp
end

> amp = HybridAmp.new(volume: 10)
> amp.respond_to?(:amplify)
=> true
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ترکیب بندی

ما نمی‌توانیم رفتار را از مکان‌های مختلف با وراثت بیرون بکشیم. ما نتوانستیم استراتژی اولیه خود را برای ساخت آمپر هیبریدی خود اعمال کنیم. ما نمی خواستیم این رفتار را تکراری کنیم. آن ها هستند از قصد همان ما به یک رویکرد متفاوت نیاز داشتیم.

ما می توانیم مجموعه ای از رفتارهای مرتبط را در ماژول ها ترکیب کنیم و آنها را بین کلاس ها به اشتراک بگذاریم. ما آن ماژول ها را با هم در کلاس های خود ترکیب می کنیم تا از رفتاری که ارائه می کنند استفاده کنیم.

با این رویکرد ترکیب، آمپرهای لوله و حالت جامد ما بسیار کوچک می شوند.

class TubeAmp < Amplifier
  include TubePreAmp, TubePowerAmp
end

class SolidStateAmp < Amplifier
  include SolidStatePreAmp, SolidStatePowerAmp
end
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید
بستن
دکمه بازگشت به بالا