2010-08-05 20 views
5

Yani Meta Programlama - çalışma zamanında sınıfları/nesneleri değiştirebileceğiniz, yeni yöntemler ve özellikler enjekte edebileceğiniz fikri. Çerçeve geliştirme için iyi olduğunu biliyorum; Grails ile çalışıyor ve bu çerçeve çalışma zamanında sınıflarınıza bir takım yöntemler ekliyor. Bir User nesnesinde name özelliğiniz var ve bamm, çalışma zamanında enjekte edilen findByName yöntemini alırsınız.Meta Programlama, ne işe yarar?

  1. Açıklamalarımın konsepti tamamen açıklandı mı?
  2. Çerçeve geliştirmesi dışında (spesifik örnekler için) başka ne iyidir?
+2

Bu ne işe yarar? Kesinlikle hiçbir şey. – Radu

+1

http://en.wikipedia.org/wiki/War_(Edwin_Starr_song) 'nin olası kopyası – Tom

+0

Birkaç yanıtın işaret ettiği gibi, açıklamanız doğru değil. Açıklamanız yansıma ve yön odaklı programlama (AOP) anlamına gelir. Bu ikisi, çalışma zamanında dilin yeteneğini genişletir. Meta programlama, dilin yeteneğini derleme zamanında genişletir ve özellikle de türler üzerinde çalışma yeteneği (bir tip sistemde).Diğer taraftan yansıma, çalışma zamanında türler üzerinde çalışma yeteneğini ekler. – rwong

cevap

3

Bana göre, meta programlama "programları yazan bir programdır". o genelleme destekler çünkü

Meta programlama, yeniden kullanım için özellikle iyidir: Belirli bir desen ait kavramların ailesini tanımlayabilirsiniz. Ardından, değişkenliği ile bu konsepti benzer ancak farklı senaryolarda uygulayabilirsiniz. @Sjoerd tarafından belirtildiği gibi

basit örnek Java'nın Alıcılar ve ayarlayıcılar geçerli:

alıcı ve ayarlayıcı iyi tanımlanmış desen izleyin ikisi: Bir alıcı, bir sınıf üyesi döndürür ve bir ayarlayıcı bir sınıf üyenin değerini ayarlar . Genellikle, belirli bir desenin uygulanmasına ve yeniden kullanılmasına izin vermek için şablonu adlı ürünü oluşturursunuz. Bir şablon nasıl çalışır, kullanılan meta programlama/kod oluşturma yaklaşımına bağlıdır.

Alıcının veya ayarlayıcının biraz farklı bir şekilde davranmasını istiyorsanız, şablonunuza bazı parametreler ekleyebilirsiniz. Bu değişkenlik. Örneğin, alma/ayarlama sırasında ek işlem kodu eklemek isterseniz, değişkenlik parametresi olarak bir kod bloğu ekleyebilirsiniz. Özel kod ve üretilen kodu karıştırmak zor olabilir. ABSE şu anda, özel bir kodu doğrudan şablon parametresi olarak doğal olarak desteklediğini bildiğim tek MDSD yaklaşımıdır.

1

Meta programlama sadece çalışma zamanında yöntemler eklemekle kalmaz, aynı zamanda derleme zamanında otomatik olarak kod da oluşturabilir. Yani kod üreten kod.

  • Web hizmetleri (yani yöntemler WSDL tanımlanan ve gerçek bir nesne üzerinde yöntemler sanki bunları kullanmak istiyorsanız) Demirbaş kodu kaçınmak
  • . Örneğin, Java'da, alıcıları ve ayarlayıcıları kullanmalısınız, ancak bunlar çoğu özellik için otomatik olarak yapılabilir.
+0

Metaprogramlamanın özellikle çalışma zamanı bir şey olduğunu sanıyordum. İlginç. Kazan plakası kodu hakkında iyi bir nokta (Grails bunu da yapar). Başka herhangi bir şey? – hvgotcodes

+0

@hvgotcodes: Metaprogramlama çoğunlukla derleme zamanı ile ilgilidir; Çalışma zamanı kullanımları, çalışma zamanı kullanımlarına göre oldukça nadirdir. Bkz. C++ şablonları (pek çok insan bunu kabul etmeyi sevmese de, metaprogramlama türüdür): STL kullanan tüm programlar ... bunların birçoğu vardır. – liori

0

Meta programlama yalnızca kod tabanınıza bir şeyler eklemek için kullanılmaz. Kod başlıklarınızı eşleştirmeden, uğraştığınız geçerli kodu açıklamak için de kullanılabilir. mediator pattern gibi birçok "birçok ilişki" uygulamasında oldukça yararlı olabilir.

İlgili konular