http://esiyo.net - uordek.essiyoo.each { |yazi| esiyo.net << yazi }

Nesneler ayni mi ? (Ruby)

21.11.2006, yazan Tankut ŞENTÜRK

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.

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

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 :)

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

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;

class SimpleClass
    include ObjectDiffModule

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

    def initialize()
        @myname = "Tankut"
        @address = "<a href="http://www.blogcu.com/uordek">http://www.blogcu.com/uordek</a>"
        @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

Bu kodları denemek için ise;

fSimple = SimpleClass.new()
sSimple = SimpleClass.new()
sSimple.myname = "Sykai"
sSimple.address = "<a href="http://www.blogcu.com/Sykai">http://www.blogcu.com/Sykai</a>"
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

Kolay gelsin..

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails)

6 Yorum

  1. müge

    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. Tankut ŞENTÜRK

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

  3. actonel

    diet pills that work http://ephedraa.ep.funpic.de/diet-pills.html diet pills online fiorecet

  4. amoxicillin

    fiorcet http://hydrocodoneyes.toplog.nl/ buy hydrocodone online symptoms of hydrocodone addiction http://www.pakstop.com/blog/?u=orderfioricet fiorecet

  5. lamisil

    buy valium without prescription http://lowepriprop.actieforum.com/ buy propecia cheap soma

  6. proscar

    singulair price http://phenada.1sweethost.com/augmentin-online.html augmentin xr

Yaz aklındakini, çekinme :)

Lütfen: Yorumunuzun değerlendirilmesi ve yayınlanması uzun sürebilir. Yorumunuzu tekrar göndermeniz için bir neden yoktur, inanın tüm yorumları yayınlıyorum. Bazıları hariç :).