HELLO, I’M SERHAT AND THIS IS MY FANCY TITLE.

Ruby günlüğü - gün 4

Ruby'de herşeyin nesne olduğunu önceki günlerden biliyoruz. Peki 2 nesne ve 2 method (fonksiyon) içeren tek satırlık bir kod yazılabilir mi? Cevabı hemen verebiliriz:

puts 2 + 5

Sonucun 7 olduğu aşikar. Peki 2 nesne ve 1 method nerede? Daha önce Ruby'de herşeyin bir nesne olduğunu söylemiştik, Ruby'nin pure-object-oriented bir dil olduğunu da. Burada 2 rakamı bir nesnedir. 5 rakamı da. Evet yanlış duymadınız bunlar birer nesne. + operatörü ise bir method, yani fonksiyon.

Peki bu nesneler hangi sınıfa aitler? Neden sınıf ismi kullanmadan çağırdık, sınıf ismi kullansak nasıl olabilirdi? Evet 2 ve 5 rakamları birer nesne dedik, peki hangi sınıfa aitler? Bunu anlamak çok basit, irb'de 2.class komutunu verebilirsiniz, veya bir IDE üzerinde çalışıyorsanız puts 2.class komutunu verebilirsiniz. class metodunu bu şekilde hemen her yerde kullanabilirsiniz.

Sonuç ne peki? Fixnum. Fixnum bir built-in class'tır, yani Ruby içerisinde gömülü gelen sınıflardan biridir. Rakamlar ise bu sınıfın nesneleridir. + operatörünün bir metod yani fonksiyon olduğunuda söylemiştik. Bu operatör iki nesneyi toplama görevini yapan bir methodtur.

Aslında puts 2+5 yerine, puts 2.+(5) yazarakta aynı sonucu elde edebilirdik.

class metodu ile sınıf için kullanılan class'ı karıştırmamak gerekir. Method olan class; string, integer, fonksiyonlar, değişkenler vb. birçok şeyin hangi sınıfa ait olduğunu söyleyen iş yapıcıdır, yani metodtur. İlerde aşmış bir Ruby programcısı olursak, Fixnum gibi built-in sınıflara kendi methodlarımızı ekleyebilir ve bu modülü geliştirebiliriz de.

Kernel Metodları

Kernel'de aynı Fixnum gibi özel bir sınıftır. Aslında bu built-in class'lara programlama dilinde biz modül diyoruz. Python tecrübesi olanlar bunu hemen idrak edeceklerdir zaten, Python'da matematik işlemler için math modülü, işletim sistemi ve dosya işlemleri için os modülü gibi birçok modül bulunmaktaydı. Kernel modülünün bir özelliği var, bu özellik sayesinde biz bu modülün metodlarını her sınıf içerisinde rahatlıkla kullanabiliriz.

Örneğin puts metodu Kernel modülüne ait bir fonksiyodur. Bizim oluşturduğumuz metodlardan farklı olarak puts metodu bir prefixe ihtiyaç duymuyor, yani bir ön-ad gerekmiyor. Örneğin Serhat.puts şeklinde kullanmıyoruz puts metodunu. Biz ne zaman puts fonksiyonunu ansak, Ruby gidiyor Kernel modülü içerisinden puts fonksiyonunu bulup kullanıyor, tabi bu işi Ruby'ye yaptırtmak yerine kendimizde yapabiliriz:

Kernel.puts "serhat"

Tam olarak aynı sonucu verecektir, arada herhangi bir farkta yoktur. Aşağıdaki örneklerin tümü aynı işi, aynı şekilde yapmaktadır:

Kernel.puts "serhat"
Kernel.puts ("serhat")
puts "serhat"
puts ("serhat")

Kernel'i teleffuz etmek, külfetli bir iştir ve gerekli değildir, Ruby zaten bu işi bizim yerimize yapıyor olduğu için tekrar tekrar bizim yapmamıza gerek yok.

Peki bu parantezlerde nereden çıktı? Parantez kullanımı zorunlu olmamakla birlikte, birçok metodu birbirine bağladığımızda, kodumuzun daha okunur olması için kullanılmasında fayda olabilir. Ancak bu çok sık karşılaşacağımız bir durum değildir, çünkü puts metodu tek bir argüman alabilir (parametre) ve çok nadir olarak başka metodlara bağlanır.

Arada ki farkı görmek açısından:

puts "Mustafa Serhat Dündar".length
puts ("Mustafa Serhat Dündar").length

İkinci yazım formunun daha açık olduğu kesin, ancak bu kullanım sizin programlama stilinize kalmış. Her şey bir nesne demiştik, peki Mustafa Serhat Dündar hangi sınıfa ait bir nesne? Hemen bakalım:

puts "Mustafa Serhat Dündar".class
> String

Görüldüğü gibi String sınıfına ait bir nesneymiş.

String Sınıfının Metodları

String sınıfının birçok metodu bulunmakta, bunları örnekle anlamak mümkün olduğu için doğrudan örnekliyorum:

puts "Test" + "Test"
> TestTest

puts "Test".capitalize
> Test

puts "Test".downcase
> test

puts "Test".chop
> Tes

> puts "Test".next
> Tesu

puts "Test".reverse
> tseT

puts "Test".sum
> 416

puts "Test".swapcase
> tEST

puts "Test".upcase
> TEST

puts "Test".upcase.reverse
> TSET

puts "Test".upcase.reverse.next
> TSEU

Son örneklerde gördüğümüz birçok metodun birbirine bağlanması durumunda parantez kullanımı paydalı olabilir, karışıklığı önleyebilir. Bir çok metod birbirine bağlandığında işlem sırasının soldan-sağa doğru sırayla olduğunu test edebilirsiniz.

OOP Kullanmamak

OOP yöntemlerini kullanmanın zorunlu olmadığını biliyor olmalısınız önceki yazılardan. OOP kullanmadan Ruby kullanabilir miyiz? Evet kullanabiliriz, Python'da OOP bir dildir ancak kullanım zorunluluğu yoktur. Ancak Ruby pure-oop olduğundan OOP kullanımı daha çok öne çıkmaktadır.

def havlamasesi
  puts "havv havv"
end

puts havlamasesi

gördüğünüz gibi sadece bu kod parçasını çalıştırabilmemiz mümkün. Burada havlamasesi metodunu herhangi bir nesneye veya sınıfa bağlamadan doğrudan kullandık. Diğer dillerde bu durumu procedure, function, subfunction - yani "alt program" olarak biliriz.

Bu metodun bir sınıfa bağlı olmadığını söyledik ama Ruby'de herşeyin bir nesne olduğunu ve tamamen OOP bir dil olduğunu söylemiştik, bu tezat değil mi? Aslında şuan biz görmesekte havlamasesi metodu bir sınıfa bağlı. Fark etmeden, object sınıfına bağlı bir metod oluşturduk. Denemek mi istiyorsunuz? Object.havlamasesi kullanmanız yeterli.

Başarılar.


Share this post!


Blog Comments powered by Disqus.