Koray Kırdinli

Yazılım ve İş Yaşamı Hakkında Paylaşımlar

Kodlama Pratikleri

 Bu yazıda aklımızda bulundurmamız gereken bazı kodlama pratiklerini maddeler halinde sıralayacağım.Kod yazarken sürekli aklımızın bir köşesinde bulundurmamız gerekir sizlerinde tavsiyeleri varsa yorumları bekliyorum.
-İlk önce değişken ve kontrollere isim verirken anlamlı isimler vererek başlayabiliriz.Örneğin sayıların toplamını tutmak için bir integer sayıyı int x yerine , int _toplam şeklinde yazmalıyız veya bir forma Form1 yerine frmAnasayfa.
– Örneğin bir design perceresine (winform olabilir webform da) veritabanından çektiğimiz verileri getiriyoruz.Buradaki yaklaşımımız txtAdi = ds.Tables[0].Rows[0][“kolon_adi”].ToString() olmamalı.Bunun yerine formun arkaplanına sınıf döndüren bir alt DAL katmanı olmalı ve sadece txtAdi = entity.Adi; demeliyiz.Reflection metodu ile dinamik bir şekilde bir datarowdaki kolonları sınıf propertylerine map edebiliriz. UI katmanı içerisinde kesinlikle sql cümleleri yazmayın.
– İş katmanında bir metoda parametre olarak Dataset yollamak ve dataseti fonksiyon içinde parse etmek te yanlış bir tercih olacaktır.Bunun yerine datasetin sınıfa dönüştürülmüş halini metoda yollamalıyız.Çünkü İş katmanındaki bir metod veritabanındaki alan adını harfiyen bilmek zorunda değildir.Ayrıca bu tarz bir yaklaşım veritabanındaki kolon ismi değiştiğinde de çok fazla sayıda metodun değişmesi ve değişim maliyetinin artması demektir.
-Uzun metodlarda bazen aralara //açıklama ‘lar serpiştiririz.Bunun yerine bu metodu alt metodlara bölüp aciklayıcı birer isim verip çağırmak daha sağlıklı.Çok fazla açıklamalarla kodu kirletmemeliyiz.
Bir metodun uzunluğu 80 satırı geçmemesine özen gösterelim.
– Standart sık olarak kullanılan method ve sınıfları bir class library projesi altında toplanarak yeni bir projeye başlarken aynı kodları tekrar tekrar yazmamış oluruz. Örneği stringi tarihe çevirme , excelden okuma , şifreleme , DataAccessLayer vs.vs. Bu yapılan projeyi iyice test edilirse her bir case için hem kalitemiz artar hem de hızımız.
– Bir sınıf sadece bir görevi yerine getirecek şekilde tasarlanmalı.Örneğin sınıf hem dinamik sql oluşturup hem de veritabanına bağlantı sağlamamlı.Her sınıf sadece bir işi ihtiva etmeli.
– Projeyi her zaman 3 katmanlı olarak geliştirmeye özen gösterilmeli.Veritabanı işlemleri DAL , hesaplama gibi işlemler business ve Presentation katmanı. Örnek proje.Core dlli , proje.DAL dll’i ve projenin UI si.
– Kıyaslama gerektiren yerlerde string veya sayılardan faydalanmak yerine Enumaration kullanmak gerekir.Bunu yapmak kodun okunurluğunu artırır.
– Tekrarlayan kod olduğunu farkettiğiniz an Design Patternlerden faydalanarak refactoring yapın.
– Yazmak istediğiniz bir sınıfı önce netten araştırın daha önce bunu nasıl yapmışlar , bulabilirseniz başkasının kodundan da kendinize birşeyler çıkartabilirsiniz.Bir başkasının kodunu okuyabilmek çok önemlidir.
– Örneğin bir veri tabanı bağlantısını açıyorsak herhangi bir hatada connectionın kapanmasını garanti altına almak için finally blogunda yapmalıyız veya using ifadesi ile işlemi yaptırmalıyız.
– Örneğin bir form üzerinde bazı kontroller yaptırmak istiyorsunuz,Eğer adı text boxı boş ise uyarı versin veya daha önce aynı isim soyisim varsa uyarı versin.Bu tür işlemlerde bir alt ara sınıf kullanarak iş katmanı ile gösterim katmanı ayrılmalıdır. Kontrol uyarılarını iş katmanı vermelidir. Bunu da bir interface IView ve class Presenter ile yapabiliriz.Böylece aynı sınıfı web ortamından windows ortamına taşımak son derece kolaylaşır ve gösterim katmanında gereksiz kod kalabalığı olmaz.KAYNAK : http://www.cihataltuntas.com/?p=204#comments
-Encapsulation : ASP.NET uygulamalarında her sayfada Session a değer atmak veya geri almak için tek tek Session[“data”]=12 gibi atama yapmak yerine Sessions diye bir sınıf oluşturup property kullanarak atama yapmak daha sağlıklı. Burada status’un arka planını saklamış olduk.

public static decimal status{get
{
if (HttpContext.Current.Session[“status”] == null) HttpContext.Current.Session[“status”] = 0;
return Convert.ToDecimal(HttpContext.Current.Session[“status”]); }
set { HttpContext.Current.Session[“status”] = value; }}

Tell Don’t Ask Principle bu method ile şunu yapıyoruz “sorma söyle”. Mantık olarak iki tane sınıfımız olsun birisi Banka diğeri de Müşteri. Müşteriler bankadan bankada para 1000 TL kalana kadar para çekebilirler.Bu karşılaştırmayı kim yapmalı müşteri mi yoksa Banka sınıfları mı. Eğer müşteri yaparsa bu bir hata olur. Çünkü her sınıf kendi görevini yapmakla mükelleftir.Bankada ne kadar para olduğu müşteriyi ilgilendirmez. Her sınıf kendi işini yapmadığı zaman yani bu kuralı çiğnediğimizde bir değişiklik için bir çok sınıf etkilenebilir tabi buda istenmeyen bir durumdur.
– High Coupling’i önlemek. Örneğin iki sınıfımız olsun. sinif1 ve sinif2. sinif2 sinif1 içerisinde ne kadar çok adı geçerse sinif2 ye olan bağımlılığı o kadar artar. NDepend gibi programlar sayesinde iki sınıf arasındaki bağımlılık derecesini öğrenebiliriz. İki sınıfın bağımlılığını önlemek için interface veya abstract sınıflar kullanılır.
– Windows formlarda veya web uygulamarında mutlaka basePage veya baseForm gibi bir yapı kullanın ki bütün formlara uygulamak istediğiniz bir özellik olursa tek tek hepsine uygulamak zorunda kalmayın. Örneğin ASP.NET sessiondan login kontrolü yapmak istiyorsunuz ve bunu her sayfada yapacak diyelim. Bunun içinpublicpartial class BasePage : System.Web.UI.Page { // todo } gibi bir türetme yaparak BasePAge in load eventini override ederek kullanabilirsiniz.

Örneğin 3 tip kullanıcınız var ve hepsinin ekran şekilleri farklı olacak. Bunun için bir base page ve bundan türeyen alt 3 base page yapıp ekranları standardize edebilirsiniz.

– Kendinizin fırlatacağı exceptionları (throw new Exception(“Not implemented”); kod içine exception açıklamasını yazmaktansa Resource.resx dosyalarına erroCode’larını ve karşılıklarını yazarak bu sınıftan exception fırlatmak daha sonra kodun yönetilmesi açısından esneklik sağlar. Örneğin throw new CoreException(100); gibi. Daha sonra bu exceptionın türkçesi istenirse sadece resource dosyasından değiştirilir ve bütün projeye uygulanmış olur.

– UNIT TESTS : Her bir metod için yazılacak birim testler hem metodun her bir case’de çalışmasını garanti eder. Örneğin bir stringi decimal’a çeviren bir metod yazdınız ve üzerinde bazı değişiklikler yaptınız bu metodu normalde bir çok yerde çalıştırıyorsunuz ve yanlış bir değişiklikte sistemin bir çok yeri çalışmaz hale gelecektir. Unit testlerde bu anlamda gelen input ve metodun vermesi gereken outputları tanımlanır.Örneğin 10 farklı input çeşitini metoda vererek bize vermesi gereken sonuçları test ederek olası hataların önüne geçilir.

– Windows veya web uygulaması yaptığımızı düşünelim bir butona tıklayınca bir işlem yaptıracağız diyelim ; işlem yapacak kodları butonun click eventi yerine bir fonksiyonda tanımlayıp butonun click eventinde bu fonksiyonu çağırabiliriz.

– Klasörler oluşturma : Belli amaca hizmet eden class’ları bir klasör altında toplayarak bir hiyerarşi sağlayabiliriz.

– Property’nin Gücünü kullan : Sınıflarda değişkenleri public yapmak işin kolayına kaçmaktır ancak daha sonra o değişken

ile ilgili bir kontrol veya herhangi bir işlem yapmak isterseniz işinizi zorlaştıracağınızı unutmayın. Bu gibi durumlarda property kullanın. Örnek bir Fatıra sınıfınız olsun ve Fatura Tarihi sistem tarihinden büyük olursa hata fırlatmasını istiyorsunuz. UI tarafında sınıfın property sine atama yapıldığı anda (SET) property içerisinde kontrolü yapıp exception fırlatabilirsiniz veya Loga yazdırabilirsiniz.

– İlerde lazım olur diye bir sınıf veya fonksiyon eklemeyin. Mantık kodumuz ne kadar sade olursa o kadar iyi.

– Fonsiyon ve sınıf isimlerini anlaşılır isimler verin bırakın uzun olsun : GetUserIdByUsernameAndPassword();

– İleri ve kurumsal düzey konulara eğilin. Ben biliyorum deyip bildiğinizi okumayın. Web services,.NET Remoting,WCF,delegate,test,assembly,culture,Threads,AppDomain,Process vs..

– String birleştirirken StringBuilder ve String.Format kullan.  Stringleri karşılaştırırken String.Compare metodlarını kullan.
Basit bir if else blogunundan sonra atama işlemi yapılacaksa  date = dr.Table.Columns.Contains(“kayit_tarihi”) == true ? TypeGenerator.ToDate(dr[“kayit_tarihi”]) : KayitTarihi; gibi bir kodlama daha kısa olur.

December 12, 2009 - Posted by | C# | , ,

No comments yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s