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

Share