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..!

Share