T4 Kod Oluşturucu (T4 Vendetta)

Merhaba yazılım kuzuları (bir bu kalmıştı söylemediğim, bu da oldu ya tamam artık). Uzun zamandır yazmayı düşündüğüm ama fırsat bulamadığım (üşendiğim) bir konu ile karşınızdayım. Text Template Transformation Toolkit yani kısaca T4 (ben nedense Vendetta kelimesini de ekliyorum V4 Vendetta hesabı…) hakkında biraz konuşacağız.

Efendim, yıllardır yazmaktan en çok zevk aldığım proje türü; kod oluşturucu projelerdir. Mesela şöyle bir uygulama düşünün: önce, MSSQL Server’a bağlanıp veritabanını seçmenize izin versin. Sonra uygulama, seçtiğiniz veritabanının her bir tablosu için bir class oluşturup, kolonlarını da classın içine property olarak yerleştirsin. Kısacası her tablo için bir model class oluştursun. Size, katmansal mimaride ne kadar büyük kolaylık sağlardı bu uygulama değil mi?

Ya da şöyle bir örnek daha vereyim; bir veritabanı projesi oluşturdunuz ve bu veritabanında 20 adet tablo var. Stored Procedure disiplinine önem veren biri olarak, her bir tablo için INSERT, UPDATE ve DELETE prosedürü yazmak istiyorsunuz. Her uygulama geliştirici, buna benzer işlere “ölme eşeğim ölme” ismini verir. Ayrıca bu isim sapına kadar da haklıdır. İçinizden bir ses, “bir uygulama yapayım da, benim için bu procedure’leri yazsın” der ve kolları sıvarsınız. Böyle bir uygulama yazmanın bir çok yolu var ama en kolay olanı SMO (Server Management Object) kullanmaktır. Ama iş burada bitmez elbette. Bir sürü kontrol ve string build işlemi yapmanız gerekiyor.

Peki ama, Visual Studio, Code Generation işlemini nasıl yapıyor Allah aşkına? Hani mesela LinqToSql class’larını bir sürükle-bırak süresinde nasıl oluyor da hazırlıyor?

Efendim bu Visual Studio meğersem yıllardır, kendi içinde template bazlı çalışan bir kod oluşturucu mekanizmasını kullanıyormuş. Fakat bu script tekniğini Visual Studio 2008 versiyonunda bizim kullanımımıza da açtılar. Yani artık biz de taklalar atmadan, bir kaç saniye içerisinde binlerce satırlık kodları yazabilen bu nimetten faydalanıyor olacağız.

Ama baştan uyarıyorum! Bu bir betik (script) dil olduğundan dolayı herhangi bir şekilde kod tamamlama (intellisense) yok. Yani biraz eskilere dönüş olacak haberiniz olsun.

Artık örneğimize başlayabiliriz. Öncelikle bir proje oluşturalım (Console veya Windows Forms Application, fark etmez) ve ardından bu projeye, .tt uzantılı bir text dosyası ekleyelim:

İşte bu dosyaya Text Template veya T4 template dosyası adını veriyoruz. Text Template dosyaları; C#,SQL veya XML gibi kodları içeren bir metin dosyası oluşturuyor. T4 kullanımı, aslına bakarsanız ASP.NET’de in-line kod yazmaya çok benziyor. Aynı ASP.NET gibi, Sayfa yönlendirmeleri ( page directive), oluşturulacak kodlarda kullanılacak sabit metinler (text block) ve bu metinlerin dinamik kısımlarını oluşturabilmek gereken için kod blokları (code blocks) kısımlarından oluşuyor. Şimdi gelelim bu şablonu oluşturmaya:

Yukarıda gördüğünüz yönlendirmelerde, öncelikle kullanacağımız dilin C# olduğunu belirtiyoruz. İkinci yönlendirme ise gayet açık; üreteceğiniz kodun uzantısı ne olacak sorusuna yanıt veriyor: “.cs”. Burada elbette, SQL,VB veya XML gibi uzantılardan dilediğinizi kullanabilirsiniz.

Şimdi de üretilecek olan kodda kullanacağınız sabit metni yazmaya geldi sıra. Burada önemli olan noktalardan biri, kullandığınız boşluğun bile aynen üretilen koda yansıması. Haliyle hiç boşluk kullanmadan aşağıdaki gibi sabit metnimi oluşturuyorum:

Sabit kodlar içerisinde gördüğünüz SinifAdi ve Ekle() kısımları, dinamik olarak değişecekler. Ama onların dışındakiler sabit kalacak. Acele etmeyin canım! Adım adım anlatıyoruz işte…

Sınıf adlarını nereden üretebilirsiniz? Yazının başında verdiğim ilk örnekte olduğu gibi bir veritabanının tablolarını kullanabilirim. Ya da bir koleksiyondan yararlanabilirim. Ama ben bunların ikisini de yapmayacağım. Basitlik anlamayı kolaylaştırır bilirsiniz. O nedenle ben bir dizi oluşturup, bu dizi içerisinde dönerek, eleman sayısı kadar class oluşturacağım.

Evet, 5. Satırda <# #> etiketleri arasında neler olduğuna bakın! Bir dizi tanımlanmış ve ardından bu dizinin eleman sayısı kadar dönen bir döngü başlatılmış. Bu döngü içerisine, sabit metnimizi yerleştirmişiz ve 19. Satır’da, yine <# #> etiketleri içerisinde for döngüsünün scope’u kapatılmış. Bundan sonraki adımı tahmin ediyor olmalısınız… SinifAdi ve Ekle() yerine dizinin elemanları gelmeli. İşte o an :

Ok işaretini de koyup artistliğimi yaptıktan sonra, sonucu artık görebiliriz. Şimdi, Text Template dosyanızı kaydedin ve Solution Explorer penceresini açın. KodOlusturucu.tt dosyasının bir alt dosya ürettiğini göreceksiniz. Dosyayı expand edip açarsanız; CodeGenerator.cs dosyası kendini gösterecek.

Bu dosyayı açın. Yüzünüzde kocaman bir gülümseme var ise kod oluşturucunuz çalışmış demektir:

Hobaaa!!! Sadece T4 şablon dosyanızı kaydettiniz ve sonuç mükemmel!

İşte Visual Studio’ya aşık olmanızı sağlayacak bir özellik daha. Benden şimdilik bu kadar. Eh artık sizi T4 ve fantezi dünyanızla baş başa bırakmanın zamanı geldi.

Not: Daha fazla coşmak isterseniz Tangible T4 isimli extension’u araştırın derim.

Keyifli kod oluşturmalar….

10 thoughts on “T4 Kod Oluşturucu (T4 Vendetta)

  1. Tam istediğim buydu harikasınız çoooooooook teşekkür ederim:)
    Çok faydalı mükemmel bir makale olmuş emeğinize sağlık.

  2. Hocam klavyenize sağlık, özletmiştiniz yazılarınızı iyi oldu bu 🙂

    İÇ SES: Çok fena kıskandım, yakın bir zamanda ben de bir makale yazmalıyım :))

  3. Açık ve net anlatmışsınız Türkay bey 🙂 süpersiniz yakın zamanda benim dediğime gelecek bu kod dünyası 🙂 ben oturduğum yerden sadece bir tuşa basıcam yada düşünücem o gerçek olucak. 🙂 Siz yazmaya devam ettikçe bende okumaya devam edicem ellerinize sağlık makalelerinizin devamı dileğiyle…

  4. Hocam ellerinize sağlık, çok faydalı bir makale hazırlamışsınız. Gerçekten bilinmesi gereken bir konuymuş. 🙂

  5. Hocam, code first çalışmayı çok seviyorum ve hakkında bir ricam olacak.
    Code first ile veritabanı oluşturuyoruz oluşturmasına da, peki code first ile procedure gibi şeyleri nasıl oluşturuyoruz? 🙂
    Türkçe kaynak bulamadım ve bulduğum ingilizce kaynaklardan da hiç bir şey anlamadım açıkcası.
    İlgili bir makalenizi görmeyi çok isterim 🙂

Leave a Reply