Yazarlar Sözlük Makaleler Yardım Masası Gözlük Forum İstatistik

Code Generation, Code Generator nedir?


Özet
Code generation adını sıkça duyduğumuz bir kavram. Kod yazan kodların yaptığı işe deniyor. Kod da kod yazar mıymış demeyin. Programlarsanız yazıyor. Hem de ne kadar iyi programlarsanız o kadar iyi yazıyor. Hatta öyle ki; bazı code generatorlar artificial intelligence sınırlarını zorlayan kodlar bile üretebiliyor. Bu tür programları gören kimi programcıların da tüyleri diken diken oluyor, "ulan patron bunu görse beni kapının önüne koyar ha" diye.

Yazar Hakkında
Şehir :
İstanbul

Üyelik :
06 Ocak 2005 06:46

Son Giriş :
24 Temmuz 2017 21:23
» Mesaj gönder
» fizikci hakkında
» Sözlükte fizikci
Code generation aslında eski bir kavram ama son zamanlarda popülerliği baya arttı. Bunun sebebi metadataya erişimin artık çok kolaylaşmış olması. Reflection, information_schema viewleri gibi nisbeten yeni teknolojiler metadataya erişim imkanı sağlıyor. Bu imkandan faydalanan programcılar bir an her şeyi generate edebileceği zannına kapılarak gençliklerinin en güzel zamanlarını cenereyşına kafa patlatarak harcıyor. :) Bu kadar çok programcı bu işe soyununca popülerliği de artıyor tabi.

Peki nasıl yapılıyor bu iş? Örneğin en çok yazılan code generator türlerinden biri olan "veritabanındaki tablolara ait liste ve veri giriş ekranlarının kodlarının üretilmesi" nasıl oluyor da oluyor?

Evet başta da söylediğimiz gibi bu işi yapabilmek için gerekli olan şey metadata. (yani datanın datası, data hakkında detaylı bilgi) Eğer liste sayfalarını ve veri giriş formlarını kendisine göre üretmek istediğimiz bilgi türlerine ilişkin yeterince detaylı, programatik olarak erişebileceğimiz bilgiye (evet metadata) sahipsek kod generate etmek kolay bir iş olacaktır.

Yani asıl mesele metadaya erişebilmek ya da sahip olmaktır. Zaten metadata, her veritabanı uygulamasının başlangıcındaki analiz sürecinde programcı tarafından bizzat üretilir. Örneğin bir kütüphane yazılımı geliştirecek olsanız, önce hangi entityleri (varlık, bilgi türü) tanımlamanız gerektiğini düşünürsünüz. "Kitap"lar olacaktır, kitapların ait olduğu "kategori"ler olacaktır, kütüphane "üye"leri olacaktır. Ve bu entitylerin özellikleri olacaktır; mesela bir kitapla ilgili olarak "ISBN" numarasını, "Ad"ını, "BasımTarihi"ni, hangi "Kategori"de olduğunu ve "Ciltli" olup olmadığını belirtmek isteyeceksiniz. Buraya kadar düşündüğümüz şeyler tamamen metadata kapsamındadır.

Peki bu metadata nasıl belirtilir? Örneğin OOP tekniğini kullanıyorsanız Kitap adında bir sınıf yazar, özellikleri bu sınıfa field olarak eklersiniz. Metadata belirtmenin bir yolu budur. Ya da veritabanını açıp direk "Kitap" tablosunu oluşturmaya başlarsınız. Bu da başka bir yoludur. Ya da bir UML aracını kullanarak ER diagramları çizersiniz. Sıkıcı da olsa bu da bir yoldur.

Nasıl yaparsınız yapın, eğer tanımladığınız metadaya programatik olarak erişebilirseniz kod generate edebileceksiniz demektir.

Eğer metadatanızı OOP classları olarak tanımladıysanız pek çok dilde reflection kullanarak bu metadataya erişebilirsiniz. Eğer direk vertabanında tablolar oluşturduysanız, metadatanıza ANSI SQL standardı olan INFORMATION_SCHEMA view'larını kullanarak erişebilirsiniz. Bir UML aracı kullandıysanız UML araçları SQL ya da class kodları generate ederek size yardımcı olacaktır.*

Biz örnek olarak direk veritabanında tablolarımızı oluşturma yoluna gitiğimizi düşünelim. Kitap tablosu aşağıdaki gibi olacaktır;
CREATE TABLE Kitap
(
   KitapID      INT         NOT NULL PRIMARY KEY,
   ISBN         VARCHAR(20) NOT NULL UNIQUE,
   Ad           VARCHAR(20),
   BasimTarihi  DATETIME,
   KategoriId   INT         REFERENCES Kategori (KategoriID),
   Ciltli       BIT
)

Bu gördüğünüz şey (create table ifadesi) metadata tanımlıyor zaten. Bu sebepten create cümlelerine DDL* ifadeleri denir. Şimdi buna bakarak kitap girişinin yapılacağı ekranın nasıl olacağını hayal edelim.
- ISBN alanının tipi varchar olduğundan, onun için bir TextBox olacak, zorunlu alan olacak
- Ad için de TextBox olacak, zorunlu olmayacak
- BasimTarihi, datetime tipinde, onun için bir DateTimePicker kontrolü olacak
- KategoriId için bir DropDownList*** olacak ve liste olarak Kategori tablosundaki kayıtları gösterecek (Neden? Çünkü foreign key tanımlanmış)
- Ciltli alanı için de bir CheckBox olacak

Bu bilgiyi veritabanından alabilmek için INFORMATION_SCHEMA.COLUMNS view'ını TABLE_NAME='Kitap' koşuluyla sorgulamalıyız. Yani şöyle;
select COLUMN_NAME, DATA_TYPE, IS_NULLABLE form INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='Kitap';

Bu sorgunun sonucu, create table ile belirttiğimiz field isimlerini, tiplerini ve null olup olmadıklarını bize aynen söyleyecektir.

Bu bilgiyi kullanarak kodlarımızı üretebiliriz. Tabi kod üretebilmeniz için daha önce Kitap gibi bir tablo için, hiç olmasa hayatımızda bir kere bile olsa, liste ve düzenleme formları hazırlamış olmamız gerekiyor. Yani üretilecek kodun nasıl bir şey  olması gerektiğini bilmemiz lazım. Ne üreteceğini bilmeden nasıl üretebilirsin ki? :)

Şimdi kitap_edit.php kodunu üretelim: (dilimiz PHP, veritabanımız Microsoft SQL Server)
<?
// kitap_edit.php dosyasını oluşturalım:
$file = fopen("kitap_edit.php", "w+");

// kitap_edit.php?id=x şeklinde gelen id değeriyle kitap tablosundan ilgili kaydı okuyan kodu üretelim:
fwrite($file, "\$rec = \$db->getRec(\"select * from [kitap] where id=\".\$_GET['id']);");

// Aman Allahım! Ne karışık koddu o öyle! - Eee boru değil, kod yazan kod yazıyoruz!

// şimdi kitap tablosunun fieldlarını INF_SCHEMA'dan öğrenelim ve formu generate edelim
$fieldRes = mssql_query("select yukarıdaki inf_schema SQLi..");

for($i=0; $i<mssql_num_rows($fieldRes); $i++)
{
   $field = mssql_fetch_array($fieldRes);

   // alanların tipine göre ekran kontrollerinizımbırtı üretelim
   switch($field['DATA_TYPE'])
   {
      case "VARCHAR":
         fwrite($file, $field['COLUMN_NAME']." : <input type=text name=row[".$field['COLUMN_NAME']."]> <br>");
         break;
      case "BIT":
         fwrite($file, $field['COLUMN_NAME']." : <input type=checkbox name=row[".$field['COLUMN_NAME']."]> <br>");
         break;
      case "DATETIME":
         fwrite($file, $field['COLUMN_NAME']." : <input type=text name=row[".$field['COLUMN_NAME']."]> <br>");
         break;
      ...
      ...
   }
}
...
...
?>

Biz burada eksik gedik ve sadece kitap tablosu için kod üreten bir örnek yazdık. Aslında yapılması gereken şudur:
1. INFORMATION_SCHEMA.TABLES view'ını sorgula ve veritabanındaki tüm tabloları öğren.
2. Bu tabloları tek tek dolaşacak bir döngü hazırla
3. tablo ismine uygun bir dosya oluştur. (kitap_edit.php gibi)
4. bu tablo için yukardakine benzer bir kodla edit kodunu generate et.
5. Üç ve dördüncü adımı bütün tablolar için uygula (2. adımdaki döngü bunun içindi zaten)

Gelelim kod üretmenin en büyük handikapına:
Mesela kitap_edit.php kodunu ürettiniz ve keyifle kullanıyorsunuz. Tabi kitap düzenleme işinin kendine has kodlama ihtiyaçları olduğundan üretilen kodun içine elinizle yeni kodlar yazdınız. Buraya kadar problem yok. Sonra kütüphaneci müşteriniz dedi ki; "kitap giriş ekranına bir tane de yazar alanı koyalım, onu unutmuşuz". Haydaaa.. Kitap tablosuna yazar alanını ekleyip kodu baştan generate etseniz elinizle yazdığınız kodlar uçacak, yok elinizle yazar alanına ait kodu yazsanız, o zaman ne anladım ben bu kod cenereyşından? Bu gerçekten de çözümsüz bir problemdir. Bazıları üretilen kodu ayrı dosyaya, elle yazılan kodu ayrı dosyaya yazarak durumu kurtarmaya çalışırlar ama -ki Microsoft C# 2.0 da bunu dilin bir özelliği haline getirmiştir*- üretilen kodun içinde olması gereken bir kod yazmanız her zaman gerekebilir. Bu da yazılım geliştirme sürecinizin ilerleyen safhalarında generation işinden vazgeçmek zorunda kalacağınız anlamına geliyor.

Madem öyle code generation gereksiz midir? Kesinlikle hayır. Bazı kodlar vardır ki; onların değişme ihtimali hiç yoktur. Onlar güvenle generate edilebilir. Mesela Visual Studio isimli IDE arkada sizden habersiz çatır çatır kodlar üretir durur, derler ve hayatınızı kolaylaştırır. Mesela bir web servisini projenizin referanslarına eklediğinizde, ya da bir kontrolü formunuzun üzerine sürükleyip bıraktığınızda...

Hasılı code generation hiç bir zaman önemini yitirmeyecektir ama bizim gibi liste ve düzenleme formlarının kodlarını üreten, bu yüzden de değişiklikler olduğunda sıkıntı yaşayanlar için daha iyi alternatifler de vardır. Nedir? Generic programming!

Yine metadatayı kullanarak generic kodlar yazarsınız. Ama bu sefer kod üretmiyoruz, sadece, tablolara ait metadata bilgisine sahip olduğu için her türlü tabloyla çalışabilen kodlar yazıyoruz. Bunu da daha sonra konuşuruz inşallah deyip bu makaleyi bitirelim. Selametle.



Yazarımıza ait diğer makaleler

1. Javascript ve HTML ile grafik çizmek
SVG ile grafik çizmek HTML ve Javascript kasmaktan daha mantıklı elbet ama SVG yaygınlaşana kadar bir müddet daha böyle idare ediyoruz.
08 Aralık 2006 01:45

2. Veritabanı hakkında yapısal bilgiye erişmek (Database metadata)
Veritabanı hakkında yapısal bilgiye (metadata) erişim için yazılmış açık kaynak kodlu kütüphane.
18 Kasım 2006 21:51

3. Javascript ile Nesne Yönelimli Programlama (OOP with JS)
Bu makalede Javascript'le ilgili olarak JSON, function pointer ve OOP konuları ele alınıyor.
21 Ekim 2006 15:29

4. Geçmişten Günümüze Bilgisayar - II (mizah)
Bir önceki makalemizde (bkz. Geçmişten Günümüze Bilgisayar (mizah)) kısaca bilgisayarın tarihçesinden bahsetmiş ve programlara dillerini anlatmaya başlamıştık. Bu makalemizde programlama dillerini anlatmaya devam ediyoruz.
01 Haziran 2006 18:27

5. Geçmişten Günümüze Bilgisayar (mizah)
...Ama aslında abaküsün günümüz bilgisayarlarıyla herhangi bir benzerliği olduğu söylenemez. Bir kere abaküsle İnternet'e bağlanamazsınız. Counter Strike da yok. Eee? Nasıl bilgisayar bu? Varsa yoksa boncuk! Üç boncuk sağa, iki boncuk sola. Ne anladım ki ben bundan?
28 Mart 2006 10:38

6. Bir PHP Hikayesi - Bölüm VI - Biraz da Javascript hikayesi
Erol PHP ortamlarından Javascript ortamlarına akıyor.
26 Şubat 2006 01:42

7. SPAM ile mücadele
Bir spamci ile aramda geçen mesajlaşmayı yayınlamak istedim. İbreti alem olsun diye.. :)
04 Şubat 2006 12:00

8. Multithreading - Bölüm I
Threading serimizin bu ilk bölümünde konuya kısa bir giriş yapıyoruz.
11 Ekim 2005 01:38

9. Bir PHP Hikayesi - Bölüm V : PHP mi? Ne PHPsi?
Bir Pazar günü Erol'un başından geçenler. Tarumar'ın katkılarıyla.
04 Eylül 2005 14:59

10. Bir PHP hikayesi - Bölüm IV : Web Formları
Bu bölümde Sinan'la Erol'u biraz daha yakından tanıyoruz.. Ha, bir de şu web formlarından bahsediyoruz.
27 Ağustos 2005 17:00

11. Bir PHP hikayesi - Bölüm III : PHP dili
Bu bölümde Erol PHP dili ile biraz daha tanışıyor, Sinan'ın rehberliğinde yeni dünyalara yelken açmanın tadını çıkartıyor.
21 Ağustos 2005 19:29

12. Bir PHP hikayesi - Bölüm II : PHP'ye giriş
Bu bölümde PHP'ye nefes kesen bir giriş yapılıyor. Sinan heyecanla anlatıyor, Erol'un bilginin sınırlarında şakakları zonkluyor.
21 Ağustos 2005 02:36

13. Bir PHP hikayesi - Bölüm I : Kurulum
PHP öğrenmek isteyen bir programcı ve PHP bilen bir başka programcının diyalogları. Çok sürükleyici! :)
20 Ağustos 2005 18:33

14. OOP - Nesne Yönelimli Programlama - Bölüm III
Bu makalemizde inheritance (kalıtım) konusuna değineceğiz.
29 Temmuz 2005 00:59

15. OOP - Nesne Yönelimli Programlama - Bölüm II
Bu makalemizde encapsulation (kapsülleme) kavramından bahsediyoruz.
19 Temmuz 2005 10:24

16. OOP - Nesne Yönelimli Programlama - Bölüm I
Artık ister istemez her programcının bulaştığı bu teknik hakkında sayısız makale yazılmıştır bu güne kadar. Bu makale de onlardan biri.
30 Haziran 2005 22:58

17. DHTML ile sayfa refresh olmadan dinamik olarak değişen veri göstermek
Veritabanı uygulamaları geliştirmek için belkide en güzel yöntem olan webin küçük bir sorunu var: Sürekli refresh olan sayfalar..
17 Haziran 2005 23:43

18. Performans Testi (CodeDOM ile)
Aynı işi gören iki farklı koddan hangisinin daha performanslı çalıştığını test etmenizi sağlayan program. İki ayrı kutuya kodlarımızı yazıp, hangisinin daha performanslı çalıştığını derlemeden görebil
11 Haziran 2005 23:06

19. Virtual domainlerde karşılaşılan mail probleminin Sendmail ile çözümü
Bu yazi 2001 yilinda "Türk Linuxçülerine bir ucundan biz de destek olalim" diye linux.com'dan Türkçe'ye tercüme edilmistir.
07 Haziran 2005 21:19

20. Taş Fırın Satrancı
.Net'i denemek, öğrenmek için zamanında yazılmış bir program ve o zamanlar kendisi hakkında yazılmış bir makale.
06 Haziran 2005 21:25

21. Yüklü Parçacıklar Simulasyonu
Bir simulasyon programı. Bu programı parçacık sistemlerinin birbirleriyle etkileşimini incelemek için kullanabilirsiniz.
(Not: Bu program ve makale 2002 yılında yazılmıştır.)
06 Haziran 2005 20:07

Yorumlar

Bu konuda bildiklerinizi bizlerle paylaşabilirsiniz
Tabi bunun için yazarsanız giriş yapmalı, yazar değilseniz yazar olmalısınız.
© 2005, Bilişim Kulübü. (1140 ms)
Ne yapabilirsin: SubtitleClick ile İngilizceni Geliştir, Çınar Framework ile kod yaz, Eglencelik.org'ta biraz eğlen