<?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>Kurumsal Java Yazılımı &#187; Tasarım Prensipleri</title>
	<atom:link href="http://www.kurumsaljava.com/category/design/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kurumsaljava.com</link>
	<description>Java Enterprise Architecture by Ozcan Acar</description>
	<lastBuildDate>Fri, 30 Dec 2011 09:28:45 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SOLID</title>
		<link>http://www.kurumsaljava.com/2011/12/30/solid/</link>
		<comments>http://www.kurumsaljava.com/2011/12/30/solid/#comments</comments>
		<pubDate>Fri, 30 Dec 2011 09:25:34 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Haberler]]></category>
		<category><![CDATA[Tasarım Prensipleri]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1608</guid>
		<description><![CDATA[<p>SOLID (<b>S</b>ingle responsibility, <b>O</b>pen-closed, <b>L</b>iskov substitution, <b>I</b>nterface segregation ve <b>D</b>ependency inversion) yazılım tasarım prensipleri için kullanılan bir kısaltmadır. Yazılım yaparken SOLID uygulandığı taktirde bakımı ve geliştirilmesi kolay yazılım sistemleri oluşturmak mümkündür. En verimli hali <a href="http://www.kurumsaljava.com/2008/11/26/test-gudumlu-yazilim-test-driven-development-tdd/" target=_blank>test güdümlü yazılım</a> ile uygulanır.<span id="more-1608"></span></p>
<table style="width: auto; font-size: 100%; table-layout: fixed; line-height:1.25; margin-left: auto; margin-right: auto;">
<tbody>
<tr>
<th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
<th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
<th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
</tr>
<tr>
<th></th>
<td></td>
<td></td>
</tr>
<tr>
<th valign=top>S</th>
<td valign=top><a href="http://www.kurumsaljava.com/2009/10/14/single-responsibility-principle-srp-tek-sorumluk-prensibi/" target=_blank>SRP</a></td>
<td valign=top>
<a title="Single responsibility principle" href="http://www.kurumsaljava.com/2009/10/14/single-responsibility-principle-srp-tek-sorumluk-prensibi/" target=_blank>Single Responsibility Principle</a><br />
Her yazılım biriminin (sınıf, nesne, metot) tek bir sorumluluğu olmalıdır.
</td>
</tr>
<tr>
<th></th>
<td></td>
<td></td>
</tr>
<tr>
<th valign=top>O</th>
<td valign=top><a href="http://www.kurumsaljava.com/2009/10/16/open-closed-principle-ocp-acik-kapali-tasarim-prensibi/" target=_blank>OCP</a></td>
<td valign=top>
<a href="http://www.kurumsaljava.com/2009/10/16/open-closed-principle-ocp-acik-kapali-tasarim-prensibi/" target=_blank>Open/Closed Principle</a><br />
Yazılım birimleri geliştirilmeye açık, değişikliğe kapalı olmalıdır.
</td>
</tr>
<tr>
<th></th>
<td></td>
<td></td>
</tr>
<tr>
<th valign=top>L</th>
<td valign=top><a  href="http://www.kurumsaljava.com/2009/10/29/liskov-substitution-principle-lsp-%e2%80%93-liskovun-yerine-gecme-prensibi/" target=_blank>LSP</a></td>
<td valign=top>
<a href="http://www.kurumsaljava.com/2009/10/29/liskov-substitution-principle-lsp-%e2%80%93-liskovun-yerine-gecme-prensibi/" target=_blank>Liskov&#8217;s Substitution Principle</a><br />
Alt sınıflardan oluşturulan nesneler üst sınıfların nesneleriyle yer değiştirdiklerinde aynı davranışı göstermek zorundadırlar.
</td>
</tr>
<tr>
<th></th>
<td></td>
<td></td>
</tr>
<tr>
<th valign=top>I</th>
<td valign=top><a href="http://www.kurumsaljava.com/2009/11/17/interface-segregation-principle-isp-%e2%80%93-arayuz-ayirma-prensibi/" target=_blank>ISP</a></td>
<td valign=top>
<a href="http://www.kurumsaljava.com/2009/11/17/interface-segregation-principle-isp-%e2%80%93-arayuz-ayirma-prensibi/" target=_blank>Interface Segregation Principle</a><br />
Herşeyi ihtiva eden interface sınıflar yerine belli bir işlemi yapan interface sınıflar oluşturulmalıdır.</td>
</tr>
<tr>
<th></th>
<td></td>
<td></td>
</tr>
<tr>
<th valign=top>D</th>
<td valign=top><a href="http://www.kurumsaljava.com/2009/10/29/dependency-inversion-principle-dip-bagimliliklarin-tersine-cevrilmesi-prensibi/" target=_blank>DIP</a></td>
<td valign=top>
<a href="http://www.kurumsaljava.com/2009/10/29/dependency-inversion-principle-dip-bagimliliklarin-tersine-cevrilmesi-prensibi/" target=_blank>Dependency Inversion Principle</a><br />
Bağımlılıklar soyut sınıflara doğru olmalıdır.
</td>
</tr>
<tr>
<th></th>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p>
Diğer tasarım prensipleri için &#8220;<a href="http://www.kurumsaljava.com/category/design/">Tasarım Prensipleri</a>&#8221; bölümüne bakınız.</p>
<p>
<p>
<p>
<i><br />
EOF (End Of Fun)<br />
Özcan Acar<br />
</i></p>
]]></description>
			<content:encoded><![CDATA[<p>SOLID (<b>S</b>ingle responsibility, <b>O</b>pen-closed, <b>L</b>iskov substitution, <b>I</b>nterface segregation ve <b>D</b>ependency inversion) yazılım tasarım prensipleri için kullanılan bir kısaltmadır. Yazılım yaparken SOLID uygulandığı taktirde bakımı ve geliştirilmesi kolay yazılım sistemleri oluşturmak mümkündür. En verimli hali <a href="http://www.kurumsaljava.com/2008/11/26/test-gudumlu-yazilim-test-driven-development-tdd/" target=_blank>test güdümlü yazılım</a> ile uygulanır.<span id="more-1608"></span></p>
<table style="width: auto; font-size: 100%; table-layout: fixed; line-height:1.25; margin-left: auto; margin-right: auto;">
<tbody>
<tr>
<th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
<th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
<th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
</tr>
<tr>
<th></th>
<td></td>
<td></td>
</tr>
<tr>
<th valign=top>S</th>
<td valign=top><a href="http://www.kurumsaljava.com/2009/10/14/single-responsibility-principle-srp-tek-sorumluk-prensibi/" target=_blank>SRP</a></td>
<td valign=top>
<a title="Single responsibility principle" href="http://www.kurumsaljava.com/2009/10/14/single-responsibility-principle-srp-tek-sorumluk-prensibi/" target=_blank>Single Responsibility Principle</a><br />
Her yazılım biriminin (sınıf, nesne, metot) tek bir sorumluluğu olmalıdır.
</td>
</tr>
<tr>
<th></th>
<td></td>
<td></td>
</tr>
<tr>
<th valign=top>O</th>
<td valign=top><a href="http://www.kurumsaljava.com/2009/10/16/open-closed-principle-ocp-acik-kapali-tasarim-prensibi/" target=_blank>OCP</a></td>
<td valign=top>
<a href="http://www.kurumsaljava.com/2009/10/16/open-closed-principle-ocp-acik-kapali-tasarim-prensibi/" target=_blank>Open/Closed Principle</a><br />
Yazılım birimleri geliştirilmeye açık, değişikliğe kapalı olmalıdır.
</td>
</tr>
<tr>
<th></th>
<td></td>
<td></td>
</tr>
<tr>
<th valign=top>L</th>
<td valign=top><a  href="http://www.kurumsaljava.com/2009/10/29/liskov-substitution-principle-lsp-%e2%80%93-liskovun-yerine-gecme-prensibi/" target=_blank>LSP</a></td>
<td valign=top>
<a href="http://www.kurumsaljava.com/2009/10/29/liskov-substitution-principle-lsp-%e2%80%93-liskovun-yerine-gecme-prensibi/" target=_blank>Liskov&#8217;s Substitution Principle</a><br />
Alt sınıflardan oluşturulan nesneler üst sınıfların nesneleriyle yer değiştirdiklerinde aynı davranışı göstermek zorundadırlar.
</td>
</tr>
<tr>
<th></th>
<td></td>
<td></td>
</tr>
<tr>
<th valign=top>I</th>
<td valign=top><a href="http://www.kurumsaljava.com/2009/11/17/interface-segregation-principle-isp-%e2%80%93-arayuz-ayirma-prensibi/" target=_blank>ISP</a></td>
<td valign=top>
<a href="http://www.kurumsaljava.com/2009/11/17/interface-segregation-principle-isp-%e2%80%93-arayuz-ayirma-prensibi/" target=_blank>Interface Segregation Principle</a><br />
Herşeyi ihtiva eden interface sınıflar yerine belli bir işlemi yapan interface sınıflar oluşturulmalıdır.</td>
</tr>
<tr>
<th></th>
<td></td>
<td></td>
</tr>
<tr>
<th valign=top>D</th>
<td valign=top><a href="http://www.kurumsaljava.com/2009/10/29/dependency-inversion-principle-dip-bagimliliklarin-tersine-cevrilmesi-prensibi/" target=_blank>DIP</a></td>
<td valign=top>
<a href="http://www.kurumsaljava.com/2009/10/29/dependency-inversion-principle-dip-bagimliliklarin-tersine-cevrilmesi-prensibi/" target=_blank>Dependency Inversion Principle</a><br />
Bağımlılıklar soyut sınıflara doğru olmalıdır.
</td>
</tr>
<tr>
<th></th>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p>
Diğer tasarım prensipleri için &#8220;<a href="http://www.kurumsaljava.com/category/design/">Tasarım Prensipleri</a>&#8221; bölümüne bakınız.</p>
<p>
<p>
<p>
<i><br />
EOF (End Of Fun)<br />
Özcan Acar<br />
</i></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2011%2F12%2F30%2Fsolid%2F&amp;linkname=SOLID"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2011/12/30/solid/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Stable Abstractions Principle (SAP) – Stabil Soyutluk Prensibi</title>
		<link>http://www.kurumsaljava.com/2011/10/26/stable-abstractions-principle-sap-%e2%80%93-stabil-soyutluk-prensibi/</link>
		<comments>http://www.kurumsaljava.com/2011/10/26/stable-abstractions-principle-sap-%e2%80%93-stabil-soyutluk-prensibi/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 20:05:03 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Tasarım Prensipleri]]></category>
		<category><![CDATA[sap]]></category>
		<category><![CDATA[Stable Abstractions Principle]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1581</guid>
		<description><![CDATA[<p><span lang="TR">Bu yazıyı PDF olarak edinebilirsiniz.</span></p>
]]></description>
			<content:encoded><![CDATA[<p><span lang="TR">Bu yazıyı PDF olarak edinebilirsiniz.</span></p>
Note: There is a file embedded within this post, please visit this post to download the file.
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2011%2F10%2F26%2Fstable-abstractions-principle-sap-%25e2%2580%2593-stabil-soyutluk-prensibi%2F&amp;linkname=Stable%20Abstractions%20Principle%20%28SAP%29%20%E2%80%93%20Stabil%20Soyutluk%20Prensibi"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2011/10/26/stable-abstractions-principle-sap-%e2%80%93-stabil-soyutluk-prensibi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Stable Dependencies Principle (SDP) – Stabil Bağımlılıklar Prensibi</title>
		<link>http://www.kurumsaljava.com/2011/10/26/stable-dependencies-principle-sdp-%e2%80%93-stabil-bagimliliklar-prensibi/</link>
		<comments>http://www.kurumsaljava.com/2011/10/26/stable-dependencies-principle-sdp-%e2%80%93-stabil-bagimliliklar-prensibi/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 20:00:11 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Tasarım Prensipleri]]></category>
		<category><![CDATA[sdp]]></category>
		<category><![CDATA[Stable Dependencies Principle]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1578</guid>
		<description><![CDATA[<p><span lang="TR">Bu yazıyı PDF olarak edinebilirsiniz.</span></p>
]]></description>
			<content:encoded><![CDATA[<p><span lang="TR">Bu yazıyı PDF olarak edinebilirsiniz.</span></p>
Note: There is a file embedded within this post, please visit this post to download the file.
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2011%2F10%2F26%2Fstable-dependencies-principle-sdp-%25e2%2580%2593-stabil-bagimliliklar-prensibi%2F&amp;linkname=Stable%20Dependencies%20Principle%20%28SDP%29%20%E2%80%93%20Stabil%20Ba%C4%9F%C4%B1ml%C4%B1l%C4%B1klar%20Prensibi"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2011/10/26/stable-dependencies-principle-sdp-%e2%80%93-stabil-bagimliliklar-prensibi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Acyclic Dependency Principle (ADP) – Çevrimsiz Bağımlılık Prensibi</title>
		<link>http://www.kurumsaljava.com/2011/10/26/acyclic-dependency-principle-adp-%e2%80%93-cevrimsiz-bagimlilik-prensibi/</link>
		<comments>http://www.kurumsaljava.com/2011/10/26/acyclic-dependency-principle-adp-%e2%80%93-cevrimsiz-bagimlilik-prensibi/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 19:52:00 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Tasarım Prensipleri]]></category>
		<category><![CDATA[Acyclic Dependency Principle]]></category>
		<category><![CDATA[adp]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1576</guid>
		<description><![CDATA[<p><span lang="TR">Bu yazıyı PDF olarak edinebilirsiniz.</span></p>
]]></description>
			<content:encoded><![CDATA[<p><span lang="TR">Bu yazıyı PDF olarak edinebilirsiniz.</span></p>
Note: There is a file embedded within this post, please visit this post to download the file.
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2011%2F10%2F26%2Facyclic-dependency-principle-adp-%25e2%2580%2593-cevrimsiz-bagimlilik-prensibi%2F&amp;linkname=Acyclic%20Dependency%20Principle%20%28ADP%29%20%E2%80%93%20%C3%87evrimsiz%20Ba%C4%9F%C4%B1ml%C4%B1l%C4%B1k%20Prensibi"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2011/10/26/acyclic-dependency-principle-adp-%e2%80%93-cevrimsiz-bagimlilik-prensibi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Common Closure Principle (CCP) – Ortak Kapama Prensibi</title>
		<link>http://www.kurumsaljava.com/2011/10/26/common-closure-principle-ccp-%e2%80%93-ortak-kapama-prensibi/</link>
		<comments>http://www.kurumsaljava.com/2011/10/26/common-closure-principle-ccp-%e2%80%93-ortak-kapama-prensibi/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 19:38:03 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Tasarım Prensipleri]]></category>
		<category><![CDATA[ccp]]></category>
		<category><![CDATA[common closure principle]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1572</guid>
		<description><![CDATA[<p>Yazılım sistemi müşteri gereksinimleri doğrultusunda zaman içinde değişikliğe uğrar. Meydana gelen değişiklerin sistemde bulunan birçok paketi etkilemesi, sistemin bakılabilirliğini negatif etkiler. CCP’ye göre yapılan değişikliklerin sistemin büyük bir bölümünü etkilemesini önlemek için, aynı sebepten dolayı değişikliğe uğrayabilecek sınıfların aynı paket içinde yer alması gerekir. CCP daha önce incelediğimiz, sınıflar için uygulanan Single Responsibility (SRP) prensibinin paketler için uygulanan halidir. Her paketin değişmek için sadece bir sebebi olmalıdır. CCP uygulandığı taktirde sistemin bakılabilirliği artırılır ve test ve yeni sürüm için harcanan zaman ve emek azaltılır.</p>
<p><span id="more-1572"></span></p>
<p><span lang="TR">Bu yazıyı PDF olarak edinebilirsiniz.</span></p>
]]></description>
			<content:encoded><![CDATA[<p>Yazılım sistemi müşteri gereksinimleri doğrultusunda zaman içinde değişikliğe uğrar. Meydana gelen değişiklerin sistemde bulunan birçok paketi etkilemesi, sistemin bakılabilirliğini negatif etkiler. CCP’ye göre yapılan değişikliklerin sistemin büyük bir bölümünü etkilemesini önlemek için, aynı sebepten dolayı değişikliğe uğrayabilecek sınıfların aynı paket içinde yer alması gerekir. CCP daha önce incelediğimiz, sınıflar için uygulanan Single Responsibility (SRP) prensibinin paketler için uygulanan halidir. Her paketin değişmek için sadece bir sebebi olmalıdır. CCP uygulandığı taktirde sistemin bakılabilirliği artırılır ve test ve yeni sürüm için harcanan zaman ve emek azaltılır.</p>
<p><span id="more-1572"></span></p>
<p><span lang="TR">Bu yazıyı PDF olarak edinebilirsiniz.</span></p>
Note: There is a file embedded within this post, please visit this post to download the file.
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2011%2F10%2F26%2Fcommon-closure-principle-ccp-%25e2%2580%2593-ortak-kapama-prensibi%2F&amp;linkname=Common%20Closure%20Principle%20%28CCP%29%20%E2%80%93%20Ortak%20Kapama%20Prensibi"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2011/10/26/common-closure-principle-ccp-%e2%80%93-ortak-kapama-prensibi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Common Reuse Principle (CRP) – Ortak Yeniden Kullanım Prensibi</title>
		<link>http://www.kurumsaljava.com/2010/07/24/common-reuse-principle-crp-%e2%80%93-ortak-yeniden-kullanim-prensibi/</link>
		<comments>http://www.kurumsaljava.com/2010/07/24/common-reuse-principle-crp-%e2%80%93-ortak-yeniden-kullanim-prensibi/#comments</comments>
		<pubDate>Sat, 24 Jul 2010 19:41:52 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Tasarım Prensipleri]]></category>
		<category><![CDATA[Common Reuse Principle]]></category>
		<category><![CDATA[CRP]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1214</guid>
		<description><![CDATA[<p>Bu prensip hangi sınıfların aynı paket içinde yer alması gerektiği konusuna açıklık getirir. CRP’ye göre beraberce tekrar kullanılabilir yapıda olan sınıfların aynı paket içinde olması gerekir.</p>
<p><span id="more-1214"></span></p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2010/07/crp_uml.jpg"><img src="http://www.kurumsaljava.com/wp-content/uploads/2010/07/crp_uml.jpg" alt="" title="crp_uml" width="550" height="290" class="aligncenter size-full wp-image-1215" /></a></p>
<p>Bu yazıyı PDF dosyası olarak aşağıdaki linkten edinebilirsiniz.</p>
<p><i><br />
EOF (End of Fun)<br />
Özcan Acar<br />
</i></p>
]]></description>
			<content:encoded><![CDATA[<p>Bu prensip hangi sınıfların aynı paket içinde yer alması gerektiği konusuna açıklık getirir. CRP’ye göre beraberce tekrar kullanılabilir yapıda olan sınıfların aynı paket içinde olması gerekir.</p>
<p><span id="more-1214"></span></p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2010/07/crp_uml.jpg"><img src="http://www.kurumsaljava.com/wp-content/uploads/2010/07/crp_uml.jpg" alt="" title="crp_uml" width="550" height="290" class="aligncenter size-full wp-image-1215" /></a></p>
<p>Bu yazıyı PDF dosyası olarak aşağıdaki linkten edinebilirsiniz.<br />
Note: There is a file embedded within this post, please visit this post to download the file.</p>
<p><i><br />
EOF (End of Fun)<br />
Özcan Acar<br />
</i></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2010%2F07%2F24%2Fcommon-reuse-principle-crp-%25e2%2580%2593-ortak-yeniden-kullanim-prensibi%2F&amp;linkname=Common%20Reuse%20Principle%20%28CRP%29%20%E2%80%93%20Ortak%20Yeniden%20Kullan%C4%B1m%20Prensibi"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2010/07/24/common-reuse-principle-crp-%e2%80%93-ortak-yeniden-kullanim-prensibi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reuse-Release Equivalence  Principle (REP) &#8211; Tekrar Kullanım ve Sürüm Eşitliği</title>
		<link>http://www.kurumsaljava.com/2009/12/09/reuse-release-equivalence-principle-rep-tekrar-kullanim-ve-surum-esitligi/</link>
		<comments>http://www.kurumsaljava.com/2009/12/09/reuse-release-equivalence-principle-rep-tekrar-kullanim-ve-surum-esitligi/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 09:03:49 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Tasarım Prensipleri]]></category>
		<category><![CDATA[REP]]></category>
		<category><![CDATA[Reuse-Release Equivalence  Principle]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=985</guid>
		<description><![CDATA[<p>Program modülleri paketler (packages) kullanılarak organize edilir. Paketler arasında sınıfların birbirlerini kullanmalarıyla bağımlılıklar oluşur. Bunun bir örneği resim 1 de yer almaktadır. Eğer paket B bünyesindeki bir sınıf paket A bünyesinde bulunan bir sınıf tarafından kullanılıyorsa, bu  paket A’nin paket B’ye bağımlılığı olduğu anlamına gelir. Bu tür bağımlılıkların oluşması doğaldır. Amaç bu bağımlılıkları ortadan kaldırmak değil, kontrol edilebilir hale getirmek olmalıdır. Bu amaçla paket bazında uygulanabilecek tasarım prensipleri oluşturulmuştur. Bunlardan birisi Reuse-Release Equivalence (tekrar kullanım ve sürüm eşitliği) prensibidir.</p>
<p><span id="more-985"></span></p>
<p><center><img src=http://image.kurumsaljava.com/storage/image.jsp?ct=image/jpg&#038;d=prod&#038;k=kurumsaljava_350></center></p>
<p>Bir proje bünyesinde değişik modüllerden oluşan bir yazılım sistemini implemente etmek için çalıştığımızı düşünelim. Her modülden ayrı bir ekip sorumlu olsun. Üzerinde çalıştığımız modülün implementasyonunu yapabilmek için büyük bir ihtimalle diğer modülleri kullanmamız gerekecektir. Örneğin bilgibankası üzerinde işlem yapmamızı sağlayacak bir modülü başka bir ekip implemente etmiş olabilir. O ekip bilgibankası üzerindeki işlemler için gerekli tüm sınıfları dao isimli bir paket içine yerleştirmiş olabilir. Bizim bu paket içindeki sınıfları tekrar kullanabilmemiz (reuse) için belirli şartların yerine gelmesi gerekmektedir. Bunlar:</p>
<ul>
<li>Bilgibankası ekibi, bilgibankası üzerinde işlem yapmak için kullanılan tüm sınıfları, bu sınıflar birbirleriyle ilişkili olduğu için aynı paket içine koymalıdır. Bu tekrar kullanımı kolaylaştırır.</li>
<li>Tekrar kullanımı desteklemek için oluşturulan paketin bir versiyon numarasıyla yeni sürümünün oluşturulması gerekmektedir. </li>
<li>Paket kullanıcıları paket üzerinde yapılan değişikliklerden haberdar edilmelidir. Onlar için kullanabilecekleri yeni bir paket sürümünün oluşturulması yanı sıra, mevcut kodun kırılmasını önlemek için paketin eski versiyonlarının da paralel kullanıma açık tutulması gerekir. Sadece bu durumda paket kullanıcıları paket üzerinde yapılan değişiklerinden etkilenmeden eski versiyonlarla çalışmaya devam edebilirler.  Zaman içinde yeni paket versiyonuna geçerek, son değişiklikleri entegre ederler.</li>
</ul>
<p>Tekrar kullanımı kolaylaştırmak için paket sürümlerinin oluşturulması şarttır. REP’e göre tekrar kullanılabilirlik (reuse) sürüm (release) ile direk orantılıdır. Sürüm ne ihtiva ediyorsa, o tekrar kullanılabilir.</p>
<p>Bu yazıyı PDF dosyası olarak aşağıdaki linkten edinebilirsiniz.</p>
<p><i><br />
EOF (End of Fun)<br />
Özcan Acar<br />
</i></p>
]]></description>
			<content:encoded><![CDATA[<p>Program modülleri paketler (packages) kullanılarak organize edilir. Paketler arasında sınıfların birbirlerini kullanmalarıyla bağımlılıklar oluşur. Bunun bir örneği resim 1 de yer almaktadır. Eğer paket B bünyesindeki bir sınıf paket A bünyesinde bulunan bir sınıf tarafından kullanılıyorsa, bu  paket A’nin paket B’ye bağımlılığı olduğu anlamına gelir. Bu tür bağımlılıkların oluşması doğaldır. Amaç bu bağımlılıkları ortadan kaldırmak değil, kontrol edilebilir hale getirmek olmalıdır. Bu amaçla paket bazında uygulanabilecek tasarım prensipleri oluşturulmuştur. Bunlardan birisi Reuse-Release Equivalence (tekrar kullanım ve sürüm eşitliği) prensibidir.</p>
<p><span id="more-985"></span></p>
<p><center><img src=http://image.kurumsaljava.com/storage/image.jsp?ct=image/jpg&#038;d=prod&#038;k=kurumsaljava_350></center></p>
<p>Bir proje bünyesinde değişik modüllerden oluşan bir yazılım sistemini implemente etmek için çalıştığımızı düşünelim. Her modülden ayrı bir ekip sorumlu olsun. Üzerinde çalıştığımız modülün implementasyonunu yapabilmek için büyük bir ihtimalle diğer modülleri kullanmamız gerekecektir. Örneğin bilgibankası üzerinde işlem yapmamızı sağlayacak bir modülü başka bir ekip implemente etmiş olabilir. O ekip bilgibankası üzerindeki işlemler için gerekli tüm sınıfları dao isimli bir paket içine yerleştirmiş olabilir. Bizim bu paket içindeki sınıfları tekrar kullanabilmemiz (reuse) için belirli şartların yerine gelmesi gerekmektedir. Bunlar:</p>
<ul>
<li>Bilgibankası ekibi, bilgibankası üzerinde işlem yapmak için kullanılan tüm sınıfları, bu sınıflar birbirleriyle ilişkili olduğu için aynı paket içine koymalıdır. Bu tekrar kullanımı kolaylaştırır.</li>
<li>Tekrar kullanımı desteklemek için oluşturulan paketin bir versiyon numarasıyla yeni sürümünün oluşturulması gerekmektedir. </li>
<li>Paket kullanıcıları paket üzerinde yapılan değişikliklerden haberdar edilmelidir. Onlar için kullanabilecekleri yeni bir paket sürümünün oluşturulması yanı sıra, mevcut kodun kırılmasını önlemek için paketin eski versiyonlarının da paralel kullanıma açık tutulması gerekir. Sadece bu durumda paket kullanıcıları paket üzerinde yapılan değişiklerinden etkilenmeden eski versiyonlarla çalışmaya devam edebilirler.  Zaman içinde yeni paket versiyonuna geçerek, son değişiklikleri entegre ederler.</li>
</ul>
<p>Tekrar kullanımı kolaylaştırmak için paket sürümlerinin oluşturulması şarttır. REP’e göre tekrar kullanılabilirlik (reuse) sürüm (release) ile direk orantılıdır. Sürüm ne ihtiva ediyorsa, o tekrar kullanılabilir.</p>
<p>Bu yazıyı PDF dosyası olarak aşağıdaki linkten edinebilirsiniz.<br />
Note: There is a file embedded within this post, please visit this post to download the file.</p>
<p><i><br />
EOF (End of Fun)<br />
Özcan Acar<br />
</i></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2009%2F12%2F09%2Freuse-release-equivalence-principle-rep-tekrar-kullanim-ve-surum-esitligi%2F&amp;linkname=Reuse-Release%20Equivalence%20%20Principle%20%28REP%29%20%26%238211%3B%20Tekrar%20Kullan%C4%B1m%20ve%20S%C3%BCr%C3%BCm%20E%C5%9Fitli%C4%9Fi"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2009/12/09/reuse-release-equivalence-principle-rep-tekrar-kullanim-ve-surum-esitligi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Interface Segregation Principle (ISP) – Arayüz Ayırma Prensibi</title>
		<link>http://www.kurumsaljava.com/2009/11/17/interface-segregation-principle-isp-%e2%80%93-arayuz-ayirma-prensibi/</link>
		<comments>http://www.kurumsaljava.com/2009/11/17/interface-segregation-principle-isp-%e2%80%93-arayuz-ayirma-prensibi/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 09:08:21 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Tasarım Prensipleri]]></category>
		<category><![CDATA[Interface Segregation Principle]]></category>
		<category><![CDATA[ISP]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=928</guid>
		<description><![CDATA[<p>Birbiriyle ilişkili olmayan birçok metodu ihtiva eden büyük bir interface sınıf yerine, birbiriyle ilişkili (cohesive) metotların yer aldığı birden fazla interface sınıfı daha makbuldür.<br />
ISP uygulanmadığı taktirde, birden fazla sorumluluğu olan interface sınıflar oluşur. Zaman içinde yüklenen yeni sorumluluklarla bu interface sınıflar daha da büyür ve kontrol edilemez bir hale gelebilir. Bunun bir örneğini resim 1 de görmekteyiz.</p>
<p><span id="more-928"></span></p>
<p><center><img src=http://image.kurumsaljava.com/storage/image.jsp?ct=image/jpg&#038;d=prod&#038;k=kurumsaljava_332></center></p>
<p>Resim 1 de yer alan Connector interface sınıfı bünyesinde JMS  (Java Message Service) için gerekli iki metot bulunmaktadır: commit ve rollback. Bu metodlarin RMIConnector implementasyonunda implemente edilmeleri anlamsız olur. Büyük bir ihtimalle RMIConnector sınıfında bu metotların implementasyonu kod 1 de yer aldığı şekilde olacaktır. </p>
<pre name="code" class="java">

package shop;

public class RMIConnector implements Connector
{

	public void commit()
	{
		throw new RuntimeException(&quot;not implemented&quot;);
	}

	public void rollback()
	{
		throw new RuntimeException(&quot;not implemented&quot;);
	}
}
</pre>
<p>Kod 1 de yer alan yapı <a target=_blank href="http://www.kurumsaljava.com/2009/10/29/liskov-substitution-principle-lsp-%e2%80%93-liskovun-yerine-gecme-prensibi">LSP</a>  ile uyumlu değildir. Connector sınıfını kullananlar RuntimeException oluşabileceğini göz önünde bulundurmak zorunda bırakılmaktadırlar.</p>
<p>ISP uygulandığı taktirde resim 1 de yer alan Connector interface sınıfını yok ederek, yerine sorumluluk alanları belli iki yeni interface sınıf oluşturabiliriz. Resim 2 de bu çözüm yer almaktadır.</p>
<p><center><img src=http://image.kurumsaljava.com/storage/image.jsp?ct=image/jpg&#038;d=prod&#038;k=kurumsaljava_333></center></p>
<p>Programcı olarak bir interface sınıfa birden fazla sorumluluk yüklememek için, interface sınıfın sistemdeki görevini iyi anlamamız gerekmektedir. Bu sadece bir sorumluluk alanı olan bir interface sınıf oluşturmamızı kolaylaştıracaktır.</p>
<p>Bu yazıyı PDF dosyası olarak aşağıdaki linkten edinebilirsiniz.</p>
<p><i><br />
EOF (End of Fun)<br />
Özcan Acar<br />
</i></p>
]]></description>
			<content:encoded><![CDATA[<p>Birbiriyle ilişkili olmayan birçok metodu ihtiva eden büyük bir interface sınıf yerine, birbiriyle ilişkili (cohesive) metotların yer aldığı birden fazla interface sınıfı daha makbuldür.<br />
ISP uygulanmadığı taktirde, birden fazla sorumluluğu olan interface sınıflar oluşur. Zaman içinde yüklenen yeni sorumluluklarla bu interface sınıflar daha da büyür ve kontrol edilemez bir hale gelebilir. Bunun bir örneğini resim 1 de görmekteyiz.</p>
<p><span id="more-928"></span></p>
<p><center><img src=http://image.kurumsaljava.com/storage/image.jsp?ct=image/jpg&#038;d=prod&#038;k=kurumsaljava_332></center></p>
<p>Resim 1 de yer alan Connector interface sınıfı bünyesinde JMS  (Java Message Service) için gerekli iki metot bulunmaktadır: commit ve rollback. Bu metodlarin RMIConnector implementasyonunda implemente edilmeleri anlamsız olur. Büyük bir ihtimalle RMIConnector sınıfında bu metotların implementasyonu kod 1 de yer aldığı şekilde olacaktır. </p>
<pre name="code" class="java">

package shop;

public class RMIConnector implements Connector
{

	public void commit()
	{
		throw new RuntimeException(&quot;not implemented&quot;);
	}

	public void rollback()
	{
		throw new RuntimeException(&quot;not implemented&quot;);
	}
}
</pre>
<p>Kod 1 de yer alan yapı <a target=_blank href="http://www.kurumsaljava.com/2009/10/29/liskov-substitution-principle-lsp-%e2%80%93-liskovun-yerine-gecme-prensibi">LSP</a>  ile uyumlu değildir. Connector sınıfını kullananlar RuntimeException oluşabileceğini göz önünde bulundurmak zorunda bırakılmaktadırlar.</p>
<p>ISP uygulandığı taktirde resim 1 de yer alan Connector interface sınıfını yok ederek, yerine sorumluluk alanları belli iki yeni interface sınıf oluşturabiliriz. Resim 2 de bu çözüm yer almaktadır.</p>
<p><center><img src=http://image.kurumsaljava.com/storage/image.jsp?ct=image/jpg&#038;d=prod&#038;k=kurumsaljava_333></center></p>
<p>Programcı olarak bir interface sınıfa birden fazla sorumluluk yüklememek için, interface sınıfın sistemdeki görevini iyi anlamamız gerekmektedir. Bu sadece bir sorumluluk alanı olan bir interface sınıf oluşturmamızı kolaylaştıracaktır.</p>
<p>Bu yazıyı PDF dosyası olarak aşağıdaki linkten edinebilirsiniz.<br />
Note: There is a file embedded within this post, please visit this post to download the file.</p>
<p><i><br />
EOF (End of Fun)<br />
Özcan Acar<br />
</i></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2009%2F11%2F17%2Finterface-segregation-principle-isp-%25e2%2580%2593-arayuz-ayirma-prensibi%2F&amp;linkname=Interface%20Segregation%20Principle%20%28ISP%29%20%E2%80%93%20Aray%C3%BCz%20Ay%C4%B1rma%20Prensibi"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2009/11/17/interface-segregation-principle-isp-%e2%80%93-arayuz-ayirma-prensibi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dependency Inversion Principle (DIP) &#8211; Bağımlılıkların Tersine Çevrilmesi Prensibi</title>
		<link>http://www.kurumsaljava.com/2009/10/29/dependency-inversion-principle-dip-bagimliliklarin-tersine-cevrilmesi-prensibi/</link>
		<comments>http://www.kurumsaljava.com/2009/10/29/dependency-inversion-principle-dip-bagimliliklarin-tersine-cevrilmesi-prensibi/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 09:23:34 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Tasarım Prensipleri]]></category>
		<category><![CDATA[Dependency Inversion Principle]]></category>
		<category><![CDATA[DIP]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=880</guid>
		<description><![CDATA[<p>Bu prensibe göre somut sınıflara olan bağımlılıklar soyut sınıflar ve interface sınıflar kullanılarak ortadan kaldırılmalıdır, çünkü somut sınıflar sık sık değişikliğe uğrarlar ve bu sınıflara bağımlı olan sınıflarında yapısal değişikliğe uğramalarına sebep olurlar.<span id="more-880"></span></p>
<p><center><img src=http://image.kurumsaljava.com/storage/image.jsp?ct=image/jpg&#038;d=prod&#038;k=kurumsaljava_320></center></p>
<p>Resim 1 de görülen yapı DIP prensibine ters düşmektedir, çünkü RemoteControl sınıfı somut bir sınıf olan TV sınıfına bağımlıdır. TV bünyesinde meydana gelen her değişiklik doğrudan RemoteControl sınıfını etkileyecektir. Ayrıca RemoteControl sınıfını TV sınıfı olmadan başka bir yerde kullanılması mümkün değildir. </p>
<p><center><img src=http://image.kurumsaljava.com/storage/image.jsp?ct=image/jpg&#038;d=prod&#038;k=kurumsaljava_321></center></p>
<p>Bu yazıyı PDF dosyası olarak aşağıdaki linkten edinebilirsiniz.</p>
<p><i><br />
EOF (End of Fun)<br />
Özcan Acar<br />
</i></p>
]]></description>
			<content:encoded><![CDATA[<p>Bu prensibe göre somut sınıflara olan bağımlılıklar soyut sınıflar ve interface sınıflar kullanılarak ortadan kaldırılmalıdır, çünkü somut sınıflar sık sık değişikliğe uğrarlar ve bu sınıflara bağımlı olan sınıflarında yapısal değişikliğe uğramalarına sebep olurlar.<span id="more-880"></span></p>
<p><center><img src=http://image.kurumsaljava.com/storage/image.jsp?ct=image/jpg&#038;d=prod&#038;k=kurumsaljava_320></center></p>
<p>Resim 1 de görülen yapı DIP prensibine ters düşmektedir, çünkü RemoteControl sınıfı somut bir sınıf olan TV sınıfına bağımlıdır. TV bünyesinde meydana gelen her değişiklik doğrudan RemoteControl sınıfını etkileyecektir. Ayrıca RemoteControl sınıfını TV sınıfı olmadan başka bir yerde kullanılması mümkün değildir. </p>
<p><center><img src=http://image.kurumsaljava.com/storage/image.jsp?ct=image/jpg&#038;d=prod&#038;k=kurumsaljava_321></center></p>
<p>Bu yazıyı PDF dosyası olarak aşağıdaki linkten edinebilirsiniz.<br />
Note: There is a file embedded within this post, please visit this post to download the file.</p>
<p><i><br />
EOF (End of Fun)<br />
Özcan Acar<br />
</i></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2009%2F10%2F29%2Fdependency-inversion-principle-dip-bagimliliklarin-tersine-cevrilmesi-prensibi%2F&amp;linkname=Dependency%20Inversion%20Principle%20%28DIP%29%20%26%238211%3B%20Ba%C4%9F%C4%B1ml%C4%B1l%C4%B1klar%C4%B1n%20Tersine%20%C3%87evrilmesi%20Prensibi"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2009/10/29/dependency-inversion-principle-dip-bagimliliklarin-tersine-cevrilmesi-prensibi/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Liskov Substitution Principle (LSP) – Liskov&#8217;un Yerine Geçme Prensibi</title>
		<link>http://www.kurumsaljava.com/2009/10/29/liskov-substitution-principle-lsp-%e2%80%93-liskovun-yerine-gecme-prensibi/</link>
		<comments>http://www.kurumsaljava.com/2009/10/29/liskov-substitution-principle-lsp-%e2%80%93-liskovun-yerine-gecme-prensibi/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 09:05:23 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Tasarım Prensipleri]]></category>
		<category><![CDATA[Liskov]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=878</guid>
		<description><![CDATA[<p>Barbara Liskov   tarafından geliştirilen bu prensip kısaca şöyle açıklanabilir:</p>
<p><b>Alt sınıflardan oluşturulan nesneler üst sınıfların nesneleriyle yer değiştirdiklerinde aynı davranışı göstermek zorundadırlar.</b></p>
<p><span id="more-878"></span></p>
<p>LSP’ye göre herhangi bir sınıf kullanıcısı, bu sınıfın alt sınıfları kullanmak için özel bir efor sarf etmek zorunda kalmamalıdır. Onun bakış açısından üst sınıf ve alt sınıf arasında farklılık yoktur. Üst sınıf nesnelerinin kullanıldığı metotlar içinde alt sınıftan olan nesneler aynı davranışı sergilemek zorundadır, çünkü oluşturulan metotlar üst sınıf davranışları örnek alınarak programlanmıştır. Alt sınıflarda meydana gelen davranış değişiklikleri, bu metotların hatalı çalışmasına sebep verebilir. Özellikte bu metotlarda instanceof gibi nesnelerin tipleri arasında kıyaslama yapılmak zorunda kalındığı zaman, LSP prensibi çiğnenmiş olur ki, bu alt sınıfların varlığından haberdar olunduğu anlamına gelir. Kullanıcı sınıflar ideal durumda alt sınıfların varlığından haberdar bile olmamalıdır.</p>
<p><center><img src=http://image.kurumsaljava.com/storage/image.jsp?ct=image/jpg&#038;d=prod&#038;k=kurumsaljava_317></center></p>
<p>Resim 1 de yer alan Client sınıfındaki print() metodunun nasıl LSP prensibine ters düştüğünü yakından inceleyelim. Bu metot A sınıfından olan nesneler üzerinde işlem yapmaktadır. A sınıfı B ve C sınıfları tarafından genişletilmiştir, yani A sınıfından olan bir parametre nesnesi aynı zamanda B ve C sınıfında da olabilir.</p>
<pre name="code" class="java">

package shop;

public class Client
{
	public void print(A a)
	{
		if(a instanceof B)
		{
			((B)a).printB();
		}
		else if(a instanceof C)
		{
			((C)a).printC();
		}
	}

	public static void main(String[] args)
	{
		Client client = new Client();
		B b = new B();
		C c = new C();

		client.print(b);
		client.print(c);
	}
}
</pre>
<p>Kod 1</p>
<p>Kod 1 de yer alan print() metodu LSP ile uyumlu değildir. Bu metodun A sınıfına bağımlılığı vardır ve bu sınıfın nesneleri üzerinde işlem yapacak şekilde implemente edilmiş olması gerekir. Lakin print()  metodu instanceof komutuyla parametre olarak verilen nesnenin hangi tipte olduğunu tespit etmeye çalışmakta ve tipe bağımlı olarak nesne üzerinde işlemi gerçekleştirmektedir. Bu durum hem OCP’ye (Open Closed Principle) hemde LSP’ye ters düşmektedir. OCP uyumlu değildir, çünkü print() metodu A’nin her yeni alt sınıfı  için değişikliğe uğramak zorundadır. LSP’ye uyumlu değildir, çünkü B ya da C sınıfından olan nesneler A sınıfından olan bir nesnenin yerini alamadığı için print() metodu instanceof ile nesnenin tipini tespit etmek zorunda bırakılmaktadır. Buradan genel bir sonuç çıkartabiliriz: LSP’ye ters düşen bir implementasyon aynı zamanda OCP’ye de ters düşer.</p>
<p><center><img src=http://image.kurumsaljava.com/storage/image.jsp?ct=image/jpg&#038;d=prod&#038;k=kurumsaljava_318></center></p>
<p>LSP’nin nasıl uygulanabileceğini diğer bir örnekte görelim. Resim 2 de bir firma çalışanları Personel sınıfını genişleten MaasliPersonel ve ParttimePersonel sınıfları ile temsil edilmektedirler. Personel sınıfı soyuttur (abstract). Çalışanların maaşlarının ödenebilmesi  için Personel sınıfında bulunan soyut odeme() metodunun alt sınıflarca implemente edilmesi gerekmektedir. Firmaya yeni stajyerler alındığı için, modelin resim 3 deki gibi adapte edildiğini farz edelim.</p>
<p><center><img src=http://image.kurumsaljava.com/storage/image.jsp?ct=image/jpg&#038;d=prod&#038;k=kurumsaljava_319></center></p>
<p>Staj yapan elemanlar için maaş ödenmez, bu yüzden odeme() metodu StajyerPersonel sınıfında boş implemente edilmesi gerekir. İmplementasyon şu şekilde olabilir:</p>
<pre name="code" class="java">

public int odeme()
{
	return 0;
}
</pre>
<p>Kod 2</p>
<p>Sıfır değerine geri vererek, odeme() metodunun geçerli ve kullanılabilir bir metot olduğunu ifade etmiş oluyoruz. Bu yanlıştır! Bu metodun StajyerPersonel sınıfında implemente edilmemesi gerekir, çünkü staj yapanlara maaş ödenmez.</p>
<p>Bu sorunu kod 3 de yer aldığı gibi bir Exception oluşturarak çözebiliriz. Eğer bir stajyer için odeme() metodu kullanılacak olursa, oluşan PersonelException, bir stajyer için maaş ödenemeyeceğini metot kullanıcısına bildirir. Exception nesneleri olağan olmayan durumları ifade etmek için kullanılır.</p>
<pre name="code" class="java">

public int odeme()throws PersonelException
{
	throw new PersonelException(&quot;Stajyer maasli calismaz!&quot;);
}
</pre>
<p>Kod 3</p>
<p>Bu implementasyon ilk örnekte olduğu gibi LSP ile uyumlu değildir. Neden uyumlu olmadığını inceleyelim. Kod 4 de çalışanlara ödenen toplam maaş miktarı hesaplanmaktadır.</p>
<pre name="code" class="java">

List&lt;Personel&gt; personel = getPersonelList();
int total = 0;
for(int i=0; i &lt; personel.size(); i++)
{
	total+=personel.get(i).odeme();
}
</pre>
<p>Kod 4</p>
<p>StajyerPersonal sınıfının sisteme eklenmesiyle kod 4 de yer alan kodun değiştirilmesi gerekmektedir. Ya try/catch bloğu kullanılarak oluşabilecek bir PersonelException’in işleme tabi tutulması gerekir ya da metot signatüründe throws kullanılarak PersonelException’in bir üst katmana iletilmesi gerekir. StajyerPersonel ismini taşıyan yeni bir sınıf oluştuğu için, mevcut Personel sınıfı kullanıcıları (client) yapısal değişikliğe uğramıştır.</p>
<pre name="code" class="java">

try
{
	List&lt;Personel&gt; personel = getPersonelList();
	int total = 0;
	for(int i=0; i &lt; personel.size(); i++)
	{
		total+=personel.get(i).odeme();
	}
}
catch (Exception e)
{
	// handle exception
}
</pre>
<p>Kod 5</p>
<pre name="code" class="java">

List&lt;Personel&gt; personel = getPersonelList();
int total = 0;
for(int i=0; i &lt; personel.size(); i++)
{
	if(! (personel.get(i) instanceof StajyerPersonal))
	{
		total+=personel.get(i).odeme();
	}
}
</pre>
<p>Kod 6</p>
<p>Try/catch blokları komplike yapılardır ve kodun okunulabilirliğini azaltırlar. Try/catch bloğundan kurtulmak için kod 6 de yer alan implementasyon düşünülebilir. Burada instanceof ile sırada hangi tip bir nesnenin olduğunu tespit edebilir ve StajyerPersonel tipi nesneleri işlem dışı bırakabiliriz. Daha öncede gördüğümüz gibi bu implementasyon LSP ile uyumlu değildir, çünkü üst sınıf ile çalışan bir metot instanceof ile alt sınıfları tanımak zorunda bırakılmaktadır. Bunun tek sebebi StajyerPersonel sınıfından olan bir nesnenin, Personel sınıfından bir nesne ile yer değiştiremez durumda olmasıdır. Personel sınıfını kullanan diğer sınıflar alt sınıf olan StajyerPersonel sınıfı sisteme eklendikten sonra bu değişiklikten etkilenmiştir. LSP’ye göre bu olmaması gereken bir durumdur. Alt sınıfların nesneleri, üst sınıflardan olan nesnelerin kullanıldığı metotlar içinde üst sınıf nesneleriyle aynı davranışı göstermek zorundadırlar, aksi taktirde kullanıcı sınıflar bu durumdan etkilenirler.</p>
<p>Sorun staj yapan bir elemanın Personel sınıf hiyerarşisinde yer alan bir sınıf aracılığıyla modellenmiş olmasında yatmaktadır. Staj yapan bir eleman maaş almadığı için personele ait değildir, bu yüzden StajyerPersonel sınıfının Personel sınıfını genişletmesi doğru değildir. Sorunu çözmek ve LSP konform hale gelmek için StajyerPersonel sınıfının Personel sınıf hiyerarşisinden ayrılması gerekmektedir.</p>
<p>Bu yazıyı PDF dosyası olarak aşağıdaki linkten edinebilirsiniz.</p>
<p><i><br />
EOF (End of Fun)<br />
Özcan Acar<br />
</i></p>
]]></description>
			<content:encoded><![CDATA[<p>Barbara Liskov   tarafından geliştirilen bu prensip kısaca şöyle açıklanabilir:</p>
<p><b>Alt sınıflardan oluşturulan nesneler üst sınıfların nesneleriyle yer değiştirdiklerinde aynı davranışı göstermek zorundadırlar.</b></p>
<p><span id="more-878"></span></p>
<p>LSP’ye göre herhangi bir sınıf kullanıcısı, bu sınıfın alt sınıfları kullanmak için özel bir efor sarf etmek zorunda kalmamalıdır. Onun bakış açısından üst sınıf ve alt sınıf arasında farklılık yoktur. Üst sınıf nesnelerinin kullanıldığı metotlar içinde alt sınıftan olan nesneler aynı davranışı sergilemek zorundadır, çünkü oluşturulan metotlar üst sınıf davranışları örnek alınarak programlanmıştır. Alt sınıflarda meydana gelen davranış değişiklikleri, bu metotların hatalı çalışmasına sebep verebilir. Özellikte bu metotlarda instanceof gibi nesnelerin tipleri arasında kıyaslama yapılmak zorunda kalındığı zaman, LSP prensibi çiğnenmiş olur ki, bu alt sınıfların varlığından haberdar olunduğu anlamına gelir. Kullanıcı sınıflar ideal durumda alt sınıfların varlığından haberdar bile olmamalıdır.</p>
<p><center><img src=http://image.kurumsaljava.com/storage/image.jsp?ct=image/jpg&#038;d=prod&#038;k=kurumsaljava_317></center></p>
<p>Resim 1 de yer alan Client sınıfındaki print() metodunun nasıl LSP prensibine ters düştüğünü yakından inceleyelim. Bu metot A sınıfından olan nesneler üzerinde işlem yapmaktadır. A sınıfı B ve C sınıfları tarafından genişletilmiştir, yani A sınıfından olan bir parametre nesnesi aynı zamanda B ve C sınıfında da olabilir.</p>
<pre name="code" class="java">

package shop;

public class Client
{
	public void print(A a)
	{
		if(a instanceof B)
		{
			((B)a).printB();
		}
		else if(a instanceof C)
		{
			((C)a).printC();
		}
	}

	public static void main(String[] args)
	{
		Client client = new Client();
		B b = new B();
		C c = new C();

		client.print(b);
		client.print(c);
	}
}
</pre>
<p>Kod 1</p>
<p>Kod 1 de yer alan print() metodu LSP ile uyumlu değildir. Bu metodun A sınıfına bağımlılığı vardır ve bu sınıfın nesneleri üzerinde işlem yapacak şekilde implemente edilmiş olması gerekir. Lakin print()  metodu instanceof komutuyla parametre olarak verilen nesnenin hangi tipte olduğunu tespit etmeye çalışmakta ve tipe bağımlı olarak nesne üzerinde işlemi gerçekleştirmektedir. Bu durum hem OCP’ye (Open Closed Principle) hemde LSP’ye ters düşmektedir. OCP uyumlu değildir, çünkü print() metodu A’nin her yeni alt sınıfı  için değişikliğe uğramak zorundadır. LSP’ye uyumlu değildir, çünkü B ya da C sınıfından olan nesneler A sınıfından olan bir nesnenin yerini alamadığı için print() metodu instanceof ile nesnenin tipini tespit etmek zorunda bırakılmaktadır. Buradan genel bir sonuç çıkartabiliriz: LSP’ye ters düşen bir implementasyon aynı zamanda OCP’ye de ters düşer.</p>
<p><center><img src=http://image.kurumsaljava.com/storage/image.jsp?ct=image/jpg&#038;d=prod&#038;k=kurumsaljava_318></center></p>
<p>LSP’nin nasıl uygulanabileceğini diğer bir örnekte görelim. Resim 2 de bir firma çalışanları Personel sınıfını genişleten MaasliPersonel ve ParttimePersonel sınıfları ile temsil edilmektedirler. Personel sınıfı soyuttur (abstract). Çalışanların maaşlarının ödenebilmesi  için Personel sınıfında bulunan soyut odeme() metodunun alt sınıflarca implemente edilmesi gerekmektedir. Firmaya yeni stajyerler alındığı için, modelin resim 3 deki gibi adapte edildiğini farz edelim.</p>
<p><center><img src=http://image.kurumsaljava.com/storage/image.jsp?ct=image/jpg&#038;d=prod&#038;k=kurumsaljava_319></center></p>
<p>Staj yapan elemanlar için maaş ödenmez, bu yüzden odeme() metodu StajyerPersonel sınıfında boş implemente edilmesi gerekir. İmplementasyon şu şekilde olabilir:</p>
<pre name="code" class="java">

public int odeme()
{
	return 0;
}
</pre>
<p>Kod 2</p>
<p>Sıfır değerine geri vererek, odeme() metodunun geçerli ve kullanılabilir bir metot olduğunu ifade etmiş oluyoruz. Bu yanlıştır! Bu metodun StajyerPersonel sınıfında implemente edilmemesi gerekir, çünkü staj yapanlara maaş ödenmez.</p>
<p>Bu sorunu kod 3 de yer aldığı gibi bir Exception oluşturarak çözebiliriz. Eğer bir stajyer için odeme() metodu kullanılacak olursa, oluşan PersonelException, bir stajyer için maaş ödenemeyeceğini metot kullanıcısına bildirir. Exception nesneleri olağan olmayan durumları ifade etmek için kullanılır.</p>
<pre name="code" class="java">

public int odeme()throws PersonelException
{
	throw new PersonelException(&quot;Stajyer maasli calismaz!&quot;);
}
</pre>
<p>Kod 3</p>
<p>Bu implementasyon ilk örnekte olduğu gibi LSP ile uyumlu değildir. Neden uyumlu olmadığını inceleyelim. Kod 4 de çalışanlara ödenen toplam maaş miktarı hesaplanmaktadır.</p>
<pre name="code" class="java">

List&lt;Personel&gt; personel = getPersonelList();
int total = 0;
for(int i=0; i &lt; personel.size(); i++)
{
	total+=personel.get(i).odeme();
}
</pre>
<p>Kod 4</p>
<p>StajyerPersonal sınıfının sisteme eklenmesiyle kod 4 de yer alan kodun değiştirilmesi gerekmektedir. Ya try/catch bloğu kullanılarak oluşabilecek bir PersonelException’in işleme tabi tutulması gerekir ya da metot signatüründe throws kullanılarak PersonelException’in bir üst katmana iletilmesi gerekir. StajyerPersonel ismini taşıyan yeni bir sınıf oluştuğu için, mevcut Personel sınıfı kullanıcıları (client) yapısal değişikliğe uğramıştır.</p>
<pre name="code" class="java">

try
{
	List&lt;Personel&gt; personel = getPersonelList();
	int total = 0;
	for(int i=0; i &lt; personel.size(); i++)
	{
		total+=personel.get(i).odeme();
	}
}
catch (Exception e)
{
	// handle exception
}
</pre>
<p>Kod 5</p>
<pre name="code" class="java">

List&lt;Personel&gt; personel = getPersonelList();
int total = 0;
for(int i=0; i &lt; personel.size(); i++)
{
	if(! (personel.get(i) instanceof StajyerPersonal))
	{
		total+=personel.get(i).odeme();
	}
}
</pre>
<p>Kod 6</p>
<p>Try/catch blokları komplike yapılardır ve kodun okunulabilirliğini azaltırlar. Try/catch bloğundan kurtulmak için kod 6 de yer alan implementasyon düşünülebilir. Burada instanceof ile sırada hangi tip bir nesnenin olduğunu tespit edebilir ve StajyerPersonel tipi nesneleri işlem dışı bırakabiliriz. Daha öncede gördüğümüz gibi bu implementasyon LSP ile uyumlu değildir, çünkü üst sınıf ile çalışan bir metot instanceof ile alt sınıfları tanımak zorunda bırakılmaktadır. Bunun tek sebebi StajyerPersonel sınıfından olan bir nesnenin, Personel sınıfından bir nesne ile yer değiştiremez durumda olmasıdır. Personel sınıfını kullanan diğer sınıflar alt sınıf olan StajyerPersonel sınıfı sisteme eklendikten sonra bu değişiklikten etkilenmiştir. LSP’ye göre bu olmaması gereken bir durumdur. Alt sınıfların nesneleri, üst sınıflardan olan nesnelerin kullanıldığı metotlar içinde üst sınıf nesneleriyle aynı davranışı göstermek zorundadırlar, aksi taktirde kullanıcı sınıflar bu durumdan etkilenirler.</p>
<p>Sorun staj yapan bir elemanın Personel sınıf hiyerarşisinde yer alan bir sınıf aracılığıyla modellenmiş olmasında yatmaktadır. Staj yapan bir eleman maaş almadığı için personele ait değildir, bu yüzden StajyerPersonel sınıfının Personel sınıfını genişletmesi doğru değildir. Sorunu çözmek ve LSP konform hale gelmek için StajyerPersonel sınıfının Personel sınıf hiyerarşisinden ayrılması gerekmektedir.</p>
<p>Bu yazıyı PDF dosyası olarak aşağıdaki linkten edinebilirsiniz.<br />
Note: There is a file embedded within this post, please visit this post to download the file.</p>
<p><i><br />
EOF (End of Fun)<br />
Özcan Acar<br />
</i></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2009%2F10%2F29%2Fliskov-substitution-principle-lsp-%25e2%2580%2593-liskovun-yerine-gecme-prensibi%2F&amp;linkname=Liskov%20Substitution%20Principle%20%28LSP%29%20%E2%80%93%20Liskov%26%238217%3Bun%20Yerine%20Ge%C3%A7me%20Prensibi"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2009/10/29/liskov-substitution-principle-lsp-%e2%80%93-liskovun-yerine-gecme-prensibi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

