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..!
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.
Ben teşekkür ederim :)
Aslında benim mail adresim İşte Ben :| bölümünde yazıyor ama sanırım pek görünür değil.