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.
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 myAssembly = 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ı
|
|
Hakkımda
Gezer, tozar, yazarım.
Kategoriler
BilgisayarHayat
Sosyal Bölümler
- Sosyomat -
Hamili Yakinimdir..
• asmakilit • visne • visnerengi • Sykai • Sunflo
|