SORU
3 ŞUBAT 2010, ÇARŞAMBA


Nasıl Yansıması kodu kokuyor neden olabilir?

Ben düşük seviye diller - C programı en yüksek seviyeye çıkıyor.

Son zamanlarda Yansıma rastladım, ve ben kodu kokuyor olmadan kullanılan olabilir nasıl idrak edemez.

Fikri teftiş sınıf/yöntem/işlevi sırasında çalışma zamanı, bana göre, puan için bir kusur tasarım - bence en sorunların Yansıması (çalışır) çözmek kullanılabilecek ya da Polimorfizmi veya uygun kullanımı miras.

Yanılıyor muyum? Yansıma kavramı ve programı yanlış mıyım?

Kullanmak için DEĞİL, diğer çözümler başarısız ya da uygulamak için çok ağır olacak nerede Yansıma kullanmak için ne zaman iyi bir açıklama olarak arıyorum.

Düşük seviyeli aydınlat bu beceriksiz lütfen.

CEVAP
3 ŞUBAT 2010, ÇARŞAMBA


Yansıma en sık statik tür sistemi atlatmak için kullanılır, ancak o da bazı ilginç kullanım durumları vardır:

Bir ORM yazalım!

Eğer Arabiriminin aşina ya da diğer ORMs, eğer veritabanında böyle bir tablo için harita hangi sınıflar yazmak:

// used to hook into the ORMs innards
public class ActiveRecordBase
{
    public void Save();
}

public class User : ActiveRecordBase
{
    public int ID { get; set; }
    public string UserName { get; set; }
    // ...   
}

Nasıl Save() yöntemi yazılı olduğunu düşünüyor musunuz? Peki, en ORMs, kayıt yöntemi alanları türetilmiş sınıfları nasıl biri olduğunu bilmiyor, ama onları yansıtma kullanarak erişebilir.

Onuntamamenşu an için aynı işlevi bir tür-güvenli bir şekilde, sadece gerektiren bir kullanıcı için geçersiz bir yöntem kopyala alanlara bir datarow nesne, ama bu sonuç çok klişe kod ve kabartmak.

Koçanları!

Rhino Mocks alaycı bir çerçeve. Bir yöntem içine bir arabirim tipi geçirmek ve perde arkasındaki çerçeve dinamik ve sahte bir nesne oluşturmak arabirimi uygulama başlatılamadı.

Tabii, bir programcı el tarafından alay nesnesi için demirbaş kodu yazabilir, ama neden çerçeve onun için yapacak varsa yapsın?

Meta!

Çeşitli amaçlar hizmet edebilir öznitelikleri (metadata) yöntemleri ile dekore edebiliriz:

[FilePermission(Context.AllAccess)]    // writes things to a file
[Logging(LogMethod.None)]              // logger doesn't log this method
[MethodAccessSecurity(Role="Admin")]   // user must be in "Admin" group to invoke method
[Validation(ValidationType.NotNull, "reportName")] // throws exception if reportName is null
public void RunDailyReports(string reportName) { ... }

Özniteliklerini incelemek için yöntem üzerinde yansıtmak gerekir. En AOP frameworks for .NET politika enjeksiyon için öznitelikleri kullanın.

Tabii, kod satır içi aynı tür yazabilirsin, ama bu tarzı daha açıklayıcı olur.

Bağımlılık bir çerçeve yapalım!

Birçok IoC konteyner yansıma bir dereceye kadar düzgün çalıştırmak için gerekli. Örneğin:

public class FileValidator
{
    public FileValidator(ILogger logger) { ... }
}

// client code
var validator = IoC.Resolve<FileValidator>();

IoC bizim konteyner dosya doğrulayıcı oluşturmak ve kurucu ILogger uygun bir uygulamaya geçecek. Hangi uygulama? Bu onun hayata ne kadar bağlı.

Hadi bir yapılandırma dosyası derleme ve sınıfın adını verdim demek. Dili bir dizge olarak sınıfın adı okuma ve yansıma oluşturmak için kullanması gerekir.

Derleme zamanında uygulanması bildiğimiz sürece, bir sınıf adına göre oluşturmaya türü için güvenli bir yol yoktur.

/ Ördek Yazarak Geç Bağlama

Çalışma zamanında bir nesnenin özelliklerini okumak isteyeceğinizi için sebepleri vardır. -- Herhangi bir nesne kabul eden bir logger yazıyordun diyelim ve bir dosya için tüm özelliklerini ortaya döküyor en basit kullanım örneği olarak oturum almak istiyorum.

public static void Log(string msg, object state) { ... }

Sanaolabilirtüm olası statik tipleri için Günlük yöntemi geçersiz kılmak için, ya da sadece yansıma özellikleri yerine okumak için kullanabilirsiniz.

Bunun ve Scala desteği gibi bazı diller statik olarak kontrol ördek-posta (structural typing) denilen, ama bazen yok derleme bir nesneler hakkında bilgi arayüzü.

Ya da Java programcıları bildiği gibi, bazen yazın sistem yol almak ve demirbaş kodu her türlü yazmak için gerektirir. Kaç tasarım desenleri simplified with dynamic typing açıklayan tanınmış bir makale var.

Bazen tür sistemi engellemeyi kodunuzu statik türleri ile mümkün olandan çok daha fazla yeniden aşağı, biraz daha temiz kod (tercihen programcı dostu bir API arkasında gizli:) ) sonuç verir. Birçok modern statik dilleri altın kuralı benimsiyor "statik mümkünse, dinamik yazarak, gerektiğinde", kullanıcıların statik ve dinamik kod arasında geçiş sağlar. yazarak

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Matthew Smith

    Matthew Smit

    24 Mayıs 2010
  • TechnoBuffalo

    TechnoBuffal

    8 HAZİRAN 2007
  • Unbox Therapy

    Unbox Therap

    21 Aralık 2010