برنامه نویسی شی گرا در روبی

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

ایجاد یک کلاس

در اینجا، میخواهیم یک مفهوم انتزاعی تولید کنیم. برای مثال، همان کلاس اتومبیل را در نظر بگیرید ، کلاس ایجاد شده به این شکل خواهد شد :

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

به این شکل، با فراخوانی متد مربوطه، متد محافظت شده نیز اجرا می شود.

جمع بندی

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

results matching ""

    No results matching ""