آهنگسازی آمپرهای گیتار خودمان از 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
رفتار ویژه هر یک از آمپرها در ماژول ها وجود دارد تا انواع مختلف آمپر می توانند از آنها استفاده کنند. ما از ماژول ها برای به اشتراک گذاشتن آن رفتار در کلاس ها استفاده می کنیم. این امر به آمپر هیبریدی ما اجازه می دهد تا مانند قسمت هایی از آمپرهای دیگر ما کار کند.