<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Yazılım Mühendisliği</title>
	<atom:link href="http://yahyakoc.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://yahyakoc.wordpress.com</link>
	<description>Konuşma Dili Seviyesinde Yazılım</description>
	<lastBuildDate>Sat, 25 Oct 2008 12:44:27 +0000</lastBuildDate>
	<language>tr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='yahyakoc.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Yazılım Mühendisliği</title>
		<link>http://yahyakoc.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://yahyakoc.wordpress.com/osd.xml" title="Yazılım Mühendisliği" />
	<atom:link rel='hub' href='http://yahyakoc.wordpress.com/?pushpress=hub'/>
		<item>
		<title>TAŞINDIK!!</title>
		<link>http://yahyakoc.wordpress.com/2008/10/25/tasindik/</link>
		<comments>http://yahyakoc.wordpress.com/2008/10/25/tasindik/#comments</comments>
		<pubDate>Sat, 25 Oct 2008 11:45:56 +0000</pubDate>
		<dc:creator>Yahya KOÇ</dc:creator>
				<category><![CDATA[Genel]]></category>

		<guid isPermaLink="false">http://yahyakoc.wordpress.com/?p=524</guid>
		<description><![CDATA[Pasajdan ikiyüz metre ileri taşındık.Okları takip edin  www.yahyakoc.com<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yahyakoc.wordpress.com&amp;blog=4806712&amp;post=524&amp;subd=yahyakoc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Pasajdan ikiyüz metre ileri taşındık.Okları takip edin<img class="alignnone size-full wp-image-80" title="icon_smile" src="http://yahyakoc.files.wordpress.com/2008/09/icon_smile.gif?w=15&#038;h=15" alt="" width="15" height="15" />  <a href="http://www.yahyakoc.com" target="_self">www.yahyakoc.com</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yahyakoc.wordpress.com/524/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yahyakoc.wordpress.com/524/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yahyakoc.wordpress.com/524/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yahyakoc.wordpress.com/524/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yahyakoc.wordpress.com/524/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yahyakoc.wordpress.com/524/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yahyakoc.wordpress.com/524/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yahyakoc.wordpress.com/524/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yahyakoc.wordpress.com/524/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yahyakoc.wordpress.com/524/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yahyakoc.wordpress.com/524/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yahyakoc.wordpress.com/524/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yahyakoc.wordpress.com/524/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yahyakoc.wordpress.com/524/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yahyakoc.wordpress.com&amp;blog=4806712&amp;post=524&amp;subd=yahyakoc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yahyakoc.wordpress.com/2008/10/25/tasindik/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1e163231ce244e2db31c690ca29d9dfa?s=96&#38;d=identicon" medium="image">
			<media:title type="html">yahyakoc</media:title>
		</media:content>

		<media:content url="http://yahyakoc.files.wordpress.com/2008/09/icon_smile.gif" medium="image">
			<media:title type="html">icon_smile</media:title>
		</media:content>
	</item>
		<item>
		<title>ScrewTurn Wiki</title>
		<link>http://yahyakoc.wordpress.com/2008/10/23/screwturn-wiki/</link>
		<comments>http://yahyakoc.wordpress.com/2008/10/23/screwturn-wiki/#comments</comments>
		<pubDate>Thu, 23 Oct 2008 07:33:35 +0000</pubDate>
		<dc:creator>Yahya KOÇ</dc:creator>
				<category><![CDATA[Takvim yaprağı arkası]]></category>
		<category><![CDATA[Bilgi Paylaşımı]]></category>
		<category><![CDATA[Wiki]]></category>

		<guid isPermaLink="false">http://yahyakoc.wordpress.com/?p=514</guid>
		<description><![CDATA[      ScrewTurn Türkçe desteği olan, asp.net c# ile geliştirilmiş,açık kaynaklı,veritabanı zorunluluğu olmayan,verileri dosyalar üzerinde tutan,çok kullanışlı bir wiki uygulaması.Yazılım ekibi içi bilgi paylaşımı,ekibin kollektif başaarsı için çok önemli.Ekip elemanlarının daha önce karşılaştığı hataları bu tür wiki sayfalarına işlemesi,takım arkadaşlarının da aynı problemi yaşamaması engellenmiş olur.Bir çeşit ekip içi yazılı eğitim aracına da dönüşebilen [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yahyakoc.wordpress.com&amp;blog=4806712&amp;post=514&amp;subd=yahyakoc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<table border="0">
<tbody>
<tr> </p>
<td> <br />
<img src="http://yahyakoc.files.wordpress.com/2008/10/logo_screwturn.gif?w=300&#038;h=140" alt="" width="300" height="140" /></td>
<td valign="top"> <br />
<a href="http://www.screwturn.eu" target="_self">ScrewTurn</a> Türkçe desteği olan, asp.net c# ile geliştirilmiş,açık kaynaklı,veritabanı zorunluluğu olmayan,verileri dosyalar üzerinde tutan,çok kullanışlı bir wiki uygulaması.Yazılım ekibi içi bilgi paylaşımı,ekibin kollektif başaarsı için çok önemli.Ekip elemanlarının daha önce karşılaştığı hataları bu tür wiki sayfalarına işlemesi,takım arkadaşlarının da aynı problemi yaşamaması engellenmiş olur.Bir çeşit ekip içi yazılı eğitim aracına da dönüşebilen bu tür araçlar şiddetle tavsiye olunur.Son sözümüz -çok klasik de olsa- &#8220;Bilgi paylaştıkça çoğalır&#8221;.Uygulamaya <a href="http://www.screwturn.eu/GetFile.aspx?File=Releases/ScrewTurnWiki-2.0.35.zip">buradan</a>, kaynak koduna <a href="http://www.screwturn.eu/GetFile.aspx?File=Releases%2fScrewTurnWiki-2.0.35-Source.zip">buradan</a> erişebilirsiniz.</td>
</tr>
</tbody>
</table>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yahyakoc.wordpress.com/514/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yahyakoc.wordpress.com/514/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yahyakoc.wordpress.com/514/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yahyakoc.wordpress.com/514/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yahyakoc.wordpress.com/514/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yahyakoc.wordpress.com/514/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yahyakoc.wordpress.com/514/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yahyakoc.wordpress.com/514/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yahyakoc.wordpress.com/514/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yahyakoc.wordpress.com/514/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yahyakoc.wordpress.com/514/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yahyakoc.wordpress.com/514/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yahyakoc.wordpress.com/514/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yahyakoc.wordpress.com/514/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yahyakoc.wordpress.com&amp;blog=4806712&amp;post=514&amp;subd=yahyakoc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yahyakoc.wordpress.com/2008/10/23/screwturn-wiki/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1e163231ce244e2db31c690ca29d9dfa?s=96&#38;d=identicon" medium="image">
			<media:title type="html">yahyakoc</media:title>
		</media:content>

		<media:content url="http://yahyakoc.files.wordpress.com/2008/10/logo_screwturn.gif" medium="image" />
	</item>
		<item>
		<title>Nhibernate-5</title>
		<link>http://yahyakoc.wordpress.com/2008/10/21/nhibernate-5/</link>
		<comments>http://yahyakoc.wordpress.com/2008/10/21/nhibernate-5/#comments</comments>
		<pubDate>Tue, 21 Oct 2008 08:43:59 +0000</pubDate>
		<dc:creator>Yahya KOÇ</dc:creator>
				<category><![CDATA[Nhibernate]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[Nhibernate örnek]]></category>
		<category><![CDATA[Nhibernate Kullanımı]]></category>

		<guid isPermaLink="false">http://yahyakoc.wordpress.com/?p=483</guid>
		<description><![CDATA[Bu yazımızda daha spesifik durumlar üzerinde duralım. Önceki Yazılar Nhibernate-1 Nhibernate-2 Nhibernate-3 Nhibernate-4 Object references an unsaved transient instance &#8211; save the transient instance before flushing: Domain.Kurum hatası: Aslında hata kendini çok güzel anlatıyor.&#8221;Bir nesneyi kaydediyorsun ama onun içinde transient-veritabanında karşılığı olmayan-bir nesne var onun da tipi &#8216;Kurum&#8217;dur.Önce onu kaydet&#8221;. Bu hatayı veren kodumuz şu [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yahyakoc.wordpress.com&amp;blog=4806712&amp;post=483&amp;subd=yahyakoc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Bu yazımızda daha spesifik durumlar üzerinde duralım.</p>
<h3>Önceki Yazılar</h3>
<ul>
<li><a href="http://yahyakoc.wordpress.com/2008/09/10/nhibernate-1/">Nhibernate-1</a></li>
<li><a href="http://yahyakoc.wordpress.com/2008/09/22/nhibernate-2/">Nhibernate-2</a></li>
<li><a href="http://yahyakoc.wordpress.com/2008/09/22/nhibernate-3/">Nhibernate-3</a></li>
<li><a href="http://yahyakoc.wordpress.com/2008/09/22/nhibernate-4/">Nhibernate-4</a></li>
</ul>
<p><span id="more-483"></span><br />
<strong>Object references an unsaved transient instance &#8211; save the transient instance before flushing: Domain.Kurum</strong> hatası:<br />
Aslında hata kendini çok güzel anlatıyor.&#8221;Bir nesneyi kaydediyorsun ama onun içinde transient-veritabanında karşılığı olmayan-bir nesne var onun da tipi &#8216;Kurum&#8217;dur.Önce onu kaydet&#8221;.<br />
Bu hatayı veren kodumuz şu şekilde:</p>
<p><pre class="brush: csharp;">
IKY_UYE uye = new IKY_UYE();
uye.Ad=&quot;recep&quot;;
uye.Insert();
</pre></p>
<p>Uye sınıfında Kurum sınıfına bağlı &#8220;Kurumu&#8221; adında bir özellik var. Doğrusu şu şekilde olmalıydı.</p>
<p><pre class="brush: csharp;">
Kurum krm=KurumDao.GetById(2);
IKY_UYE uye = new IKY_UYE();
uye.Kurumu=krm;
uye.Ad=&quot;recep&quot;;
uye.Insert();
</pre></p>
<p><strong>Class Lazy,List Lazy</strong><br />
Mapping dosyalarını inclediğinizde hem sınıflar için hemd e listeler için bir lazy özelliği geçiyor.</p>
<p><pre class="brush: xml;">
  &lt;class name=&quot;SanalOkul.Domain.Okul,SanalOkul.Domain&quot; table=&quot;OKUL&quot; lazy=&quot;true&quot;&gt;
    &lt;bag name=&quot;Siniflar&quot; lazy=&quot;true&quot; cascade=&quot;save-update&quot; inverse=&quot;true&quot; &gt;
       &lt;key column=&quot;OKULID&quot; /&gt;
       &lt;one-to-many class=&quot;SanalOkul.Domain.Sinif,SanalOkul.Domain&quot;  /&gt;
     &lt;/bag&gt;&lt;/class&gt;
</pre></p>
<p>Listeler üzerinde lazy kavramına <a href="http://yahyakoc.wordpress.com/2008/09/22/nhibernate-2/">Nhibernate-2</a> yazısında değinmiştik.Kısaca tekrar edelim.Öncelikle Lazy özelliğinin varsayılan değeri &#8220;true&#8221; dur.Yani biz lazy özelliğini xml dosyamızda yazmazsak değerleri otomatik olarak true set edilecektir.Listelerde genel olarak bu özelliği &#8220;lazy=true&#8221; şeklinde kullanıyoruz.Böylece ihityacımız olduğunda listeyi doldurmuş oluyoruz.Bu şekilde performans düşüşünü engellemiş oluyoruz.Bazı durumalrda bu özelliği &#8220;lazy=false&#8221; olarak da kullanmak durumunda kalabiliriz.<br />
Şimdi class üzerindeki lazy üzerine yoğunlaşalım.Sınıf üzerindeki lazy özelliği,liste üzerindeki lazy özelliğinden bağımsızdır.Biribirlerini etkilemezler.Sınıf içerisinde &#8220;lazy=true&#8221; ifadesini kullandığımızda o sınıfı özellik(property) olarak kullanan sınıf o özelliğe erişmek istediğinde devreye girer.bunu bir örnek üzerinde inceleyelim:<br />
=&gt;lazy false:</p>
<p><pre class="brush: xml;">
 &lt;class name=&quot;SanalOkul.Domain.Okul,SanalOkul.Domain&quot; table=&quot;OKUL&quot; &lt;strong&gt;lazy=&quot;false&quot;&lt;/strong&gt;
</pre></p>
<p>Şöyle bir kodumuz olsun.Sayfa ilk açıldığında bir öğrenciyi bulup Asp.Net Session&#8217;a atalım.Başka bir buton eventi altında bu öğrencinin okulunun adına erişelim.</p>
<p><pre class="brush: csharp;">
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Ogrenci ogr = new Ogrenci();
            ogr=OgrenciDao.GetById(75);
            Session[&quot;ogr&quot;] = ogr;
        }
    }
</pre><br />
<pre class="brush: csharp;">
   protected void Button1_Click(object sender, EventArgs e)
    {
        Ogrenci ogr = (Ogrenci)Session[&quot;ogr&quot;];
        string strOkulAdi = ogr.Okulu.OkulAdi;
    }
</pre></p>
<p>Kodu çalıştırıp butona tıkladığımızda 4.satıra gelindiğinde ogr nesnesinin lazy&#8217;si false olan Okulu alanına erişerek okul adını okuyabileceğiz.<br />
İkinci duruma geçelim:<br />
=&gt;lazy true:</p>
<p><pre class="brush: xml;">
 &lt;class name=&quot;SanalOkul.Domain.Okul,SanalOkul.Domain&quot; table=&quot;OKUL&quot; &lt;strong&gt;lazy=&quot;true&quot;&lt;/strong&gt;
</pre></p>
<p>Mapping dosyasını yukarıdaki gibi değiştirelim.Kodumuzu tekrar çalıştırıp butona tıkladığımızda 4.satırda hata alacağız:&#8221;<strong>Could not initialize proxy-the owning session was closed</strong>&#8220;<br />
Peki bu hatayı alacağımızı bildiğimiz halde neden &#8220;lazy=true&#8221; kullanıyoruz?Performansı en üstte tutabilmek için.Dikkat edin burda &#8220;lazy=false&#8221; ifadesi Ogrenci sınıfında değil Okul sınıfında.Hatayı aldığımız yer de ogr.<strong>Okulu</strong>.OkulAdi;&#8230;</p>
<p>Öyleyse bu hatadan nasıl kurtulabiliriz?<br />
Buton click eventinin altındaki kodu şu şekilde değiştiriyoruz.</p>
<p><pre class="brush: csharp;">
   protected void Button1_Click(object sender, EventArgs e)
    {
        Ogrenci ogr = (Ogrenci)Session[&quot;ogr&quot;];
        OgrendiDao.Refresh(ogr);
        string strOkulAdi = ogr.Okulu.OkulAdi;
    }
</pre></p>
<p>4.satırda aslında Session.Refresh(ogr); yapıyoruz.Böylece bir önceki eventte(PageLoad) yer alan Nhibernate session&#8217;ı içinde kalan ogr nesnesini tekrar çekiyoruz.Ayrıntlı bilgi için <a href="http://yahyakoc.wordpress.com/2008/09/22/nhibernate-2/">Nhibernate-2</a> yazısını incelemenizi tavsiye ederim.</p>
<p><strong>A different object with the same identifier value was already associated with the session: 1, of class Kurum</strong><br />
Bu hata da aynı Nhibernate session&#8217;ı içinde aynı id&#8217;yi taşıyan birden fazla nesne var demektir.falz olan nesneler session&#8217;dan uzaklaştırılmalıdır.Bunu da <strong>Session.Evict(okl)</strong> şeklinde sağlıyoruz.</p>
<p><strong>Composite-Id</strong><br />
Nhibernate, nesneleri primary keyler üzerinden işler.Primary key alanı olmayan tablolar nhibernate için uygun değildir.Id özelliği,tek alandan oluşabileceği gibi birden çok alanı içinde barındıran composite-id şeklinde de olabilir.Fakat composite-id mantığı kötü tasarımın ürünüdür.</p>
<p><pre class="brush: xml;">
  &lt;class name=&quot;Kurum,CrmDomain&quot;  table=&quot;Kurum&quot;&gt;
    &lt;composite-id name=&quot;ID&quot; class=&quot;Kurum_ID,CrmDomain&quot;&gt;
      &lt;key-property name=&quot;K_TUR&quot; column=&quot;K_TUR&quot; /&gt;
      &lt;key-property name=&quot;K_KOD&quot; column=&quot;K_KOD&quot; /&gt;
      &lt;key-property name=&quot;K_SEHIR&quot; column=&quot;T_SEHIR&quot; /&gt;
    &lt;/composite-id&gt;
&lt;property name=&quot;K_ADRES&quot; column=&quot;K_ADRES&quot; /&gt;
    &lt;many-to-one name=&quot;SEHIR&quot; class=&quot;CrmDomain.Sehir,CrmDomain&quot;  update=&quot; false&quot; insert=&quot;false&quot;  &gt;
      &lt;column name=&quot;K_SEHIR&quot; /&gt;
    &lt;/many-to-one&gt;
  &lt;/class&gt;
</pre></p>
<p>Yukarıda görüldüğü gibi Kurum sınıfının id özelliği üç alandan oluşuyor(K_TUR,K_KOD,K_SEHIR).Alt tarafta da o kurumun bağlı olduğu şehir ilişkisi belirtilmiş.Bu ilişki de Kurum sınıfının id&#8217;sini oluşturan alanlardan K_SEHIR üzerinden kurulmuş.Bu tür kullanım gayet doğal bir kullanım gibi gözükse de çok tercih edilmemesi gerektiğini düşünüyorum.Zira bu durumların yönetimi zordur.Önce kullanımı inceleyelim sonra da alternatif çözüme bakalım.<br />
Nhibernate içinde, composite-id kullanabilmek için composite-id olarak oluşturduğumuz sınıfın &#8220;Equals&#8221; ve &#8220;GetHashCode&#8221; virtual metodlarını override etmesi gerekir.</p>
<p><pre class="brush: csharp;">
 public class KURUM_ID
    {
        private string _K_TUR;
        public virtual string K_TUR
        {
            get { return _K_TUR; }
            set { _K_TUR= value; }
        }
        private Nullable&lt;long&gt; _K_KOD;
        public virtual Nullable&lt;long&gt; K_KOD
        {
            get { return _K_KOD; }
            set { _K_KOD= value; }
        }
        private Nullable&lt;long&gt; _K_SEHIR;
        public virtual Nullable&lt;long&gt; K_SEHIR
        {
            get { return _K_SEHIR; }
            set { _K_SEHIR = value; }
        }
        public override bool Equals(object other)
        {
            if ((this == other))
                return true;
            if ((other == null))
                return false;
            if (!(other is KURUM_ID))
                return false;
            KURUM_ID castOther = (KURUM_ID)other;
            return ((this.K_TUR == castOther.K_TUR) &amp;&amp; (this.K_KOD == castOther.K_KOD) &amp;&amp; (this.K_SEHIR == castOther.K_SEHIR) );
        }
        public override int GetHashCode()
        {
            int result = 17;
            result = 37 * result + this.K_TUR.ToString().Length;
            result = 37 * result + this.K_KOD.ToString().Length;
            result = 37 * result + this.K_SEHIR.ToString().Length;
            return result;
        }
    }
</pre></p>
<p>Şimdi de kod yazalım.</p>
<p><pre class="brush: csharp;">
    KURUM kurum=new KURUM();
    KURUM_ID id=new KURUM_ID();
    id.K_TUR=2;
    id.K_KOD=2645264;
    id.K_SEHIR=34;
    kurum.Id=id;
    kurum.Sehir=SEHIRDAO.GetById(26);
    KURUMDAO.insert(kurum);
</pre></p>
<p>Tekrar mapping dosyamıza dönelim</p>
<p><pre class="brush: xml;">
    &lt;many-to-one name=&quot;SEHIR&quot; class=&quot;CrmDomain.Sehir,CrmDomain&quot;  update=&quot; false&quot; insert=&quot;false&quot; &gt;
      &lt;column name=&quot;K_SEHIR&quot; /&gt;
    &lt;/many-to-one&gt;
</pre></p>
<p>update=&#8221;false&#8221; insert=&#8221;false&#8221; ifadesine dikkat edelim.Bu ifade bu sınıf için bir insert ya da update cümlesi oluşturulduğunda ilişkide geçen bu alanı(K_SEHIR) alanını sql cümlesi içinde kullanma anlamına gelir. Çünkü bu alan,asıl sınıfın composite-id alanlarından biri olduğu için insert,update cümlesinde zaten geçiyor.insert=&#8221;false&#8221; update=&#8221;false&#8221; ifadesini kullanmadığımızda K_SEHIR alanı sql cümlesinde tekrar geçecek ve &#8220;<strong>duplicate column</strong>&#8221; hatası alacağız.<br />
Peki ne zaman insert=&#8221;true&#8221; update=&#8221;true&#8221; kullanırız? Many-to-one ilişkimizi ana sınıf üzerinde id olmayan sıradan alanlar üzerinden kurduğumuzda -örneğin K_ADRES- bu ifadeyi insert=&#8221;true&#8221; update=&#8221;true&#8221; şeklinde kullanırız.Böylece ilişki içerisinde geçen K_ADRES alanını da insert cümlesine katmış oluruz.</p>
<p>Alternatif çözümümüz, composite-id kullanmamaktır.K_TUR,K_KOD,K_SEHIR alanlarının üçünü birden id yapmak yerine üç alanı karşılayan K_ID adında yeni bir alan oluşturulur geri kalan bu üç alan kendi içlerinde UNIQUE yapılır.</p>
<table border="1">
<tbody>
<tr>
<td width="30">PK</td>
<td width="90" align="center">UNIQUE</td>
</tr>
<tr>
<td width="30">K_ID</td>
<td width="90">K_TUR,K_KOD,K_SEHIR</td>
</tr>
</tbody>
</table>
<p>Böylece ilişkileri de hep id alanı üzerinden kurarak,yönetilebilir bir koda kavuşmuş olacağız.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yahyakoc.wordpress.com/483/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yahyakoc.wordpress.com/483/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yahyakoc.wordpress.com/483/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yahyakoc.wordpress.com/483/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yahyakoc.wordpress.com/483/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yahyakoc.wordpress.com/483/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yahyakoc.wordpress.com/483/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yahyakoc.wordpress.com/483/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yahyakoc.wordpress.com/483/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yahyakoc.wordpress.com/483/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yahyakoc.wordpress.com/483/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yahyakoc.wordpress.com/483/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yahyakoc.wordpress.com/483/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yahyakoc.wordpress.com/483/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yahyakoc.wordpress.com&amp;blog=4806712&amp;post=483&amp;subd=yahyakoc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yahyakoc.wordpress.com/2008/10/21/nhibernate-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1e163231ce244e2db31c690ca29d9dfa?s=96&#38;d=identicon" medium="image">
			<media:title type="html">yahyakoc</media:title>
		</media:content>
	</item>
		<item>
		<title>Single Responsibility Pattern</title>
		<link>http://yahyakoc.wordpress.com/2008/10/20/single-responsibility-pattern/</link>
		<comments>http://yahyakoc.wordpress.com/2008/10/20/single-responsibility-pattern/#comments</comments>
		<pubDate>Mon, 20 Oct 2008 18:02:36 +0000</pubDate>
		<dc:creator>Yahya KOÇ</dc:creator>
				<category><![CDATA[Metaforlar,Metodolojiler]]></category>
		<category><![CDATA[Single Responsibility Pattern]]></category>

		<guid isPermaLink="false">http://yahyakoc.wordpress.com/?p=467</guid>
		<description><![CDATA[&#8220;Single Responsibility Pattern&#8221;, adından da anlaşılacağı gibi her sınıfın sadece bir sorumluluğu yerine getirmesi anlamına geliyor. Cümleyi tersten okuduğumuzda çıkan anlam da doğrudur: Bir işi sadece bir sınıf yerine getirir. Nesneye yönelik programlamanın temel mantığı, çalışan kodu yönetilebilir,anlamlı en küçük birimlere ayrımaya dayanır.Böylece modüler yapı sağlanmış olacak,yeni ihtiyaçlar ışığında değişmesi gerekecek ve bu değişimden etkilenecek birimler asgari seviyede [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yahyakoc.wordpress.com&amp;blog=4806712&amp;post=467&amp;subd=yahyakoc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>&#8220;Single Responsibility Pattern&#8221;, adından da anlaşılacağı gibi<strong> her sınıfın sadece bir sorumluluğu yerine getirmesi</strong> anlamına geliyor. Cümleyi tersten okuduğumuzda çıkan anlam da doğrudur: <strong>Bir işi sadece bir sınıf yerine getirir.</strong><span id="more-467"></span></p>
<p>Nesneye yönelik programlamanın temel mantığı, çalışan kodu yönetilebilir,anlamlı en küçük birimlere ayrımaya dayanır.Böylece modüler yapı sağlanmış olacak,yeni ihtiyaçlar ışığında değişmesi gerekecek ve bu değişimden etkilenecek birimler asgari seviyede tutulacaktır.<br />
Konuyu bir örnek üzerinde inceleyelim:<br />
Bir Haber ajansının güncel haberleri abonelerine gönderen şöyle bir kod parçası olsun.<br />
<pre class="brush: csharp;">
static void Main(string[] args)
        {
            HaberYoneticisi haberYoneticisi =new  HaberYoneticisi();
            haberYoneticisi.HaberleriAbonelereGec();
        }
</pre><br />
<pre class="brush: csharp;">
   public  class HaberYoneticisi
    {
        public void HaberleriAbonelereGec()
        {
            IList guncelHaberler=Haber.GetAll();
            foreach (Haber haber in guncelHaberler)
            {
                IList aboneListesi = haber.AboneListesi;
                foreach (Abone abone in aboneListesi)
                {
                    Mail mail=new Mail();
                    mail.From = &quot;XXX AJANS&quot;;
                    mail.To = abone.mail;
                    mail.Subject = haber.Icerik;
                    mail.Server = &quot;exchange&quot;;
                    mail.Port = 25;
                    mail.Send();
                }
            }
        }
    }
</pre><br />
HaberYoneticisi sınıfı içerisinde yeralan HaberleriAbonelereGec metodunda iki işlem yapılıyor:</p>
<ul>
<li>Güncel haberlerin abonelerini bulma</li>
<li>Bulunan abonelere mail atma</li>
</ul>
<p>Burada yer alan iki iş, biribirine sıkı bir şekilde bağlı olsa örneğin &#8220;Aboneleri bul&#8221;,&#8221;Abonelerin puanını bir artır&#8221; gibi başka yerde tekrarlanmayacak iki iş olsa,bunları ayırmak her birine sınıf yazmak <strong>OverEngineering</strong> diye tabir edilen gereksiz kompleksliğe yol açar.Fakat burda geçen &#8220;&#8230;&#8217;a mail atma&#8221; işinin, başka bir çok sınıf içinde geçtiğini varsayalım*.(Abonelere,yöneticilere,diğer ajanslara mail atma)Bu durumda her sınıf içinde aynı işi yapan kodlar <strong>gereksiz kod tekrarına</strong> yol açar.Ek olarak mail atan sınıflarda  &#8220;System.Net.Mail&#8221;  gibi sistem sınıflarına gereksiz yere referans vermiş oluruz.İp yumaklarının biribirine karışmasına benzer bu durumdan aşağıdaki çözümle kurtulabiliriz.<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
*Dikkat edin &#8220;ileride geçebilir&#8221; demiyorum. &#8220;İleride geçer&#8221; diye şimdiden sınıfları ayırıp,gruplama yapmıyoruz.Bu bizim Heuristic(deneme-yanılma) yöntemle kod yazma felsefemize uymuyor.İleride, <strong>ihtiyaç olduğunda</strong> gerekli refactoring işlemleriyle ayrıştırma yapılabilir.<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
<strong>Çözüm:</strong>İkinci işin(mail atma) kod bloğunu ayrı bir sınıfa alıyoruz.O sınıfı, ilk sınıfımız içerisinde (use-a yada has-a ilişkisi) kullanıyoruz.Ya da bu kısmı bir arayüz(interface) içine alıp(is-a ilişkisi) sınıflarımızı bu arayüzü uygular hale getiriyoruz.Biz bu örnekte &#8220;use-a&#8221; ilişkisini tercih edelim.</p>
<p>Kodumuzun yeni durumuna bakalım:<br />
<pre class="brush: csharp;">
 public  class HaberYoneticisi
    {
        public void HaberleriAbonelereGec()
        {
            IList&lt;Haber&gt; guncelHaberler=Haber.GetAll();
            foreach (Haber haber in guncelHaberler)
            {
                IList&lt;Abone&gt; aboneListesi = haber.AboneListesi;
                foreach (Abone abone in aboneListesi)
                {
                   MailSender.Send(abone, haber);
                }
            }
        }
    }
    public static class MailSender
    {
        public static void Send(Abone abone,Haber haber)
        {
            Mail mail = new Mail();
            mail.From = &quot;XXX AJANS&quot;;
            mail.To = abone.mail;
            mail.Server = &quot;exchange&quot;;
            mail.Subject = haber.Icerik;
            mail.Port = 25;
            mail.Send();
        }
    }
</pre><br />
Kodu bu şekilde yazdığımızda,mail sınıfında meydana  gelen bir değişiklik(port değişikliği,adres değişikliği..) diğer sınıfları etkilemeyecektir.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yahyakoc.wordpress.com/467/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yahyakoc.wordpress.com/467/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yahyakoc.wordpress.com/467/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yahyakoc.wordpress.com/467/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yahyakoc.wordpress.com/467/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yahyakoc.wordpress.com/467/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yahyakoc.wordpress.com/467/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yahyakoc.wordpress.com/467/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yahyakoc.wordpress.com/467/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yahyakoc.wordpress.com/467/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yahyakoc.wordpress.com/467/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yahyakoc.wordpress.com/467/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yahyakoc.wordpress.com/467/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yahyakoc.wordpress.com/467/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yahyakoc.wordpress.com&amp;blog=4806712&amp;post=467&amp;subd=yahyakoc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yahyakoc.wordpress.com/2008/10/20/single-responsibility-pattern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1e163231ce244e2db31c690ca29d9dfa?s=96&#38;d=identicon" medium="image">
			<media:title type="html">yahyakoc</media:title>
		</media:content>
	</item>
		<item>
		<title>Yazılımda Dokümantasyona Farklı Bir Bakış</title>
		<link>http://yahyakoc.wordpress.com/2008/10/18/yazilimda-dokumantasyona-farkli-bir-bakis/</link>
		<comments>http://yahyakoc.wordpress.com/2008/10/18/yazilimda-dokumantasyona-farkli-bir-bakis/#comments</comments>
		<pubDate>Sat, 18 Oct 2008 12:01:08 +0000</pubDate>
		<dc:creator>Yahya KOÇ</dc:creator>
				<category><![CDATA[Metaforlar,Metodolojiler]]></category>
		<category><![CDATA[Yazılımda Dokümantasyon]]></category>

		<guid isPermaLink="false">http://yahyakoc.wordpress.com/?p=456</guid>
		<description><![CDATA[Agile Manifestosu&#8216;ndan hatırlayacağımız üzere çalışan yazılıma,kapsamlı dokümantasyondan daha fazla önem veriyoruz.Bu demek değildirki dokümantasyona önem vermiyoruz.Fakat &#8220;çalışan yazılımın kendisi zaten bir dokümandır&#8221; mantığıyla hareket ediyoruz. &#8220;Code Complete&#8221; kitabının &#8220;Yazılım Metaforları&#8221; bölümünde şöyle bir açıklama var: &#8230;&#8230;&#8230;&#8230; 1998 tarihli bir çalışmaya göre bir milyon satırdan oluşan bir yazılım için yaklaşık 69 farklı doküman tipine ihtiyaç varmış.Bu [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yahyakoc.wordpress.com&amp;blog=4806712&amp;post=456&amp;subd=yahyakoc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://yahyakoc.wordpress.com/2008/10/07/cevik-programlama/">Agile Manifestosu</a>&#8216;ndan hatırlayacağımız üzere çalışan yazılıma,kapsamlı dokümantasyondan daha fazla önem veriyoruz.Bu demek değildirki dokümantasyona önem vermiyoruz.Fakat &#8220;çalışan yazılımın kendisi zaten bir dokümandır&#8221; mantığıyla hareket ediyoruz.<br />
&#8220;Code Complete&#8221; kitabının &#8220;Yazılım Metaforları&#8221; bölümünde şöyle bir açıklama var:<br />
&#8230;&#8230;&#8230;&#8230;<br />
1998 tarihli bir çalışmaya göre bir milyon satırdan oluşan bir yazılım için yaklaşık 69 farklı doküman tipine ihtiyaç varmış.Bu büyüklükte bir sistemin gereksinim dokümanları 4000-5000 sayfadan oluşuyormuş.Tasarım dokümanları bu sayının iki üç katıymış.<br />
&#8230;&#8230;&#8230;&#8230;..<span id="more-456"></span></p>
<p>Bu kadar büyüklükte bir dokümantasyonun bırakın anlaşılmasını beklemek, okunması bile çok zordur.Neredeyse kod satırından çok doküman yazılıyor.Eski metedolojilere göre zaten geçerli olan &#8220;koddan çok açıklama satırı&#8221; mantığıdır.Günümüzde bile bu tür görüşleri savunanlar var.Saygı duyuyoruz<img class="alignnone size-full wp-image-80" title="icon_smile" src="http://yahyakoc.files.wordpress.com/2008/09/icon_smile.gif?w=15&#038;h=15" alt="" width="15" height="15" />.</p>
<p>Bugün daha çok yazılımın ürün hali ile ilgili dokümantasyondan bahsetmek istiyorum.<br />
Bir iş uygulam yazılımı yaptığınızı düşünelim.Uygulamayı devreye alıyorsunuz.Kullanıcılara uygulama için eğitim vermeniz gerekli.Ama önce kalite standartları gereği kullanıcı klavuzu yazmanız gerektiği hatırlatılıyor.Fontlar,şablonlar,imlâ kuralları&#8230;. Doküman yazmak kod yazmaktan çok daha zor hale geliyor&#8230; Yazılımcının en büyük hazinesi zamandır.Doküman yazmak kolay bir işlem olsa da çok fazla zamana mâl olur(Aynı şekilde sayfa üzerinde html ile uğraşmak vs..).Bir şekilde dokümanı yazmayı bitirdiğinizi varsayalım.Eğitim için insanları toplayıp iki saatte yazılımın işlevlerini anlatmaya çalışıyorsunuz.Ne kadar faydalı olduğu şüpheli.Doküman yazmak için çok değerli iki saatinizi harcıyorsunuz.Eğitim vermek için tüm şirketin çok değerli iki saatini harcıyorsunuz.<br />
Bu tür eski moda dokümantasyon ve eğitim teknikleri yerine, kaydedilmiş eğitim videolarını tercih etmemiz gerektiğini düşünüyorum(Bknz. <a href="http://yahyakoc.wordpress.com/2008/10/18/camtasia-studio/">Camtasia</a>). Yazılım her işlevini anlatan ufak ufak videolar kaydedip bütün kullanıcıların erişebileceği ortak bir noktaya koyun.Böylece kullanıcılar,programda takıldıkları yerde bu videroları izleyip sorularına cevap bulabilecekler.Artık her takıldıkları yerde sizi aramayacaklar.&#8221;Call center&#8221; olmaktan kurtulacaksınız<img class="alignnone size-full wp-image-80" title="icon_smile" src="http://yahyakoc.files.wordpress.com/2008/09/icon_smile.gif?w=15&#038;h=15" alt="" width="15" height="15" />.</p>
<p>Bu yöntemle elde edeceğimiz kazanımlarımızı özetleyelim:</p>
<ul>
<li>Kullanıcıların hiç bir zaman okumayacağı klavuzlar hazırlamak için çektiğiniz eziyetten kurtulacaksınız.</li>
<li>Doküman yazmak ve eğitim vermek için, sizin ve kullanıcılarınızın zamanını harcamamış olacaksınız.</li>
<li>Kullanıcılar tarafından sürekli rahatsız edilmeyeceksiniz.</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yahyakoc.wordpress.com/456/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yahyakoc.wordpress.com/456/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yahyakoc.wordpress.com/456/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yahyakoc.wordpress.com/456/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yahyakoc.wordpress.com/456/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yahyakoc.wordpress.com/456/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yahyakoc.wordpress.com/456/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yahyakoc.wordpress.com/456/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yahyakoc.wordpress.com/456/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yahyakoc.wordpress.com/456/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yahyakoc.wordpress.com/456/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yahyakoc.wordpress.com/456/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yahyakoc.wordpress.com/456/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yahyakoc.wordpress.com/456/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yahyakoc.wordpress.com&amp;blog=4806712&amp;post=456&amp;subd=yahyakoc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yahyakoc.wordpress.com/2008/10/18/yazilimda-dokumantasyona-farkli-bir-bakis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1e163231ce244e2db31c690ca29d9dfa?s=96&#38;d=identicon" medium="image">
			<media:title type="html">yahyakoc</media:title>
		</media:content>

		<media:content url="http://yahyakoc.files.wordpress.com/2008/09/icon_smile.gif" medium="image">
			<media:title type="html">icon_smile</media:title>
		</media:content>

		<media:content url="http://yahyakoc.files.wordpress.com/2008/09/icon_smile.gif" medium="image">
			<media:title type="html">icon_smile</media:title>
		</media:content>
	</item>
		<item>
		<title>Camtasia Studio</title>
		<link>http://yahyakoc.wordpress.com/2008/10/18/camtasia-studio/</link>
		<comments>http://yahyakoc.wordpress.com/2008/10/18/camtasia-studio/#comments</comments>
		<pubDate>Sat, 18 Oct 2008 11:09:45 +0000</pubDate>
		<dc:creator>Yahya KOÇ</dc:creator>
				<category><![CDATA[Takvim yaprağı arkası]]></category>
		<category><![CDATA[Camtasia]]></category>

		<guid isPermaLink="false">http://yahyakoc.wordpress.com/?p=449</guid>
		<description><![CDATA[Camtasia Studio ekran üzerinde yaptığınız tüm hareketleri, görüntü dosyası halinde kaydetmenizi sağlayan çok elverişli bir program.Sesli-görüntülü kayıt özelliğinin yanısıra kaydettiğiniz görüntüyü değişik formatlara dönüşterebilmenize imkan sağlıyor.Ayrıca görüntü üzerinde baloncuk içerisinde açıklamalar oluşturabiliyorsunuz.Görüntü üzerinde şekiller ve oklar da çıkartabiliyorsunuz.Yazacağınız yazılımlar için yardım dokümanı hazırlamak yerine yardım videosu hazırlamak için çok elverişli araç.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yahyakoc.wordpress.com&amp;blog=4806712&amp;post=449&amp;subd=yahyakoc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<table>
<tr>
<td><img src="http://yahyakoc.files.wordpress.com/2008/10/camtasia5.jpg?w=298&#038;h=200" alt="" title="camtasia5" width="298" height="200" class="alignnone size-full wp-image-450" /></td>
<td valign="top"> <a href="http://www.techsmith.com/camtasia.asp" target="_self">Camtasia Studio</a> ekran üzerinde yaptığınız tüm hareketleri, görüntü dosyası halinde kaydetmenizi sağlayan çok elverişli bir program.Sesli-görüntülü kayıt özelliğinin yanısıra kaydettiğiniz görüntüyü değişik formatlara dönüşterebilmenize imkan sağlıyor.Ayrıca görüntü üzerinde baloncuk içerisinde açıklamalar oluşturabiliyorsunuz.Görüntü üzerinde şekiller ve oklar da çıkartabiliyorsunuz.Yazacağınız yazılımlar için yardım dokümanı hazırlamak yerine yardım videosu hazırlamak için çok elverişli araç.</td>
</tr>
</table>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yahyakoc.wordpress.com/449/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yahyakoc.wordpress.com/449/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yahyakoc.wordpress.com/449/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yahyakoc.wordpress.com/449/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yahyakoc.wordpress.com/449/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yahyakoc.wordpress.com/449/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yahyakoc.wordpress.com/449/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yahyakoc.wordpress.com/449/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yahyakoc.wordpress.com/449/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yahyakoc.wordpress.com/449/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yahyakoc.wordpress.com/449/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yahyakoc.wordpress.com/449/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yahyakoc.wordpress.com/449/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yahyakoc.wordpress.com/449/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yahyakoc.wordpress.com&amp;blog=4806712&amp;post=449&amp;subd=yahyakoc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yahyakoc.wordpress.com/2008/10/18/camtasia-studio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1e163231ce244e2db31c690ca29d9dfa?s=96&#38;d=identicon" medium="image">
			<media:title type="html">yahyakoc</media:title>
		</media:content>

		<media:content url="http://yahyakoc.files.wordpress.com/2008/10/camtasia5.jpg" medium="image">
			<media:title type="html">camtasia5</media:title>
		</media:content>
	</item>
		<item>
		<title>Test Driven Development(TDD)-3</title>
		<link>http://yahyakoc.wordpress.com/2008/10/17/test-driven-developmenttdd-3/</link>
		<comments>http://yahyakoc.wordpress.com/2008/10/17/test-driven-developmenttdd-3/#comments</comments>
		<pubDate>Fri, 17 Oct 2008 19:58:29 +0000</pubDate>
		<dc:creator>Yahya KOÇ</dc:creator>
				<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit test]]></category>
		<category><![CDATA[Nun]]></category>

		<guid isPermaLink="false">http://yahyakoc.wordpress.com/?p=432</guid>
		<description><![CDATA[Konuyla ilgili önceki yazılar: Test Driven Development-1 Test Driven Development-2 Para örneğimize kaldığımız yerden devam ediyoruz.Para nesnelerini karşılaştıran testlerimize başlayalım. Farklı birimlerde aynı miktarlar karşılaştırıldığında testimiz false döndürmeli Aynı birimlerde farklı miktarlar karşılaştırıldığında testimiz false döndürmeli Aynı birimlerde aynı miktarlar karşılaştırıldığında testimiz true döndürmeli Resharper bize AyniMi metodunun olmadığını söylüyor.Öyleyse AYniMİ metodunu yazıyoruz: Metodun bu [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yahyakoc.wordpress.com&amp;blog=4806712&amp;post=432&amp;subd=yahyakoc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Konuyla ilgili önceki yazılar:</p>
<ul>
<li><a href="http://yahyakoc.wordpress.com/2008/10/10/test-driven-developmenttdd-1//">Test Driven Development-1</a></li>
<li><a href="http://yahyakoc.wordpress.com/2008/10/10/test-driven-developmenttdd-2//">Test Driven Development-2</a></li>
</ul>
<p>Para örneğimize kaldığımız yerden devam ediyoruz.Para nesnelerini karşılaştıran testlerimize başlayalım.<span id="more-432"></span></p>
<ul>
<li>Farklı birimlerde aynı miktarlar karşılaştırıldığında testimiz false döndürmeli</li>
<li>Aynı birimlerde farklı miktarlar karşılaştırıldığında testimiz false döndürmeli</li>
<li>Aynı birimlerde aynı miktarlar karşılaştırıldığında testimiz true döndürmeli</li>
</ul>
<p><pre class="brush: csharp;">
[Test]
public void AyniBirimler_Farkli_Miktarlar_Equals_Return_false()
{
     ParaBase ytl = ParaBase.CreatePara(8,&quot;YTL&quot;);
     ParaBase yeniYtl = ParaBase.CreatePara(13, &quot;YTL&quot;);
     Assert.AreEqual(false,ytl.AyniMi(yeniYtl));
}
[Test]
public void AyniBirimler_Ayni_Miktarlar_Equals_Return_true()
{
     ParaBase ytl = ParaBase.CreatePara(8, &quot;YTL&quot;);
     ParaBase yeniYtl = ParaBase.CreatePara(8, &quot;YTL&quot;);
     Assert.AreEqual(true, ytl.AyniMi(yeniYtl));
}
[Test]
public void FarkliBirimler_Ayni_Miktarlar_Equals_Return_false()
{
     ParaBase ytl = ParaBase.CreatePara(8, &quot;YTL&quot;);
     ParaBase dolar = ParaBase.CreatePara(8, &quot;USD&quot;);
     Assert.AreEqual(false, ytl.AyniMi(dolar));
}
</pre></p>
<p>Resharper bize AyniMi metodunun olmadığını söylüyor.Öyleyse AYniMİ metodunu yazıyoruz:</p>
<p><pre class="brush: csharp;">
public bool AyniMi(ParaBase kiyasPara)
{
     return (Miktar == kiyasPara.Miktar);
}
</pre></p>
<p>Metodun bu haliyle Farkli_Miktarlar_Equals_Return_false, Ayni_Miktarlar_Equals_Return_true testleri başarılı olacak ama FarkliBirimler_Ayni_Miktarlar_Equals_Return_false testi başarasız olacak zira sadece miktar alanına bakıyoruz.Bu durumda 8 USD=8 YTL işlemi doğruymuş gibi gözükecek.<br />
Metodumuza birim karşılaştırması da ekliyoruz</p>
<p><pre class="brush: csharp;">
public bool AyniMi(ParaBase kiyasPara)
{
     return (Miktar == kiyasPara.Miktar) &amp;&amp; (Birim==kiyasPara.Birim);
}
</pre></p>
<p>Şimdi farklı para birimleri arasında dönüştürme testlerimize başlayalım.<br />
1 USD=2YTL kabul edelim.(Bu durumun tersini arzu ederdik)</p>
<p><pre class="brush: csharp;">
[Test]
public void YTL_USD_DonusumMetodu()
{
     ParaBase ytl = ParaBase.CreatePara(8, &quot;YTL&quot;);
     ParaBase dolar=ParaDonusturucu.Donustur(ytl, &quot;USD&quot;);
     Assert.AreEqual(dolar.Miktar,4);
}
</pre></p>
<p>Tabi testi bu haliyle geçemiyoruz.Önce ParaDonusturucu sınıfımızı oluşturuyoruz.</p>
<p><pre class="brush: csharp;">
public class ParaDonusturucu
{
    public static ParaBase Donustur(ParaBase DonusturulecekPara, string DonusecekBirim)
    {
       retun null;
    }
}
</pre></p>
<p>Parabirimleri arasında dönüşüm yapabilmek çaprazkur bilgilerini bilmemiz gerekiyor.<br />
Donustur metodunun içerisini şöyle değiştirelim:</p>
<p><pre class="brush: csharp;">
public class ParaDonusturucu
{
     public static ParaBase Donustur(ParaBase DonusturulecekPara, string DonusecekBirim)
     {
       double caprazKur = CaprazKurlar.KurDegeri(DonusturulecekPara.Birim, DonusecekBirim);
       double yeniMiktar = DonusturulecekPara.Miktar*caprazKur;
       return ParaBase.CreatePara(yeniMiktar, DonusecekBirim);
     }
}
</pre></p>
<p>CaprazKurlar adında static bir sınıfımız olsun.İçinde KurDegeri adında bir metod, verilen parametlere göre çarprazkur bilgisini döndürsün.Örneğin (1 USD,YTL) için 2 değeri dönsün.</p>
<p>USD YTL 2<br />
YTL USD 0,5<br />
Şeklinde verileri tutabileceğimiz sınıflarımız olsun.Ve bu sınıflar da aynı özelliklere sahip olacağı için soyut bir sınıf yazıyoruz.</p>
<p><pre class="brush: csharp;">
public abstract class CaprazKurBase
{
     public abstract string KaynakBirim { get; }
     public abstract string HedefBirim { get; }
     public abstract double CaprazKurDegeri { get; }
}
</pre></p>
<p>Yeni kur sınıflarımızı da bu sınıftan türeterek oluşturuyoruz.</p>
<p><pre class="brush: csharp;">
public class USD_YTL_CaprazKur:CaprazKurBase
{
     public override string KaynakBirim
     {
       get { return &quot;USD&quot;; }
     }
     public override string HedefBirim
     {
       get { return &quot;YTL&quot;; }
     }
     public override double CaprazKurDegeri
     {
       get { return 2.0; }
     }
}
public class YTL_USD_CaprazKur : CaprazKurBase
{
     public override string KaynakBirim
     {
        get { return &quot;YTL&quot;; }
     }
     public override string HedefBirim
     {
       get { return &quot;USD&quot;; }
     }
     public override double CaprazKurDegeri
     {
       get { return 0.5; }
     }
}
</pre></p>
<p>Şimdi CarprazlarKurlar sınıfı ve o sınıfın KurDegeri metodunu doldurabiliriz.</p>
<p><pre class="brush: csharp;">
public static class CaprazKurlar
{
     static List&lt;CaprazKurBase&gt; CaprazKurListesi=new List&lt;CaprazKurBase&gt;{new USD_YTL_CaprazKur(),new YTL_USD_CaprazKur()};
    public static double KurDegeri(string kaynakBirim, string hedefBirim)
    {
       foreach (CaprazKurBase kur in CaprazKurListesi)
       {
         if((kur.HedefBirim==hedefBirim) &amp;&amp;(kur.KaynakBirim==kaynakBirim))
            {
              return kur.CaprazKurDegeri;
            }
        }
        return 0;
   }
}
</pre></p>
<p>Şimdi YTL_USD_DonusumMetodu testini çalıştırdığımızda testi geçtiğimi göreceğiz.<br />
YTL-&gt;USD dönüşümünü yaptık.Şimdi USD-&gt;YTL dönüşümü test edelim.</p>
<p><pre class="brush: csharp;">
[Test]
public void USD_YTL_DonusumMetodu()
{
     ParaBase dolar = ParaBase.CreatePara(8, &quot;USD&quot;);
     ParaBase ytl = ParaDonusturucu.Donustur(dolar, &quot;YTL&quot;);
     Assert.AreEqual(ytl.Miktar, 16);
}
</pre></p>
<p>8doları 16ytl&#8217;ye çevirebildik.</p>
<p>Farkettiyseniz birimler string olarak tanımlı.Artık bu stringlerden kurtulup bir enum tip oluşturmanın vakti geldi.Çift tırnak içine yazılarak tanımlanan değişkenlerin hatalı tanımlanma olasılığı yüksektir.Örneğin CreatePara(8,&#8221;UAD&#8221;)&#8230; &#8216;S&#8217; yerine &#8216;A&#8217; karakterine bastım.Derleyici çift tırnak içindeki ifadelerin size ait olduğunu düşünür ve içinde kontrol yapmaz.Bunun yerine enum değişkenler kullansak ve hatalı yazsak derleyici bizi uyaracak.</p>
<p>Birim adında bir enum oluşturalım.</p>
<p><pre class="brush: csharp;">
public enum Birim
{
    YTL=0,
    USD=1,
    EUR=2
}
</pre></p>
<p>Kodumuzdaki tüm &#8220;YTL&#8221; ifadelerini, Birim.YTL; tüm &#8220;USD&#8221; ifadelerini, Birim.USD yapalım Ve testlerimizi tekrar çalıştıralım.(Dönüşümlerden sonra sorun çıkacak mı?)<br />
Evet değişikliklerden sonra testlermizin hepsi yeşil&#8230;.<br />
Kodumuzun son haline bakalım.</p>
<p><pre class="brush: csharp;">
[TestFixture]
public class Tests
{
    [Test]
    public void Dolar_YapiciMetodIleDuzgunOlusturulmus_Mu()
    {
       ParaBase dlr = ParaBase.CreatePara(8, Birim.USD);
       Assert.AreEqual(dlr.Miktar, 8);
    }
    [Test]
    public void YTL_YapiciMetodIleDuzgunOlusturulmus_Mu()
    {
       ParaBase ytl = ParaBase.CreatePara(8, Birim.YTL);
       Assert.AreEqual(ytl.Miktar, 8);
     }
     [Test]
     public void YTL_ParaEkleme()
     {
        ParaBase ytl = ParaBase.CreatePara(8, Birim.YTL);
        ytl.Ekle(5);
        Assert.AreEqual(ytl.Miktar, 13);
     }
     [Test]
     public void YTL_Farkli_Miktarlar_Equals_Return_false()
     {
        ParaBase ytl = ParaBase.CreatePara(8, Birim.YTL);
        ParaBase yeniYtl = ParaBase.CreatePara(13, Birim.YTL);
        Assert.AreEqual(false,ytl.AyniMi(yeniYtl));
     }
     [Test]
     public void YTL_Ayni_Miktarlar_Equals_Return_true()
     {
        ParaBase ytl = ParaBase.CreatePara(8, Birim.YTL);
        ParaBase yeniYtl = ParaBase.CreatePara(8, Birim.YTL);
        Assert.AreEqual(true, ytl.AyniMi(yeniYtl));
     }
     [Test]
     public void FarkliBirimler_Ayni_Miktarlar_Equals_Return_false()
     {
        ParaBase ytl = ParaBase.CreatePara(8, Birim.YTL);
        ParaBase dolar = ParaBase.CreatePara(8, Birim.USD);
        Assert.AreEqual(false, ytl.AyniMi(dolar));
     }
     [Test]
     public void YTL_ParaTemelSinifiEkleMetodu()
     {
        ParaBase ytl = ParaBase.CreatePara(8, Birim.YTL);
        Assert.AreEqual(ytl.Miktar, 8);
     }
     [Test]
     public void YTL_ParaTemelSinifiCikarMetodu()
     {
        ParaBase ytl = ParaBase.CreatePara(8, Birim.YTL);
        ytl.Cikar(3);
        Assert.AreEqual(ytl.Miktar, 5);
      }
      [Test]
      [ExpectedException(typeof(YetersizMiktarException))]
      public void YTL_ParaTemelSinifiCikarMetodu_MiktarSifirinAltinda_IstisnaFirlat()
      {
         ParaBase ytl =ParaBase.CreatePara(8,Birim.YTL);
         ytl.Cikar(13);
      }
      [Test]
      public void YTL_USD_DonusumMetodu()
      {
         ParaBase ytl = ParaBase.CreatePara(8, Birim.YTL);
         ParaBase dolar=ParaDonusturucu.Donustur(ytl, Birim.USD);
         Assert.AreEqual(dolar.Miktar,4);
      }
      [Test]
      public void USD_YTL_DonusumMetodu()
      {
         ParaBase dolar = ParaBase.CreatePara(8, Birim.USD);
         ParaBase ytl = ParaDonusturucu.Donustur(dolar, Birim.YTL);
         Assert.AreEqual(ytl.Miktar, 16);
       }
}
public class ParaBase
{
     public static ParaBase CreatePara(double _miktar, Birim _birim)
     {
        return new ParaBase(_miktar, _birim);
     }
     protected double miktar;
     private Birim birim;
     protected ParaBase(double _miktar, Birim _birim)
     {
         miktar = _miktar;
         birim = _birim;
      }
      public double Miktar
      {
         get { return miktar; }
      }
      public Birim Birim
      {
        get { return birim; }
      }
      public bool AyniMi(ParaBase kiyasPara)
      {
         return (Miktar == kiyasPara.Miktar) &amp;&amp; (Birim==kiyasPara.Birim);
      }
      public void Ekle(int _ekMiktar)
      {
         miktar += _ekMiktar;
      }
      public void Cikar(int _cikacakMiktar)
      {
          if (_cikacakMiktar &gt; Miktar) throw new YetersizMiktarException(&quot;Yeterli para yok&quot;);
          miktar -= _cikacakMiktar;
       }
}
public class YetersizMiktarException : Exception
{
     public YetersizMiktarException(string Message) : base(Message) { }
}
public class ParaDonusturucu
{
      public static ParaBase Donustur(ParaBase DonusturulecekPara, Birim hedefBirim)
      {
         double caprazKur = CaprazKurlar.KurDegeri(DonusturulecekPara.Birim, hedefBirim);
         double yeniMiktar = DonusturulecekPara.Miktar*caprazKur;
         return ParaBase.CreatePara(yeniMiktar, hedefBirim);
      }
}
public static class CaprazKurlar
{
      static readonly List CaprazKurListesi=new List{new USD_YTL_CaprazKur(),new  YTL_USD_CaprazKur()};
      public static double KurDegeri(Birim kaynakBirim, Birim hedefBirim)
      {
          foreach (CaprazKurBase kur in CaprazKurListesi)
          {
              if((kur.HedefBirim==hedefBirim) &amp;amp;&amp;amp;(kur.KaynakBirim==kaynakBirim))
                {
                   return kur.CaprazKurDegeri;
                }
            }
        return 0;
       }
}
public class USD_YTL_CaprazKur:CaprazKurBase
{
    public override Birim KaynakBirim
    {
       get { return Birim.USD; }
    }
    public override Birim HedefBirim
    {
       get { return Birim.YTL; }
    }
    public override double CaprazKurDegeri
    {
      get { return 2.0; }
    }
}
public class YTL_USD_CaprazKur : CaprazKurBase
{
     public override Birim KaynakBirim
     {
        get { return Birim.YTL; }
     }
     public override Birim HedefBirim
     {
        get { return Birim.USD; }
     }
     public override double CaprazKurDegeri
     {
        get { return 0.5; }
     }
}
public abstract class CaprazKurBase
{
     public abstract Birim KaynakBirim { get; }
     public abstract Birim HedefBirim { get; }
     public abstract double CaprazKurDegeri { get; }
}
public enum Birim
{
    YTL=0,
    USD=1,
    EUR=2
}
</pre></p>
<p>Burada şöyle bir soru kafamızı kurcalıyor.&#8221;Her yeni parabirimi eklendiğinde,birim sayısı kadar kombinasyon oluşacak.Her kombinasyon için yeni bir sınıf mı oluşturacağız?(YTl_YEN_CAPRAZKUR,DIN_YTL_CAPRAZKUR&#8230;)Ya da biz bu değerleri bir yerlerden mi okumalıyız?Evet bu değerleri veritabanından okumalıyız.Bu durumda her dönüşüm için bir sınıf oluşturmamıza gerek yok.Soyut sınıfımızın soyutluğunu kaldırır, veritabanında CaprazKur tablosundan gelen verileri bu sınıfa doldurarak kullanırız.</p>
<p>Son olarak &#8220;ayniMi&#8221; metoduna bakalım.Farklı miktarlarda farklı para birimlerini karşılaştıran testimizi yazalım.</p>
<p><pre class="brush: csharp;">
[Test]
public void FarkliBirimler_Farkli_Miktarlar_AyniDeger_Equals_Return_true()
{
    ParaBase ytl = ParaBase.CreatePara(8, Birim.YTL);
    ParaBase dolar = ParaBase.CreatePara(4, Birim.USD);
    Assert.AreEqual(false, ytl.AyniMi(dolar));
}
</pre></p>
<p>Testimizi çalıştırdığımızda başarısız olacağımızı göreceğiz.Zira &#8220;AyniMi&#8221; metodu içerisinde kontrolümüz şu şekilde:</p>
<p><pre class="brush: csharp;">
      return (Miktar == kiyasPara.Miktar) &amp;&amp; (Birim==kiyasPara.Birim);
</pre></p>
<p>Bu durumda farkli para birimlerindeki paralar hiçbir zaman eşit olmayacak.&#8221;AyniMi&#8221; metodunun içini değiştiriyoruz.</p>
<p><pre class="brush: csharp;">
public bool AyniMi(ParaBase kiyasPara)
{
    if (Birim == kiyasPara.Birim)
    {
       return (Miktar == kiyasPara.Miktar);
    }
    ParaBase kaynakPara= ParaDonusturucu.Donustur(this, kiyasPara.Birim);
    return (kaynakPara.Miktar == kiyasPara.Miktar);
}
</pre></p>
<p>Testlerimizi tekrar çalıştırıyoruz.Hepsi yeşil&#8230;Tekrar vurgulamak gerekirse birim testlerin bize sağladığı en önemli fayda,koddaki değişikliklerin diğer noktalarda ne gibi sorunlar çıkartacağını bize göstermesidir.&#8221;AyniMi&#8221; metodunda yaptığımız değişiklik en son testimizde sorun çıkartmaz ama önceki testlerimizi patlatabilirdi.</p>
<p>&#8220;Unit test&#8221; yazı dizisinin sonuna geldik..</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yahyakoc.wordpress.com/432/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yahyakoc.wordpress.com/432/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yahyakoc.wordpress.com/432/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yahyakoc.wordpress.com/432/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yahyakoc.wordpress.com/432/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yahyakoc.wordpress.com/432/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yahyakoc.wordpress.com/432/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yahyakoc.wordpress.com/432/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yahyakoc.wordpress.com/432/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yahyakoc.wordpress.com/432/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yahyakoc.wordpress.com/432/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yahyakoc.wordpress.com/432/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yahyakoc.wordpress.com/432/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yahyakoc.wordpress.com/432/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yahyakoc.wordpress.com&amp;blog=4806712&amp;post=432&amp;subd=yahyakoc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yahyakoc.wordpress.com/2008/10/17/test-driven-developmenttdd-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1e163231ce244e2db31c690ca29d9dfa?s=96&#38;d=identicon" medium="image">
			<media:title type="html">yahyakoc</media:title>
		</media:content>
	</item>
		<item>
		<title>Kötü Tasarımın İşaretleri</title>
		<link>http://yahyakoc.wordpress.com/2008/10/13/kotu-tasarimin-isaretleri/</link>
		<comments>http://yahyakoc.wordpress.com/2008/10/13/kotu-tasarimin-isaretleri/#comments</comments>
		<pubDate>Mon, 13 Oct 2008 08:23:10 +0000</pubDate>
		<dc:creator>Yahya KOÇ</dc:creator>
				<category><![CDATA[Metaforlar,Metodolojiler]]></category>
		<category><![CDATA[Agile Software Development]]></category>

		<guid isPermaLink="false">http://yahyakoc.wordpress.com/?p=426</guid>
		<description><![CDATA[Bükülmezlik:Sistem değişime kapalıdır.Her değişiklik hamlesi sistemin diğer kısımlarında da değişikliği zorunlu kılar. &#8220;Ufak bir değişiklik yapacağız&#8221; diye yola çıkılır.İşin sonunda geliştirici,başlangıçta tahmin ettiği noktadan çok uzaklardadır. Kırılganlık:Yapılan değişiklikler,değişiklikle hiç alakası olmayan yerlerde kırılmalara neden olur. Taşınamazlık:Sistemin alt parçaları,başka sistemlerde kullanılabilecek biçimde modüler değildir. Yoğunluk:Sistem üzerinde doğru şeyi yapmak,yanlışı yapmaktan daha zordur.(Sistem doğru kullanımı dikte etmiyor.)Dizaynı [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yahyakoc.wordpress.com&amp;blog=4806712&amp;post=426&amp;subd=yahyakoc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<ul>
<li><strong>Bükülmezlik</strong>:Sistem değişime kapalıdır.Her değişiklik hamlesi sistemin diğer kısımlarında da değişikliği zorunlu kılar. &#8220;Ufak bir değişiklik yapacağız&#8221; diye yola çıkılır.İşin sonunda geliştirici,başlangıçta tahmin ettiği noktadan çok uzaklardadır.</li>
<li><strong>Kırılganlık</strong>:Yapılan değişiklikler,değişiklikle hiç alakası olmayan yerlerde kırılmalara neden olur.</li>
<li><strong>Taşınamazlık</strong>:Sistemin alt parçaları,başka sistemlerde kullanılabilecek biçimde modüler değildir.</li>
<li><strong>Yoğunluk</strong>:Sistem üzerinde doğru şeyi yapmak,yanlışı yapmaktan daha zordur.(Sistem doğru kullanımı dikte etmiyor.)Dizaynı koruyarak değişlik yapmak zordur.</li>
<li><strong>Gereksiz Komplekslik</strong>:Sisteme direk olarak fayda sağlamayan ve muhtemelen ileride faydası olur diye yerleştirelen gereksiz yapılar.</li>
<li><strong>Gereksiz Tekrarlar</strong>:Soyutlanmış yapılar altında bir defa geçmesi gereken kod blokları tekrar tekrar kullanılmıştır.(Kes-Yapıştır Mühendisliği)</li>
<li><strong>Bulanıklık</strong>:Kodların okunması zordur.Sistemin tam olarak neyi yapmak istediği anlaşılamıyordur.</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yahyakoc.wordpress.com/426/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yahyakoc.wordpress.com/426/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yahyakoc.wordpress.com/426/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yahyakoc.wordpress.com/426/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yahyakoc.wordpress.com/426/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yahyakoc.wordpress.com/426/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yahyakoc.wordpress.com/426/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yahyakoc.wordpress.com/426/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yahyakoc.wordpress.com/426/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yahyakoc.wordpress.com/426/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yahyakoc.wordpress.com/426/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yahyakoc.wordpress.com/426/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yahyakoc.wordpress.com/426/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yahyakoc.wordpress.com/426/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yahyakoc.wordpress.com&amp;blog=4806712&amp;post=426&amp;subd=yahyakoc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yahyakoc.wordpress.com/2008/10/13/kotu-tasarimin-isaretleri/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1e163231ce244e2db31c690ca29d9dfa?s=96&#38;d=identicon" medium="image">
			<media:title type="html">yahyakoc</media:title>
		</media:content>
	</item>
		<item>
		<title>Command Pattern-2</title>
		<link>http://yahyakoc.wordpress.com/2008/10/12/command-pattern-2/</link>
		<comments>http://yahyakoc.wordpress.com/2008/10/12/command-pattern-2/#comments</comments>
		<pubDate>Sun, 12 Oct 2008 10:43:25 +0000</pubDate>
		<dc:creator>Yahya KOÇ</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Command Pattern]]></category>

		<guid isPermaLink="false">http://yahyakoc.wordpress.com/?p=418</guid>
		<description><![CDATA[Konuyla ilgili önceki yazılar: Command Pattern-1 &#8220;Pdf Okuyucu&#8221; örneğimizi genişleterek devam ediyoruz.PdfPager adında sayfaları ileri-geri çevirmemize yardım eden bir sınıfımız vardı.Şimdi de sayfalar üzerinde not almamızı sağlayacak bir PdfWriter sınıfımız olsun.Bu sınıf yardımı ile sayfalar üzerinde not alabilelim ya da aldığımız önceki notları silebilelim. Önce ReadCommand sınıfımızı hatırlayalım: Command arayüzünü hatırlayalım. Yeni komut sınıfımız olan [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yahyakoc.wordpress.com&amp;blog=4806712&amp;post=418&amp;subd=yahyakoc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Konuyla ilgili önceki yazılar:</p>
<ul>
<li><a href="http://yahyakoc.wordpress.com/2008/10/11/command-pattern/">Command Pattern-1</a></li>
</ul>
<p>&#8220;Pdf Okuyucu&#8221; örneğimizi genişleterek devam ediyoruz.PdfPager adında sayfaları ileri-geri çevirmemize yardım eden bir sınıfımız vardı.Şimdi de sayfalar üzerinde not almamızı sağlayacak bir PdfWriter sınıfımız olsun.Bu sınıf yardımı ile sayfalar üzerinde not alabilelim ya da aldığımız önceki notları silebilelim.<br />
<span id="more-418"></span><br />
Önce ReadCommand sınıfımızı hatırlayalım:</p>
<p><pre class="brush: csharp;">
public class ReadCommand:ICommand
{
    public PdfPager pdfPager { get; set; }
    public char IslemTipi { get; set; }
    public int Miktar { get; set; }   

    public void Execute()
    {
        pdfPager.Read(IslemTipi, Miktar);
    }
    public void Undo()
    {
        ChangeIslemTipi();
        Execute();
    }
    public void Redo()
    {
        ChangeIslemTipi();
        Execute();
    }
    public void ChangeIslemTipi()
    {
        IslemTipi = IslemTipi == '+' ? '-' : '+';
    }
}
</pre></p>
<p>Command arayüzünü hatırlayalım.</p>
<p><pre class="brush: csharp;">
public interface ICommand
{
    void Execute();
    void Undo();
    void Redo();
}
</pre></p>
<p>Yeni komut sınıfımız olan WriteCommand sınıfımızda da IslemTipi alanına(not ekle,not sil) ihtiyacımız olacak.Undo ve Redo metodları da önce işlem tipini değiştirip sonra execute metodunu çağıracak.Öyleyse ortak kod bloklarımız var.Bu durumda arayüzü soyut sınıfa çeviriyoruz.Yeni command soyut sınıfımızı inceleyelim:</p>
<p><pre class="brush: csharp;">
public abstract class Command
    {
        public abstract void Execute();
        public  void Undo()
        {
            ChangeIslemTipi();
            Execute();
        }
        public  void Redo()
        {
            ChangeIslemTipi();
            Execute();
        }
        public void ChangeIslemTipi()
        {
            IslemTipi = IslemTipi == '+' ? '-' : '+';
        }
        public abstract char IslemTipi { get; set; }
    }
</pre></p>
<p>Şimdi de ReadCommad ve WriteCommand sınıfılarımızın son haline bakalım.</p>
<p><pre class="brush: csharp;">
    public class ReadCommand:Command
    {
        public PdfPager pdfPager { get; set; }
        public override char IslemTipi { get; set; }
        public int Miktar { get; set; }
        public override void Execute()
        {
            pdfPager.Read(IslemTipi, Miktar);
        }
    }
</pre><br />
<pre class="brush: csharp;">
public class WriteCommand:Command
    {
       public override void Execute()
        {
            pdfWriter.PdfNotlariniYonet(IslemTipi,Not);
        }
        public override char IslemTipi { get; set; }
        public string Not { get; set; }
        public PdfWriter pdfWriter { get; set; }
    }
</pre></p>
<p>PdfPager sınıfında hangi sayfada olduğumuzu gösteren CurrentPageIndex adında bir alanımız vardı.Yeni sınıfımız PdfWriter için de hangi sayfaya not aldığımızı gösterecek böyle bir alana ihtiyaç var.Aslında CurrentPageIndex alanının bu iki sınıfa da ait olmadığını direk Book sınıfının bir özelliği olduğunu görüyoruz.Öyleyse bu özelliği, Book sınıfına taşıyoruz.</p>
<p>Book sınıfının son durumu şöyle:</p>
<p><pre class="brush: csharp;">
 public class Book
    {
        private readonly List&lt;Command&gt; commands = new List&lt;Command&gt;();
        public readonly PdfPager pager=new PdfPager();
        public readonly PdfWriter writer = new PdfWriter();
        private int CurrentCommandIndex { get; set; }
        public int CurrentPageIndex { get; set; }

        public Book()
        {
            CurrentCommandIndex = -1;
            writer.book = this;
            pager.book = this;
        }
        public void Oku(char IslemTipi, int Miktar)
        {
            ReadCommand readCommand = new ReadCommand { IslemTipi = IslemTipi, Miktar = Miktar, pdfPager = pager};
            commands.Add(readCommand);
            CurrentCommandIndex++;
            readCommand.Execute();
        }
        public void IslemleriGeriAl(int times)
        {
            for (int i = 0; i &lt; times; i++)
            {
                commands[CurrentCommandIndex].Undo();
                CurrentCommandIndex--;
            }
        }
        public void IslemleriIleriAl(int times)
        {
            for (int i = 0; i &lt; times; i++)
            {
                CurrentCommandIndex++;
                commands[CurrentCommandIndex].Redo();
            }
        }
        public void NotAl(char IslemTipi,string not)
        {
            WriteCommand writeCommand = new WriteCommand { IslemTipi = IslemTipi, Not = not, pdfWriter = writer };
            commands.Add(writeCommand);
            CurrentCommandIndex++;
            writeCommand.Execute();
        }
    }
</pre></p>
<p>PdfWriter sınıfımız:</p>
<p><pre class="brush: csharp;">
 public  class PdfWriter
    {
      public Book book { get; set; }
      readonly IDictionary&lt;int,string&gt; NotList=new Dictionary&lt;int, string&gt;();
      public void  PdfUzerineNotKaydet(string not)
      {
           NotList.Add(book.CurrentPageIndex,not);
      }
      public void PdfUzerineNotSil(string not)
      {
          FindAndDeleteNot(not);
      }
      private void FindAndDeleteNot(string not)
        {
           foreach(KeyValuePair&lt;int,string&gt; pair in NotList)
           {
               if(pair.Value==not)
               {
                   NotList.Remove(pair.Key);
                   break;
               }
           }
        }
        public void PdfNotlariniYonet(char IslemTipi, string not)
        {
            switch (IslemTipi)
            {
                case '+':
                    PdfUzerineNotKaydet(not);
                    break;
                case '-':
                    PdfUzerineNotSil(not);
                    break;
            }
        }
    }
</pre></p>
<p>ve nihayet Musteri sınıfı:</p>
<p><pre class="brush: csharp;">
 public class Musteri
    {
        public static void Oku()
        {
            Book book = new Book();
            book.CurrentPageIndex = 28;

            book.NotAl('+',&quot;deneme&quot;);
            book.Oku('+', 5);
            book.NotAl('+', &quot;deneme2&quot;);
            book.Oku('+', 7);
            book.NotAl('+', &quot;deneme3&quot;);
            book.Oku('+', 8);
            book.NotAl('-', &quot;deneme&quot;);
            book.IslemleriGeriAl(2);
            int sayfaNumarasi = book.CurrentPageIndex;
        }
    }
</pre></p>
<p>book.IslemleriGeriAl(2); satırına gelindiğinde sayfa numarası 48,book nesnesinin içinde yer alan writer nesnesi üzerinde tuttuğumuz NotList alanı: (33,deneme2),(40,deneme3) değerlerini gösterir.<br />
book.IslemleriGeriAl(2); satırını da çalıştırdığımzıda önce book.NotAl(&#8216;-&#8217;, &#8220;deneme&#8221;); komutumuz tersine çalışıp sildiğimiz &#8220;deneme&#8221; notunu geri yazacağız.Sonra da book.Oku(&#8216;+&#8217;, 8); komutunu tersine çalıştırıp 8 sayfa geri gideceğiz.Son durumda sayfa numarası 40,book nesnesinin içinde yer alan writer nesnesi üzerinde tuttuğumuz NotList alanı: (33,deneme2),(40,deneme3),(48,deneme) değerlerini gösterir.</p>
<p>Temel iş mantığında hatalar,mantıksızlar olabilir.Sonuçta bu bir örnek.Önemli olan command pattern desenin işleyiş mantığını anlamak.<br />
Tasarım desenleri ile alakalı bir kaç şey söylerek bu yazıyı tamamlamak istiyorum.Tasarım desenleri uygulanması zorunlu metodolojiler değildir.Çözüm getirdiği iddia edilen durumlar için uygunluğu daha önceden birçok kez tescil edilmiş,genelleşmiş yöntemlerdir.Her geliştiricinin kendine has durumları için kendine özel çözümleri,tasarım desenleri olabilir.Yazılımcının tasarım deseni ezberlemesi çok mantıksız ve gereksiz geliyor bana..Ben command Pattern&#8217;i ezbere bilmiyorum.Bu kodu yazdıktan sonra bile ezberimde değil<img class="alignnone size-full wp-image-80" title="icon_smile" src="http://yahyakoc.files.wordpress.com/2008/09/icon_smile.gif?w=15&#038;h=15" alt="" width="15" height="15" />.İhtiyacım olduğunda daha önceden yazılmış kodu inceleyerek kendi durumuma göre özelleştirip kullanıyorum.Bazı durumlarda &#8220;illa da tasarım deseni kullanarak yapacağım(overengineering)&#8221; diye basit bir kodu karmaşıklaştırmanın hiç bir anlamı yok.Yazılım geliştirme, deneme-yanılma yöntemine dayalı(heuristic) bir iştir.Yukarıda yazılan kod, yeni yeni deneme-yanılma yöntemleri kullanılarak daha iyi bir duruma getirilebilir.<br />
Sağlıcakla kalın.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yahyakoc.wordpress.com/418/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yahyakoc.wordpress.com/418/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yahyakoc.wordpress.com/418/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yahyakoc.wordpress.com/418/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yahyakoc.wordpress.com/418/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yahyakoc.wordpress.com/418/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yahyakoc.wordpress.com/418/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yahyakoc.wordpress.com/418/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yahyakoc.wordpress.com/418/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yahyakoc.wordpress.com/418/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yahyakoc.wordpress.com/418/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yahyakoc.wordpress.com/418/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yahyakoc.wordpress.com/418/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yahyakoc.wordpress.com/418/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yahyakoc.wordpress.com&amp;blog=4806712&amp;post=418&amp;subd=yahyakoc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yahyakoc.wordpress.com/2008/10/12/command-pattern-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1e163231ce244e2db31c690ca29d9dfa?s=96&#38;d=identicon" medium="image">
			<media:title type="html">yahyakoc</media:title>
		</media:content>

		<media:content url="http://yahyakoc.files.wordpress.com/2008/09/icon_smile.gif" medium="image">
			<media:title type="html">icon_smile</media:title>
		</media:content>
	</item>
		<item>
		<title>Bilişim Sözlüğü</title>
		<link>http://yahyakoc.wordpress.com/2008/10/11/bilisim-sozlugu/</link>
		<comments>http://yahyakoc.wordpress.com/2008/10/11/bilisim-sozlugu/#comments</comments>
		<pubDate>Sat, 11 Oct 2008 23:19:33 +0000</pubDate>
		<dc:creator>Yahya KOÇ</dc:creator>
				<category><![CDATA[Takvim yaprağı arkası]]></category>

		<guid isPermaLink="false">http://yahyakoc.wordpress.com/?p=408</guid>
		<description><![CDATA[Yaşadığımız en büyük sorunlardan biri de kavramların Türkçe karşılığını bulamamaktır.Yazılım dünyasına ait İngilizce kavramların,tanımların Türkçe karşılıkları için bazı çalışmalar yapılmakta.Bilişim Sözlüğü de bunlardan biri.Bu sözlükde genel anlamda bilişim kavramlarını ele alınmış.Yazılım sözlüğü gibi birşey lazım bize. Her ne kadar yazılım jargonunun tamamen Türkçeleştirilmesinin zorlama olacağına inansam da zaman içinde bu alternatif kelimelerin zihnimizde yer edeceğini [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yahyakoc.wordpress.com&amp;blog=4806712&amp;post=408&amp;subd=yahyakoc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Yaşadığımız en büyük sorunlardan biri de kavramların Türkçe karşılığını bulamamaktır.Yazılım dünyasına ait İngilizce kavramların,tanımların Türkçe karşılıkları için bazı çalışmalar yapılmakta.<a href="http://www.bilisimsozlugu.com/download/BilisimSozlugu.zip">Bilişim Sözlüğü</a> de bunlardan biri.Bu sözlükde genel anlamda bilişim kavramlarını ele alınmış.Yazılım sözlüğü gibi birşey lazım bize.</p>
<p><span id="more-408"></span><br />
Her ne kadar yazılım jargonunun tamamen Türkçeleştirilmesinin zorlama olacağına inansam da zaman içinde bu alternatif kelimelerin zihnimizde yer edeceğini düşünüyorum.Bazı komik ve saçma çeviriler de olmuyor değil..&#8221;Programı run ettim&#8221; yerine &#8220;programı koşturdum&#8221; cümlesi hep komik gelmiştir bana.At değilki bu program, koşturasın.İlla Türkçe kullanalım diyorsak &#8220;Programı çalıştırdım&#8221; diyebiliriz.<br />
Bir de &#8220;Kodun test case&#8217;lerini run ederken çok extraordinary bir situation gördüm&#8221; şeklinde konuşan concon tipler var.Bu konuya daha sonra değiniriz<img src="http://yahyakoc.files.wordpress.com/2008/09/icon_smile.gif?w=15&#038;h=15" alt="" title="icon_smile" width="15" height="15" class="alignnone size-full wp-image-80" />.<br />
Ben sözlükte geçen bazı temel kavramlar ve Türkçe karşılıklarını sıraladım:<br />
Attribute:Öznitelik<br />
Property:Özellik<br />
Field:Alan<br />
Class:Sınıf<br />
Default Value:Varsayılan değer<br />
Dependency:Bağımlılık<br />
Pattern:Desen<br />
Abstract:Soyut<br />
Object:Nesne<br />
Constructor:Yapıcı<br />
Encapsulation:Sarmalama<br />
Proxy:Vekil</p>
<p>Ama bazı kelimeler de varki İngilizcesi çok kısa ama Türkçesi çok uzun olmuş.Örneğin Caching:Önbelleğe koyma</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yahyakoc.wordpress.com/408/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yahyakoc.wordpress.com/408/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yahyakoc.wordpress.com/408/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yahyakoc.wordpress.com/408/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yahyakoc.wordpress.com/408/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yahyakoc.wordpress.com/408/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yahyakoc.wordpress.com/408/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yahyakoc.wordpress.com/408/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yahyakoc.wordpress.com/408/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yahyakoc.wordpress.com/408/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yahyakoc.wordpress.com/408/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yahyakoc.wordpress.com/408/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yahyakoc.wordpress.com/408/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yahyakoc.wordpress.com/408/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yahyakoc.wordpress.com&amp;blog=4806712&amp;post=408&amp;subd=yahyakoc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yahyakoc.wordpress.com/2008/10/11/bilisim-sozlugu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1e163231ce244e2db31c690ca29d9dfa?s=96&#38;d=identicon" medium="image">
			<media:title type="html">yahyakoc</media:title>
		</media:content>

		<media:content url="http://yahyakoc.files.wordpress.com/2008/09/icon_smile.gif" medium="image">
			<media:title type="html">icon_smile</media:title>
		</media:content>
	</item>
	</channel>
</rss>
