Ruby ile Struct

Merhaba arkadaÅŸlar,

Bugünkü yazımızda Struct ve OpenStruct yapılarından bahsedeceÄŸiz. “Bu yapılara neden ihtiyacımız var ?”, “Var olan ‘class’ yapısı veya bu iÅŸlemlere benzer olan ‘Array’ ve ‘Hash’ yapılarını neden kullanmıyoruz ?”, “Bu kadar fazla öğrenmemiz gereken sınıf, yapı ve iÅŸlev varken neden bir de başımıza bu ikisi çıktı ?”, ve son olarak “Ne iÅŸimiz var kardeÅŸim Struct ile falan, bunlar boÅŸ iÅŸ.. ne yapacan öğrenip de..!?” gibi soruları cevaplamak gerekir. Ama tüm bu sorulardan önce ben neden bu yazıyı yazıyorum onu anlatmalıyım sanırım. Bu yazıyı bu linkte yer alan bir yazıyı gördükten sonra yazmaya karar verdim. Bu yazıda blog sahibi arkadaÅŸ Ruby on Rails’de ActionMailler kullanımı sırasında kullanmış, çok da güzel kullanmış. Ben de kendi kendime ‘Ben de bunu bizimkilerle paylaÅŸayım’ dedim. Ä°yi ettim di mi ? ettim ettim.. :)

Hatta ve hatta çok da güzel bir snippet’da mevcut. Bir göz atmanızı tavsiye ederim.

‘Struct’ ruby içerisinde yer alan ‘Class’ benzeri bir yapı, aslında Class’dan türemiÅŸ farklı bir yapı. Şöyleki normalde yeni bir ‘class’ yaratmak istediÄŸimiz de

class YeniSinif
attr_reader ...
attr_writer ...
attr_accessor ...

def ...
end

...
end

ÅŸeklinde ‘YeniSinif’ı yaratır ve bu sınıftan nesneler üretmeye baÅŸlayabiliriz. Struct, sadece veri taşımak için tasarlandığı için ÅŸu ÅŸekilde bir tanımlamaya ihtiyaç duyar;

# Temel Struct tanımı...
Adres = Struct.new(:posta_kodu, :sehir, :ilce, :semt, :mahalle, :apt_no, :apt_isim, :daire)

anlaşılacağı üzere, herhangi bir ÅŸekilde eriÅŸim belirleyicisi tanımlanamaz (private, protected, public gibi) tüm üyeler public’dir. Önemle belirtmem gerekirki, bu yeni oluÅŸturduÄŸum ‘Adres’ bir nesne deÄŸildir, bir sınıftır yani yeni bir türdür(type). Peki biz neden ruby içerisinde yeni bir tür(type) yaratmak istedik ? Örnekten de anlaşılacağı gibi, normal hayatta adres bilgisinde posta kodu, ÅŸehir, ilçe…vb bilgiler birbirlerinden ayrılamazlar ve mantıksal anlamda da bir birliktelikleri vardır. Elbette kullanmazsak programlarımızda çok büyük problemler çıkmaz ama bazı durumlarda bize çok büyük kolaylıklar saÄŸlayabilir; örnek vermek gerekir ise; Struct kullanmadan adres yapısının kopyalanması;

yeni_posta_kodu = posta_kodu
yeni_sehir = sehir
yeni_ilce = ilce
yeni_semt = semt
...
...

peki Adres diye bir tür kullansaydık ve işlemleri bu tür üzerinden yürütseydik;

yeni_adres = adres.clone # Bu kadar.. :)

ÅŸeklinde küçücük bir kod parçası ile bu iÅŸlemi yapabilirdik. Peki hemen aklınıza gelebilir, zaten sınıf(class) yapısı mevcut ben struct yerine class kullanamazmıyım ? Elbette kullanabilirsin, class, struct’ın yapabileceÄŸi tüm özelliklere sahip temel ve en genel yapıdır. Struct sadece verileri tutmak için yapılmış ve bu iÅŸ üzerine yönelmiÅŸ class’ın alt sınıfıdır. Yukarıda da bahsettiÄŸim snippet incelenecek olursa, bu konu daha rahat anlaşılır diye tahmin ediyorum.

Peki “Struct sadece verileri tutmak için yapılmış ve bu iÅŸ üzerine yönelmiÅŸ class’ın alt sınıfıdır” dedik, bu veri tutma iÅŸinde bizlere hangi özellikleri vermektedir. Struct, class’lardan farklı olarak bizlere bir Array veya Hash nesnesine eriÅŸir gibi içerisinde yer alan özelliklere eriÅŸimimizi saÄŸlayabilir. Şöyleki;

adres = Adres.new()
# veya
# adres = Adres.new(34300, "Ä°stanbul", "Fatih", "CerrahpaÅŸa", "ZZZZ ZZZ ZZZZ ZZ", 1, "Gonca", 18)
adres.posta_kodu = 34300
adres.sehir = "Ä°stanbul"
puts adres[:posta_kodu] # 34300
puts adres["sehir"] # Ä°stanbul
puts adres[1] # Ä°stanbul
puts adres.members # üyelerin isimlerini verir.
puts adres.values # üyelerin değerlerini verir.

adres.each_pair do |key,value| 
	puts key.to_s + ":" + value.to_s
end

Bir sonraki yazımda OpenStruct’u anlatmaya çalışacağım… :)

Kolay gelsin :)

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir