Uordek'in Defteri

30/10/2006 - Bundan sonra, artık, daha sonra, yeni bir..

Değişiklik iyidir... :)

Yorum (1) :: Yorum yaz! :: Bağlantı

19/10/2006 - Nesneler aynı mı ? (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.

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_*******(variable)
            secondValue = secondObject.instance_*******(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ızki, 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 = "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


Bu kodları denemek için ise;
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



Kolay gelsin..
Yorum (1) :: Yorum yaz! :: Bağlantı

19/10/2006 - .NET 2.0'da "reflection" kullanırken "ref" parametreler kullanmak.

Kategori: Bilgisayar
Bugün bir arkadaşımdan email aldım, kendisi "reflection" kullanırken nasıl parametrelerden birini veya birkaçını "ref" olarak nasıl geçebileceğini soruyordu. İnternet üzerinden araştırdığı söyledi fakat bulamamış, kendisine emaille yardımcı oldum.

Zamanım da var enerjim de bir yazı da buraya yazayım dedim.. iyi demiş miyim ? :)


Elimizde Deneme2 adlı bir namespace mevcut olsun, hatta bu ayrı bir proje olsun; (hedef namespace)
namespace Deneme2
{
    public class Aha
    {
        public Aha(int a)
        {
            Console.WriteLine("Aha.Const = " + a.ToString());
        }
        public void ToString(ref int sayi)
        {
            Console.WriteLine("Aha.ToString" + sayi.ToString());
            sayi = 10;
        }
    }
}

Ve Deneme2 Assembly'sine erişerek "Aha" sınıfını 'reflection' ile yaratıp ref veya normal parametreler geçerek method'larını çağıran TestApp1 namespace'inde Program adlı bir sınıfımız olsun...

namespace TestApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Deneme2 ayrı bir proje olduğu için şu anki Assembly'de yer almaz bu nedenle
            // çağrılmalıdır.
            Assembly my
Assembly = Assembly.Load("Deneme2");

            //
myAssembly içerisinden Aha adlı sınıfın tipi alınıyor.
            Type myType =
myAssembly.GetType("Deneme2.Aha", true, true);
           
            // Yapıcı ve methodlar için
parametre listesi düzeneği hazırlanıyor.
            Type[] paramTypes = new Type[1];
           
paramTypes[0] = typeof(int);
           
            // Yukarıda hazırlanan parametre listesinin değerleri hazırlanıyor.
            Object[] paramValues = new Object[1];
           
paramValues[0] = (object)5;

           
// Daha önceden tipi hazırlanmış olan sınıfın yapıcısını parametre
            // listesi ve değerleri ile çağırıyoruz.

            ConstructorInfo myInfo = myType.GetConstructor(paramTypes);
            Object myAhaObject = myInfo.Invoke(
paramValues);

            // Yeni oluşturduğumuz
myAhaObject üzerinde "ToString" method'u 'invoke' ediliyor.
            myType.InvokeMember("ToString", BindingFlags.InvokeMethod, null,
myAhaObject, paramValues);
           
            Console.WriteLine((int)
paramValues[0]);
            Console.ReadLine();
        }
    }
}


Kolay gelsin, tekrar görüşmek üzere..!


Yorum (0) :: Yorum yaz! :: Bağlantı

<- Son Sayfa :: Sonraki Sayfa ->

Hakkımda

Gezer, tozar, yazarım.

Gezinti Bölümü

Kaptan Köşkü
Arşiv

Kategoriler

  • Bilgisayar
  • Hayat
  • Sosyal Bölümler

    - Sosyomat -

    Hamili Yakinimdir..

    asmakilit
    visne
    visnerengi
    Sykai
    Sunflo