Önceki açmış olduğum konu olan Ruby #1 - Giriş'te genel olarak Ruby tam olarak nedir, tarihi ve nasıl sistemlerinize yükleyebileceğinizle ilgili ufak bir bilgilendirme yapmıştım. Bu rehberde ise Ruby ile ilgili biraz daha ayrıntı bilgilere girmek amacındayım. Ruby'nin genel özellikleri, söz dizimi ve çalışma prensipleri bu rehberin konularını kapsıyor.
Ruby'nin Genel Özellikleri
Ruby, yaratıcısı Matz'ın deyimiyle basitlikten çok doğallığı temel alan bir programlama dilidir. Bu sebepten ötürü de Matz aslında sevdiği dillerden (Perl, Smalltalk, Eiffel, Ada, ve Lisp) özellikleri alıp harmanlayıp Ruby'yi oluşturmuştur. Böylece özel bir alana yoğunlaşan bir dil olmaktansa genel amaca hizmet eden bir dil olmuştur. Özellikleri neticesinde de zaman içerisinde kaybolmamış ve günümüzde de kullanıldığı görülmektedir.
Nesne Yönelimli Yaklaşım
Birçok nesne yönelimli yaklaşım felsefesini benimsemiş dilin aksine Ruby, diğer dillere nazaran bu felsefeyle biraz daha haşır neşirdir. Bunun sebebi de Matz'ın Ruby'yi Python'a kıyasla daha nesne yönelimli yaklaşımlı olmasını istemesinden kaynaklanır. Bu açıklama garip gelebilir ama çok da doğru bir sebebi var: Ruby'de görebileceğiniz her şey birer nesnedir. Sayılar, diziler ve sınıflar bile birer nesnedir. Bu sonuç da doğal olarak Ruby'yi olması gerektiğinden çok daha esnek bir hale getiriyor.
Esneklik
Her şeyin birer nesne olmasının yanı sıra Ruby dinamik olarak veri tipi kontrolü yaptığından ötürü sizin tip kontrolü yapmak için fazladan kod yazmanıza gerek yoktur. Bunun yanında Ruby, sizi tam olarak bir şeyin nasıl yapılması gerektiği konusunda dayatma uygulamaz. Tamamen serbestsiniz, ne yaptığınızı bildiğiniz sürece tabii ki. Örneğin şu kod örneğini inceleyelim:
Gördüğünüz üzere çok basit bir şekilde Ruby'de + operatörünü kullanmak yerine plus adlı bir metot oluşturup aynı işlevi yapacak bir alternatif üretebiliyoruz. Bu her ne kadar basit bir örnek olsa da size az çok Ruby'nin esnekliği hakkında bilgi verecektir. Ruby'nin ileri seviye özelliklerine bakacağımız rehberlerde bu konuya ayrı olarak değineceğim ama şimdilik bu yeterli olur.
Basit Sözdizimi
Her ne kadar yüksek seviye dillerin çoğunun sözdizimi kolay olsa da Ruby belki de en temiz ve en okunabilir sözdizimine sahip programlama dili olabilir. Baktığınızda sanki bir kod okuyor değil de İngilizce metin okuyormuş hissine kapılabilirsiniz. Tabii eklemek gerekir, Ruby kodunu da çok rahat bir şekilde karmaşık hale getirebilirsiniz. Mesela iki farklı kod örneği inceleyelim. Birini ortalama bir teknikle yazarken diğerini Ruby'nin özelliklerini kullanarak yazalım. Yapacağımız uygulama çok basit; dizi içerisinde olan sayıları teker teker kontrol edip çift olanların çıktısını göstereceğiz:
Normalde bu şekilde de kolayca sayıların üzerinden geçip çift olup olmadıklarını basit bir algoritmayla halledebiliriz. Uzunluk açısından bakarsak, her ne kadar çok kritik olmasa da bu kodu da Ruby'nin özelliklerinden faydalanarak kısaltmak pek mümkün.
Görebileceğiniz üzere Ruby'nin kullanıcıya sunduğu özelliklerden yararlanarak yaptığımız işlemi tek satıra indirebiliyoruz. Kodun açıklaması da bir o kadar basit;
Yine Ruby'nin kendine has özelliklerini kullanarak az önceki kodu daha da basitleştirerek, yaptığımız işlemden ödün vermeden aynı sonuca ulaşabiliyoruz.
Genel anlamda şu an için bahsedebileceklerim bu kadarıyla sınırlı. İlerleyen rehberlerde yeri geldiğince Ruby'nin kendine has özelliklerinden bahsedecek ve bunları nasıl kullanabileceğinizi de örnekler üzerinden göstereceğim. Sonraki rehberde karşılaşmak üzere, esenlikler dilerim.
Kaynakça
Ruby'nin Genel Özellikleri
Ruby, yaratıcısı Matz'ın deyimiyle basitlikten çok doğallığı temel alan bir programlama dilidir. Bu sebepten ötürü de Matz aslında sevdiği dillerden (Perl, Smalltalk, Eiffel, Ada, ve Lisp) özellikleri alıp harmanlayıp Ruby'yi oluşturmuştur. Böylece özel bir alana yoğunlaşan bir dil olmaktansa genel amaca hizmet eden bir dil olmuştur. Özellikleri neticesinde de zaman içerisinde kaybolmamış ve günümüzde de kullanıldığı görülmektedir.
Nesne Yönelimli Yaklaşım
Birçok nesne yönelimli yaklaşım felsefesini benimsemiş dilin aksine Ruby, diğer dillere nazaran bu felsefeyle biraz daha haşır neşirdir. Bunun sebebi de Matz'ın Ruby'yi Python'a kıyasla daha nesne yönelimli yaklaşımlı olmasını istemesinden kaynaklanır. Bu açıklama garip gelebilir ama çok da doğru bir sebebi var: Ruby'de görebileceğiniz her şey birer nesnedir. Sayılar, diziler ve sınıflar bile birer nesnedir. Bu sonuç da doğal olarak Ruby'yi olması gerektiğinden çok daha esnek bir hale getiriyor.
Esneklik
Her şeyin birer nesne olmasının yanı sıra Ruby dinamik olarak veri tipi kontrolü yaptığından ötürü sizin tip kontrolü yapmak için fazladan kod yazmanıza gerek yoktur. Bunun yanında Ruby, sizi tam olarak bir şeyin nasıl yapılması gerektiği konusunda dayatma uygulamaz. Tamamen serbestsiniz, ne yaptığınızı bildiğiniz sürece tabii ki. Örneğin şu kod örneğini inceleyelim:
Ruby:
class Numeric
def plus(x)
self.+(x)
end
end
y = 5.plus 6
Gördüğünüz üzere çok basit bir şekilde Ruby'de + operatörünü kullanmak yerine plus adlı bir metot oluşturup aynı işlevi yapacak bir alternatif üretebiliyoruz. Bu her ne kadar basit bir örnek olsa da size az çok Ruby'nin esnekliği hakkında bilgi verecektir. Ruby'nin ileri seviye özelliklerine bakacağımız rehberlerde bu konuya ayrı olarak değineceğim ama şimdilik bu yeterli olur.
Basit Sözdizimi
Her ne kadar yüksek seviye dillerin çoğunun sözdizimi kolay olsa da Ruby belki de en temiz ve en okunabilir sözdizimine sahip programlama dili olabilir. Baktığınızda sanki bir kod okuyor değil de İngilizce metin okuyormuş hissine kapılabilirsiniz. Tabii eklemek gerekir, Ruby kodunu da çok rahat bir şekilde karmaşık hale getirebilirsiniz. Mesela iki farklı kod örneği inceleyelim. Birini ortalama bir teknikle yazarken diğerini Ruby'nin özelliklerini kullanarak yazalım. Yapacağımız uygulama çok basit; dizi içerisinde olan sayıları teker teker kontrol edip çift olanların çıktısını göstereceğiz:
Ruby:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
numbers.each do |number|
if number % 2 == 0
puts number
end
end
Normalde bu şekilde de kolayca sayıların üzerinden geçip çift olup olmadıklarını basit bir algoritmayla halledebiliriz. Uzunluk açısından bakarsak, her ne kadar çok kritik olmasa da bu kodu da Ruby'nin özelliklerinden faydalanarak kısaltmak pek mümkün.
Ruby:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
numbers.select(&:even?).each(&method(:puts))
Görebileceğiniz üzere Ruby'nin kullanıcıya sunduğu özelliklerden yararlanarak yaptığımız işlemi tek satıra indirebiliyoruz. Kodun açıklaması da bir o kadar basit;
.select(&even?)
parçası her bir sayıyı okuyor ve Ruby'nin içinde bulunan .even?
kontrol metoduyla sayının çift olup olmadığını kontrol ediyor. .each(&method(:puts))
parçası da çift olan her sayıyı puts
metotu ile komut istemcisine çıktı olarak gönderiyor. Aslında aradaki temel fark; normalde kontrol için algoritmayı sizin yazmanız gerekirken Ruby bunu zaten sizin için yapıyor. Zincirleme bir şekilde metot çalıştırabildiğiniz için (ki bu neredeyse her dilde var) yazılacak kodu tek bir satıra indirebiliyorsunuz. Hatta gelin, değişkenlerle de uğraşmadan işimizi daha da kolaylaştıralım:
Ruby:
(1..10).each { |n| puts n if n.even? }
Yine Ruby'nin kendine has özelliklerini kullanarak az önceki kodu daha da basitleştirerek, yaptığımız işlemden ödün vermeden aynı sonuca ulaşabiliyoruz.
Genel anlamda şu an için bahsedebileceklerim bu kadarıyla sınırlı. İlerleyen rehberlerde yeri geldiğince Ruby'nin kendine has özelliklerinden bahsedecek ve bunları nasıl kullanabileceğinizi de örnekler üzerinden göstereceğim. Sonraki rehberde karşılaşmak üzere, esenlikler dilerim.
Kaynakça
Son düzenleme: