Programlama dünyasında aynı veya benzer amacı taşıyan kod bloklarının uygulamanızın farklı yerlerinde defalarca yer alması istenen bir durum değildir (don't repeat yourself).
Özellikle çok katmanlı uygulamalarda bu problemden kaçınmak maalesef oldukça zor olabilmekte. Bugün bir projenin kaynak kodları üzerinde araştırma yaparken programcının bu sorunun üstünden gelmek için güzel bir yöntem izlediğini gördüm ve sizlerle de paylaşmak istedim. Ben burada konuyu mümkün olduğu kadar basit tutmak amacıyla çok küçük bir örnek ile konuyu anlatmaya çalışacağım.
Şekildeki gibi bir Member Class'imiz olsun

Öncelikle DB üzerinde işlem yaptığımız bir Reposiyory class'imiz olsun (örnekte MemberRepository) Class'imiz ile site üyelerimiz arasında isim ve email adreslerini kullanarak arama yapıyoruz.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Linq.Expressions;
namespace drytips.Models
{
public class MemberRepository
{
wp2010Entities MyEntity=new wp2010Entities();
public Member GetMemberWithNick(string nick)
{
var lMember = (from m in MyEntity.Members
where m.Nick==nick
select m
).FirstOrDefault();
return lMember;
}
public Member GetMemberWithEMailAddress(string emailAddress)
{
var lMember = (from m in MyEntity.Members
where m.EMailAddress==emailAddress
select m
).FirstOrDefault();
return lMember;
}
public Member GetMember(Expression<Func<Member, bool>> query)
{
var lMember = MyEntity.Members.Where(query).FirstOrDefault();
return lMember;
}
}
}
İlk iki fonksiyonumuzda klasik yöntemle iki ayrı fonksiyon oluşturuyoruz. Bunlardan birincisi ile Nick üzerinden ikincisinde ise email adresi üzerinden ilgili kullanıcının veritabanımızda yer alıp yer almadığını kontrol ediyoruz. Üçüncü fonksiyonumuzda ise Linq expression'lar arayıcılığıyla daha esnek bir GetMember fonksiyonu oluşturuyoruz ve hangi parametre üzerinden arama yapılacağını sınıf örneğini oluşturan client kodumuza bırakıyoruz. Bu sınıf üzerinden işlem yapan istemci kodlarımız ise şöyle
MemberRepository mr = new MemberRepository();
var standart1 = mr.GetMemberWithNick("aokocax");
var standart2 = mr.GetMemberWithEMailAddress("aokoc--@aokocax.net");
//linq expressionları ile tek fonksiyonda aynı işlem
var linq1 = mr.GetMember(m => m.EMailAddress == "aokoc--@aokocax.net");
var linq2 = mr.GetMember(m => m.Nick == "aokocax");
Görüldüğü üzere linq expression ile oluşturduğumuz GetMember fonksiyonumuz sayesinde kod tekrarından kurtulmuş olduk ve uygulamamıza müthiş bir esneklik kattık. Nick ve EMail Adresinin yanında aynı fonksiyon sayesinde Member Class'imizin bir çok fieldi üzerinde arama işlemi yapabileceğimizi de unutmayalım. Ben burda sadece where fonksiyonu üzerinden örnek yaptım ancak tahmin edebileceğiniz üzere order sorgularından group'lama işlemelerine kadar bir çok yerde bu esnekliği siz de kullanabilirsiniz. Görüş ve önerilerinizi yorum olarak bırakabilirsiniz. Kolay kodlamalar...
Hiç yorum yok:
Yorum Gönder