Muammer HALLAÇ

"Bir yazılımcının çiziktirikleri"

TDD' ye giriş 1 - Test Driven Development'ın ABC si?

Temiz kod nedir? Özellikleri nelerdir?

1. Tahmin edilebilir bir development süreci vardır. Ne zaman bitirdiğinizi bilirsiniz. Bug olacak mı olmayacak mı derdiniz olmaz.
2. Yazacağınız kodun size öğreteceği derslerin hepsini alma şansı verir. Aklınıza gelen ilk çözümü uygulayabiliyorsanız ikinci birşey düşünmenize gerek kalmaz.
3. Temiz kod, takım arkadaşlarınızın size güvenmesini sağlar. Ve sizin de onlara.
4. Temiz kod yazmak iyi hissettirir. 

Peki temiz kodu nasıl anlarız? 
Çevremizdeki bir çok etken bizi temiz kod yazmaktan uzaklaştırır. Hatta ve hatta yazdığımız kodlar bile. 
Korkularımızı ve endişelerimizi bir kenara bırakarak yapacağımız tek şey bir geliştirme stili olan "Test Driven Development" ı uygulamak.

Peki nedir TDD?

TDD programlama süreçlerindeki korkuları yönetme yöntemidir.
Test Driven Development (TDD), ya da diğer isimleriyle Test Driven Design, Test First Development ilk olarak Extreme Programming (XP) yazılım sürecinin babası Kent Beck tarafından ortaya atılmıştır.

TDD kulağa geliştirdiğimiz yazılımı test etmeye veya test ekibindeki tester arkadaşlarla ilgiliymiş gibi gelsede, aslında yazılımı test etmekten ziyade onu geliştirme yöntemidir. Kısacası kod geliştirmeden önce testleri yazıp, daha sonra bu testleri gercekleyen kodu yazmış oluyoruz.

TDD yöntemiyle kod yazarken genelde şu şekilde bir yol izlenir;

1. Test yaz (Tek bir satır bile kod yazmadan, sanki testteki objeler varmış gibi. Kodunuzun compile edilebilmesine bile gerek yok.)
2. Build edilebilmesini sağla. (Build edilebilmesi için her türlü pisliği yapabilirsiniz ;))

3. Fail olduğunu görmek için testi çalıştır (RED)
4. Testin geçeceği kadar kod yaz (GREEN)
5. Kod tekrarını ortadan kaldır (Pislikleri temizleme zamanı :)) (REFACTOR) 

6. Başa dön.

TDD' nin yararları nelerdir?
1. Kalbe iyi gelir :-)

                Ne kadar stresli bir işimiz olduğunu anlatmama gerek yoktur sanırım. Sürekli yazılan kodlar, sürekli yığılan bir kod yığını. Özellikle kalabalık takımlarda yazılan her satır kod aslında ortaya atılan bir el bombasıdır. Neyin nereyi etkileceği bilinmez. Bu durumdan da çok korkulur aslında. Yapılan bir geliştirmenin, kodlardaki başka bir yeri etkilemesi. TDD ile bunun önüne geçmiş oluruz.

2.  Geliştirdiğimiz kodun kalitesini artırır. TDD aslında bizi OOP kurallarına uymaya zorlar. Dolayısı ile kod kalitemiz artmış olur.
3. Kodumuzun okunabilirliliği artar. OOP nin nimetlerinden yine :-)
4. Hata oranımız azalır
5. Break pointler arasında kaybolmadığımız için yazılım geliştirme süremiz inanılmaz derecede azalır.

 

C# ta Arayüzler (Interface)

Interfaceler saf abstract sınıflardır. Sadece metod, property ve/veya indexer ların imzalarını barındırırlar. İmplementasyon bulundurmazlar kesinlikle.

Barındırabileği üyeler;
1. Metodlar
2. Property ler
3. Indexer lar
4. Event ler

Barındıramayacağı üyeler;
1. Field lar
2. Constant lar
3. Constructor metodlar
4. Destructor metodlar
5. Operatörler

Arayüz üyeleri kesilikle statik olamazlar. Class lar ve Struct lar çoklu interface kalıtımına izin verirler. Bunun yanısıra bir interface başka bir interface den kalıtım alabilir.

Örnek Kullanım;

public interface IList : ICollection, IEnumerable
{
    int Add(object value);  //method
    bool IsReadOnly{get;}  //property
    object this [int index]{get; set;}  //indexer
}

Implementasyon Örneği;

class MyClass : MyBaseClass, IList, ISerializable
{
    public int Add(object value){...}
    public bool Contains(object value){...}
    public bool IsReadOnly{get{...}}
    public object this [int index]{get{...} set{...}}
}

Bir sınıf sadece ve sadece tek bir sınıftan türetilebilirken, birden fazla interfaceten türetilebilir.
Structlar ise herhangi bir sınıftan türetilemezken birden fazla interfaceten türetilebilirler.

Tüm interface üyeleri türetilen sınıf veya struct ta kalıtım alınmalı veya implemente edilmeli.
Interface üyeleri türetilen sınıfta implemente edilirken override olarak implemente edilemezler.

 

C# ta Member Hiding

İki sınıf arasındaki kalıtım yoluyla gelen fonksiyon ve/veya özelliklerin kalıtım alan sınıfta hide (gizlenmesi) edilmesi ihtiyacı olabilir.

Şöyleki;

public class A1
{
    public string Method1()
    {
        return "Hello from a1 - method1";
    }
}

ve  

public class B1
{

}

gibi iki sınıfımı olsun ve B1 sınıfı;

public class B1 : A1
{

}

şeklinde A1 sınıfından kalıtım alsın. B1 sınıfı Kalıtım ile beraber A1 sınıfından Method1() metoduna sahip olacaktır.  Ancak bu metodu B1 sınıfından ihtiyaç dahilinde farklı bir şekilde çağırmamız gerekebilir. Bu gibi durumda kalıtım alan sınıfta

public class B1 : A1
{
    public new string Method1()
    {
        return "Hello from b1 - method1";

    }
}

şeklinde "new" anahtar kelimesiyle yeniden yazdığımızda artık B1 den Method1() i çağırdığımızda B1 deki implementasyonuna erişiyor olacağız.

Peki bu durumda bile A1 sınıfındaki Method1() metoduna erişmek istersek ne yapacağız? Sonuçta kalıtımla her iki sınıftaki Method1() metoduna da sahibiz.

Bu durumda ise;

 

var b1 = new B1();
Console.WriteLine(((A1)b1).Method1());

şeklinde yine B1 sınıfındaki Method1() metıduna A1 deki implementasyonu üzerinden erişmiş oluruz.

 

 

C# ta Kalıtım

class A
{
    int a;
    public A(){...}
    public void F(){...}
}

class B{
     int b;
     public B(){...}
     public void G(){...}
}

Gibi iki sınıfımız olsun. 

B sınıfını A sınıfından 

class B : A{
     int b;
     public B(){...}
     public void G(){...}
}

şeklinde türettiğimizde;

B sınıfı A sınıfından kalıtım olarak F() fonksiyonunu alır. Dikkat edersenizyapıcı method olan A() metodu B sınıfı tarafından kalıtım yoluyla alınamaz. Kalıtım yoluyla alınan metodlarvirtual tanımlanmışlar ise override edilebililer.
Bir sınıf kural olarak sadece başka bir sınıftan kalıtım alabilir. Struct lardan kalıtım alamazlar. Ancak birden fazla interface den türeyebilirler.
Sınıfların aksine Struct lar başka bir tipten kalıtım alamazlar. Ancak yine sınıflar gibi birden fazla interface den türeyebilirler.
Eğer bir sınıf başka bir base sınıftan türemiyorsa "object" tipinden türüyor demektir. (Everything is an object)

Windows 8 ve Windows Store

Yazılım geliştiriciler için yepyeni bir sayfa açılıyor; Windows 8 ile gelecek yeni Windows Store sayesinde yazılım geliştiriciler uygulamalarını online olarak satabilecekler ve satışlarının ilk başta %70'ini sonrasında satışları 25.000$ rakamını aştığında %80'ini kazanacaklar. Bu yazılım dünyasını yepyeni boyuta taşıyacak değişim dün duyuruldu. Yapılan açıklamayı ve demoyu aşağıdaki videodan izleyebileceğiniz gibi detaylı basın açıklaması bilgisine http://win8.ms/press adresinde de erişebilirsiniz.

Ayrıca önemli bir diğer nokta Windows Store Türkçe olarak Türk Lirası ile ödeme yapılacak şekilde Türkiye pazarında olacak; detaylar için http://msdn.microsoft.com/​en-us/library/windows/apps/​hh694064.aspx adresini inceleyebilirsiniz.

Kaynak : http://www.nuricankaya.com

En İyi Kod Olmayan Koddur

Okuduğum bir makale de şöyle diyordu; (Code is our enemy)

"Code is bad. It rots. It requires periodic maintenance. It has bugs that need to be found. New features mean old code has to be adapted. The more code you have, the more places there are for bugs to hide. The longer checkouts or compiles take. The longer it takes a new employee to make sense of your system. If you have to refactor there's more stuff to move around.

Code is produced by engineers. To make more code requires more engineers. Engineers have n^2 communication costs, and all that code they add to the system, while expanding its capability, also increases a whole basket of costs. You should do whatever possible to increase the productivity of individual programmers in terms of the expressive power of the code they write. Less code to do the same thing (and possibly better). Less programmers to hire. Less organizational communication costs." 

Hepimizin başına gelmiştir. Yazdığımız projeler büyüdükçe yaptığımız işler de artmaya başlar. Aslında yaptığımız işlerin büyük bir çoğunluğu yeni işin değildir. Yeni iş için yazdığımız kodların önceden yazılmış olan kodlarla olan entegrasyonları ve çıkan bugların düzeltilmesidir. Aslında sorun kodlar da değildir. Sorun ne mi diyorsunuz? Aynaya bakmamız yeterli olacaktır.

 Tabiki hepimiz (yazılımcılar) iyi niyetliyiz. Yaptığımız işi seviyoruz. Bir çok problemle saatlerce uğraşıp kafa patlatırız. Uykusuz kalırız. Saatlerce kod yazarız. Ancak çok kod yazmaya olan eğilimimizi dizginlemeliyiz.  

Yazılımcı olmanın doğası gereği aslında verdiğimiz her karar bir trade-off tur. İyi bir yazılımcı olmak için bu trade-off ları iyi anlamamız ve yazdığımız herşeyde bu bilinçle hareket etmemiz lazım.

Yazılmış bir kodu bir çok yönden değerlendirebilirsini;

1. Kısalığı
2. Sahip olduğu özellikler
3. Hızlı işlemesi
4. Kodlamada harcanan zaman
5. Güçlülüğü
6. Esnekliği

Yukarıdaki değerlendirme durumlarının aslında her birinin bir diğerine muhalefeti vardır.
Örneğin; çok rutin bir işi yazmak için 3 gün harcadığınızı düşünün. yukarıdaki maddelerden 2 ve 3 numaralı şartları çok iyi sağlarsınız. Ancak 4. maddeyi kesinlikle sağlayamamış olursunuz. Sonuçta rutin bir iş için 3 gün harcadınız. 

Peki buna değer mi? Bu kararları nasıl alırız? Cevap bilinçlı olmak, kodları mümkün olduğunca basit tutmaktır. 

Kod yazmayı ne kadar severseniz sevin, en iyi kod olmayan koddur. Mümkün olduğu kadar basit tutmaya çalışın kodlarınızı. 

Kararsız kaldığınız anlarda....

Yeni bir fikriniz mi var? Bir şeyi yapıp yapmamakta kararsız mı kaldınız? o zaman bu linke mutlaka tıklamalısınız... Wink

JQuery Denemeleri - II (JQuery Neler Yapabilir?)

JQuery kütüphanesi; web programlama için genel amaçlı ara bir katman oluşturur. Bu katman sayesinde neredeyse her türlü duruma uyan scriptler yazabiliriz. JQuery kütüphanesinin genişleyebilir bir yapısı vardır. Üzerine plug-in ler yazılabilir. İnternet üzerinde ve official sitesinde yazılmış plug-in lere kolayca ulaşabilirsiniz. Hatta kendi plug-in inizi bile yazabilirsiniz.

İşte JQuery' nin kabiliyetlerinden bazıları:

1. Sayfa Elemanlarına Ulaşım : JavaScript kütüphanesi olmadan DOM (Document Object Model) ağacı üzerinde veya HTML dökümanı üzerinde işlem yapmak için satırlarca kod yazmamız gerekir. JQuery tam da burada hızlı ve etkili bir çözümü olan "Seçiciler" (Selectors) mekanizmasını sunar. Seçiciler mekanizması ile HTML elementlerine hızlı ve kolay bir şekilde ulaşabiliriz.

2. Sayfa Görünümünü Değiştirme : CSS sayfa stilleme işinde inanılmaz ve güçlü metodlar sunar. Fakat tarayıcıların tüm standartları desteklemediği zamanlarda CSS de yetersiz kalır. CSS in yarattığı bu boşluğu JQuery, tüm tarayıcıların desteklediği standartlarıyla gayet güzel bir şekilde doldurur. Buna ek olarak, sayfamız render edildikten sonra JQuery ile CSS classlarını ve inline yazılmış style ları değiştirebiliriz.

3. Sayfa İçeriğini Değiştirme : JQuery nin sayfa üzerinde yapabildikleri sadece class ve style değiştirmekle sınırlı değil. JQuery ile bir kaç tuşla sayfamızda istediğimiz içeriği de değiştirebiliriz. Sayfamızdaki yazıları değiştirebiliriz. İstediğimiz yere yeni HTML elementleri insert edebiliriz, imajları değiştirebiliriz, elementlerimizin yerini değiştirebiliriz, hatta sayfamızdan eleman bile kaldırabiliriz.

4. Sayfa Animasyonları : Sayfamızdaki kontrollere fadeIn, fadeOut veya wipe efektleri verebiliriz.

5. Sayfa yenilemesi olmadan Sunucudan veri alma : Diğer bir deyişle AJAX (Asynchronous Javascript and XML) işlemleri yapabiliriz.

6. Genel JavaScript işlerini basitleştirme : Javacsript ile sıklıkla yaptığımız işleri (döngüler, dizi işlemleri vb.) daha basite indirger.

Bu saydığımız maddeler dışında tabiki onlarca özellik sayılabilir. JQuery denizine girdikçe görebileceğimiz bir çok özellik mevcut. Özellikle giriş bölümünde bahsettiğimiz plug-in olayı zaten başlı başına bir derya. Bu plug-in ler bizim hayal gücümüzle sınırlı sadece. Başka bir sınırı yok.

Şimdili bu kadar, diğer yazılarda görüşmek üzere

JQuery Denemeleri - I (Write Less, Do More)

JQuery bir JavaScript kütüphanesidir en kısa tanımıyla. Ancak başlıktaki sloganından da anlaşılabileceği gibi; az kodla çok iş yapmamıza yardımcı olan bir kütüphanedir. Aynı  zamada HTML dökümanı içerisinde istediğimiz gibi dolaşmamıza, form efektlerine, AJAX vb. işlemlere izin vererek hızlı kod geliştirme yapmamızı sağlar.

Kullanım Şekli:
Kullanımı gayet basittir. JQuery bir JS dosyasıdır. JS dosyalarını nasıl kod geliştirme ortamımıza include ediyorsak aynı şekilde JQuery dosyamızı kod geliştirme ortamımıza ekledikten sonra JQuery'nin nimetlerinden faydalanmaya başlayabiliriz.
Örnek : <script src="Scripts/jquery-1.3.2.js" type="text/javascript"></script>

Nasıl Temin Edebilirim?
http://jquery.com/ adresinde JQuery nin son sürümünü ister Development, ister Production tipinde indirebilirsiniz.

Kullanıma başlamak bu kadar basit. Gelecek yazı serilerinde JQuery denizine dalıyor olacağız. 

Detaylı Bilgi için http://jquery.com/ adresini ziyaret edebilirsiniz.

Yedek Almanın Önemi

İnternet üzerinde iş yapıyorsanız, ya da internette işinize yarayan birşeyleriniz (dosya, döküman vb.) var ise yedekleme yapmak hayati önem taşıyor.

Nereden çıktı şimdi bu yedek olay??? Şöyleki hosting sürem dolmuş ve bende nasıl olduysa işlerin yoğunlukğundan olacak atlamışım yenilemeyi, bir gün sitemi bir açtım o da nesi :))) site mite yok ortada... O zaman jeton düştü benim. Hemen hostingi yeniledim ama geçmiş olsun, siteye yazdığım yazıların son hali maalesef ne ben de var, ne de hosting hizmeti aldığım şirkette. Hosting hizmeti aldığım şirketin sahibi Allahtan arkadaşım da bana dosyalarımı gönderdi. Ama onlarda ara ara yedek alıyorlarmış. Yine tüm dosyalarıma ulaşamadım yani.

Sitede maalasef son 2 ayda yazmış olduğum yazılar yok. Şimdi artık daha temkinli davranıp önce local de çalışıp sonra siteye atıyorum :)

Siz siz olun internette yedeksiz çalışmayın.