27 Haziran 2014 Cuma

Refactoring - Değer Atamalar

eskisi
       if (tumIbanlar.Count == 3)
        {
            faturaGenel.Iban1 = tumIbanlar[0];
            faturaGenel.Iban2 = tumIbanlar[1];
            faturaGenel.Iban3 = tumIbanlar[2];
        }
        else if (tumIbanlar.Count == 2)
        {
            faturaGenel.Iban1 = tumIbanlar[0];
            faturaGenel.Iban2 = tumIbanlar[1];
        }
        else if (tumIbanlar.Count == 1)
            faturaGenel.Iban1 = tumIbanlar[0];

yenisi
        if (tumIbanlar.Count > 0)
            faturaGenel.Iban1 = tumIbanlar[0];
        if (tumIbanlar.Count > 1)
            faturaGenel.Iban2 = tumIbanlar[1];
        if (tumIbanlar.Count > 2)
            faturaGenel.Iban3 = tumIbanlar[2];

Orijinal gönderi : Anıl Yetik

linq First() vs FirstOrDefault()

when SlotSahibiKumpanyaId is null

runtime exception
if(denizKonsimentosu.Rows.Count > 0)konsimentoListeleResponse.SlotSahibiKumpanyaId = 
denizKonsimentosu.AsEnumerable()
.Where(p => (p.Field<long?>("SlotSahibiKumpanyaId").ToLong() > 0)).                          Select(p => (p.Field<long?>("SlotSahibiKumpanyaId")).ToLong()).First();

Returns default value
if(denizKonsimentosu.Rows.Count > 0)konsimentoListeleResponse.SlotSahibiKumpanyaId = 
denizKonsimentosu.AsEnumerable()
.Where(p => (p.Field<long?>("SlotSahibiKumpanyaId").ToLong() > 0)).                        Select(p => (p.Field<long?>("SlotSahibiKumpanyaId")).ToLong()).FirstOrDefault();
 
Orijinal gönderi : Pınar Kılınç

25 Haziran 2014 Çarşamba

Temel LINQ Operasyonları - 2

Daha önce Temel LINQ Operasyonları konusunda bahsedilen örneklere ek olarak şu şekilde de bir senaryo ile karşı karşıya kalabiliriz. İki tane List<string> nesneleri içinde item bazında birbirlerini içerip içermediklerini kontrol etmek istediğimizde aşağıdaki gibi bir LINQ hayat kurtaracaktır.







Bu LINQ sorgusu KaynakList'in herhangi bir item'ın, HedefList'deki herhangi bir item'ın içinde geçip geçmediğini kontrol edecektir.

23 Haziran 2014 Pazartesi

refactoring source control changeset

Kod üzerinde yapmayı planladığımız değişiklikleri, mevcut bir taleple / değişiklik isteği ile birlikte değil, farklı bir çalışma (ve changeset ile) koda yansıtmamız, kodun değişimlerini gösteren tarihçe (history) kayıtlarını daha anlaşılır kılacaktır (Talep için yapılan değişiklikler ile kodu iyileştirme için yapılan değişiklikler ayrı ayrı takip edilebilecektir).

20 Haziran 2014 Cuma

Refactoring Uygulamaları - 3

TarifePeriyotDondur() SıraNumarasının sıfır verildiği senaryoyu desteklemektedir. Yani bu alana giriş yapılmış ise filtreye eklemektedir.

Burada sıra numarası ile giderek üç kez VT  sorgusu atmış oluyoruz.

Sıra numarası vermeden (üç periyod için tüm ) verileri bir seferde çekebiliriz sonra sonrasında tek satırlık LINQ sorgusu ile istediğimiz bilgiyi kullanabiliriz.

 

 

 

Refactoring Uygulamaları - 2

Tekrar eden kod blokları,

·      Farklı bir metot yazılmasını gerekliğini veya

·      “IF” bloklarının tekrar düzenlenmesini işaret eder.

Yazılan yeni metot


 

 

Refactoring Uygulamaları - 1

Tekrar Eden Operasyon

 

·      Aynı değişken için ikiden fazla “if” var ise, “switch..case” kullanmak daha okunaklı olacaktır.

·      Ara değişken kullanımı okunabilirliği artırır.

·      Erken validation ve terk


 

 

Hataya Açık Kodlamalar

Nullable Alan İçeren Uniuqe Constraint

Tablo üzerinde, koyduğumuz “Uniuqe Constraint” içinde “nullable” bir alan var ise orta katmanda bu UC yi kullanarak oluşturan FETCH ‘i kullandığımızda, ilgili alan için “null” değeri içeren yapılan çağırımlarda, sonuç dönmeyecek ve kayıt bulunamayacaktır.

Aşağıda, ilgili alanın null (ilgili framework’te null==0 olarak kullanılmaktadır)  geldiği durum kontrol edilmiş, bu durumda FETCH yapılarak değil, klasik bir sorgulama ile kayıtlar çekilmiştir.

 

Null ile Kontrol

Nullable objelerin null’ı kontrol edilmeden, içindeki bir alana veya metoda erişmeye çalışmak çalışma zamanında hataya yol açacaktır.

TonajDT global tanımlanmış. Null olma ihtimali var.

private DataTable tonajDT
    {
        get
        {
            object tonajDT = ViewState["TonajDataTable"];
            if (tonajDT != null)
                return (DataTable)tonajDT;
            return null;
        }

 

 private TrfTarifeTonajTransferObjectList SecilenTonajBilgilerindenTOListOlustur()
    {
        TrfTarifeTonajTransferObjectList trfTonajTOList = new TrfTarifeTonajTransferObjectList();
        foreach (DataRow dr in tonajDT.Rows)
        {

 

DataTable’ın kullanıldığı yerde null olma durumunu yönetmemiz lazım.

 

LINQ Sorgusunda Nullable

 

Collection Count Kontrol

Bir listenin, referans ettiğimiz elemanının o listede olduğundan emin olmamız, kontrol etmemiz gerekir. En yaygın yapılan hata, boş bir listenin ilk elemanını okumaya çalışmaktır.

Hatalı durum, liste boş gelirse, kod çatlar.

Doğrusu, listenin boş geldiği durum her zaman yönetilmelidir.

 

 

DataTable AcceptChanges()

Datatable operasyonlarında, yapılan kayıtların etkin olabilmesi için AcceptChanges() metodunun çalıştırılması gerekir.

Bu konuya ait sistemde yapılan bir düzeltmenin görüntüsü aşağıdadır.

Veri Tabanı Çağırımları Performans İpuçları

Veri Tabanı Çağırımları

Veri tabanına gitmek çok kaynak tüketen bir işlemdir. O nedenle, veri tabanı çağrısı yaparken, kendimize sormamız gereken bazı sorular vardır.

1)) Bu çağırıyı yapmama gerek var mı? Bu bilgi elimde hali hazırda var mı?

2)) Çağırımı yapmam gereken asıl ihtiyacım olan yer burası mı? Yoksa bu çağırımı yaptıktan sonra bu bilgiyi kullanmadığım bir senaryo var mı?

3)) İhtiyacım olan kadar mı yoksa daha fazla mı bilgi çekiyorum.

 

Hatalı Kullanım - Döngü İçinde Veri Tabanı Çağrısı

İhtiyacımız olan veri tabanı çağrısını, döngü içinde değişmeyen bir bilgi ile yapıyorsak, bu çağırımın döngü dışında bir kez yapılması yeterlidir.

Aşağıdaki örnekte, şirket bilgisi ile döngü içinde veri tabanı çağırısı yapılmaktadır. Hâlbuki kurulan döngünün şirket bilgisi ile bir ilişkisi yoktur ve bu bilgiyi değiştirmemektedir.

Örnek – 1

Böyle bir durumda bu çağrıyı döngü girişine alıp, entity’mizi istediğimiz bilgi ile doldurduktan sonra, son içinde bu entity’yi kullanabiliriz.

 

 

Hatalı Kullanım - Kullanılmayacak Veri Çekme

Veri tabanında bir istekte bulunan bir kod yazdığımızda, çektiğimiz veriye gerçekten ihtiyaç duyup duymadığımızı sorgulamamız gerekmektedir. Bu konudaki yaygın yanlış kullanımlar şöyledir.

Önce VT Bağımsız Kontrolleri Yapmak

VT çağırımı yapmadan önce, eleyebileceğimiz senaryoları önce kontrol etmek, gereksiz çağırımlara engel olacaktır.

Bir if kontrolünün operatörleri arasında, hali hazırda değeri atanmış bir tane var ise, önce sadece onu içeren bir if yazarak, gereksiz VT sorgusu atmamış oluruz. Sarıya boyanmış kısmın değeri hâlihazırda belli, o nedenle önce onu kontrol edelim.

 

 

Veriyi, ihtiyacı olan kod bloğu içinde çekmek

İlgii tablo, sadece eğer yük adedi sıfıdan büyük ise çalışan for blok içinde çalışıyor. Yük olmadığı durumlar için boşuna kaynak kullanıyoruz.

Olması gereken, döndü içinde ihtiyaç duyulan kaynakları, döngüye girdiği zaman çalışacak blok içinde tanımlamak. Yeni bir “if” yazıp, bu kaynağı orada çekiyoruz.

 

Collection Vs. TypedListBuilder

Bu örnekte, birden fazla tablo (haliyle tablolar arası “relation” ) içeren bir veri kümesi oluşturuyor. Bu kümeden sadece bir alana (Bookin Numara) ihtiyacımız var. Bu alanı çekmek için ORM nin bize sunduğu bir entity’e ait tüm alanları çeken ilgili Collection sinifini kullanılmış. Bu durumda içinden bir tanesini kullanmak üzere tüm alanları tablodan çekmiş bulunuyoruz.

Bunun yerine çalıştığımız framework’un bize sağladığı aynı “relation” ve “filtre” seçeneklerini kullanabileceğimiz, fakat istediğimiz alanı seçmemizi sağlayan altenatif yaklaşımı kullanmalıyız. Örneğimiz için, yukardaki sarı ile işaretlenmiş satırları aşağıdaki sarı satırlar ile değiştirebiliriz.

Value Types

int, long, short, byte: Bunlar “Value Type” tiplerdir.

“Null” ile kontrol etmeye gerek yoktur. “Null” değeri alamazlar.

 

http://msdn.microsoft.com/en-us/library/3ewxz6et.aspx

 

Temel LINQ Operasyonları

LINQ “Dil ile bütünleşik sorgulama” anlamına gelmektedir.

LINQ .NET Framework 3.5 ile ortaya çıkmıştır. Objeler üzerinde T-SQL benzeri sorgulama yapılmasını sağlar fakat bu sorgulama da tamamen nesnel ifadeler kullanılır. Yani nesneler ile veri tabanları arasında köprü görevi üstlenir. SQL kodu yerine programımızda nesneler kullanarak veriye erişimi sağlar. 
LINQ ya ait sınıf ve arabirimler System.Linq sınıfı altında bulunur. 

String Birleştirme

Klasik Yaklaşım, Döngü kurma (bu örnekte ayrıca, oluşan stringin sonunda fazladan bir “,” karakteri var.)

Döngü kurarak string birleştirme

Alternatif

//LINQ İLE, string birleştirme **UYGUN**
string bookingNumaralari = String.Join(",", bkgBookingColl.Select(i => i.Numara).ToArray());

 

Eğer kaynağımız DataTable ise

string bookingNumaralari = String.Join(",", dt.AsEnumerable().Select(i => i.Field<string>("Numara")).ToArray());

 

List Oluşturma

 

Yeni Sütün Oluşturma, DataTable Yaratma

Kayıtlara Ulaşma ve İşlem Yapma

Kontrollere Ulaşma ve Metot Çağırım


 

Diğer LINQ Operasyonları

Liste birleştirilirken (fark alırken)  döngü kurmak yerine, framework’un sağladığı yapıları kullanalım.

 

 

 

Metottan Birden Fazla Değer Döndürmek

Bir metottan birden fazla değer dönmek için, bu değerleri REF ile parametre listesine eklemek yerine,

Yeni bir “struct” yazıp, bunu dönüş değeri tipi olarak kullanabiliriz.

 

http://msdn.microsoft.com/en-us/library/0taef578.aspx


 

 

Daha Okunaklı Değer Atamalar

TEK SATIRLIK IF-ELSE ATAMALARI

BOOL ATAMALAR

Bu örnekteki “ELSE” kısmının olmaması, canlı sistemde bir hataya neden olmuştur.

à

 

 

 

Mümkünse Framework Halletsin

Mümkün olduğunca çalıştığımız framework’un sağladığı yapıları kullanmaya çalışmalıyız.

Hem çalıştığımız platformun sağladığı (.NET, JAVA) hem de özel olarak projede kullandığımız framework’ler buna dâhildir.

Özellikle “string” manipülasyonlar ve matematiksel işlemlerde, bu işin acaba framework’te yapılasının bir yolu var mıdır diye kısa bir araştırma yapmak faydalı olacaktır.

String Fonksiyonları

string.IsNullOrEmpty()

olması gereken

(.net framework>3.5)

Math. Fonksiyonları

DateTime

 

Date karşılaştırmaları için string çevrimlerine gerek yoktur.

 

 

Çalıştığımız framework’un sağladığı metodları kullanmalıyız.