<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CETURK &#187; aydinunlu</title>
	<atom:link href="http://www.ceturk.com/author/aydinunlu/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ceturk.com</link>
	<description>Türkiye&#039;nin Bilişim Platformu</description>
	<lastBuildDate>Sat, 05 May 2012 16:04:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Open Source Nedir? Ne Değildir?</title>
		<link>http://www.ceturk.com/open-source-nedir-ne-degildir/</link>
		<comments>http://www.ceturk.com/open-source-nedir-ne-degildir/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 16:55:31 +0000</pubDate>
		<dc:creator>aydinunlu</dc:creator>
				<category><![CDATA[Bilgisayar Mühendisliği]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Yazarlar]]></category>
		<category><![CDATA[Yazılım Mühendisliği]]></category>
		<category><![CDATA[Açık Kaynak]]></category>
		<category><![CDATA[Mehmet Aydın Ünlü]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=4416</guid>
		<description><![CDATA[Open Source (Açık Kaynak) kavramı özellikle ülkemizde çok fazla basite indirgenmiş bir kavramdır. Aslında open source dediğimiz şey gerçekte çok basit bir kavramdır. Fakat benim ilk cümlemde "basite indirgenmiş" diyerek anlatmak istediğim şey; kavramın içinin boşaltılmasıdır...]]></description>
			<content:encoded><![CDATA[<p><strong>Open Source (Açık Kaynak)</strong> kavramı özellikle ülkemizde çok fazla basite indirgenmiş bir kavramdır. Aslında open source dediğimiz şey gerçekte çok basit bir kavramdır. Fakat benim ilk cümlemde <strong>&#8220;basite indirgenmiş&#8221;</strong> diyerek anlatmak istediğim şey;<strong> kavramın içinin boşaltılmasıdır&#8230;</strong></p>
<p>Open Source kavramı bugüne kadar hep yazılım geliştirme süreci ile birlikte kullanılan bir kavram olarak karşımıza çıktı. Zaman zaman birileri bu kavramı karşımıza böyle çıkardı ve bizde karşımıza her sunulan şeyi kabullendiğimiz gibi bunu da hep bu şekilde kabullendik. Fakat gerçekte<strong> open source denen kavramı sadece yazılım geliştirme gibi bir alan ile sınırlandırmak bu fikirsel akıma tamamen haksızlık yapmak demektir.</strong></p>
<p>Open source&#8217; ün ne olduğuna geçmeden önce bugüne kadar bize anlatılanlardan bahsetmek gerekirse; <strong>en basit hali ile kaynak kodu açık bir şekilde yazılım geliştirme sürecidir diyebiliriz.</strong> İlk bakışta herhangi bir mantığa dayandıramadığımız bu süreç üzerine biraz düşününce aslında son derece iyi niyetli bir düşünce olduğunu anlıyoruz. Buraya kadar bir sorun yok zaten.<strong> Fakat sorun bu kavramı bu kadar sığ bir şekilde açıklayıp gerisini getirememekten kaynaklanıyor.</strong></p>
<p>Bu durumu neden bir sorun olarak gördüğüme gelirsek eğer şunu söyleyebilirim ki;<br />
bu kavramın içi sığ tutulduğu sürece, open source kavramı kendi ideolojisine tamamen zıt olan farklı ideolojilerin(örneğin kapitalizm gibi) kendi çıkarları doğrultusunda onu sömürmesi devam edecektir. Bu cümleden sonra biraz durup düşünmek gerekiyor sanırım. Çok ufak bir örnek vermek gerekirse, günümüz de tamamen kar elde etmeye odaklanmış ulusararası bir X firması , 2-3 tane open source projeye imza atıp, bakın biz de open source&#8217; e destek veriyoruz imajı yaratarak programcıları kendi cephesine çekmeye çalışmaktadır. Üstelik bu çabalar özgür düşüncenin hakim olması gereken üniversite salonlarında gerçekleştirilmektedir. Farklı bir örnek daha vermek gerekirse benzer girişimler sanat alanında da görülebilmektedir. Bir çok küresel firma bir yandan çevreyi kirleterek Dünya&#8217;yı yaşanmaz bir hale getirirken bir yandan da sanata destek veriyoruz imajı yaratmaya çalışır. Peki bunu neden yaparlar? Bu sorunun cevabı tamamen ayrı bir yazı konusudur, dolayısıyla bu bölümü burada bitirerek open source&#8217; ün bize anlatılmayan kısımlarına değinmek istiyorum.</p>
<p>Open source için öncelikle söylenmesi gereken ilk şey bence; <strong>asla ama asla sadece yazılım geliştirme süreci ile alakalı bir kavram olmadığıdır.</strong> <strong>Aksine open source&#8217; ü hayatın her alanında görebiliriz. Yeter ki doğru açıdan bakalım.</strong></p>
<p>Open source, insanların hayata bakış açıları ile örtüşen bir fikir akımıdır. Hayattan tek beklentisi sadece kendini kurtarmak olan ve öğrendiği herşeyi kendisine saklayan insanların sahip olamayacağı bir bakış açısıdır.</p>
<p>Open source, tüm insanlığı daha iyiye ve daha doğruya götürecek bir fikir akımıdır. Dolayısıyla paylaşımcı ve pozitif bir bakış açısıdır. Bir bilim adamının bir hastalığa karşı bulduğu bir ilacın formülünü diğer bilim adamları ile paylaşması da özünde bir open source &#8216;e destek hareketidir. Bir programcının geliştirdiği bir mimariyi insanlara anlatmasıda&#8230;</p>
<p>Open source&#8217;e bir programcı bakış açısıyla bakarsak eğer ilk olarak, <strong>sadece kaynak kodu açık bir şekilde yazılım geliştirmek demek değildir diyebiliriz.</strong> Bu durum sadece yapılması gereken adımlardan biridir.<strong> Önemli olan open source denen kavrama neden ve nasıl sadık kalmanız gerektiğidir.</strong> Örneğin open source olmayan araçlar ile open source&#8217; e destek verilebilir mi ? Bu sorunun cevabının zaman zaman değişkenlik gösterebileceğine inandığım gibi genel olarak bence evet diyebilirim. Çünkü <strong>işin özünde insanlara bir fikir vermek, bir fikri paylaşmak vardır.</strong> Eğer yaptığınız işle insanlara bir fikir veremiyorsanız bunun sizden başka kimseye bir faydası yoktur. Bu da open source kavramına tamamen terstir.</p>
<p>Örnek vermek gerekirse bir içerik yönetim sistemini sadece açık kaynak kodlu şekilde geliştirirken insanlara bir fikir veremiyorsanız bunun hiç bir anlamı yoktur. Hatta bence bu tamamen bir zaman kaybıdır. Burada bence bakış açısı şu şekilde olmalıdır; siz veriye erişim için bir mimari geliştirmiş olabilirsiniz ve bunu bir içerik yönetim sistemine entegre şekilde örnekleyerek insanlara sunarsınız. İşte bunu yaptığınız zaman tüm programcılara bir fikir vermiş olursunuz. Burada ki amacınız içerik yönetim sistemi değil, veriye erişim mimarisidir. İçerik yönetim sistemide bu amacın anlatılmasını kolaylaştırmak için kullanılan bir araçtır sadece&#8230;</p>
<p><strong>Bu anlattıklarımın hepsi bir yana open source &#8216;de gözden kaçan bir nokta daha vardır ki oda, geri bildirimdir.</strong> Geri bildirim sayesinde sizin paylaştığınız fikirler insanlar tarafından yorumlanır ve bir şekilde size geri döner. Bu sayede siz kendi fikirlerinizin ne kadar doğru veya ne kadar yanlış olduğunu çok net bir şekilde öğrenir ve kişisel gelişiminizi çok olumlu bir şekilde sürdürebilirsiniz.<span style="color: #ff0000;"><strong> <span style="color: #000000;">Kendi fikirlerini kimseyle paylaşmayan bir insan neyin doğru neyin yanlış olduğunu asla ama asla öğrenemez bence.</span></strong></span></p>
<p>Tekrar etmek gerekirse, <strong>open source; sadece kaynak kodu açık bir şekilde yazılım geliştirme süreci demek değildir.Aksine open source&#8217; ü hayatın her alanında görebiliriz. Yeter ki doğru açıdan bakalım.</strong></p>
<p>Mehmet Aydın Ünlü<br />
aydinunlu85@gmail.com<br />
<a href="http://www.aydinunlu.blogspot.com" target="_blank">http://www.aydinunlu.blogspot.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/open-source-nedir-ne-degildir/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solid Principles E-Book</title>
		<link>http://www.ceturk.com/solid-principles-e-book/</link>
		<comments>http://www.ceturk.com/solid-principles-e-book/#comments</comments>
		<pubDate>Sat, 07 Nov 2009 18:32:58 +0000</pubDate>
		<dc:creator>aydinunlu</dc:creator>
				<category><![CDATA[Download]]></category>
		<category><![CDATA[E-Book]]></category>
		<category><![CDATA[Manşet]]></category>
		<category><![CDATA[dependency inversion principles]]></category>
		<category><![CDATA[interface segregation principle]]></category>
		<category><![CDATA[liskov subsitution principle]]></category>
		<category><![CDATA[Mehmet Aydın Ünlü]]></category>
		<category><![CDATA[open close principle]]></category>
		<category><![CDATA[single responsibility principle]]></category>
		<category><![CDATA[solid principles]]></category>
		<category><![CDATA[tasarım prensipleri]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=3965</guid>
		<description><![CDATA[SOLID Principles yazı dizisinin derlenip pdf formatına getirilmiş hali.]]></description>
			<content:encoded><![CDATA[<p>SOLID Principles yazı dizisinin derlenip pdf formatına getirilmiş hali.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/solid-principles-e-book/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dependency Inversion Principle</title>
		<link>http://www.ceturk.com/dependency-inversion-principle/</link>
		<comments>http://www.ceturk.com/dependency-inversion-principle/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 06:00:11 +0000</pubDate>
		<dc:creator>aydinunlu</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Nesne Yönelimli Programlama]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[dependency inversion principle]]></category>
		<category><![CDATA[design principles]]></category>
		<category><![CDATA[Mehmet Aydın Ünlü]]></category>
		<category><![CDATA[object oriented]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[tasarım prensipleri]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=2888</guid>
		<description><![CDATA[Bu prensipte anlatılmak istenen şeyi Türkçe&#8217; ye çevirince ortaya, bağımlılıkların tersine çevrilmesi gibi anlaşılması zor olan bir şey çıkıyor. Fakat şimdilik bunun böyle isimlendirildiğini bilmeniz yeterli. Biz hemen konuyu daha net anlaşılması için açalım. Öncelikle bu prensibin dayandığı ana fikri söylemekte fayda var. Şöyle ki; herhangi bir sınıf ile herhangi bir başka sınıf arasında, doğrudan [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-medium wp-image-2885" title="tasarim-prensipleri-dip" src="http://www.ceturk.com/images/dip-600x480.jpg" alt="tasarim-prensipleri-dip" width="600" height="480" /></p>
<p>Bu prensipte anlatılmak istenen şeyi Türkçe&#8217; ye çevirince ortaya, <strong>bağımlılıkların tersine çevrilmesi</strong> gibi anlaşılması zor olan bir şey çıkıyor. Fakat şimdilik bunun böyle isimlendirildiğini bilmeniz yeterli. Biz hemen konuyu daha net anlaşılması için açalım.</p>
<p>Öncelikle bu prensibin dayandığı ana fikri söylemekte fayda var. Şöyle ki;<strong> herhangi bir sınıf ile herhangi bir başka sınıf arasında, doğrudan doğruya bir bağın olması sakıncalıdır.</strong> Bu durum genelde bir sınıf, diğer bir sınıfı kendi içinde örnekliyorsa ortaya çıkar. Böyle bir durumda, kendi bünyesinde başka bir sınıf örnekleyen sınıfa üst sınıf, örneklenen sınıfada alt sınıf adının verelim. Şimdi demek istediğimizi şöyle basit bir şekilde örnekleyelim; üst sınıf, herhangi bir methodunda, alt sınıfı parametre olarak almamalıdır. Veya üst sınıf, alt sınıf tipinden bir property &#8216;e sahip olmamalıdır. Ve bunlar gibi bağımlılığa neden olacak kullanım şekillerini örnek verebiliriz&#8230;</p>
<p>Peki böyle bir durum yaratmadan nasıl sınıf hiyeraşimizi kurabiliriz. Çözüm; <strong>üst sınıf ile alt sınıf arasına, soyut bir katman koymak ile çözülebilir.</strong> Diğer bir deyişle, alt sınıflar ortak bir Interface &#8216;den veya Abstract bir sınıftan türetilip, üst sınıfın da bu Interface &#8216;e veya Abstact Class &#8216;a bağımlı olması sağlanabilir.</p>
<p>Aşağıda yanlış ve doğru tasarım şekillerini görebilirsiniz.</p>
<p><img class="alignnone size-full wp-image-2886" title="tasarim-prensipleri-dip-bad_dip" src="http://www.ceturk.com/images/bad_dip.gif" alt="tasarim-prensipleri-dip-bad_dip" width="400" height="400" /></p>
<p>Şekil 1 &#8211; Yanlış Tasarım</p>
<p><img class="alignnone size-full wp-image-2887" title="tasarim-prensipleri-dip-good_dip" src="http://www.ceturk.com/images/good_dip.gif" alt="tasarim-prensipleri-dip-good_dip" width="400" height="500" /></p>
<p>Şekil 2 &#8211; Doğru Tasarım</p>
<p>İlk resimde, alt sınıf ile üst sınıf arasında doğrudan bir ilişki olduğu için kötü bir tasarımdır. Fakat ikinci resimde de gördüğünüz gibi bu iki sınıf arasına bir katman eklenince çok kolay bir şekilde doğru tasarımı elde ediyoruz ve alt sınıfları soyutlamış oluyoruz.</p>
<p>Aslında yapılmak istenen şey tamamen şudur; öyle bir yapı olmaldır ki, üst sınıf ilerde sisteme eklenebilecek yeni tüm alt sınıfları kullanabilsin. Burada yapılan işlemde tamamen budur. Böylece üst sınıfın kullanmasını istediğimiz yeni bir sınıf eklemek istediğimiz zaman tek yapmamız gereken şey, alt sınıfı bu soyut katmandan türetmek okadar.</p>
<p>Şimdi bu örneği birde koda dökelim isterseniz. Örnek senaryoda üst ve alt sınıf mantığının anlaşılmasını kolaylaştırmak için alt sınıf olarak bir Worker sınıfı olacak ve üst sınıf olarak ta bir Manager sınıfımız olacak.</p>
<p>Önce kötü tasarıma bir bakalım.</p>
<pre class="brush:csharp">public class Worker
{
    public void Work()
    {
        Console.WriteLine("Calisiyorum...");
    }
}

public class Manager
{
    Worker worker;

    public void SetWorker(Worker w)
    {
        worker = w;
    }

    public void Manage()
    {
        worker.Work();
    }
}</pre>
<p>Kodda gördüğünüz gibi Manager sınıfı direk olarak Worker tipini kullandığı için Manager sınıfı, Worker sınıfına direk olarak bağımlıdır. Bu durumun zorluğunu görmek için kendimize şu soruyyu soralım, &#8220;biz bu Manager sınıfının, SuperWorker adında yeni bir sınıf ile de çalışmasını istersek ne yapacağız ?&#8221; Yanlış çözümlerden birine örnek verecek olursak, önce SuperWorker &#8216;ı tanımlarız. Daha sonra bunu kullanacak Manager sınıfı içindeki methodları SuperWorker&#8217; a özel olarak yazarız. Yani aşağıdaki gibi.</p>
<pre class="brush:csharp"> public class Worker
 {
     public void Work()
     {
         Console.WriteLine("Calisiyorum...");
     }
 }

 public class SuperWorker
 {
     public void Work()
     {
         Console.WriteLine("Daha cok calisiyorum");
     }
 }

 public class Manager
 {
     Worker worker;

     public void SetWorker(Worker w)
     {
         worker = w;
     }

     public void Manage()
     {
         worker.Work();
     }

     SuperWorker superWorker;

     public void SetSuperWorker(SuperWorker s)
     {
         superWorker = s;
     }

     public void ManageSuperWorker()
     {
         superWorker.Work();
     }
 }</pre>
<p>Bu yapıyıda aslında bir tip kontrolü sayesinde <strong>Manage </strong>methodu içinde, bir if blogu ile kontrol edebiliriz. Yada Manage methodunu overload ederiz. Veya bir çok farklı senaryo ile destekleyebiliriz. Fakat sorun bu şekilde çözülmeye çalışıldığı her denemede, değişiklik yapılacak yer Manager sınıfıdır. Başka ihtimaliniz yok. Çünkü bu sınıflara bağımlısınız. Oysa DIP&#8217; in sağlamak istediği doğru tasarım bunun tam tersi olmakla beraber, şudur; <strong>üst sınıf içinde hiçbir değişiklik yapmadan, genişletilebilir bir yapıyı geliştirebilmektir.</strong> Ozaman çözüm yolu aşağıdaki gibi olacaktır. Yani alt sınıfları ortak bir interface olan IWorker &#8216;ı uygulayarak geliştirmek. Sonrasında da manager sınıfını bu interface ile bağımlı hale getirmek.</p>
<pre class="brush:csharp">public interface IWorker
  {
      void Work();
  }

  public class Worker : IWorker
  {
      public void Work()
      {
          Console.WriteLine("Calisiyorum...");
      }
  }

  public class SuperWorker : IWorker
  {
      public void Work()
      {
          Console.WriteLine("Daha cok calisiyorum...");
      }
  }

  public class Manager
  {
      IWorker worker;

      public void SetWorker(IWorker w)
      {
          worker = w;
      }
      public void Manage()
      {
          worker.Work();
      }
  }</pre>
<p>Gördüğünüz gibi Manager sınıfı tamamen IWorker isimli interface ile bağımlıdır. Diğer bir deyişle, Manager sınıfı için önemli olan sadece IWorker interface&#8217;ini uygulamış bir şekilde gelen nesnelerdir. Worker veya SuperWorker olması onun için önemli değildir. Onları tanımaz bile. Bu şu demektir ki, Manager sınıfı IWorker&#8217; ı uygulayan bütün sınıflar ile çalışabilir. İşte extend edilebilir yani genişletilebilir kod yazmanın tekniklerinden biride budur.</p>
<p>Bu yazıyla birlikte Design Principles başlıklı yazı dizimin SOLID Principles bölümünü bitirmiş bulunuyorum. Sizde takdir edersiniz ki bu tarz fikirsel konuları anlatmak her zaman için bir teknolojinin nasıl kullanıldığını anlatmaktan daha zordur. Bende Türkçe kaynak sıkıntısı çektiğimiz bu alanda elimden geldiği kadar edindiğim bilgileri sizlerle paylaşmaya çalıştım&#8230;</p>
<p>Kaynak : <a href="http://www.oodesign.com/" target="_blank">http://www.oodesign.com</a></p>
<p>Mehmet Aydın Ünlü<br />
aydinunlu85@gmail.com<br />
<a href="http://www.aydinunlu.blogspot.com" target="_blank">http://www.aydinunlu.blogspot.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/dependency-inversion-principle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.ceturk.com/images/dip.jpg" length="64535" type="image/jpg" />	</item>
		<item>
		<title>Interface Segregation Principle</title>
		<link>http://www.ceturk.com/interface-segregation-principle/</link>
		<comments>http://www.ceturk.com/interface-segregation-principle/#comments</comments>
		<pubDate>Sat, 03 Oct 2009 06:00:09 +0000</pubDate>
		<dc:creator>aydinunlu</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Nesne Yönelimli Programlama]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[design principles]]></category>
		<category><![CDATA[interface segregation principle]]></category>
		<category><![CDATA[Mehmet Aydın Ünlü]]></category>
		<category><![CDATA[object oriented]]></category>
		<category><![CDATA[tasarım prensipleri]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=2879</guid>
		<description><![CDATA[Öncelikle bu prensibin dayandığı ana fikri genel çerçevede açıklamaya çalışıp, ardından bir önek üzerinden giderek yazımıza devam edelim. Elimizde ortak özellikler barındıran bir çok sınıf olduğunu düşünelim. Genelde böyle durumlarda bu sınıfları ortak olan tek bir interface &#8216;i uygulayarak oluştururuz. Bu elbette ilk etapta mantıklı ve işimizi gören bir yaklaşımdır. Fakat bizim geliştirdiğimiz uygulama tabi [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-medium wp-image-2880" title="tasarim-prensipleri-interface_segregation" src="http://www.ceturk.com/images/interface_segregation-600x480.jpg" alt="tasarim-prensipleri-interface_segregation" width="600" height="480" /></p>
<p>Öncelikle bu prensibin dayandığı ana fikri genel çerçevede açıklamaya çalışıp, ardından bir önek üzerinden giderek yazımıza devam edelim.</p>
<p>Elimizde ortak özellikler barındıran bir çok sınıf olduğunu düşünelim. Genelde böyle durumlarda bu sınıfları ortak olan tek bir interface &#8216;i uygulayarak oluştururuz. Bu elbette ilk etapta mantıklı ve işimizi gören bir yaklaşımdır. Fakat bizim geliştirdiğimiz uygulama tabi ki genişletilebilir bir yapıya sahip olacak ve ilerde uygulamamıza bu sınıflara benzer yeni sınıflar ekleme ihtiyacı duyacağız. Bunu yaparken tabi ki ilk yapacağımız şey, bu yeni sınıfları da aynı interface&#8217; i uygulayarak yaratmak olacaktır. Fakat yeni sınıfımızın yapısı gereği, bu interface içinde bulunan bazı üyeleri kullanması doğru ve mantıklı değildir. İşte bizim sorunumuz da tam bu noktada ortaya çıkıyor.<strong> Sınıfların, interface içinde kullanmayacağı kesin olarak belli üyeler varsa ve bunlar sınıfın yapısına aykırı bir durum sergiliyorsa, sınıfın bu interface &#8216;i uygulaması doğru değildir.</strong></p>
<p>Çözüm ilk etapta yeni bir interface yaratıp, yeni sınıfa onu uygulamak gibi görünse de bu durum da pek sağlıklı değildir. Çünkü ilerde bu tarz sınıfların sayısının arttığı bir durumda, sınıf hiyerarşisi içinden çıkılamayacak kadar karışık bir hal almaya başlar. Bunu da kimse istemez herhalde. Peki ozaman ne yapacağız? Çözüm okadar da zor değil aslında.<strong> Tek yapmamız gereken şey, interface leri oluştururken barındırdığı üyeleri ortak olacak şekilde parçalayıp, bu üyeleri farklı interface &#8216;ler altında toplayıp, ayrı ayrı interface&#8217; ler oluşturmak okadar.</strong></p>
<p>Bu genel açıklamadan sonra şimdi somut bir örnek ile ne demek istediğimizi çok daha net bir şekilde örnekleyelim. Kullanacağım örnek genelde bu prensibin anlatılırken kullanıldığı bir senaryoya sahip. Bende bu örneğin, sorunu ve çözümünü çok güzel açıkladığını düşündüğüm için aynen kullanacağım.</p>
<p>Örneğimiz de işçilerin ortak özelliklerini barındıran <strong>IWorker </strong>adından bir interface mevcut. Bu interface içinde işçilerin çalışma yeteneğini gösteren <strong>Work </strong>adında bir method ve yemek yeme yeteneğini gösteren <strong>Eat </strong>adında bir method var. Bunun dışında bu interface &#8216; i uygulayan normal bir çalışan olan <strong>Worker </strong>ve daha çok çalışan <strong>SuperWorker </strong>adında 2 tane işçi sınıfı var. Bütün işçi tipleri de bu interface &#8216;i uygulayarak yaratılıyor. Yani biz yeni bir işçi sınıfı tanımlamak istersek bunu da <strong>IWorker </strong>interface&#8217; ini uygulayarak yaparız. Böylece bizim bütün işçilerimiz hem çalışıp hem de yemek yiyebilme yeteneklerine sahip olmuş oluyor. Son olarak birde <strong>Manager </strong>adında, işçilerin ne yapmasını gerektiğini söyleyen bir sınıf mevcut.</p>
<pre class="brush:csharp">public interface IWorker
{
    void Work();
    void Eat();
}

public class Worker : IWorker
{
    public void Work()
    {
        Console.WriteLine("Az is yapar");
    }

    public void Eat()
    {
        Console.WriteLine("Az yemek yer");
    }
}

public class SuperWorker : IWorker
{
    public void Work()
    {
        Console.WriteLine("Cok is yapar");
    }

    public void Eat()
    {
        Console.WriteLine("Cok yemek yer");
    }
}

public class Manager
{
    IWorker worker;

    public void SetWorker(IWorker w)
    {
        worker = w;
    }

    public void Manage()
    {
        worker.Work();
    }
}</pre>
<p>Buraya kadar herşey çok güzel ve sorunsuz görünüyor. Şimdi size herşeyin açıklanmasına neden olacak soruyu sormak istiyorum. Uygulamayı geliştirdiğiniz fabrika, insan işçilerin yanına bir de robot işçiler almaya karar verdi ! Robot olmasına rağmen sonuçta o da bir işçidir. Bu durumda robot sınıfının mutlaka IWorker interface&#8217; ini uygulaması gerekiyor. Fakat robotlar yemek yemez. Biz bu örnekte sadece yemek yeme olayı üzerinden gittik. Fakat bu kompleks bir sınıf olsaydı, robot yapısına aykırı bir çok olay olacaktı.Örneğin maaş gibi veya izin kullanma hakkı gibi.Bu örnekler çoğaltılabilir. Hal böyleyken bu kadar farklı yeteneklere sahip yeni bir robot sınıfının, bu özellikleri bünyesinde barındırması onu robot olmaktan çıkarır aslında. Bu da asla doğru bir tasarım şekli değildir.</p>
<p>Çözüm yukarda da dediğimiz gibi temel interface &#8216; i parçalayıp, çalışabilen ve yemek yiyebilen gibi 2 farklı interface yaratmak. Sonra eklenecek olan işçi sınıflarına bu interfaceler &#8216;den uygun olanlarını seçip, onları uygulamak. Kodun revize edilmiş hali aşağıdaki gibidir.</p>
<pre class="brush:csharp">public interface IWorkable
  {
      void Work();
  }

  public interface IFeedable
  {
      void Eat();
  }

  public class Worker : IWorkable, IFeedable
  {
      public void Work()
      {
          Console.WriteLine("Az is yapar");
      }

      public void Eat()
      {
          Console.WriteLine("Az yemek yer");
      }
  }

  public class SuperWorker : IWorkable, IFeedable
  {
      public void Work()
      {
          Console.WriteLine("Cok is yapar");
      }

      public void Eat()
      {
          Console.WriteLine("Cok yemek yer");
      }
  }

  public class Robot : IWorkable
  {
      public void Work()
      {
          Console.WriteLine("Cok fazla is yapar, yemek yemez");
      }
  }

  public class Manager
  {
      IWorkable worker;

      public void SetWorker(IWorkable w)
      {
          worker = w;
      }

      public void Manage()
      {
          worker.Work();
      }
  }</pre>
<p>Interface &#8216;lerin parçalanıp ayrı ayrı ele alınması gerektiğini söyleyen tasarım prensibimiz işte bu kadar arkadaşlar. Aslında şunu söylmekte fayda var diye düşünüyorum. Diğer tüm prensiplerde olduğu gibi bu prensipte de, zor olan şey; <strong>prensiplere uygun bir şekilde kod yazmak değil, prensiplere aykırı olan durumları tespit etmektir.</strong> Bu da aslında öyle çok zor bir şey değil ve zamanla aşılabilecek bir durumdur. Bu tarz tasarımsal problemler ile karşılaştıkça ve buna kafa yordukça, herhangi bir sınıf hiyerarşisine veya koda şöyle bir bakınca, bir çok eksikliğini ve güzelliğini görebilecek duruma geliyorsunuz zaten.</p>
<p>Kaynak : <a href="http://www.oodesign.com/" target="_blank">http://www.oodesign.com</a></p>
<p>Mehmet Aydın Ünlü<br />
aydinunlu85@gmail.com<br />
<a href="http://www.aydinunlu.blogspot.com" target="_blank">http://www.aydinunlu.blogspot.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/interface-segregation-principle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.ceturk.com/images/interface_segregation.jpg" length="76535" type="image/jpg" />	</item>
		<item>
		<title>Liskov Subsitution Principle</title>
		<link>http://www.ceturk.com/liskov-subsitution-principle/</link>
		<comments>http://www.ceturk.com/liskov-subsitution-principle/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 06:30:30 +0000</pubDate>
		<dc:creator>aydinunlu</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Nesne Yönelimli Programlama]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[liskov subsitution principle]]></category>
		<category><![CDATA[Mehmet Aydın Ünlü]]></category>
		<category><![CDATA[object oriented]]></category>
		<category><![CDATA[tasarım prensipleri]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=2872</guid>
		<description><![CDATA[Bu prensibin ana fikri; türeyen sınıfların üyeleri, temel sınıfın üyeleri ile tamamen yer değiştirebilir ilkesine dayanır. Bu dediğimizi bir örnek üzerinde görmek herşeyin daha net anlaşılmasını sağlar elbette. Ozaman hemen örneğimize geçelim. Elimizde Rectangle adında bir sınıf olsun. Bu sınıf, Width ve Height adında iki tane özellik barındırsın ve bu özelliklerin çarpımını hesaplayıp geri döndüren [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-medium wp-image-2873" title="liskov" src="http://www.ceturk.com/images/liskov-600x480.jpg" alt="liskov" width="600" height="480" /></p>
<p>Bu prensibin ana fikri; <strong>türeyen sınıfların üyeleri, temel sınıfın üyeleri ile tamamen yer değiştirebilir ilkesine dayanır.</strong></p>
<p>Bu dediğimizi bir örnek üzerinde görmek herşeyin daha net anlaşılmasını sağlar elbette. Ozaman hemen örneğimize geçelim.</p>
<p>Elimizde <strong>Rectangle </strong>adında bir sınıf olsun. Bu sınıf, <strong>Width </strong>ve <strong>Height </strong>adında iki tane özellik barındırsın ve bu özelliklerin çarpımını hesaplayıp geri döndüren <strong>GetArea </strong>adında bir method barındırsın. Bu methodun görevi sadece alan hesabı yapmak okadar. Birde bu sınıftan türeyen <strong>Square </strong>adında bir sınıf olsun.</p>
<pre class="brush:csharp">public class Rectangle
{
  public int Width { get; set; }
  public int Height { get; set; }

  public int GetArea()
  {
    return Width * Height;
  }
}

public class Square : Rectangle
{
 private int width;
 public int Width
 {
    get { return width; }
      set
      {
         width = value;
         height = value;
      }
}

 private int height;
 public int Height
 {
    get { return height; }
      set
      {
         height = value;
         width = value;
      }
}
}</pre>
<p>Şimdi yukarıdaki kodlarda bulunan, <strong>Square </strong>sınıfı içindeki özelliklerin set bloklarına dikkat etmenizi istiyorum. Gördüğünüz gibi <strong>Width </strong>veya <strong>Height </strong>özelliklerinden herhangi birine bir değer atadığınız zaman diğerinede aynı değer atanıyor. Bunu neden yaptık derseniz, bir karenin 4 kenar uzunluğuda birbirine eşit olmalıdır diyebiliriz. Böylece bu sınıfı kullanıp bu özelliklere değer atarken olası bir yanlış hesabın önüne geçmiş oluyoruz.</p>
<p>Sınıflarımızı yazdıktan sonra test kodlarımızı yazmaya geçebiliriz. Şimdi sizden şöyle düşünmenizi istiyorum. Biz bu sınıfları kullanmak istediğimizde, direkt bir nesne oluşturma işlemi yapmayalım da, gerekli işlemleri yapan bir <strong>factory </strong>sınıfımız olduğunu varsayalım. Bu factory sınıfının içinde de <strong>GetRectangle </strong>adında geriye Rectangle sınıfının referansını döndüren bir method olsun. Şu durumda Factory&#8217; nin nasıl çalıştığı ve methodun içeriği çokta önemli değil. Şimdilik önemli olan sadece, geriye bir Rectangle referansı döndüren <strong>method imzasına</strong> sahip bir method olması. Fakat koda dikkat ederseniz geriye dönen sınıf <span style="color: #ff0000;"><strong>Rectangle </strong></span>tipinde değil de, <span style="color: #0000ff;"><strong>Square </strong></span>tipindendir. Yani aşağıdaki gibi;</p>
<pre class="brush:csharp">public static class Factory
{
 public static Rectangle GetRectangle()
 {
    // ...
    return new Square();
 }
}</pre>
<p>Şimdi bu factory sınıfmızı kullanarak örneğimizi test edelim.</p>
<pre class="brush:csharp">class Program
{
   static void Main(string[] args)
   {
      Rectangle rect = Factory.GetRectangle();

      rect.Width = 5;
      rect.Height = 10;

      Console.WriteLine(rect.GetArea());
   }
}</pre>
<p>Şimdi herşeyden önce programı çalıştırıp çıktıya bakarsanız eğer, ekrana 50 yazdığını görürsünüz. Fakat 100 olması gerekmiyor mu sizce de ? Çünkü az önce Square sınıfı içinde özelliklere değer atanırken, en son atanan değerin diğer özelliğe de atandığını söylemiştim. O zaman burada <strong>Height </strong>özelliğine atadığım değerin, otomatik olarak <strong>Width </strong>özelliğine de atanması gerekmiyor mu ? Eğer böyle olsaydı 10*10 = 100 sonucuna ulaşmam gerekirdi. İşte işin püf noktasıda tam olarak burası. Eğer bunu gördüyseniz olayı biraz kavramış olmanız gerekiyor. Şimdi işin ispatına geçelim.</p>
<pre class="brush:csharp">Rectangle rect = Factory.GetRectangle();</pre>
<p>Bu satıra dikkat ederseniz eğer, ben <strong>rect </strong>adında bir <strong>Rectangle </strong>nesnesi örnekliyorum. <strong>GetRectangle </strong>&#8216;ın method imzasına göre geriye bir Rectangle döndürdürmesi gerekse bile, bu method kendi içinde aslında geriye bir <strong>Square </strong>tipi döndürüyor. Fakat oluşan nesne bir Rectangle referansına atandığına göre bir Rectangle olması gerekmiyor mu ? Hayır tabiki de, çünkü zaten Square sınıfı, Rectangle sınıfından türediği için her Square aslında bir Rectangle &#8216;dır.<strong> Fakat burada önemli olan şey, Square sınıfının kendi içinde tanımlanan özelliklere göre değilde, türediği sınıf olan Rectangle &#8216;ın özelliklerine göre davranıyor olması. Liskov &#8216;un prensibi de şunu söyler zaten; türeyen sınıfın özellikleri, temel sınıfın özellikleri ile yer değiştirebilir.</strong></p>
<p>Şimdi programı debug edip, Quick Watch&#8217; tan <strong>rect </strong>nesnesinin gerçek tipinin ne olduğunu ve hangi özelliklerine hangi değerlerin atandığına bakalım.</p>
<p><img class="size-full wp-image-2874" title="liskov-img1" src="http://www.ceturk.com/images/rect.gif" alt="liskov-img1" width="534" height="361" /></p>
<p>Resimden de anlaşılan şu ki, Square nesnesi Width ile Height değerlerini Rectangle içindeki özelliklere atamış. Bu durumda bizim Square sınıfı için yazdığımız Width ve Height özelliklerinin birbirlerine eşit olması gerektiğini belirtken kısıt ihlal edilmiş oluyor. Bu durumdan kurtulmanın yolu ise, Square sınıfını Rectangle&#8217; dan bağımsız bir şekilde tanımlamaktır.</p>
<p>Kaynak : <a href="http://www.oodesign.com/" target="_blank">http://www.oodesign.com</a></p>
<p>Mehmet Aydın Ünlü<br />
aydinunlu85@gmail.com<br />
<a href="http://aydinunlu.blogspot.com" target="_blank">http://www.aydinunlu.blogspot.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/liskov-subsitution-principle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.ceturk.com/images/liskov.jpg" length="91542" type="image/jpg" />	</item>
		<item>
		<title>Open Closed Principle</title>
		<link>http://www.ceturk.com/open-closed-principle/</link>
		<comments>http://www.ceturk.com/open-closed-principle/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 06:14:08 +0000</pubDate>
		<dc:creator>aydinunlu</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Nesne Yönelimli Programlama]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[design principles]]></category>
		<category><![CDATA[Mehmet Aydın Ünlü]]></category>
		<category><![CDATA[object oriented]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[open closed principles]]></category>
		<category><![CDATA[tasarım prensipleri]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=2868</guid>
		<description><![CDATA[Bu prensibin ana fikri; geliştirilecek olan uygulamanın genişlemelere açık fakat modifikasyonlara kapalı olması gerektiğidir. Diğer bir deyişle var olan uygulama üzerine sürekli yeni modüller ve işlevler ekleyebilmelisiniz. Fakat bunu yaparken var olan kodlar üzerinde asla bir değişiklik yapmamalısınız. Bu prensibe olan ihtiyaç, genelde bir yönetici sınıfın, yönettiği diğer sınıflar ile iletişim kurduğu durumlarda ortaya çıkıyor. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-medium wp-image-2867" title="open-close" src="http://www.ceturk.com/images/open_closed-600x480.jpg" alt="open-close" width="600" height="480" /></p>
<p>Bu prensibin ana fikri; geliştirilecek olan uygulamanın <strong>genişlemelere açık fakat modifikasyonlara kapalı olması gerektiğidir. </strong>Diğer bir deyişle var olan uygulama üzerine sürekli yeni modüller ve işlevler ekleyebilmelisiniz. <strong>Fakat bunu yaparken var olan kodlar üzerinde asla bir değişiklik yapmamalısınız.</strong></p>
<p>Bu prensibe olan ihtiyaç, genelde bir yönetici sınıfın, yönettiği diğer sınıflar ile iletişim kurduğu durumlarda ortaya çıkıyor. Şöyle ki; bizim elimizde <strong>GraphicEditor </strong>adında bir yönetici sınıf olsun. Bu sınıf ekrana çeşitli şekillerin çizilmesinden sorumlu olsun ve yapısı aşağıdaki şekildeki gibi olsun.</p>
<p><img class="aligncenter size-medium wp-image-2865" title="open-close-ClassDiagram1" src="http://www.ceturk.com/images/ClassDiagram1-600x291.jpg" alt="open-close-ClassDiagram1" width="600" height="291" /></p>
<pre class="brush:csharp">public class GraphicEditor
{
   public void DrawShape(Shape s)
   {
      if (s._type == 1)
      {
         DrawRectangle((Rectangle)s);
      }
      else if (s._type == 2)
     {
         DrawCircle((Circle)s);
      }
}

   public void DrawRectangle(Rectangle s)
   {
      Console.WriteLine("Rectangle");
   }

   public void DrawCircle(Circle s)
   {
      Console.WriteLine("Circle");
   }
}</pre>
<p>Şekilden ve kodlardan da görüldüğü gibi her bir şekil <strong>direkt </strong>olarak yönetici sınıf olan <strong>GraphicEditor </strong>sınıfına bağlı. İşte bu durum Robert Martin&#8217; in belirlediği kötü tasarım ilkelerinden her üçüne de aykırıdır.</p>
<p>Öncelikle bu kadar birbirine bağlı sınıflardan esnek davranmalarını beklemek pek mümkün değil. Bu durum da <strong>Rigidity </strong>ilkesine tamamen aykırıdır. If koşulu ile hangi şeklin çizileceğinin belirlenmesine değinmiyorum bile.</p>
<p>Bunun dışında sisteme eklemeye çalışacağım herhangi bir yeni şekil, sistemin bir çok yerinde değişikliğe neden olacaktır. Kompleks yapılarda iş akışı hataları ve exceptionların çıkması çok muhtemel bir durumdur. Bu durum da <strong>Fragility </strong>ilkesine aykırıdır.</p>
<p>Son olarak bu kadar birbirine bağımlı bir mimaride siz kalkıp GraphicEditor sınıfını <strong>Shape</strong>, <strong>Circle </strong>ve <strong>Rectangle </strong>sınıfları olmadan tek başına bir yere taşıyamayamazsınız. Çünkü GraphicEditor sınıfının bu sınıflara doğrudan bir bağımlılığı vardır. Bu durumda <strong>Immobility </strong>ilkesine ters düşer.</p>
<p>Peki çözüm nedir diye sorarsanız, devam edelim&#8230;</p>
<p>Böyle bir durumdan kurtulmak için tek yapmamız gereken şey; şekilleri ortak bir <strong>abstract </strong>sınıftan türetip, bu ortak sınıf içine yazacağımız <strong>abstract bir method</strong> ile Draw işlemini her sınıfın kendine has bir şekilde ele almasını sağlamamız okadar. Bunu da tabiki Draw methodunu her sınıf kendi içinde <strong>override </strong>edecek şekilde geliştirerek yababiliriz. Doğru tasarımın diagramı ve kodları aşağıdaki gibidir.</p>
<p><img class="aligncenter size-full wp-image-2866" title="open-close-ClassDiagram2" src="http://www.ceturk.com/images/ClassDiagram2.png" alt="open-close-ClassDiagram2" width="379" height="473" /></p>
<pre class="brush:csharp">public abstract class Shape
{
   public abstract void Draw();
}

public class Rectangle : Shape
{
   public override void Draw()
   {
      Console.WriteLine("Rectangle");
   }
}

public class Circle : Shape
{
   public override void Draw()
   {
      Console.WriteLine("Circle");
   }
}

public class GraphicEditor
{
   public void DrawShape(Shape s)
   {
      s.Draw();
   }
}</pre>
<p>Bu yapıyı bir örnekte kullanmaya başladığımız zaman, polymorphism &#8216;in en güzel halini aşağıdaki gibi görebiliyoruz.</p>
<pre class="brush:csharp">class Program
{
   static void Main(string[] args)
   {
      GraphicEditor editor = new GraphicEditor();

      Rectangle r = new Rectangle();
      editor.DrawShape(r);

      Circle c = new Circle();
      editor.DrawShape(c);
   }
}</pre>
<p>Koda dikkat ederseniz, hiç bir koşula bakılmadan, benim gönderdiğim türe uygun bir çizim işlemi gerçekleşmiş oluyor. Artık uygulamaya yeni bir şekil eklemek istersem tek yapmam gereken onu <strong>Shape </strong>isimli <strong>asbstract </strong>sınıftan türetmek ve <strong>Draw </strong>methodunu override etmek okadar.</p>
<p>Kaynak : <a href="http://www.oodesign.com/" target="_blank">http://www.oodesign.com</a></p>
<p>Mehmet Aydın Ünlü<br />
aydinunlu85@gmail.com<br />
<a href="http://www.aydinunlu.blogspot.com" target="_blank"> http://www.aydinunlu.blogspot.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/open-closed-principle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.ceturk.com/images/ClassDiagram1.jpg" length="31617" type="image/jpg" />	</item>
		<item>
		<title>Single Responsibility Principle</title>
		<link>http://www.ceturk.com/single-responsibility-principle/</link>
		<comments>http://www.ceturk.com/single-responsibility-principle/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 06:00:49 +0000</pubDate>
		<dc:creator>aydinunlu</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Nesne Yönelimli Programlama]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Mehmet Aydın Ünlü]]></category>
		<category><![CDATA[object oriented]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[single responsibility principle]]></category>
		<category><![CDATA[sir]]></category>
		<category><![CDATA[tasarım prensipleri]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=2855</guid>
		<description><![CDATA[Bir class ’ın sadece ve sadece bir tek sorumluluğa sahip olması gerektiğini belirtir. Buradan yola çıkarak şunu diyebiliriz ki; bir class ‘ın ileride herhangi bir değişikliğe uğraması için öne sürülebilecek sadece bir tane sebep olmalıdır. Diğer bir deyişle, bir class ‘a verilebilecek görev tekil olmalıdır. Örnek vermek gerekirse; bir sınıf, temel kayıt işlemlerinden (CRUD) sorumluyken [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-medium wp-image-2852" title="tasarim-prensipleri-sir" src="http://www.ceturk.com/images/sir-600x480.jpg" alt="tasarim-prensipleri-sir" width="600" height="480" /></p>
<p><strong>Bir class ’ın sadece ve sadece bir tek sorumluluğa sahip olması gerektiğini belirtir. Buradan yola çıkarak şunu diyebiliriz ki; bir class ‘ın ileride herhangi bir değişikliğe uğraması için öne sürülebilecek sadece bir tane sebep olmalıdır.</strong></p>
<p>Diğer bir deyişle, bir class ‘a verilebilecek görev tekil olmalıdır. Örnek vermek gerekirse; bir sınıf, temel kayıt işlemlerinden (CRUD) sorumluyken aynı zamanda bir raporlama işlemini de yerine getirecek işlevleri yönetmemelidir. Benzer bir örnek daha vermek gerekirse, rapor almaktan sorumlu bir sınıf aynı zamanda bu raporları ilgili kişilere mail atabilecek yeteneğe sahip olmamalıdır. Kısaca her sınıf, sadece bir tek amaca hizmet edecek şekilde geliştirilmelidir.<br />
<strong><br />
Bunun dışında tek bir amaca hizmet edecek olan sınıflarında, kendi içinde ileride çıkabilecek değişiklik sebepleri de tekil olmalıdır.</strong></p>
<p>Dilerseniz bu söylediklerimi daha rahat anlayabilmek için aşağıdaki örneği inceleyelim. Elimizde mesaj göndermekten sorumlu, <strong>IMessageManager </strong>interface ‘ini implemente etmiş <strong>MessageManager </strong>adında bir sınıf var.</p>
<pre class="brush:csharp">Public Interface IMessageManager
{
   void Send(string message, string number);
}

Public Class MessageManager : IMessageManager
{
   void Send(string message, string number)
   {
      // Send…
   }
}</pre>
<p>Koda ilk baktığımızda herşey son derece düzgün görünüyor. <strong>Send </strong>adında iki parametre alan bir method var. Bu method aldığı string tipindeki mesajı, ikinci parametrede aldığı numaraya gönderiyor. Fakat sorun tam olarak bu noktada başlıyor. Siz programı bu şekilde piyasaya sürdünüz diyelim. 3 ay sonra MMS diye bir teknoloji çıktığı zaman, sizin string tipinde parametre alan methodunuz bu ihtiyacı karşılamayacak. Tamam programı yayınlandığınız zaman böyle bir teknoloji yoktu. Zaten beklenti asla MMS diye bir teknolojiyi önceden tahmin edip ona göre bir sınıf tasarlamanız değildir. <strong>Fakat beklenen şey; ileride değişiklik olabileceğini göz önüne alarak buna uygun esnek bir yapı tasarlamanızdır.</strong> Tabi olası bu yeniliklere mümkün olduğu kadar modüler çözümler sunmak gerekiyor. Şöyleki; bu şekilde yazılan bir kodun yeni bir MMS teknolojisine sunacağı çözüm, ancak MMS tipinde parametre alan ikinci bir Send methodu yazmaktan geçer. Diğer bir deyişle Send methodunu overload etmekten geçer. Bu da benim mesaj göndermekten sorumlu olan MessageManager isimli sınıfımın, mesaj göndermek ile tamamen alakasız olarak, bir mesaj tipi yüzünden değişime uğraması demektir. Bu da SIR’ a tamamen aykırı bir durumdur. Benzer şekilde 5 ay sonra da sesli mesaj teknolojisi çıktığı zaman aynı süreci malesef tekrar yaşamak gerekecektir…</p>
<p>Çözüm son derece basittir. Mesajımızı string olarak göndermek yerine, <strong>IMessage </strong>gibi bir Interface ‘ten implemente edilmiş bir sınıf tipinde göndermek işimizi görecektir.</p>
<p>Methodumuz artık IMessage referansına sahip bir parametre almaktadır. Yani aşağıdaki kod bloğunda görüldüğü gibi.</p>
<pre class="brush:csharp">Public Interface IMessage
{
}

Public Class SMS : IMessage
{
public string Message;
}

Public Class Picture
{
   public String Name;
   public int Size;
}

Public Class MMS : IMessage
{
   public Picture Message;
}

Public Interface IMessageManager
{
   void Send(IMessage message, string number);
}

Public Class MessageManager : IMessageManager
{
   void Send(IMessage message, string number)
   {
      // Send…
   }
}</pre>
<p>Artık elimizde bir IMessage Interface’ i var ve bunu implemente etmiş, SMS ve MMS sınıfları var. SMS’ in sadece string bir mesajı vardır, fakat MMS’ in Picture tipinde çok farklı bir mesajı vardır. Mesaj tipleri farklı dahi olsa biz bu kodu artık şu şekilde kullanabiliriz.</p>
<pre class="brush:csharp">SMS sms  = new SMS();
sms.Message = “mesaj”;
MessageManager manager = new MessageManager();
manager.Send(sms, “123”);
//----------------------------------
Picture pic = new Picture();
pic.Name = “resim”;
pic.Size = 130;

MMS mms = new MMS();
mms.Message = pic;
manager.Send(mms,”123”);</pre>
<p>Görüldüğü gibi ben MessageManager sınıfında en ufak bir değişiklik bile yapmadan MMS gibi farklı bir teknolojiyi desteklemiş oldum. Bunu da sadece yeni sınıflar ekleyerek yaptım. İşte modüler tasarım dediğimiz şey özünde böyle bir mimariye sahip olmalıdır.</p>
<p>SIR, modüler programlamanın temelinde yatan prensiplerden belkide en önemlisidir. Bu şekilde geliştirilen sınıfların birbirlerine olan bağımlılıkları son derece düşüktür. Bu da modüler programlamanın en önemli gereksinimidir. Zaten ileride göreceğimiz diğer prensiplerin de hedeflediği en önemli amaç, sınıfları mümkün olduğu kadar birbirinden soyutlamak ve bağımsız tutmaktır.</p>
<p>Kaynak : <a href="http://www.oodesign.com/" target="_blank">http://www.oodesign.com</a></p>
<p>Mehmet Aydın Ünlü<br />
aydinunlu85@gmail.com<br />
<a href="http://www.aydinunlu.blogspot.com/" target="_blank">http://www.aydinunlu.blogspot.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/single-responsibility-principle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tasarım Prensipleri</title>
		<link>http://www.ceturk.com/tasarim-prensipleri/</link>
		<comments>http://www.ceturk.com/tasarim-prensipleri/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 14:42:07 +0000</pubDate>
		<dc:creator>aydinunlu</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Nesne Yönelimli Programlama]]></category>
		<category><![CDATA[dependency inversion]]></category>
		<category><![CDATA[design principles]]></category>
		<category><![CDATA[interface segregation]]></category>
		<category><![CDATA[liskov]]></category>
		<category><![CDATA[Mehmet Aydın Ünlü]]></category>
		<category><![CDATA[open close principle]]></category>
		<category><![CDATA[single responsibility principle]]></category>
		<category><![CDATA[solid]]></category>
		<category><![CDATA[solid principles]]></category>
		<category><![CDATA[tasarım prensipleri]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=2832</guid>
		<description><![CDATA[Design Principles kavramı, kötü tasarımdan uzak durmak için belirlenmiş belli kurallardan oluşan bir kurallar zinciridir. Principles of Class Design kavramı ise sınıflar üzerinde ki modellemede uymamız gereken prensipleri belirlemiştir. Bunun dışında ayrıca paketlerin nasıl tasarlanması gerektiğini belirten prensipler de vardır. Biz bu yazı dizimizde sınıflar için belirlenmiş prensipleri tanıyacağız. Sınıflar için uyulması gereken bu prensipler, [...]]]></description>
			<content:encoded><![CDATA[<p><strong><img title="tasarim-prensipleri-solid" src="http://www.ceturk.com/images/solid-600x480.jpg" alt="tasarim-prensipleri-solid" width="600" height="480" /></strong></p>
<p><strong>Design Principles kavramı</strong>, kötü tasarımdan uzak durmak için belirlenmiş belli kurallardan oluşan bir kurallar zinciridir.</p>
<p style="text-align: left;"><strong>Principles of Class Design</strong> kavramı ise sınıflar üzerinde ki modellemede uymamız gereken prensipleri belirlemiştir. Bunun dışında ayrıca paketlerin nasıl tasarlanması gerektiğini belirten prensipler de vardır. Biz bu yazı dizimizde sınıflar için belirlenmiş prensipleri tanıyacağız.</p>
<p style="text-align: left;">Sınıflar için uyulması gereken bu prensipler, kötü tasarıma neden olabilecek 3 ana unsuru ortadan kaldırmak amacıyla geliştirilmiştir. Peki nedir bu unsurlar ? Robert Martin bunları şöyle sıralamıştır;</p>
<p style="text-align: left;"><strong>Rigidity (Esnemezlik) : </strong>Kullanılan tasarımın esnek olmadığını gösterir. Yani kullanılan tasarımın geliştirmeye ve plug-in mimarisine uygun olmadığını gösterir.</p>
<p style="text-align: left;"><strong>Fragility (Kırılganlık) :</strong> Sistemin bir yerinde yaptığınız bir değişikliğin, sistemin bir başka yerinde sorun çıkarmasıdır.<strong></strong></p>
<p style="text-align: left;"><strong>Immobility (Sabitlik) :</strong> Geliştirdiğiniz bir modülün tekrar kullanılabilir olmadığını gösterir.</p>
<p style="text-align: left;">Bu 3 ana unsurun aslında ortak bir paydada buluştuğunu ve buna çözüm bulmak için prensipler geliştirildiğini söyleyebiliriz. Şöyle ki; bu durumların her birinin ortaya çıktığı nokta bağımlılık seviyesi yüksek sınıflarda görülür. Sınıf tasarımları eğer birbirlerine sıkı sıkıya bağlı ise, bu tasarım ne esnek, ne sağlam ne de taşınabilir olur. Buradan şunu söyleyebiliriz ki tüm prensiplerin çözüm ararken yapmaya çalıştığı şey, mümkün olduğu kadar sınıfların birbirlerine olan bağımlılıklarını azaltmaktır. Bunların nasıl yapılacağını yazı dizimizin sonraki bölümlerinde tek tek göreceğiz zaten. Fakat bundan önce şimdi dilerseniz bu sorunları ortadan kaldırmak için uymamız gereken prensiplere çok kısa bir şekilde bakalım.</p>
<p style="text-align: left;"><strong>Single Responsibility Principle :</strong> Her modülün bir tek sorumluluğa sahip olmasını ve ilerde olası bir değişiklikğin de tek bir nedene dayandırılması gerektiğini belirtir.</p>
<p style="text-align: left;"><strong>Open/Closed Principle :</strong> Genişlemelere açık, modifikasyonlara kapalı bir tasarım kullanılması gerektiğini belirtir.</p>
<p style="text-align: left;"><strong>Liskov &#8216;s Substitution Principle :</strong> Türeyen sınıfın üyeleri, temel sınıfın üyeleri ile tamamen yer değiştirebilir olmalıdır.</p>
<p style="text-align: left;"><strong>Interface Segregation Principle :</strong> Interface&#8217; lerin mümkün olduğu kadar birbirlerinden ayrıştırılması gerektiğini belirtir.</p>
<p style="text-align: left;"><strong>Dependency Inversion Principle :</strong> Yüksek seviye sınıfların, düşük seviye sınıflara direkt olarak bağımlı olmaması gerektiğini belirtir. Bunu da araya bir abstract sınıf veya Interface koyarak yaparız.</p>
<p style="text-align: left;">Kaynak : <a href="http://www.oodesign.com/" target="_blank">http://www.oodesign.com</a></p>
<p style="text-align: left;">Mehmet Aydın Ünlü<br />
aydinunlu85@gmail.com<br />
<a href="http://www.aydinunlu.blogspot.com" target="_blank">http://www.aydinunlu.blogspot.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/tasarim-prensipleri/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.ceturk.com/images/solid.jpg" length="60850" type="image/jpg" />	</item>
		<item>
		<title>Entity Framework için Singleton Entity Modeli Geliştirmek</title>
		<link>http://www.ceturk.com/entity-framework-icin-singleton-entity-modeli-gelistirmek/</link>
		<comments>http://www.ceturk.com/entity-framework-icin-singleton-entity-modeli-gelistirmek/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 15:42:00 +0000</pubDate>
		<dc:creator>aydinunlu</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[entity framework]]></category>
		<category><![CDATA[ipucu]]></category>
		<category><![CDATA[LinQ]]></category>
		<category><![CDATA[performans]]></category>
		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=2804</guid>
		<description><![CDATA[Merhaba arkadaşlar, Bu yazımızın konusu, entity framework ile geliştireceğimiz uygulamalarda ki, özellikle büyük bir entity nesnesi üzerinde çalışırken, bu nesnenin sürekli new ile örneklenmesinin önüne geçmek. Böylece büyük bir nesnenin birden çok örneğinin sürekli örneklenmesi ile oluşacak bellek kaybının yaşanmasını engellemiş olacağız. Bunu yaparken de basit ve kullanışlı bir tasarım deseni olanı Singleton desenini kullanacağız. [...]]]></description>
			<content:encoded><![CDATA[<p>Merhaba arkadaşlar,</p>
<p>Bu yazımızın konusu, entity framework ile geliştireceğimiz uygulamalarda ki, özellikle büyük bir entity nesnesi üzerinde çalışırken, bu nesnenin sürekli new ile örneklenmesinin önüne geçmek. Böylece büyük bir nesnenin birden çok örneğinin sürekli örneklenmesi ile oluşacak bellek kaybının yaşanmasını engellemiş olacağız. Bunu yaparken de basit ve kullanışlı bir tasarım deseni olanı <strong>Singleton</strong> desenini kullanacağız.</p>
<p>Konumuz singleton desenini içerdiği ve entity framework odaklı olduğu için öncelikle bu konuları en azından giriş seviyesinde bilmeniz gerekiyor. Singleton desenine yazı içinde kısaca değineceğim ve entity framework&#8217; ün nasıl kullanıldığını da resimli bir şekilde anlatacağım. Bunun dışında bu anlatım çok fazla detaylı olmayacağı için, size çok faydasını dokunacağından emin olduğum ado.net&#8217; in resmi web sitesinde yayınlanan <strong><a href="http://msdn.microsoft.com/en-us/data/aa937723.aspx" target="_blank">How Do I</a></strong> video serisini izlemenizi tavsiye ediyorum. Singleton ve diğer bir çok OOP kavramı için de <a href="http://www.oodesign.com/singleton-pattern.html" target="_blank"><strong>OODesign </strong></a>sitesini ziyaret edebilirsiniz.</p>
<p>İşe kısaca Entity Framework &#8216;ü ve Singleton desenini tanıyarak başlayalım isterseniz&#8230;</p>
<p>Veritabanı uygulamaları geliştirirken karşılaştığımız en büyük sorun, kuşkusuz veritabanı nesnelerinin uygulama geliştirme tarafında birer nesne olarak modellenmesidir. Bunun için bir çok farklı platform için geliştirilmiş çeşitli araçlar vardır. En bilinen örnek kuşkusuz Java için geliştirilmiş olan <a href="https://www.hibernate.org/" target="_blank">Hibarnate</a>&#8216; in, .net uyarlaması olan <a href="https://www.hibernate.org/343.html" target="_blank">NHibarnate</a>&#8216; tir. EntityFramework &#8216;ün de kavramsal olarak NHibarnate &#8216;den hiç bir farkı yoktur. Yani EF&#8217;de özünde sadece bir <a href="http://en.wikipedia.org/wiki/Object-relational_mapping" target="_blank">ORM </a>aracıdır. Yaptığı şey ise veritabanınızı olduğu gibi object olarak modellemektir. Bütün ORM araçları da bunu yapar aslında. Böylece siz veritabanı, tablolar, alanalar, stored procedure&#8217;ler gibi hemen hemen bütün veritabanı varlıkları üzerinde, saf OOP temelli uygulama geliştirme süreci izleyebilirsiniz. Bu da kısaca OOP&#8217; nin tüm nimetlerinden yararlanmak demektir. Nitekim Singleton deseninin de Object Oriented temelli bir tasarım deseni olduğunu düşünürsek bu nimetten faydalanmak ta en büyük hakkımız sanırım <img src='http://www.ceturk.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Entity Framework &#8216;ün görevinin bir veri tabanını object olarak modellemek olduğunu söyledik. Bu bağlamda şöyle bir sorun var ki, eğer veritabanı varlıksal açıdan çok büyükse, EF&#8217; nin oluşturacağı entity nesneside çok büyük olacaktır. Veritabanının varlıksal açıdan büyük olması ile söylemek istediğim şey ise, tablo, kolon, stored procedure gibi veritabanı varlıklarının çok fazla olmasıdır. Böyle bir entity nesnesinin her kullanmak istediğimiz zaman new ile örneklememiz gerekeceği için sürekli ram üzerinde aynı nesnenin birden fazla örneği yer işgal edecektir. Bu durum da ram &#8216;in gereksiz yere tüktelimesi demektir. Özellikle web uygulamalarında sorun olacak bir durumdur bu. Singleton tasarım desenide işte tam bu noktada devreye giriyor ve bizi bu yükten kurtarıyor. Nasıl mı ?</p>
<p>Şöyle ki;<strong> Singleton tasarım deseninin dayandığı temel ilke; bir nesnenin, içinde bulunduğu uygulamanın yaşam süresi boyunca, sadece 1 kez new ile örneklenmesini sağlamaktır.</strong> Bir başka deyişle, siz bir nesneyi 1 kere new ile örnekledikten sonra oluşacak tüm örnekleme isteklerinde, aynı nesne bir kez daha örneklenmeyecek ve var olan nesne kullanılacaktır.</p>
<p>Bu açıklamalardan sonra artık örneğimize geçebiliriz.</p>
<p>Örneğimiz &#8220;SingletonEF&#8221; adında bir konsol uygulaması olacak.Fakat siz web ve Windows uygulamalarında da kullanabilirsiniz tabiki. Bunun dışında kullanacağımız veritabanı da AdventureWorks olacak. Uygulamayı oluşturduktan sonra EF ile entity nesnemizi oluşturabiliriz. Bunları kısaca resimli olarak görelim hemen.</p>
<p>1. Uygulamaya sağ tıklayıp,<strong> Add New Item</strong> diyelim. Açılan pencereden<strong> ADO.NET Entity Data Model</strong> &#8216;i seçelim ve adına <strong>EntiyModel </strong>diyelim.</p>
<p><img class="aligncenter size-medium wp-image-2794" title="singleton-entityframework-img1" src="http://www.ceturk.com/images/img15-600x360.png" alt="singleton-entityframework-img1" width="600" height="360" /></p>
<p>2. Ardından açılan pencereden<strong> Genereate From Database</strong> &#8216;i seçelim ve next diyelim.</p>
<p style="text-align: center;"><img class="aligncenter" title="singleton-entityframework-img2" src="../images/img22.png" alt="singleton-entityframework-img2" width="623" height="554" /></p>
<p>3. Ardından açılan pencereden <strong>New Connection</strong> ile bağlanmak istediğimiz veritabanını seçelim ve onaylayıp aynı pencereye döndükten sonrada entity &#8216;mize isim olarak <strong>DataContext </strong>adını verip next ile ilerleyelim. (Burada verdiğimiz isim C# tarafında programlamada kullanacağımız isim olacaktır.)</p>
<p><img class="aligncenter size-full wp-image-2796" title="singleton-entityframework-img3" src="http://www.ceturk.com/images/img31.png" alt="singleton-entityframework-img3" width="624" height="554" /></p>
<p>4. Ardından açılan pencerede modellenmesini istediğimiz veritabanı varlıklarını seçip <strong>Finish </strong>butonuna basalım.</p>
<p><img class="aligncenter size-full wp-image-2797" title="singleton-entityframework-img4" src="http://www.ceturk.com/images/img41.png" alt="singleton-entityframework-img4" width="622" height="555" /></p>
<p>Bu işlemleri gerçekleştirdikten sonra entity objemiz projemize dahil edilecektir. Bu işlem sırasında çeşitli referanslar eklenmekle birlikte , solution explorer penceresinde eklenen entity &#8216;mizi görebilirsiniz. <span style="font-weight: bold;">EntityModel.Designer.cs</span> kod dosyasında da, Visual Studio&#8217; nun entity için dinamik olarak oluşturduğu kodları görebilirsiniz.</p>
<p><img class="aligncenter size-full wp-image-2798" title="singleton-entityframework-img5" src="http://www.ceturk.com/images/img51.png" alt="singleton-entityframework-img5" width="267" height="196" /></p>
<p>Birazcık bekledikten sonra, entity nesnemiz visual studio tarafından oluşturulmulş olacaktır. Artık tüm veritabanı işlemlerimizi bu entity üzerinden gerçekleştirebiliriz. Bizim konumuz tabiki bu işlemleri gerçekleştirmek değil, bu entity nesnesini kullanmak amacıyla örneklerken, sadece 1 kez örneklenmesini sağlamak&#8230;</p>
<p>İşte şimdi Singleton sınıfımızı yazmaya başlayacağız. Projemize <span style="font-weight: bold;">DataAccess </span>adında bir class ekleyelim ve ardından aşağıdaki kodları yazalım.</p>
<pre class="brush:csharp">using System;

namespace SingletonEF
{
 public class DataAccess
 {
    private static DataContext context;

    private DataAccess()
    {
    }

    public static DataContext GetDataContext()
    {
       if (context == null)
       {
          context = new DataContext();
       }

       return context;
    }
 }
}</pre>
<p>İşte bu kodlar bizim singleton desenimizi oluşturuyor. Kısaca kodları inceleyelim isterseniz. Öncelikle bizim <strong>DataContext</strong>&#8216; imizi bu sınıf içinde ele almamızı sağlayan <strong>static </strong>bir <strong>context </strong>nesnesi tanımlanmış. Ardından sınıfın singleton olmasında ki en önemli etken olan Constructor tanımlaması bulunuyor. Burada dikkat etmenizi istediğim şey constructor&#8217; ın <span style="color: #ff0000;"><strong>public </strong></span>olarak değil de <span style="color: #0000ff;"><strong>private </strong></span>olarak tanımlanmasıdır. Constructor &#8216;ların ne zaman çalıştığını hatırlayalım.</p>
<pre class="brush:csharp">Object o = new Object();</pre>
<p>Bir nesne <strong>new </strong>ile örneklendiği zaman ilk çalışan method yapıcı method olan constructor &#8216;dır. Fakat biz nesnemizin sadece 1 kez oluşmasını istiyoruz. Böyle bir yapıda ben istediğim kadar nesne örnekleyebilirim. Ozaman benim önüne geçmem gereken nokta bu yapıyı değiştirmekte gizli. Bunu da constructor &#8216;ı <strong>private </strong>tanımlayıp, dışarıdan erişimi engelleyerek yapabilirim. İsterseniz ufak bir deneme yapın ve constructor &#8216;ı private tanımlanmış bir class &#8216;ı dışarıdan new ile örneklemeye çalışın. Hata verdiğini sizde göreceksiniz.</p>
<p>Fakat benim bir şekilde bu nesneyi oluşturmam gerekiyor ki kullanabileyim. İşte yeni yapımızı oluşturacak olan son adımımızı da geriye <strong>DataContext </strong>döndüren bir <strong>static </strong>method ile yapıyoruz. Burada önemli olan methodun <strong>static </strong>olmasıdır. <strong>Hatırlayalım static methodları kullanmak için nesne örneklemeye gerek yoktu. </strong>Yani direk sınıf adı üzerinden ben bir static methoda erişebiliyorum. Bundan sonra bana kalan son şey ise, bu method içinde sadece 1 kez oluşmasını istediğim DataContext&#8217; in, daha önceden oluşup oluşmadığını kontrol etmek okadar. Bunu da eğer daha önceden oluşmadıysa yeni bir tane oluşturup, yok daha önceden oluştuysa da direk onu geri döndürerek yapıyorum. If koşulumuz da bu yapıyı sağlamış oluyor yani&#8230;</p>
<p><strong>ÖNEMLİ :</strong> Aslında burada şunu söylemekte fayda var. Bu örnekte singleton olan sınıf <span style="color: #ff0000;"><strong>DataContext </strong></span>değil, <span style="color: #0000ff;"><strong>DataAccess </strong></span>adında bizim yazdığımız sınıftır. İstersek DataContext&#8217; ide constructor &#8216;ını private yapıp, içine bir static Get.. methodu ekleyerek singleton hale getirebiliriz ki bunu da birazdan yapacağız zaten.</p>
<p>Şimdi bu DataAccess sınıfı yardımıyla, bu yapının nasıl kullanıldığını ve gerçekten sadece 1 tanemi nesne örnekleniyor görmek amacıyla ufak bir örnek yapalım. Bunun için main methodu içine aşağıdaki kodu yazıp, debug etmek yeterli&#8230;</p>
<pre class="brush:csharp">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SingletonEF
{
 class Program
 {
    static void Main(string[] args)
    {
       DataContext context = DataAccess.GetDataContext();
       DataContext context2 = DataAccess.GetDataContext();
       DataContext context3 = DataAccess.GetDataContext();

       var productList = (from product in context.Product
                          select product).Take(10);

       foreach (Product p in productList)
       {
          Console.WriteLine(p.Name);
       }
    }
 }
}</pre>
<p>Dikkat ederseniz, <strong>context</strong>, <strong>context2 </strong>ve <strong>context3 </strong>adında 3 farklı context oluşturuyorum. Fakat ilk oluşturulan dışında hiç bir context nesnesi için yeni bir DataContext nesnesi örneklenmiyor. Uygulama çalıştığı sürece binlerce bile istek olsa sadece ve sadece 1 tane DataContext nesnesi kullanılıyor olacak&#8230;</p>
<p>Debug sonucunu aşağıda görebilirsiniz.</p>
<p>1. İstek</p>
<p><img class="aligncenter size-full wp-image-2799" title="singleton-entityframework-code1" src="http://www.ceturk.com/images/code1.png" alt="singleton-entityframework-code1" width="600" height="80" /></p>
<p><img class="aligncenter size-full wp-image-2800" title="singleton-entityframework-code2" src="http://www.ceturk.com/images/code2.png" alt="singleton-entityframework-code2" width="600" height="170" /></p>
<p>Görüldüğü gibi nesne daha önceden olmadığı için 1 kez oluşturuluyor.</p>
<p>2. İstek</p>
<p><img class="aligncenter size-full wp-image-2801" title="singleton-entityframework-code3" src="http://www.ceturk.com/images/code3.png" alt="singleton-entityframework-code3" width="600" height="95" /></p>
<p><img class="aligncenter size-full wp-image-2802" title="singleton-entityframework-code4" src="http://www.ceturk.com/images/code4.png" alt="singleton-entityframework-code4" width="600" height="170" /></p>
<p>Bu istek ve sonraki diğer tüm isteklerde yeni bir nesne oluşturmak yerine var olan context geri dönecektir&#8230;</p>
<p>Yukarıda ÖNEMLi notu ile belirttiğim ifade de söylediğim gibi burada singleton olan sınıf aslında DataAccess &#8216;tir. Fakat biz aslında DataContext&#8217; in singleton olmasını istiyoruz. Dikkatli arkadaşlarımız kod bu haldeyken şöyle bir tanımlama yaparlarsa yeni bir DataContext oluştuğunu çok net görebilirler.</p>
<pre class="brush:csharp">DataContext dc = new DataContext();</pre>
<p>Peki bu durumun önüne nasıl geçeriz. Yapmamız gereken tek şey Entity framework &#8216;ün oluşturduğu kodları singleton olacak şekilde revize etmek okadar. Biz artık bir sınıfı nasıl singleton yapacağımızı biliyoruz. O halde,<strong> EntityModel. Designer.cs</strong> isimli kod dosyasını açalım ve static bir <strong>DataContext </strong>değişkeni tanımlayıp, tüm constructorları <strong>private </strong>yapalım. Sonra geriye DataContext döndüren <strong>static </strong>bir method yazalım&#8230;</p>
<p>Önce static bir DataContext tanımlayalım.</p>
<pre class="brush:csharp">private DataContext() :
        base("name=DataContext", "DataContext")
{
    this.OnContextCreated();
}

private DataContext(string connectionString) :
        base(connectionString, "DataContext")
{
    this.OnContextCreated();
}

private DataContext(global::System.Data.EntityClient.EntityConnection connection) :
        base(connection, "DataContext")
{
    this.OnContextCreated();
}</pre>
<p>Ardından static methodumuzu yazalım ki, nesnemizi oluşturabilelim.</p>
<pre class="brush:csharp">public static DataContext GetDataContext()
    {
        if (dataContext == null)
        {
            dataContext = new DataContext();
        }
        return dataContext;
    }</pre>
<p>Bu işlemlerden sonra artık DataAccess sınıfına pek ihtiyacımız kalmadı aslında.<br />
Şöyle ki; eskiden DataAccess üzderinden eriştiğimiz context &#8216;e, artık singleton olduğu için direk kendi üzerinden de gönül rahatlığı ile erişebiliriz.</p>
<pre class="brush:csharp">DataContext context = DataContext.GetDataContext();</pre>
<p>Artık aşağıdaki gibi bir kullanımın da önüne geçmiş bulunuyoruz. Yani saf singleton bir DataContext&#8217; imiz var artık.</p>
<pre class="brush:csharp">DataContext dc = new DataContext();</pre>
<p>Açıkçası araya DataAccess gibi bir katman koymak şimdilik çok ta önemli değil. Fakat gerçek uygulamalarda genellikle veri kaynağı tek bir veritabanından ibaret olmaz. Veribanı dışında size veri sunan bir çok kaynak olabilir. Nitekim web servisleri bunun en güzel örnektir.Bunun dışından birden fazla entity ile çalışıyor da olabilirsiniz. İşte bu kadar fazla veri kaynağını tek bir merkezden (DataAccess sınıfı gibi) yönetmek çok daha mantıklı bir çözümdür.(Farklı mimarilerde uygulunabilir) Bende, araya farklı katmanlar ekleyebileceğiniz gibi bunları da singleton yapabileceğinizi göstermek için yazıyı bu şekilde ele almak istedim.</p>
<p>Konuyu kısaca özetlersek artık büyük boyuttaki entity objelerimizi singleton yaparak ram israfını önlemiş bulunuyoruz. Bunun dışında birde ipucu vermek gerekirse, eğer bu nesneyi önbellekte yedekler isek çok daha fazla performans kazancı elde ederiz&#8230;</p>
<p>Mehmet Aydın Ünlü<br />
aydinunlu85@gmail.com<br />
<a href="http://www.aydinunlu.blogspot.com/" target="_blank">http://www.aydinunlu.blogspot.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/entity-framework-icin-singleton-entity-modeli-gelistirmek/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.ceturk.com/images/db.jpg" length="9612" type="image/jpg" />	</item>
		<item>
		<title>Soruna Odaklanan Bir Programcının Kısır Döngüsü</title>
		<link>http://www.ceturk.com/soruna-odaklanan-bir-programcinin-kisi-dongusu/</link>
		<comments>http://www.ceturk.com/soruna-odaklanan-bir-programcinin-kisi-dongusu/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 18:10:41 +0000</pubDate>
		<dc:creator>aydinunlu</dc:creator>
				<category><![CDATA[Yazarlar]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[hata]]></category>
		<category><![CDATA[ipucu]]></category>
		<category><![CDATA[öneri]]></category>
		<category><![CDATA[Programlama]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=2452</guid>
		<description><![CDATA[Programcıların çalışırken harcadığı zamanın büyük bir bölümünün, hata ayıklamak ile geçtiğini söylemek sanırım çokta yanlış olmaz. Hatta bazen öyle durumlar ile karşılaşırız ki, kendi kendimize söylediğimiz ilk cümle şu olur genelde; "herşey doğru görünüyor ama çalışmıyor !"]]></description>
			<content:encoded><![CDATA[<p>Programcıların çalışırken harcadığı zamanın büyük bir bölümünün, hata ayıklamak ile geçtiğini söylemek sanırım çokta yanlış olmaz. Hatta bazen öyle durumlar ile karşılaşırız ki, kendi kendimize söylediğimiz ilk cümle şu olur genelde; <strong>&#8220;herşey doğru görünüyor ama çalışmıyor !&#8221;</strong></p>
<p>Bu cümleyi kurduktan hemen sonra detaylı bir debug yaparsınız ve sürekli hata nerede acaba diye aynı yeri en az 5-6 kere test edersiniz. İşin kötü yanı ortaya çıkan bir hata yoksa, diğer bir deyişle ististani bir durum oluşmuyorsa genelde 2 ihtimal vardır. Birincisi yazdığınız kodda iş akışı hatalıdır. İkincisi uygulama alanı dışında bir eksiklik vardır. Yani mesela kodlar veritabanına bağlanıp bir tablodan select yapıp kayıt getiriyordur. Fakat ekrana kayıtlar gelmiyordur. En basit sorun tablo boştur veya sizin select sorgunuzdaki kısıtlara uygun kayıt tabloda yoktur. Bu durumda sizin uygulamanızdan, yazdığınız kodlardan tamamen bağımsızdır&#8230;</p>
<p>Konuyu çokta fazla uzatmayacağım. Kısaca demek istediğim şudur ki; bu gibi durumlarda genelde kendimizi ekrana yapıştırarak aynı kodu defalarca çalışırtırıp, neresi hatalı veya nesi eksik bulmak için saatlerce uğraşırız. Aradan saatler geçtikten sonra kodun hala çalışmadığını ve oluşan zaman kaybını ancak birşey dikkatimizi dağıttıktan sonra farkederiz.<strong> Böyle sorunlar ile karşılaştığımız zaman bir olaya odaklanmak yerine, tam tersine olabildiğince geniş düşünüp genel bir eksiklik aramaya çalışmalıyız.</strong> Hata aradığımız kapsamı mümkün olduğu kadar geniş tutmalıyız. Buda sakin bir kafa ister.O yüzden böyle durumlarla karşılaşınca, hemen bilgisayarın başından kalkın ve 10-15 dk tamamen başka konular üzerine birisiyle sohbet edin veya hava almaya çıkın. Sonra işinizin başına dönün ve iş akışıyla bağıntılı olarak, olabildiğince geniş düşünmeye başlayın. Olası bir çok durumu değerlendirip ne eksik onu bulmaya çalışın. Yine mi olmadı ? Sorun değil, gidin bir 10-15 dk daha kafa dağıtın, sonra yine düşünün&#8230;</p>
<p><strong>Genelde eksik olan şeyi bulduktan sonra, &#8220;bu mudur yani&#8221; diyebileceğiniz kadar basit bir şey olduğunu farkedeceksiniz. Sorun da zaten , tek bir noktaya odaklandığımız için, bu kadar basit bir şeyi bile görememektir. Çözüm sadece, sakin ve geniş düşünmeyi gerektirir&#8230;</strong></p>
<p>Mehmet Aydın Ünlü<br />
aydinunlu85@gmail.com<br />
<a href="http://www.aydinunlu.blogspot.com" target="_blank">http://www.aydinunlu.blogspot.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/soruna-odaklanan-bir-programcinin-kisi-dongusu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

