Nesneler ayni mi ? (Ruby)

Belki daha sonra diÄŸer dillerde de yapmaya çalışırım ama ÅŸimdilik sadece Ruby’de… EÄŸer sizlerden istek gelirse diÄŸer dillerde de yazabilirim… Elbette eksikleri olabilir, yorumlarınız ile katkıda bulunursanız çok sevinirim.. :)Aslında yazıyı bitirdikten sonra kontrol ederken, bu yazının Ruby’nin çok güzel bir özelliÄŸi olan “Module Mixin” yeteneÄŸi için de çok iyi bir yazı olduÄŸunu fark ettim.. umarım bu açıdan da sizlere faydalı olur.
öncelikle module mixin ile birçok yerde kullanmak üzere “ObjectDiffModule” adında bir modül içerisinde tüm kodlarımızı yazalım.. :) belki daha sonra bu modulü diÄŸer sınıflar içerisinde kullanırız.
[ruby]
module ObjectDiffModule
attr_reader :objectDiffArray
# Standart hata cümlesi oluşturuluyor.
OBJECTDIFF_ERRORSTR = “Objects are not have same class type.”

def isPropertiesEqual(firstObject, secondObject)
# Yeni iÅŸlem için objectDiffArray bilgisi temizleniyor…
@objectDiffArray = Array.new()

# Her iki nesnenin property’leri alınıyor. Varsa @objectDiffArray deÄŸerleri temizleniyor.
firstVarList = firstObject.instance_variables
firstVarList.delete(“@objectDiffArray”)
secondVarList = secondObject.instance_variables
secondVarList.delete(“@objectDiffArray”)

# Performans amacı ile property dizilerinin eşit olup olması el ile kontrol ediliyor.
raise RuntimeError, OBJECTDIFF_ERRORSTR if firstVarList.size != secondVarList.size
firstVarList.size.times {
variable = firstVarList.pop
raise RuntimeError, OBJECTDIFF_ERRORSTR if variable != secondVarList.pop
firstValue = firstObject.instance_eval(variable)
secondValue = secondObject.instance_eval(variable)
@objectDiffArray.push( [variable, firstValue, secondValue] ) if firstValue != secondValue
}
return @objectDiffArray
end

def ===(secondObject)
return true if self == secondObject
isPropertiesEqual(self, secondObject).empty?
end
end[/ruby]
Daha sonra bu modülü kullanacak olan static bir sınıf yapmalıyız ki, modulü kullanmayan nesneleri birbirleri ile karşılaştırabilelim :)
[ruby]class ObjectDiff
include ObjectDiffModule
@@objectDiff = nil

private_class_method :new

def initialize() end

def ObjectDiff.isEqual(firstObject, secondObject)
return true if firstObject == secondObject
@@objectDiff = new unless @@objectDiff
@@objectDiff.isPropertiesEqual(firstObject, secondObject).empty?
end

def ObjectDiff.objectDiffArray
@@objectDiff.objectDiffArray if @@objectDiff
end
end[/ruby]
Bu yazdığımız modülü kendi sınıflarımız içerisinde de kullanabiliriz böylece yeni oluşturduğumuz sınıflar ObjectDiff özelliklerini desteklerler :)
Örnek vermek gerekir ise;
[ruby]class SimpleClass
include ObjectDiffModule

attr_reader :myname, :address, :den1, :den2
attr_writer :myname, :address

def initialize()
@myname = “Tankut”
@address = “http://www.blogcu.com/uordek
@den1 = “aaaa”
@den2 = “bbbb”
@den3 = “aaaa”
end

public
def publicDene1() end
def publicDene2() end
def to_s()
super.to_s
end
private
def privateDene1() end
def privateDene2() end
def privateDene3() end
end[/ruby]
Bu kodları denemek için ise;
[ruby]fSimple = SimpleClass.new()
sSimple = SimpleClass.new()
sSimple.myname = “Sykai”
sSimple.address = “http://www.blogcu.com/Sykai
begin
p fSimple === sSimple
p fSimple.objectDiffArray
p sSimple === fSimple
p sSimple.objectDiffArray
p ObjectDiff.isEqual(fSimple, sSimple)
p ObjectDiff.objectDiffArray
rescue RuntimeError => err
p “Bunlar farklı… ” + err
end[/ruby]
Kolay gelsin..

Nesneler ayni mi ? (Ruby)” üzerine 6 yorum

  1. merhaba sayfanızı inceledim tebrikler çok faydalı bilgiler var
    üniversite öğrencisiyim ve bitirme projemi ruby ile ilgili aldım konumun amacı da ;
    sistemi kullanacak olan kiÅŸi veya kiÅŸilere anket oluÅŸturmalarına olanak tanımak.kullanıcı sisteme “ben 30 sorulu bir anket” istiyorum diyecek.ve daha sonra her sorunun türünü (multiple, açık uçlu, true false, vs.) belirtecek, soru ve eÄŸer varsa cevaplarını girecek.daha sonra bu anket veri tabanında saklanacak.ayrıca veritabanında baÅŸka bir tablo da sırf bu anketin cevaplarını barındıracak (anketi dolduranların gireceÄŸi).ve bu anket ayrıca sistemi kullanan kiÅŸi istediÄŸinde belli bir adreste otomatik olarak devreye girecek.ve kullanıcı istediÄŸinde de görüntülenmekten kalkacak.
    veri tabanına hakimim sql biliyorum.ruby ise bilmiyorum kendim öğreneceğim.takıldığım yerlerde bana yardımcı olur musunuz.ruby öğrenmeyi çok istiyorum
    kolay gelsin iyi çalışmalar

  2. Öncelikle kolay gelsin :)

    Cevap verebildiğim kadarı ile sorularını cevaplamaktan mutluluk duyarım.

    Mezun olduktan sonra oluşturacağın iş yaşantısında da kullanabileceğin güncel ve güzel bir ödev.

    Ruby on Rails’in de sana çok yardımcı olacaktır.

Bir Cevap Yazın

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