برنامه نویسی شی گرا در روبی
در فصل قبلی از نظر تئوری، با مسائل مربوط به برنامه نویسی شی گرا، آشنا شدیم. در اینجا، کمی به مبحث وارد تر شده، و تقریبا تمام مفاهیمی که در فصل گذشته فرا گرفتیم، به صورت کد در آمده و پیاده سازی خواهد شد.
ایجاد یک کلاس
در اینجا، میخواهیم یک مفهوم انتزاعی تولید کنیم. برای مثال، همان کلاس اتومبیل را در نظر بگیرید ، کلاس ایجاد شده به این شکل خواهد شد :
class Automobile
...
end
دقت کنید، نام کلاس ها حتما باید با حرف بزرگ شروع شود. اما کلاس ما یک چیز کم دارد. با ساختن یک کلاس، معمولا متدی برای مقداردهی اولیه به آن، ساخته می شود :
class Automobile
def initialize(name)
@name = name
end
end
ایجاد یک شیء از یک کلاس
اکنون، ما یک کلاس کلی اتومبیل داریم، بیاید یک شیء از این کلاس ایجاد کنیم :
pride = Automobile.new("Pride")
به این شکل، یک اتومبیل جدید به اسم Pride ایجاد کردیم. یادتان باشد که متد new توسط خود روبی برای کلاس ها در نظر گرفته شده،و پارامترهای آن به متد initalize که توسط ما تعریف شده است، پاس داده می شود.
اضافه کردن متد به کلاس
متد، روش های مختلفیست که یک کلاس و در نتیجه یک شیء از یک کلاس، قادر به انجام آن است. در اینجا، میخواهیم یک متد اضافه کنیم که وقتی یک عدد را از ورودی دریافت میکند، در خروجی میزان حرکت به همان اندازه را به کاربر نشان دهد. نتیجتا کلاس به این شکل خواهد شد :
class Automobile
def initialize(name)
@name = name
end
def move(distance)
puts "#{@name} moved about #{distance} kilometers"
end
end
بگذارید به شی خود برگردیم. وقتی چنین چیزی را فراخوانی میکنیم :
pride.move(50)
در خروجی باید چنین چیزی تحویل بگیریم :
Pride moved about 50 kilometers
در واقع، اینجا مشخص می شود که خودروی تعریف شده، چقدر حرکت کرده است.
ایجاد یک کلاس فرزند
همانگونه که در فصل پیش نیز گفته شد، یکی از ویژگی های شی گرایی، ویژگی ارث بری یا Inheritance است. در واقع، ما یک کلاس و یک مفهوم انتزاعی کلی در نظر میگیریم، سپس از آن یک سری مفهوم دیگر مشتق میکنیم. اکنون، بیاید کلاس کامیون را تعریف کنیم :
class Truck < Automobile
...
end
دو متد initalize و move اکنون به این کلاس ما، منتقل شده اند. ولی برای مثال، برای کامیون نیاز است تا ظرفیتش دانسته شود. پس یک متد برای ست کردن ظرفیت در کامیون خود، تعریف میکنیم :
class Truck < Automobile
set_capacity(cap)
@cap = cap
end
end
اما، همچنان، ممکن است ندانیم که این کامیون، چه قدر ظرفیت دارد و حتی نامش چیست. پس یک متد دیگر مینویسیم :
class Truck < Automobile
set_capacity(cap)
@cap = cap
end
def print_info
puts "Name : #{@name}"
puts "Capacity : #{@cap} tons"
end
end
اکنون، یک شیء کامیون جدید میسازیم :
scania = Truck.new("Scania")
scania.set_capacity(20)
حال میتوانیم با استفاده از متد print_into مشخصات کامیون را ببینیم. که نتیجه کد ما چنین است :
Name : Scania
Capacity : 20 tons
توجه کنید که متد move نیز برای این شیء همچنان معتبر است.
چندریختی
در این قسمت، ویژگی «چند ریختی» از برنامه نویسی شی گرا را بررسی خواهیم کرد. بیایید ببینیم که اصلا چندریختی یعنی چه؟ همانطور که در فصل پیش گفته شد، چند ریختی دقیقا به معنای آن است که یک شی، به چند شکل مختلف ساخته شود، اما در نهایت همان کارکرد را داشته باشد. بیایید ابتدا یک کلاس Parser را در نظر بگیریم. این کلاس را ابتدا به این شکل مینویسیم :
class Parser
def parse
raise NotImplementedError, 'You need to define this method'
end
end
اگر از این کلاس، یک شی ایجاد کنیم و سپس متد parse را فراخوانی کنیم، مفسر روبی به ما یک ارور خواهد داد و از ما خواهد خواست که متد parse را تعریف کنیم. اکنون ما یک Parser برای JSON از روی این کلاس مینویسیم :
class JsonParser < Parser
def parse
puts 'JSON parser received the parse message'
end
end
کپسوله سازی
کپسوله سازی یا Encapsulation بدین معنیست که کارکرد بخش های درونی یک کلاس را از دید کاربر مخفی کنیم. در واقع، این کار برای آسایش بیشتر کاربر است. برگردیم به مثال فصل گذشته، اگر فرض را بر این بگیریم که شما قرار باشد خودتان عملکرد کلاچ را در خودرویتان داشته باشید، تقریبا استفاده از خودرو غیرممکن خواهد شد. اما سازندگان خودرو، یک فرایند پیچیده را از دید شما مخفی کرده اند و تنها کاری که شما برای انجام آن نیاز دارید تا انجام دهید، آن است که یک پدال را فشار دهید. حالا ببینیم که کپسوله سازی به چند شکل قابل انجام است؟
متدهای خصوصی
متدهای خصوصی ، یا private متدهایی هستند که خود برنامه به آن ها دسترسی دارد. میتوانند از درون متدهای دیگر هم میتوانند این متدها را درون خود صدا بزنند. برای مثال :
class Test
def initialize()
private_method
end
private
def private_method
puts "Private method called"
end
end
متدهای خصوصی، باید درون متدهای دیگر صدا زده شوند. به این شکل، ما میتوانیم از آنها استفاده کنیم، بدون آن که کاربر متوجه شود چنین متدهایی نیز وجود داشته اند.
متدهای محافظت شده
متدهای محافظت شده یا protected هم متدهایی هستند که خارج از کلاس قابل استفاده نیستند و باید در متدهای دیگر استفاده شوند. برای استفاده از این متد ها، باید از کلمه کلیدی self
استفاده کنیم.
class Test
def initalize()
self.protected_method
end
protected
def protected_method
puts "Protected method called!"
end
end
به این شکل، با فراخوانی متد مربوطه، متد محافظت شده نیز اجرا می شود.
جمع بندی
در این فصل، تمام موضوعاتی که در فصل گذشته توضیح داده شد را به صورت کاربردی و برنامه نویسی توضیح دادیم. اکنون، شما دیگر میتواند برنامه های کاربردی را توسط روبی توسعه دهید. از این به بعد، محتوای کتاب بیش از آن که به مسائل برنامه نویسی روتین بپردازد، به مسائل کاملا کاربردی در روبی خواهد پرداخت. شما در فصل آینده، کمی از تکنیک های شی گرایی را فرا خواهید گرفت و سپس، با کاربرد روبی در وب آشنا خواهید شد.