Ruby ile Reflection – 2

Merhabalar,

Bir önceki Ruby ile Reflection adlı yazımda anlatmaya baÅŸladığım Reflection konusunu, bu yazı ile bitiriyoruz. Önceki yazımda Reflection‘ın tanımı yapmış, yazılımcıların neden kullanmak istediklerini felsefik anlamda incelemiÅŸtik. Hatta tüm bunlar yetmemiÅŸ bir de kapsamlı bir örnek yapmıştım.

Bu yazıda biraz daha güncel hayat örnekleri ile beraber özellikle Rails’de bu iÅŸler nasıl yapılmış ona deÄŸineceÄŸim. Daha doÄŸrusu deÄŸinmeye çalışacağım.

Ä°lk olarak Ruby on Rails üzerinde Model kavramı ile çalışmaya baÅŸladığınızda ilk veya ikinci örnekte aÅŸağıda yer alan kod satırını görürsünüz. (Örnek; Agile Web Development With Rails’den alınmıştır.)
[ruby]
class Product < ActiveRecord::Base validates_presence_of :title, :description, :image_url end[/ruby] Bu örnekte validates_presence_of methodu ile title, description ve image_url bilgilerinin boÅŸ olamayacağını belirtmiÅŸ oluyoruz. Kodun yazım ÅŸekli biraz garip olabilir, ilk zamanlar (Ruby ile Reflection’ı öğrenmeden önce) bana garip gelmiÅŸti :)

Åžimdi bu yazım ÅŸekli de nereden çıktı diyeceksiniz, aslında çok basit; Ruby’de “:” iÅŸareti bir methodu veya deÄŸiÅŸkeni ifade etmek için kullanılır. Bu iÅŸaretle biz aslında o methodu veya deÄŸiÅŸkeni kullanmak istemediÄŸimizi sadece ifade etmek istediÄŸimizi belirtiyoruz. Eski dilde, tabir-i caiz ise adresini kullanıyoruz. Yani “:title” aslında “title” deÄŸiÅŸkenini ifade eder.

DiÄŸer yazılarımızda olduduÄŸu gibi, hemen örneÄŸimize geçelim; bu örneÄŸimizde rails’de kullanılan aynı yöntem ile validate_not_empty ve validate_max_size kontrollerini kendi oluÅŸturduÄŸumuz sınıfa ekleyeceÄŸiz.
[ruby]
# Yapılacak olan kontroller MyBaseClass’a alındı.
# Özel bir nedeni yok sadece görüntüsü güzel olduğu için :)
class MyBaseClass
protected # Sadece alt sınıfların kullanması için
# Not Empty kontrolü için propertiler tutulacak
@@validate_not_empty_props = []
def self.validate_not_empty(*props)
if props.instance_of?(Array)
@@validate_not_empty_props = props
else
@@validate_not_empty_props = [props]
end
end
# Max size kontrolü için propertiler tutulacak
@@validate_max_size_props = {}
def self.validate_max_size(prop, size)
@@validate_max_size_props[prop] = size
end
# Standart (not empty ve max size) kontrölleri yapan method
def standart_validation
# Bu bölümde ekrana yazdırmak yerine hata verilebilir.
@@validate_not_empty_props.each do |prop|
if self.send(prop).length == 0
puts “#{prop.id2name}, boÅŸ olamaz.(#{self})”
end
end

@@validate_max_size_props.each do |prop, size|
if self.send(prop).length > size
puts “#{prop.id2name} bilgisinin uzunluÄŸu #{size}’dan fazla olamaz.(#{self})”
end
end
end
end

class SimpleClass < MyBaseClass attr_accessor :ad, :soyad, :adres # Yapılacak kontroller belirlenir. validate_not_empty :ad, :soyad validate_max_size :ad, 10 validate_max_size :soyad, 15 validate_max_size :adres, 50 def initialize(ad, soyad) @ad = ad @soyad = soyad end def to_s "#{@ad}, #{@soyad} (#{@adres})" end def validate standart_validation() puts "Merhaba Uordek" if ad == "Uordek" end end myClass1 = SimpleClass.new("Sihaya", "") myClass1.adres = myClass1.ad * 10 myClass1.validate myClass2 = Class.const_get("SimpleClass").send("new","Uordek", "esiyo.net") myClass2.adres = myClass2.ad * 3 myClass2.validate [/ruby] programı çalıştığında; soyad, boÅŸ olamaz.(Sihaya, (SihayaSihayaSihayaSihayaS…..))
adres bilgisinin uzunluÄŸu 50’dan fazla olamaz.(Sihaya, (SihayaSihaya….))
Merhaba Uordek
‘ ÅŸekilde bir çıktı üretir.

ÖrnekÄŸi biraz açıklamak gerekiyor, validate_not_empty :ad, :soyad iÅŸlemi aslında duraÄŸan (singleton) bir method çaÄŸrımıdır. MyBaseClass’da yer alan validate_not_empty methoduna :ad ve :soyad bilgilerini parametre olarak geçer. Biz bu bilgileri @@validate_not_empty_props adlı static bir deÄŸiÅŸken de saklarız. Daha sonra kontrollerin gerçekleÅŸeceÄŸi zaman aÅŸağıda yer alan kod satırı ile iÅŸlemi gerçekleÅŸtiririz;
[ruby]
@@validate_not_empty_props.each do |prop|
puts “#{prop.id2name}, boÅŸ olamaz.(#{self})” if self.send(prop).length == 0
end
[/ruby]
Konu biraz karışık, ama örneği denediğinizde aklınızda kalan soruların da yok olacağına eminim :)

Kolay gelsin..!

Ruby ile Reflection – 2” üzerine 2 yorum

  1. Reflectionlar için kendimce erken ancak güzel bir kaynak olduğu su götürmez teşekkürler.

    Bu arada ruby konusunda beraber bir çalışma yapmak adına benimle mail adresinden bağlantı kurabilirseniz sevinirim.

Bir Cevap Yazın

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