<?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>Bilgisayar Kavramları &#187; Nesne Yönelimli Programlama</title>
	<atom:link href="http://www.bilgisayarkavramlari.com/category/nesne-yonelimli-programlama/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bilgisayarkavramlari.com</link>
	<description>www.bilgisayarkavramlari.com</description>
	<lastBuildDate>Sun, 29 Jan 2012 21:38:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Observer Design Pattern (Gözlemci Tasarım Kalıbı)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/11/11/observer-design-pattern-gozlemci-tasarim-kalibi/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/11/11/observer-design-pattern-gozlemci-tasarim-kalibi/#comments</comments>
		<pubDate>Fri, 11 Nov 2011 04:50:55 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[Nesne Yönelimli Programlama]]></category>
		<category><![CDATA[Yazılım Mühendisliği (Software Engineering)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/?p=6043</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu yazının amacı, nesne yönelimli programlama ortamlarında kullanılan bir tasarım kalıbı (design pattern) olan gözlemci tasarım kalıbını (observer design pattern) açıklamak ve kullanımına dair bir örnek vermektir. Nesne yönelimli olmayan programlama dillerinde (örneğin C) aynı yapı, geri çağırım (callback) ismi verilen yaklaşım ile yapılabilir. Konuya, klasik bir gözlemci tasarım kalıbını [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bu yazının amacı, <a href="http://www.bilgisayarkavramlari.com/2007/04/14/nesne-yonelimli-programlama-object-oriented-programming/">nesne yönelimli programlama ortamlarında</a> kullanılan bir tasarım kalıbı (design pattern) olan gözlemci tasarım kalıbını (observer design pattern) açıklamak ve kullanımına dair bir örnek vermektir. Nesne yönelimli olmayan programlama dillerinde (örneğin C) aynı yapı, <a href="http://www.bilgisayarkavramlari.com/2011/11/11/callback-gericagrim/">geri çağırım (callback)</a> ismi verilen yaklaşım ile yapılabilir. </p>
<p>Konuya, klasik bir gözlemci tasarım kalıbını açıklayarak başlayalım. Geliştirme ortamı olarak sıklıkla kullandığım Netbeans içerisinde bir observer pattern eklenmesi halinde aşağıdakine benzer bir<a href="http://www.bilgisayarkavramlari.com/2008/12/25/uml-unified-modeling-language-ortak-modelleme-dili/"> sınıf diyagramı (class diagram) </a>görülmektedir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/gozlemcikalibi.png" alt="Gozlemcikalibi" title="gozlemcikalibi.png" border="0" width="600" height="277" /></p>
<p>Yukarıdaki kalıpta görüldüğü üzere 4 temel unsur bu kalıbı oluşturmaktadır:</p>
<ul>
<li>ConcreteObserver : Somut bir gözlemci</li>
<li>ConcreteSubject: Somut bir fail (özne)</li>
<li>Subject : Somut failden (özneden) türemiş olan diğer failler</li>
<li>Observer: Somut gözlemciden türemiş olan diğer gözlemciler./
<li>
</ul>
<p></p>
<p>Gözlemci tasarım kalıbı, yukarıdaki şekilde görülebileceği üzere, aslında bir Fail / Meful ilişkisi (subject / object, özne /nesne ) üzerine kuruludur. Somut fail ile kastedilen, gözlemci yapısındaki herhangi bir fiile sebep olan (eylemi yapan) faildir (özne). Buna karşılık, nesne yönelimli programlama dillerinde, üzerine bir fiil uygulanan şey genelde nesne olarak ifade edilir. Yani zaten nesne yönelimli dillerde herhangi bir fiil, sadece nesneler üzerine uygulanmaktadır. Bu durumda fail ile kastedilen, yukarıdaki kalıpta concreteSubject ve bu yapıdan türeyen bütün subject sınıfı nesneler, meful ise bu nesnelerin metotlarına parametre olarak geçirilen ve üzerinde işlem yapılan nesnelerdir. </p>
<p> Bu yaklaşımı bir kod örneği üzerinden açıklamaya çalışalım. Öncelikle tasarımımızın <a href="http://www.bilgisayarkavramlari.com/2008/12/25/uml-unified-modeling-language-ortak-modelleme-dili/">sınıf diyagramını (class diagram)</a> vererek konuya başlayalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/failmefulgozlemci.png" alt="Failmefulgozlemci" title="failmefulgozlemci.png" border="0" width="564" height="330" /></p>
<p>Yukarıdaki şekilde, modelimizde bulunacak olan üç unsur içinde, yani gözlemci, fail ve meful için birer sınıf tanımı yaptık. Bu sınıfların kodu aşağıda verilmiştir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/gozlemci.png" alt="Gozlemci" title="gozlemci.png" border="0" width="485" height="326" /></p>
<p>İlk olarak gözlemci <a href="http://www.bilgisayarkavramlari.com/2008/07/15/sinif-class/">sınıfı (class)</a> ile konuya başlayalım. Sınıfın tanımında, bir main fonksiyonu bulunuyor ve bu main fonksiyonu  aslında fail , meful ve gözlemci kavramlarının bir araya geldiği nokta oluyor. Zaten sınıf diyagramında da görüleceği üzere gözlemci bu iki kavramı bir araya getirir. Buna göre fail ve meful sınıflarından üretilen failNesne ve mefulNesne <a href="http://www.bilgisayarkavramlari.com/2008/07/15/nesne-object/">nesneleri (objects)</a> (kodun 20. ve 23. satırlarında), kodun 26. satırında, addObserver fonksiyonu ile birbirine bağlanmıştır. Bu basit işlem, meful üzerinde bir failin gözlemini tanımlar. Ayrıca kodun 29. satırında klasik thread üretmek için kullanılan ve Runnable arayüzü üzerinden Thread çağırımı ile failNesne&#8217;mizi bir thread şeklinde başlatıyoruz. </p>
<p>Gelelim Fail sınıfının tanımına:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/fail.png" alt="Fail" title="fail.png" border="0" width="600" height="292" /></p>
<p>Yukarıdaki kodda, basit bir şekilde, kulanıcıdan, ekranda yazı okumak için BufferedReader, InputStreamReader&#8217;a ve InputStreamReader da System.in&#8217;e bağlanmış. Bu sayede, System.in üzerinden girilen bir veri, BufferedReader tarafından okunabilecektir. response ismindeki String <a href="http://www.bilgisayarkavramlari.com/2008/09/08/degisken-variable/">değişkeni (variable)</a> bir sonsuz döngü içerisinde (21. satırdaki while) kullanıcıdan veri okumakta ve sırasıyla setChanged() ve notifyObservers() fonksiyonlarını çağırmaktadır. Buradaki notifyObservers fonksiyonu aslında bütün bu yazının kalbini oluşturuyoru. Dikkat edilirse bu fonkisyona klavyeden okuduğumuz response isimli değişkeni parametre olarak veriyoruz.</p>
<p>Kodda dikkat edilecek diğer iki husus ise, Observable sınıfını <a href="http://www.bilgisayarkavramlari.com/2007/04/14/inheritance-nesneler-arasi-miras-iliskisi/">miras almamız (inheritance)</a> ve bir thread olarak çalışmasını istediğimiz için Runnable <a href="http://www.bilgisayarkavramlari.com/2008/11/22/arayuz-interface/">arayüzünü (interface</a>) implements etmemizdir. </p>
<p> Son olarak meful sınıfını açıklayıp, kodun çalışmasına bakalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/meful.png" alt="Meful" title="meful.png" border="0" width="530" height="236" /></p>
<p>Kodda görüldüğü üzere, Meful isimli sınıfımız, basitçe Observer <a href="http://www.bilgisayarkavramlari.com/2008/11/22/arayuz-interface/">arayüzünü</a> kendi üzerine uygulamıştır (implements).</p>
<p>Meful sınıfının yegane fonksiyonu update fonksiyonudur ve parametre olarak bir Observable nesnesi bir de arg isimli Object tipinde (yani JAVA açısından tipsiz) bir parametre almaktadır. </p>
<p>Burada tipsiz tipler ile ilgili aşağıdaki yazıyı okumakta yarar olabilir</p>
<p> Son olarak update fonksiyonu içerisinde alınan mesaj, <a href="http://www.bilgisayarkavramlari.com/2008/11/24/tip-inkilabi-tip-donusturme-type-casting/">tip inkılabı (typecasting)</a> ile Object tipinden String tipine inkılap ettirilmiş ve ardından ekrana basılmıştır.</p>
<p>Şimdi yukarıdaki senaryoyu toparlayacak olursak, gözlemci sınıfımızdaki main fonksiyonu çalıştırılarak bütün senaryo başlamaktadır. Bu main fonksiyonu içerisinde bir fail bir de meful nesnesi üretilmekte ve üretilen nesneler birbirine addObserver fonksiyonu ile bağlanmaktadır. Yani artık meful sınıfından türeyen nesneler, fail sınıfının birer observer&#8217;ı olmaktadır. Ardından fail sınıfından üretilen nesne bir thread olarak çalıştırılmakta ve kendi içerisinde bulundurduğu, ve threadlerin ilk çalışan fonksiyonu olan run() fonksiyonunda tanımlı olan kullanıcıdan bir dizgi (String) okuma işlemini gerçekletirmektedir. Hemen ardından okunan mesajı, aslında hiçbir fikri olmayan ismini, ne tür bir parametre aldığını dahi bilmediği notifyObservers () fonksiyonuna parametre geçirmektedir. Bu fonksiyon, bir sevki tabii olarak meful sınıfındaki update isimli fonksiyonu tetiklemektedir. Update fonksiyonu ise kendisine parametre olarak gelen nesneyi String sınıfına çevirmekte ve ekrana bamaktadır.</p>
<p>Yukarıdaki kodu çalışması sonucu ekran görüntüsü aşağıdaki şekildedir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/calisma.png" alt="Calisma" title="calisma.png" border="0" width="441" height="149" /></p>
<p>Görüldüğü üzere kodumuz bir fiil sorusu sormakta ve klavyeden benim yazdığım &#8220;merhaba&#8221; yazısını ekrana geri basmaktadır. Buradaki mesajı okuyan fail isimli sınıftan türeyen nesne iken, ekrana cevabı yazan meful isimli sınıftan türeyen nesnedir</p>
<p>Yukarıdaki bu tasarım kalıbını, daha gerçekçi bir örnek üzerinden açıklamaya çalışalım. </p>
<p>Örneğin bir müzayede (açık arttırma) ortamını, gözlemci tasarım kalıbı ile modellemek isteyelim. Buna göre müzayedeyi yöneten bir kişi ve bu müzayedeye katılan müzayedeciler bulunacaktır. Buna göre müzayedeyi yöneten kişi bir gözlemci olmakta, müzayedecilerin her biri birer fail (fiili yapan kişi) olmakta ve müzeyede sırasında verilen her teklif (fiyat) bir meful (fiilin etkisindeki değer) olmaktadır. </p>
<p> Bu yaklaşımı aşağıdaki şekilde göstermeye çalışalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/muzayede.png" alt="Muzayede" title="muzayede.png" border="0" width="600" height="593" /></p>
<p>Yukarıdaki yaklaşımda, muzayede sırasında verilen değerler, gözlemcinin update fonksiyonuna birer parametre olarak geçirilmekte ve nihayetinde gözlemciden bağımsız olarak ilgili fonksiyonlar çağrılmaktadır. </p>
<p>Gözlemci tipi tasarım kalıbının bir dezavantajı, bu noktada çıkmaktadır. Gözlemci tasarım kalıbında, meful yapısında olan ve fiilden etkilenen nesnelerin sistemde etkin rol oynaması beklenir. Diğer bir deyişle, açık arttırmaya katılan her bir katılımcı, fail olarak fiyatlarını belirtirken, gözlemci bu durumu sadece gözlemekte ve bir fiilde bulunmamakta ancak fiileri gözlemektedir. Bu anlamda, gözlemci tasarım kalıbı, çekme iletişim modeli (pull interaction model) olarak düşünülebilir. Alternatifi olan itme iletişim modelleri (push interaction model) failin doğrudan eylemde bulunması ile sonuca ulaşmakta ve dışarıdaki nesneleri çalışmaya zorlamaktadır. Yani gözlemci örüntü modelinde, dışarıda bulunan nesnelerin çalışmaları sonuçları toplanmaktayken, itme iletişim modeli olan diğer kalıplarda, bir nesne, diğer nesnelerin sonuç üretmesini zorlayabilir. Burada, tasarıma bağlı olarak bir seçim yapmak gerekir. </p>

<p class="sayac_bilgi">334 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/11/11/observer-design-pattern-gozlemci-tasarim-kalibi/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Nesne Yönelimli Programlama Dersi Bütünleme İmtihanı Çözümü</title>
		<link>http://www.bilgisayarkavramlari.com/2011/07/06/nesne-yonelimli-programlama-dersi-butunleme-imtihani-cozumu/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/07/06/nesne-yonelimli-programlama-dersi-butunleme-imtihani-cozumu/#comments</comments>
		<pubDate>Wed, 06 Jul 2011 10:05:17 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Nesne Yönelimli Programlama]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/07/06/nesne-yonelimli-programlama-dersi-butunleme-imtihani-cozumu/</guid>
		<description><![CDATA[Çözüm : Şadi Evren ŞEKER Çözüme geçmeden önce, sizlerle görüşme imkanımız olmadığı için bir iki noktayı buradan açıklama ihtiyacı hissettim. Öncelikle, bilinmelidir ki bu sınavda sorulan bütün sorular, derste anlatılan konular kapsamında hazırlanmıştır. Bazı sorulara çözüm olabilecek derste birden fazla yol gösterilmiştir, buradaki cevaplarda bir tanesini seçip (genelde en uzun ve karmaşık olanını vermeye çalışıyorum) [...]]]></description>
			<content:encoded><![CDATA[<p>Çözüm : Şadi Evren ŞEKER</p>
<p>Çözüme geçmeden önce, sizlerle görüşme imkanımız olmadığı için bir iki noktayı buradan açıklama ihtiyacı hissettim. Öncelikle, bilinmelidir ki bu sınavda sorulan bütün sorular, derste anlatılan konular kapsamında hazırlanmıştır. Bazı sorulara çözüm olabilecek derste birden fazla yol gösterilmiştir, buradaki cevaplarda bir tanesini seçip (genelde en uzun ve karmaşık olanını vermeye çalışıyorum) anlatıyorum ancak diğer yollar da doğru kabul edilecektir. Hatta derste anlatılmayan ama JAVA dilinde doğru olan yöntemler kullandıysanız (sonuçta derste anlatmadığım ama JAVA Tutorial içinde bulunan ve sizin ders dışı çalışarak öğrendiğiniz konular olabilir) bunları da doğru kabul edeceğim.</p>
<p>Ayrıca sınavlarınızın bir kısmını okudum ve genel olarak çalışmadığınız görülüyor. Nasıl bir sınav bekliyordunuz bilmiyorum ama bu dönem itibariyle hayal kırıklığına uğradığımı söyleyebilirim. Özellikle final sınavında birebir derste anlattığım kodları sormuştum. Finaldeki toplam 5 sorunun tamamını derste adım adım kodlayıp çalıştırıp sizlere anlatmıştım. Özellikle finaldeki 0. soruyu çözemeyip, ekrana ismini ve numarasını bastıramayan kişi sayısı sınıfın çoğunluğunu oluşturuyor. Bu durum da gösteriyor ki bu derse hiç çalışılmamış. Bütünleme sınavlarının henüz tamamını okumadım ama görülen durum, derste anlatılan konuları, bildiğiniz veya bilmenizi beklediğimiz konuları, farklı problemlere uygulayamadığınız. Örneğin Thread sorusunda, derste anlattıklarımın dışında yeni hiçbir bilgiye ihtiyacınız olmadığı halde genelde bu soruda durum çok kötü. Bu dönem itibariyle ilk defa üniversitenizde ders verdiğim için sanırım benim hatam sizlere fazla güvenmem ve çalışacağınıza olan inancımdı. Bu dönemden sonra, her hafta ödev, dönem projesi, quiz ve sıkı bir laboratuvar programı uygulamamız gerektiğini, ve sizleri çalışmaya zorlamamız gerektiğini anlamış bulunuyorum.<br />
Aşağıdaki çözümleri web sayfası olarak yayınlarken bazan hatalar olabiliyor. Kod hassas bir yazı olduğu için bu tip hatalara mahal vermemek adına, çalışan bir örnek kodu aşağıdaki linkten indirebilirsiniz:<br />
<a href="http://www.bilgisayarkavramlari.com/wp-content/uploads/2011/butunleme.rar">Sınavın çözüm kodu (netbeans projesi olarak) indirmek için tıklayın.</a></p>
<p>Soru 0) Bir kesir (fraction) sınıfı kodlayınız. Kodunuza iki kesiri toplayan fonksiyonu ekleyiniz. (15 puan)</p>
<p><span style="color: red;">Öncelikle bilinmelidir ki rasyonel sayılar kümesi reel sayılar kümesinden farklıdır. Ayrıca kesirli sayıların paydası 0 olamaz. Sınavda bu problemi çözmek için istisna yakalama (exception handling) kullanabileceğiniz gibi, basit bir if ile kontrolünüz de doğru kabul edilecektir. Buna göre kodlanmış hali aşağıdaki şekildedir:<br />
</span></p>
<pre>package butunleme;
class kesir{
    public int getPay() {
        return pay;
    }
    public void setPay(int pay) {
        this.pay = pay;
    }
    public int getPayda() {

        return payda;
    }
    public void setPayda(int payda) {
        if(payda==0) // kesirli sayıların paydası 0 olamaz.
            payda = 1;
        this.payda = payda;
    }
    public kesir(int pay, int payda) {
	setPayda(payda);
	setPay(pay);
    }
    int obeb(int a,int b){
      if(b==0)
        return a;
   else
        return obeb(b,a%b);
    }
    public void topla(kesir k){
        int obeb = obeb(k.payda, payda);
        k.pay *= payda/obeb;
        pay *= k.payda/obeb;
        pay += k.pay;
        payda = (k.payda/obeb ) * (payda/obeb);
    }
    int pay;
    int payda;
}
public class Butunleme {
    public static void main(String[] args) {
        // TODO code application logic here
        kesir k = new kesir(3,4);
        kesir m = new kesir(4,5);
        k.topla(m);
        System.out.println("toplam : "+k.pay + " / "+ k.payda);
    }
}</pre>
<p><span style="color: red;">Ekran çıktısı :<br />
</span></p>
<p><span style="color: red;">toplam : 31 / 20<br />
</span></p>
<p>Soru 1) 0. Soruda verdiğiniz cevabı kullanarak, bir çok terimli (polynom) sınıfı kodlayanız. Toplama (summation) , çarpma (multiplication), türev (derivation) ve  çözme (evaluation) metotlarını kodlayınız. Kodunuzda, kapsülleme (encapsulation), çok şekillilik (polymorphism), yapıcı metotlar (constructor methods) bulunmalı ve kodunuzu çalıştıran main fonksiyonunu yazmalısınız. Ayrıca kodunuzu yazdıktan sonra konsol üzerinde nasıl derlenip çalıştırığını da yazınız.</p>
<p>Örnek:</p>
<p>(¾ x<sup>2</sup> + ½ x + 5) çok terimlisi ile (5x<sup>3</sup> + 1/3 x + 2) çok terimlisinin toplamı :</p>
<p>(5x<sup>3</sup> + ¾ x<sup>2</sup> + 5/6 x + 7) olarak bulunmalıdır.  Yukarıdaki iki soru için tek bir kod yazabilirsiniz. (35 puan)</p>
<p><span style="color: red;">Sorunun çözümünü dosya olarak ekliyorum. Soru için genel olarak birden fazla çözüm yolu bulunuyor. Örneğin iki çok terimlinin toplamını 3. bir çok terimliye döndürmek veya mevcut çok terimliye bir parametre eklemek arasındaki tercih notlamayı etkilemez. Örnek kodda çarpma için üçüncü bir çok terimli döndürdüm ve toplama için mevcut çok terimliye ilave ettim, dolayısıyla iki yolda görülebiliyor. Ayrıca çok terimlileri sadeleştirmek veya sadeleştirmemek de notlama için önemli değil.  Yine örnek çözümde terim isminde bır sınıf kullanıp, çok terimlinin her terimini bu sınıftan bir nesne halinde vektöre yerleştirdim. Derste birden fazla nesneyi tutmak için iki yol görmüştük, vektör yerine diğer yol olan dizi kullanılabilir veya terim sınıfı yerine 3 farklı dizi paralel şekilde tutulabilirdi (ders veri yapıları olmadığı için bu tip, aslında veri yapısı hatası olan kodlamaları kabul edebiliriz). Yine örnek kodda, obeb (gcd) hesabı için özyineli (recursive) fonksiyon kullandım, iteratif kullanım da yapılabilirdi. Anlatmaya çalıştığım üzere sonucu doğru olan birden fazla yol bulunmakta ve hangisi ile yapılması istendiği, soruda beliritilmediği için önemli olmamaktadır.<br />
</span></p>
<p>Soru 2)Grafik arayüzü kullanarak (swing kütüphanesi), bir çok terimliyi okuyan ve yukarıdaki kodunuzu kullanarak bir nesne oluşturan kodu yazınız.  (20 puan)</p>
<p><span style="color: red;">Bu soruda da farklı seçimler yapılabilir. Örneğin swing kütüphanesi kullanılarak basit bir arayüz tasarlayıp tek bir metin kutusundan çok terimli okunabilir. Okuduğunuz çok terimliyi daha sonra tokenize etmeniz gerekeceği için swing kısmı basit ama arkadaki string işleme kısmı kuvvetli bir kod yazabileceğiniz gibi, çok terimlinin her terimini okuyan ayrı birer kutu da yerleştirilebilir. Sonuçta amacımız bir çok terimliyi ekrandan okumak.<br />
</span></p>
<pre>package butunleme;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ekran implements ActionListener{
    //www.bilgisayarkavramlari.com
    JButton dugme;
    JButton tamam;
    JFrame x;
    int derece;
    JTextField tf;
    JLabel jl;
    JTextField ctparam [];
    public ekran(){
        x = new JFrame();
         x.setLayout(new FlowLayout());
         jl = new JLabel("Çok Terimlinin derecesini giriniz:");
        x.add(jl);
        tf = new JTextField(5);
        x.add(tf);
        dugme=new JButton("Devam");
        x.add(dugme);
       dugme.addActionListener(this);
        x.setSize(400,200);
        x.setVisible(true);
    }
    public static void main(String args[]){
       new ekran();
    }
    public void actionPerformed (ActionEvent e){
        if(e.getSource()==dugme){
            derece = Integer.parseInt(tf.getText());
            x=new JFrame();
            x.setLayout(new GridLayout(derece+2,2));
            x.setSize(150,300);
            x.add(new JLabel("pay"));
            x.add(new JLabel("payda"));
            x.add(new JLabel("üst"));
            ctparam = new JTextField [derece*3];
            for(int i = 0;i&lt;derece;i++){
                ctparam[3*i]=new JTextField();
                ctparam[3*i+1]=new JTextField();
                ctparam[3*i+2]=new JTextField();
                x.add(ctparam[3*i]);
                x.add(ctparam[3*i+1]);
                x.add(ctparam[3*i+2]);
            }
            tamam = new JButton("Tamam");
            x.add(tamam);
            tamam.addActionListener(this);
            x.setVisible(true);
        }
        if(e.getSource() == tamam){
            cokTerimli ct = new cokTerimli();
            for(int i = 0;i&lt;derece;i++){
                ct.ct.add(new terim(Integer.parseInt(ctparam[3*i+2].getText()),
                        new kesir(Integer.parseInt(ctparam[3*i].getText()),
                        Integer.parseInt(ctparam[3*i+1].getText()))));
            }
            ct.goster();
        }

    }
}</pre>
<p><span style="color: red;">Kodun ekran çıktısı aşağıdaki şekildedir:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/070611_1005_NesneYnelim1.png" alt="" /><span style="color: red;"><br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/070611_1005_NesneYnelim2.png" alt="" /><span style="color: red;"><br />
</span></p>
<p><span style="color: red;">Ve kod konsoldan aşağıdaki çok terimliyi basar:<br />
</span></p>
<p><span style="color: red;">2/3x^4 + 5/6x^5 + 3/1x^2 + 3/4x^3 + 1/1x^1<br />
</span></p>
<p>Soru 3) Bir çok terimlinin x ekseni ile arasında kalan alanın hesaplanması için, kullanılan yöntemlerden birisi de, belirli aralıklarla x değerleri verilerek dikdörtgenler elde etmek ve bu dikdörtgen alanlarının toplamlarını hesaplamaktır.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/070611_1005_NesneYnelim3.png" alt="" /></p>
<p>Örneğin yukarıda, şekli verilen çok terimlinin alanı hesaplanırken, belirli aralıklara sahip x değerleri verilmiş ardından bu değerlerin çok terimlideki sonuçları ile aralık miktarları çarpılarak elde edilen dikdörtgenlerin alanları bulunmuştur. Çok terimlinin alanı, bu dikdörtgenlerin alanlarının toplamı olarak bulunabilir.</p>
<p>Bu hesaplama işlemi, karmaşık çok terimliler için, çok küçük aralıklarla hesaplama istendiğinde, bilgisayara yüksek miktarda yük getirebilmektedir. Sizden istenen hesaplama işlemini çok life bölmenizdir.</p>
<p>Çok lifli (multi threaded) kod yazarak hesaplanacak alanı en az 3 life (thread) bölünüz ve sonucu ekranda gösteren main fonksiyonunu kodlayınız.</p>
<p>Not: kolaylık olması için bu soruda, hesaplanacak alanın başlangıç ve bitiş değerlerini (x&#8217;in alt ve üst limitlerini), aralık değerini (delta) ve lif sayısını, kullanıcıdan alabilirsiniz.</p>
<p>(30 puan)</p>
<p>Yukarıdaki soru için yazılabilecek çözümlerden birisi aşağıdaki şekildedir:</p>
<pre>package butunleme;
class alanLif extends Thread {
    cokTerimli ct ;
    int basla,bit;
    int delta;
    anaLif al ;
    public alanLif(cokTerimli ct,int basla, int bit, int delta,anaLif al){
        this.ct = ct;
        this.basla = basla;this.bit=bit;this.delta=delta;
        this.al = al;
    }
    public void run(){
        int hareket = basla;
        int toplam = 0;
        while(hareket &lt; bit){
            toplam += ct.coz(hareket)*delta;
            hareket += delta;
        }
        al.getSonuc(toplam);
        System.out.println(" alan : "+ toplam + " aralik " + basla + " - "+ bit);
    }
}
public class anaLif {
    int toplam=0;
    int sonucGelen = 0;
    public anaLif(){
        cokTerimli ct = new cokTerimli();
        ct.ct.add(new terim(2,new kesir(2,1)));
        ct.ct.add(new terim(1,new kesir(3,1)));
        ct.ct.add(new terim(0,new kesir(5,1)));
        ct.goster();

        int basla = 0;
        int bit = 100;
        int ara= (bit-basla)/5,arabasla=0,arabit=ara;
        for(int i = 0;i&lt;5;i++){

            new alanLif(ct,arabasla,arabit,1,this).start();
            arabasla+=ara;
            arabit += ara;
        }
    }
    public static void main(String args[]){
       anaLif al = new anaLif();
       while(al.sonucGelen &lt; 5)
           try{  Thread.sleep(50); } catch(Exception e){}
       System.out.println("alanın toplam değeri:"+al.toplam);
    }
    public void getSonuc(int sonuc){
       toplam += sonuc;
       sonucGelen ++;
    }
}</pre>
<p><span style="color: red;">Yukarıdaki kodda, alanLif isimli thread sınıfı, verilen aralık ve delta değeri için alan hesaplamaktadır. Bu sırada, çok terimli sınıfında bulunan çöz fonksiyonunu kullanmaktadır. Ayrıca analif sınıf, 5 adet (bu örnek için lif sayısını ben 5 kabul ettim, sayı farklı olabilir, soruda 3&#8242;ten fazla olması istenmiştir) lif (thread) oluşturmaktadır.<br />
</span></p>
<p><span style="color: red;">Son aşamada, main fonksiyonu altında, bütün threadler bitene kadar (ki bittiklerini hepsinin sonuç döndürmesinden anlıyoruz) bekliyoruz. Bütün thraedler sonuçlarını analif&#8217;e döndürünce, her threadden gelen değeri alıp sonuç toplamını hesaplıyor ve ekrana basıyoruz.<br />
</span></p>
<p><span style="color: red;">Yukarıdaki kod için örnek ekran çıktısı aşağıdaki şekildedir:<br />
</span></p>
<p><span style="color: red;">2/1x^2 + 3/1x^1 + 5/1x^0 alan : 5610 aralik 0 &#8211; 20<br />
</span></p>
<p><span style="color: red;"> alan : 102410 aralik 40 &#8211; 60<br />
</span></p>
<p><span style="color: red;"> alan : 38010 aralik 20 &#8211; 40<br />
</span></p>
<p><span style="color: red;"> alan : 198810 aralik 60 &#8211; 80<br />
</span></p>
<p><span style="color: red;"> alan : 327210 aralik 80 &#8211; 100<br />
</span></p>
<p><span style="color: red;">alanın toplam değeri:672050</span></p>

<p class="sayac_bilgi">658 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/07/06/nesne-yonelimli-programlama-dersi-butunleme-imtihani-cozumu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java dilinde vektörler</title>
		<link>http://www.bilgisayarkavramlari.com/2011/03/31/java-dilinde-vektorler/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/03/31/java-dilinde-vektorler/#comments</comments>
		<pubDate>Wed, 30 Mar 2011 22:01:54 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[Nesne Yönelimli Programlama]]></category>
		<category><![CDATA[veri yapıları]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/03/31/java-dilinde-vektorler/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu yazının amacı, Java dilindeki vektör sınıfının kullanılmasını ve yapısını anlatmaktır. Java dilindeki vektörlerin yapısından bahsederek başlayalım. Klasik veri yapısı olarak dizilerin (array) ve bağlı listelerin (linked list) özelliklerini birleştirmiştir. Bir vektör boyutu belli olmadan tanımlanıp içerisine veri konuldukça hafızada kapladığı yeri arttırmaktadır. Bu anlamda bağlı listelere benzer özellik göstermektedir. [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Bu yazının amacı, Java dilindeki vektör sınıfının kullanılmasını ve yapısını anlatmaktır.
</p>
<p>Java dilindeki vektörlerin yapısından bahsederek başlayalım. Klasik veri yapısı olarak <a href="http://www.bilgisayarkavramlari.com/2007/05/04/array-dizi/">dizilerin (array)</a> ve <a href="http://www.bilgisayarkavramlari.com/2007/05/03/linked-list-linkli-liste-veya-bagli-liste/">bağlı listelerin (linked list)</a> özelliklerini birleştirmiştir.
</p>
<p>Bir vektör boyutu belli olmadan tanımlanıp içerisine veri konuldukça hafızada kapladığı yeri arttırmaktadır. Bu anlamda bağlı listelere benzer özellik göstermektedir. Yani bir vektörün boyutunun önceden tanımlanması gerekmez. Aslında vektörün boyu yoktur ve herhangi bir anda vektör için bir limit belirtilmez.
</p>
<p>Boyutunu belirsiz tutabilmemizin yanında, bir vektörün herhangi bir elemanına doğrudan erişmek (random acces) de mümkündür. Bu sayede vektör yapısı diziler ve bağlı listelerden daha avantajlı bir hal almış olur.
</p>
<p>Vektörler hakkında bilmemiz gereken son özellik ise, vektörlerin tipsiz olduğudur. Yani vektörler içlerinde istenilen tipte veri tutabilir. Bunu, JAVA dilinde bulunan nesne mirası sayesinde yapmaktadırlar. JAVA dilinde, bütün nesneler, Object sınıfından türemiştir. Yani aslında bütün nesneler ile Object sınıfı arasında bir <a href="http://www.bilgisayarkavramlari.com/2007/04/14/inheritance-nesneler-arasi-miras-iliskisi/">miras (inheritance)</a> ilişkisi bulunmaktadır.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/033011_2201_Javadilinde11.png" alt=""/>
	</p>
<p>Dolayısıyla JAVA dilindeki bütün nesneler, Object sınıfına yukarı <a href="http://www.bilgisayarkavramlari.com/2011/03/19/nesne-akisi-casting/">akış yapılarak (upcasting)</a> bu tipte tutulabilir. Aşağıdaki örneklerde bu durumu gösteren kodlar sunulacaktır.
</p>
<p>Gelelim vektörlerin, JAVA dilindeki kullanılışlarına
</p>
<p>Basit bir uygulama ile bu sınıfı tanımaya başlayalım.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/033011_2201_Javadilinde21.png" alt=""/>
	</p>
<p>
 </p>
<p>Öncelikle java dilindeki vektör sınıfı, java.util paketi altında bulunabilir. Dolayısıyla vektörler ile çalışırken kodun başına
</p>
<p>import java.util.Vector;
</p>
<p>yazmak gerekir.  Yukarıdaki kodun 14. satırında da bu import işlemi ile koda başlanmıştır.
</p>
<p>Kodun ana çalışan sınıfı (class) vektorDeneme isimli sınıftır ve bu sınıfın içerisinde bir adet main fonksiyonu bulunur. Bu fonksiyonun içinde victor isimli bir Vector tanımlanmıştır.
</p>
<p>Ayrıca vektörün içerisinde tutulacak veri tipini belirlemek için bir oluşum sınıfı (composition class) tanımı yapılmış ve insan tipinin, boy ve yaş bilgilerinden oluştuğu kodlanmıştır. (kodun 14-23. satırları arası). Bu sınıf içerisinde bir <a href="http://www.bilgisayarkavramlari.com/2008/11/24/yapici-constructor/">inşa fonksiyonu (yapıcı fonksiyon, constructor)</a> tanımlanmış ve iki tam sayı (int) alarak bir insanı tanımlamaya imkan sağlamıştır.
</p>
<p>Kodun 28. satırında, insan tipinde bir ali nesnesi (object) üretilmiş ve bu nesne, 29. satırda, daha önceden tanımladığımız victor ismindeki vektöre yerleştirilmiştir.
</p>
<p>Kodun 30. satırında, victor isimli vektörün boyutunun nasıl alındığı gösterilmiştir. Buna göre bir vektör nesnesinin .size() şeklinde metodu çağrılarak, boyutu alınabilir.
</p>
<p>Ayrıca vektörün herhangi bir sıradaki elemanına erişmek için .elementAt() fonksiyonunu çağırmak ve bu fonksiyona parametre olarak kaçıncı elemana erişilmek istendiğini vermek yeterlidir.
</p>
<p>Ne yazık ki 31. satırdaki çağırma işlemi sonucunda JAVA anlamlı bir şey basamaz. Bunun sebebi, vektörün 0. elemanı olarak konulan nesnenin tipinin belirsiz olması ve şu anda nesne sınıfına (object) çevrilmiş olmasıdır. Vektörün 0. sırasında bulunan bu elemanın üyelerine (members) erişmek için öncelikle insan tipine geri çevrilmesi gerekir. Bunun için tip inkılabı yapıp nesnenin başına parantezler içerisinde (insan) yazılmıştır. Ancak bu çevirim yapıldıktan sonra boy ve yas üyelerine erişilebilmiş ve ekrana basılmıştır.
</p>
<p>Yukarıdaki kodun çıktısı aşağıda verilmiştir:
</p>
<ul>
<li>vektör boyutu: 1
</li>
<li>vektörün 0. elemanı : javaapplication21.insan@190d11
</li>
<li>elemanın insan olarak boyu : 100 yasi : 10
</li>
</ul>
<p>Görüldüğü üzere, çıktının ikinci satırında, JAVA nesneyi ekrana basmıştır.  (aslında ekrana basılan nesnenin dizgiye (string) çevrilmiş ve serilenmiş halidir, daha fazla bilgi için <a href="http://www.bilgisayarkavramlari.com/2009/10/04/nesne-serileme-ve-dizme-object-serialization-marshalling/">nesne serileme (serialization)</a> başlıklı yazıya bakabilirsiniz).
</p>
<p>Vektörlerin, JAVA dilinde bir tip kısıtlaması ile kullanılması da mümkündür.
</p>
<p>Örneğin yukarıdaki kodda bulunan victor isimli vektöre, yeni elemanlar eklenirken herhangi bir kısıt bulunmaz. İkinci elemanı olarak öğrenci, üçüncü elemanı olarak ders tipinde nesneler eklenebilir. Bu nesnelerin hepsi Object tipine çevrilerek yerleştirilir. Ancak biz kısıtlamak istersek bir <a href="http://www.bilgisayarkavramlari.com/2009/04/20/sablonlar-templates/">şablon tanımı (template)</a> yapmamız mümkündür.
</p>
<p>Vector&lt;insan&gt;kisitli = new  Vector&lt;insan&gt;();
</p>
<p>Şeklindeki tanım, sadece insan tipinden nesneler alabilir. Farklı tiplerdeki nesnelerin bu vektöre konulması mümkün değildir. Aynı zamanda tip dönüşümü yapmak da gerekmez. Yani bir önceki kodda bulunan ve vektörün herhangi bir elemanının boyu veya yaşını bastırmak için başına eklediğimiz (insan) ibaresinin bu kodda bulunması artık gerekmez. Çünkü JAVA bu sınıfların tiplerini bilmektedir ve bu tiplere göre erişime izin verir.
</p>
<p>
 </p>
<p>
 </p>

<p class="sayac_bilgi">459 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/03/31/java-dilinde-vektorler/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JAVA da nihai uygulması (Final)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/03/31/java-da-nihai-uygulmasi-final/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/03/31/java-da-nihai-uygulmasi-final/#comments</comments>
		<pubDate>Wed, 30 Mar 2011 21:43:35 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[Nesne Yönelimli Programlama]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/03/31/java-da-nihai-uygulmasi-final/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu yazının amacı, java dilinde bulunan final kelimesini açıklamaktır. Temel olarak final kelimesi, java dilinde 3 farklı yerde bulunabilir: Sınıf tanımında Metot (fonksiyon) tanımında Değişken tanımında Sırasıyla bu durumları uygulamalar üzerinden görelim. public final class sonsınıf{ } yukarıdaki tanımın yapılması halinde, sınıf (class) nihai bir sınıf olur (final class) ve [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bu yazının amacı, java dilinde bulunan final kelimesini açıklamaktır. Temel olarak final kelimesi, java dilinde 3 farklı yerde bulunabilir:</p>
<ul>
<li>Sınıf tanımında</li>
<li>Metot (fonksiyon) tanımında</li>
<li>Değişken tanımında</li>
</ul>
<p>Sırasıyla bu durumları uygulamalar üzerinden görelim.</p>
<pre>public final class sonsınıf{ }</pre>
<p>yukarıdaki tanımın yapılması halinde, <a href="http://www.bilgisayarkavramlari.com/2008/07/15/sinif-class/">sınıf (class)</a> nihai bir sınıf olur (final class) ve artık bu sınıftan <a href="http://www.bilgisayarkavramlari.com/2007/04/14/inheritance-nesneler-arasi-miras-iliskisi/">kalıtım yapılamaz (miras, inheritance).</a></p>
<p>Örneğin yukarıdaki tanımdan sonra, aşağıdaki şekilde bir kod yazılması hatadır:</p>
<pre>public class yenisınıf extends sonsınıf{ }</pre>
<p>sebebi ise sonsınıf&#8217;ın nihai sınıf olarak tanımlanmış olmasıdır (final class).</p>
<p>Benzer şekilde bir metot tanımının başına final kelimesi yazılarak, metodun nihai olması durumunda, bu metodun <a href="http://www.bilgisayarkavramlari.com/2008/11/22/cignemek-overriding/">üzerine bindirme yapılamaz (overriding).</a></p>
<p>Örneğin aşağıdaki kodu ele alalım:</p>
<pre>public class deneme{</pre>
<pre>  public final int toplama(int a,int b){</pre>
<pre>     return a + b;</pre>
<pre> }</pre>
<pre>}</pre>
<p>Yukarıdaki kodda, toplama fonksiyonunun nihai hali kodlanmıştır. Bu sınıftan <a href="http://www.bilgisayarkavramlari.com/2007/04/14/inheritance-nesneler-arasi-miras-iliskisi/">miras alan hiçbir sınıf</a> toplama fonksiyonunu değiştiremez.</p>
<p>Örneğin aşağıdaki kod hatalıdır:</p>
<pre>public class yenisınıf extends deneme{</pre>
<pre>  public int toplama(int a, int b){ }</pre>
<pre>}</pre>
<p>Yukarıdaki bu kodun hatası, final olarak tanımlanan bir metodun <a href="http://www.bilgisayarkavramlari.com/2008/11/22/cignemek-overriding/">üzerine bindirme yapıyor olmasıdır (overriding).</a></p>
<p>Son olarak bir değişkenin nihai olmasını inceleyelim. (final variables)</p>
<p>Bir değişken nihai tanımlandıysa, bu durumda içerisine atama sadece bir kere yapılabilir (assignment).</p>
<p>Örneğin aşağıdaki tanımı ele alalım:</p>
<pre>final int x = 10;</pre>
<p>yukarıdaki koddan sonra, kodun herhangi bir yerinde x değişkenine yeni değer atanamaz.  Örneğin</p>
<pre>x= 7;</pre>
<p>yazılması durumunda hata alınır.</p>
<p>Nihayi değişkenler, sabit değişkenlerden farklıdır (constant variables, const)</p>
<p>En önemli farkı ise, derleme zamanında (compile time) değişkenin değerinin bilinmesi gerekmemesidir.</p>
<p>Örneğin aşağıdaki kodu ele alalım:</p>
<pre>public class deneme{</pre>
<pre>  final int x;</pre>
<pre>  public deneme(int x){</pre>
<pre>   this.x = x;</pre>
<pre>  }</pre>
<pre>}</pre>
<p>Yukarıdaki kod doğru ve çalışan bir koddur çünkü değişkene sadece bir kere, <a href="http://www.bilgisayarkavramlari.com/2008/11/24/yapici-constructor/">yapıcı fonksiyon marifetiyle (constructor, inşa fonksiyonu</a>) atama yapılmıştır. Buna karşılık aşağıdaki kod hatalıdır:</p>
<pre>public class deneme{</pre>
<pre>  const int x;</pre>
<pre>  public deneme(int x){</pre>
<pre>   this.x = x;</pre>
<pre>  }</pre>
<pre>}</pre>
<p>Çünkü yukarıdaki kodda, değişkenin tanımı sırasında değer atanması yapılması gerekir. Örneğin</p>
<pre>const int x = 10;</pre>
<p>gibi ve bu atamadan sonra değer değiştirilemez. Örneğin yukarıdaki kodda bulunan final kelimesinin const kelimesi ile değişmesi halinde, <a href="http://www.bilgisayarkavramlari.com/2008/11/24/yapici-constructor/">yapıcı fonksiyonda (constructor)</a> hala hata bulunmaktadır çünkü sabit bir değişkenin değeri değiştirilmeye çalışılmaktadır.</p>

<p class="sayac_bilgi">212 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/03/31/java-da-nihai-uygulmasi-final/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JAVA dilinde çoklu kalıtım (miras)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/03/22/java-dilinde-coklu-kalitim-miras/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/03/22/java-dilinde-coklu-kalitim-miras/#comments</comments>
		<pubDate>Tue, 22 Mar 2011 14:06:36 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[Nesne Yönelimli Programlama]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/03/22/java-dilinde-coklu-kalitim-miras/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu yazının amacı, JAVA programlama dilinde bir sınıfın, birden fazla sınıftan nasıl miras aldığını anlatmaktır. Temel olarak JAVA dilinde doğrudan çoklu kalıtım (multiple inheritance) bulunmaz. Yani aşağıdaki gibi bir kod hatalıdır: public class bilgisayar_mühendisliğ_öğrencisi extends sayısal_öğrenci, üniversite_öğrencisi{ } Yukarıdaki tanıma göre bir bilgisayar mühendisliği öğrencisi hem üniversite öğrencisidir hem de [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bu yazının amacı, JAVA programlama dilinde bir sınıfın, birden fazla sınıftan nasıl miras aldığını anlatmaktır. Temel olarak <a href="http://www.bilgisayarkavramlari.com/2007/04/14/java-programlama-dili/">JAVA dilinde</a> doğrudan <a href="http://www.bilgisayarkavramlari.com/2007/04/14/inheritance-nesneler-arasi-miras-iliskisi/">çoklu kalıtım (multiple inheritance)</a> bulunmaz. Yani aşağıdaki gibi bir kod hatalıdır:</p>
<p>public class bilgisayar_mühendisliğ_öğrencisi extends sayısal_öğrenci, üniversite_öğrencisi{</p>
<p>}</p>
<p>Yukarıdaki tanıma göre bir bilgisayar mühendisliği öğrencisi hem üniversite öğrencisidir hem de sayısal bölüm öğrencisidir. Ancak JAVA, yukarıdaki bu tanıma izin vermez ve extends kelimesinden sonra sadece tek bir sınıf ismi yazılmasına izin verir.</p>
<p>Buna rağmen, JAVA programlama dilinde <a href="http://www.bilgisayarkavramlari.com/2008/11/22/arayuz-interface/">arayüz kullanarak (interface)</a> bir sınıfın birden fazla sınıftan miras almasını sağlayabiliriz.</p>
<p>Çoklu mirasa geçmeden önce tek bir sınıfı, arayüz kullanarak nasıl miras aldığımızı görelim ardından birden fazla sınıf için bu yöntemi geliştirelim.</p>
<p>interface sayısal_öğrencisi_olma_şartı{</p>
<p>public void analitik_düşünmek();</p>
<p>}</p>
<p>Yukarıda bir sayısal öğrencisi olma şartı arayüzü tanımlanmıştır. Bu arayüz, herhangi bir sınıf tarafından uygulanırsa (implements) bu sınıfın analitik_düşünmek şeklinde bir fonksiyonu bulunması gerekir.</p>
<p>Şimdi bir bilgisayar mühendisliği öğrencisinin bu şartı sağladığını JAVA dilinde modelleyelim:</p>
<p>Public class bilgisayar_mühendisliği_öğrencisi implements sayısal_öğrencisi_olma_şartı{</p>
<p>public void analitik_düşünmek(){</p>
<p>// fonksiyon içeriği…</p>
<p>}</p>
<p>}</p>
<p>Yukarıda kodda görüldüğü üzere, uygulama şartı olarak (implements) arayüzde bulunan fonksiyonun içeriği yazılmıştır. Bu kodlamadan sonra artık bilgisayar mühendisliği öğrencisinin, sayısal öğrencisi olma şartını sağladığını söyleyebiliriz.</p>
<p>Şimdi bilgisayar mühendisliğindeki öğrencileri sayısal öğrencisi olarak tanıtabiliriz:</p>
<p>public class sayısal_öğrencisi {</p>
<p>double ortalaması;</p>
<p>public sayisal_öğrencisi( sayısal_öğrencisi_olma_şartı s){</p>
<p>s.analitik_düşünmek();</p>
<p>}</p>
<p>}</p>
<p>public class bilgisayar_mühendisliği_öğrencisi implements sayısal_öğrencisi_olma_şartı{</p>
<p>public void analitik_düşünmek(){</p>
<p>System.out.println(&#8220;düşünüyorum….&#8221;);</p>
<p>}</p>
<p>}</p>
<p>public class test{</p>
<p>public static void main(String args[]){</p>
<p>sayısal_öğrencisi ali = new sayısal_öğrencisi( new bilgisayar_mühendisliği_öğrencisi());</p>
<p>}</p>
<p>}</p>
<p>Yukarıdaki kod sonucunda ekranda, &#8220;düşünüyorum….&#8221; yazısı belirir. Bunun anlamı, ali isimli sayısal öğrencisinin, düşünmek isminde bir fonksiyonu olmasıdır.</p>
<p>Yazının başında da belirtildiği gibi JAVA doğrudan bir kalıtım ilişkisini desteklemez. Ancak yukarıdaki şekilde sınıflar arasında bir arayüz tanımlayarak bu iki sınıf arasında kalıtım ilişkisi kurulabilir.</p>
<p>Yukarıdaki kodda, yapılan eylem iki farklı yanlış anlaşılmaya açıktır. Genelde sık yapılan bu hataları aşağıda anlatmaya çalışalım.</p>
<p>1. Kalıtım değildir.</p>
<ol></ol>
<p>Yukarıdaki kod modeli, tam olarak kalıtım değildir. Sadece fonksiyonlar üzerinde tanımlıdır. Örneğin <a href="http://www.bilgisayarkavramlari.com/2008/11/22/arayuz-interface/">arayüzler (interface)</a> üzerinde değişken tanımlanamaz.</p>
<p>2. HASA ve ISA arasındaki fark.</p>
<ol></ol>
<p>HASA ilişki modeli ile bir nesnenin diğer bir nesneyi içermesi, ISA ilişki modelinden farklıdır.</p>
<p>Bu durumu aşağıdaki şekil üzerinden açıklamaya çalışalım. Örneğin aralarında ISA ilişkisi bulunan iki sınıfı ele alalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/032211_1406_JAVAdilinde1.png" alt="" /></p>
<p>Bu çizimi bir küme modeli ile modellemek istersek aşağıdaki şekilde bir sonuç çıkar:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/032211_1406_JAVAdilinde2.png" alt="" /></p>
<p>Yukarıdaki model, nesne varlığı açısından kurulmuştur. Bu modele göre, insan, öğrenci&#8217;nin bir alt sınıfıdır. Yani öğrenci, insanda olan bütün özellikleri ve eylemleri kapsar ilave olarak kendisine özgü bazı özellikleri de bulunabilir. ( bu modelleme aslında çok sağlıklı değildir çünkü genelde kavram-varlığı açısından karmaşaya sebep olur. Modele kavram-varlığı açısından bakılırsa aslında öğrenci, insanın bir alt kümesidir ve insan kümesinde farklı varlıklar da vardır (örneğin öğrenci olmayan diğer insanlar) ancak yukarıdaki model tekrar ediyorum nesne-varlığı açısından çizilmiştir).</p>
<p>Yukarıdaki modeli elde etmenin birinci yolu <a href="http://www.bilgisayarkavramlari.com/2007/04/14/inheritance-nesneler-arasi-miras-iliskisi/">miras ilişkisi kurmaktır (kalıtım inheritance)</a> diğer yolu ise HASA ilişkisi tanımlamaktır.</p>
<p>public class öğrenci extends insan{</p>
<p>}</p>
<p>Şeklindeki bir tanım, insan sınıfındaki bütün tanımları otomatik olarak öğrenci sınıfına taşıyacak ve ardından yukarıda çizilen küme modelini gerçekleyecektir.</p>
<p>public class öğrenci{</p>
<p>insan a;</p>
<p>}</p>
<p>Ancak bu gerçekleme bir kalıtım ilişkisi olarak kabul edilemez. Bu gerçeklemede aslında iki farklı varlık vardır ve bu varlıklar arasında var oluştan kaynaklanan bir fark yoktur.</p>
<p>public class test{</p>
<p>public static void main(String args[]){</p>
<p>insan ali = new insan();</p>
<p>öğrenci veli = new öğrenci();</p>
<p>veli.a= ali;</p>
<p>}</p>
<p>Yukarıdaki bu model sonucunda, ali, velinin bir alt kümesi halini alır ancak buradaki ali&#8217;nin varlığı ile veli&#8217;nin varlığı arasında bağlayıcılık yoktur. Örneğin veli nesnesi (object) yok edilmesi sonucunda ali yaşamına devam edebilir. Bu tip ilişkilere <a href="http://www.bilgisayarkavramlari.com/2008/12/20/birliktelik-munasebet-ve-olusum-association-aggregation-and-composition/">münasebet (aggregation)</a> ismi verilmektedir ve yukarıdaki yazıda anlatılan arayüz marifetiyle kalıtımdan tamamen farklı bir yapıdadır.</p>

<p class="sayac_bilgi">581 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/03/22/java-dilinde-coklu-kalitim-miras/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nesne Akışı (Casting)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/03/19/nesne-akisi-casting/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/03/19/nesne-akisi-casting/#comments</comments>
		<pubDate>Sat, 19 Mar 2011 01:39:44 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[Nesne Yönelimli Programlama]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/03/19/nesne-akisi-casting/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Nesne yönelimli programlama dillerinde, sınıflar (class) arasında miras ilişkisi bulunması halinde (inheritance), bu sınıflardan türetilen nesnelerin birbirine akıtılması durumudur. Bu durumu aşağıdaki örnekler üzerinden anlamaya çalışalım: public class insan{ int boy; int kilo; } public class öğrenci extends insan{ int sınıf; String bölüm; } Örnek olarak verilen yukarıdaki iki sınıf [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Nesne yönelimli programlama dillerinde, <a href="http://www.bilgisayarkavramlari.com/2008/07/15/sinif-class/">sınıflar (class)</a> arasında <a href="http://www.bilgisayarkavramlari.com/2007/04/14/inheritance-nesneler-arasi-miras-iliskisi/">miras ilişkisi bulunması halinde (inheritance),</a> bu sınıflardan türetilen nesnelerin birbirine akıtılması durumudur.
</p>
<p>Bu durumu aşağıdaki örnekler üzerinden anlamaya çalışalım:</p>
<pre>
public class insan{
   int boy;
   int kilo;
}
public class öğrenci extends insan{
   int sınıf;
   String bölüm;
}
</pre>
</p>
<p>Örnek olarak verilen yukarıdaki iki sınıf arasında miras ilişkisi bulunmaktadır ve insan sınıfı, öğrenci sınıfının atası olarak kabul edilebilir.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/031911_0139_NesneAkCa1.png" alt=""/>
	</p>
<p>Şimdi bu sınıflardan birer nesne tanımlayarak akış işlemini göstermeye çalışalım:</p>
<pre>
public class test{
   public static void main(String args[]){
      öğrenci ali = new öğrenci();
      insan veli = new insan();
      ali= veli;
      veli = new öğrenci();
   }
}
</pre>
</p>
<p>Yukarıdaki kodun son iki satırında bulunan atama işlemleri birer akış işlemidir (casting) ve ali=veli atamasında, öğrenci tipinden bir nesne atfına, insan sınıfından bir nesne konulduğu için bu akışa, aşağı akış (down casting) ismi verilir.
</p>
<p>Bu akışın tam ters yönlüsü olan ve son satırda yer alan atamada ise veli isimli insan tipinden bir nesne atıfının içerisine öğrenci sınıfından bir nesne yerleştirilmektedir. Bu durum ise yukarı akış (up casting) olarak isimlendirilmektedir.
</p>
<p>Klasik olarak nesne yönelimli programlama dillerinde aşağı akış (downcasting) yapılması halinde, nesnenin bütün bilgilerine erişilebilirken, yukarı akış (upcasting) yapılması durumunda nesnenin sadece nesne atfının üyeleri kadar bilgisine erişilebilir. Örneğin yukarıdaki kod için veli isimli değişken, insan tipinde olduğu için, öğrencinin boy ve kilosuna erişebilirken, öğrencinin sınıfı veya bölümüne erişemez. Bu bilgiler daha önceden atanmışsa hafızada durur ama erişilemez. Tekrar öğrenci tipinde bir nesne atıfı tarafından karşılanması durumunda bu bilgilere erişilebilir. Örneği yukarıdaki kodun sonuna aşağıdaki satır eklenseydi:
</p>
<p>ali = veli;
</p>
<p>Bu durumda veli tarafından atıfta bulunulan öğrenci, kendi tipinden bir nesne atıfı tarafından gösterilecek ve veli tarafından erişilemeyen değerlere erişilebilecekti.
</p>
<p>Atama işlemleri sırasında unutulmaması gereken bir husus da, <a href="http://www.bilgisayarkavramlari.com/2008/11/24/tip-inkilabi-tip-donusturme-type-casting/">tip inkılabında olduğu gibi (type casting)</a> aşağı akış sırasında (downcasting) mutlaka tip dönüşümü yapılması gerektiğidir. Örneğin yukarıdaki kodda bulunan bu satır JAVA dili açısından hatalıdır:
</p>
<p>ali= veli;
</p>
<p>Ancak bunun tam tersi atama hatalı değildir:
</p>
<p>veli = ali;
</p>
<p>Yukarıdaki hatalı olan atamayı düzeltmek için tip dönüşümü yapılabilir:
</p>
<p>ali = (öğrenci) veli;
</p>
<p>şeklinde.</p>

<p class="sayac_bilgi">179 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/03/19/nesne-akisi-casting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nesne Kopyalama</title>
		<link>http://www.bilgisayarkavramlari.com/2011/03/19/nesne-kopyalama/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/03/19/nesne-kopyalama/#comments</comments>
		<pubDate>Sat, 19 Mar 2011 00:14:40 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[Nesne Yönelimli Programlama]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/03/19/nesne-kopyalama/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu yazının amacı, nesne yönelimli programlama ortamlarında (object oriented programming) kullanılan iki temel kopyalama işlemini anlatmaktır. Literatürde bir nesnenin kopyalanması için geçen iki terim bulunur: Sığ kopyalama (shallow copying) Derin kopyalama (deep copying) Sığ kopyalama basitçe bir nesnenin referansını gösteren nesne atfının, farklı bir nesne atfına atanmasıdır. Örneğin aşağıdaki kodu [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bu yazının amacı, nesne yönelimli programlama ortamlarında (object oriented programming) kullanılan iki temel kopyalama işlemini anlatmaktır.</p>
<p>Literatürde bir nesnenin kopyalanması için geçen iki terim bulunur:</p>
<ul>
<li>Sığ kopyalama (shallow copying)</li>
<li>Derin kopyalama (deep copying)</li>
</ul>
<p>Sığ kopyalama basitçe <a href="http://www.bilgisayarkavramlari.com/2007/05/03/pointer-gosterici/">bir nesnenin referansını gösteren nesne atfının</a>, farklı bir nesne atfına atanmasıdır. Örneğin aşağıdaki kodu inceleyelim :</p>
<pre>
public class kedi{

   int boy;

   int kilo;

}

public class test{

   public static void main(String args[]){

      kedi tekir = new kedi();

      tekir.boy = 40;

      tekir.kilo=6;

      kedi mırnav = new kedi();

      mırnav = tekir;

}
</pre>
<p>Yukarıdaki kodun son satırında bulunan mırnav = tekir; ataması (Assignment) yapılmadan önce hafızdaki (RAM) durum aşağıdaki şekildedir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/031911_0014_NesneKopyal1.png" alt="" /></p>
<p>İlgili atama satırı çalıştıktan sonra mırnav ile tekir aynı adresi göstermeye başlar:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/031911_0014_NesneKopyal2.png" alt="" /></p>
<p>Yukarıdaki bu atamaya sığ atama (shallow copying) ismi verilir çünkü hafızada iki <a href="http://www.bilgisayarkavramlari.com/2007/05/03/pointer-gosterici/">nesne atıfı</a> tarafından da aynı nesne gösterilmektedir ve birisinde yapılan değişiklik diğerini etkiler. Örneğin aşağıdaki satırı ele alalım:</p>
<p>mırnav.boy = 35</p>
<p>Bu satırdan sonra tekir isimli nesne atfının da boy üyesi 35 değerine sahip olmaktadır.</p>
<p>Peki, atamadan önceki mirnav tarafından gösterilen ve henüz değerleri bulunmayan nesne ne olur? Sonuçta bu nesnenin içerisindeki üyelere (members) değer konulmamış olsa da (boy ve kilo değeri verilmemiştir), new operatörü ile tanımlanmış bir hafız alanı söz konusudur ve bu alan hafızada yer kaplar. Sorunun cevabı programlama diline göre değişir. Örneğin java için garbage collector isimli bir işlem devreye girerek bu alanı temizler. C++ dilinde ise bu alan uzayda kaybolur (lost in space) ve C++ programcılarının bu tip hatalara karşı dikkatli olması ve free() fonksiyonunu kullanarak hafızadan kaldırması gerekir.</p>
<p>Gelelim derin kopyalamaya (deep copying)</p>
<p>Bu durumu da aynı sınıf tanımı üzerinden (kedi sınıfı) aşağıdaki kod ile anlamaya çalışalım:</p>
<pre>
public class kedi{

   int boy;

   int kilo;

   public void kopyala(kedi x){

      this.boy = x.boy;

      this.kilo= x.kilo;

   }

}

public class test{

   public static void main(String args[]){

      kedi tekir = new kedi();

      tekir.boy = 40;

      tekir.kilo=6;

      kedi mırnav = new kedi();

      mirnav.kopyala(tekir);

   }
}
</pre><br />
Yukarıdaki kopyala satırı, parametre olarak aldığı, kedi sınıfından bir nesnenin içeriğini kendisine kopyalar. Örneğimizdeki mirnav nesnesi, tekir nesnesinin içeriğini kendisine kopyalamıştır.</p>
<p>Yukarıdaki bu işlemin hafızdaki (RAM) görüntüsü ise aşağıdaki temsili resimde verilmiştir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/031911_0014_NesneKopyal3.png" alt="" /></p>
<p>Yukarıda gösterilen derin kopyalama işleminin bir benzerini yapmak için <a href="http://www.bilgisayarkavramlari.com/2008/11/24/yapici-constructor/">yapıcı fonksiyonlardan (constructor function, inşa fonksiyonu)</a> faydalanılabilir. Bunun için aşağıdaki kodda olduğu gibi bir yapıcı fonksiyon tanımlamak yeterlidir.<br />
<PRE>
public class kedi{

   int boy;

   int kilo;

   public kedi(kedi x){

      this.boy =x. boy;

      this.kilo= x.kilo;

   }

}

public class test{

   public static void main(String args[]){

      kedi tekir = new kedi();

      tekir.boy = 40;

      tekir.kilo=6;

      kedi mırnav = new kedi(tekir);
   }
}

</pre><br />
Yukarıdaki kodda bulunan bu yapıcı fonksiyona ayrıca özel olarak kopyalama yapıcısı (copy constructor) ismi de verilmektedir.</p>

<p class="sayac_bilgi">245 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/03/19/nesne-kopyalama/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nesne Yönelimli Programlama Dersi Quiz Çözümü</title>
		<link>http://www.bilgisayarkavramlari.com/2010/12/07/nesne-yonelimli-programlama-dersi-quiz-cozumu/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/12/07/nesne-yonelimli-programlama-dersi-quiz-cozumu/#comments</comments>
		<pubDate>Tue, 07 Dec 2010 09:31:45 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Kod Örnekleri]]></category>
		<category><![CDATA[Nesne Yönelimli Programlama]]></category>
		<category><![CDATA[Sınavlar]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/12/07/nesne-yonelimli-programlama-dersi-quiz-cozumu/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Quiz soruları ve çözümleri aşağıdaki şekildedir: Bir oylama için program yazmanız isteniyor. Oylamaya katılan 5 aday bulunuyor ve bu adayların numarası (1&#8242;den 5&#8242;e kadar bir sayı) oy pusulasına yazılarak oy kullanılıyor. Programınızda 10 adet oyu okuyup ekrana adayların aldıkları oy miktarını basan bir program yazınız. Kullanılan oyun 1-5 arasında olmaması [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Quiz soruları ve çözümleri aşağıdaki şekildedir:</p>
<ol>
<li>Bir oylama için program yazmanız isteniyor. Oylamaya katılan 5 aday bulunuyor ve bu adayların numarası (1&#8242;den 5&#8242;e kadar bir sayı) oy pusulasına yazılarak oy kullanılıyor. Programınızda 10 adet oyu okuyup ekrana adayların aldıkları oy miktarını basan bir program yazınız. Kullanılan oyun 1-5 arasında olmaması halinde problemi istisna yakalama ile çözünüz.</li>
</ol>
<p><strong>Çözüm<br />
</strong></p>
<p>Oylama programında basitçe her oyun tutulduğu bir oy pusulası ve bir de oy verilen adaylar olacağını düşünebiliriz. Bu durumda oy pusulası ve aday isimli iki adet sınıf tanımlayıp bu sınıfların kodlamasını aşağıdaki şekilde yapabiliriz.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/120710_0931_NesneYnelim1.png" alt="" /></p>
<p>Yukarıdaki kodda, aday bilgisi tutuluyor. Programımızda olması gereken bilgi, adayın numarası ve oy sayısıdır. Biz de bu bilgileri tutan iki adet değişken tanımlıyor ve bu değişkenlerin getter/Setter fonksiyonlarını kodluyoruz. Ayrıca sınıfın <a href="http://www.bilgisayarkavramlari.com/2008/11/24/yapici-constructor/">inşa fonksiyonunda (constructor),</a> başlangıç olarak oy sayısını 0 yapıyoruz. Son olarak adayların oy sayısını arttıran bir metot yukarıdaki kodun sonunda yer almaktadır. Basit bir arttırma işlemidir.</p>
<p>Oy pusulasını tutan kod ise aşağıdaki şekilde kodlanmıştır:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/120710_0931_NesneYnelim2.png" alt="" /></p>
<p>Yukarıdaki kodda, görüldüğü üzere, oy pusulasında sadece kime oy verildiği bilgisi tutulmuştur. Bu bilgiyi <a href="http://www.bilgisayarkavramlari.com/2010/10/25/c-dili-ile-kapsulleme-encapsulation/">kapsülleme gereği getter ve setter fonksiyonları</a> ile erişilebilir halde sınıfta kodluyoruz.</p>
<p>Son olarak kodumuzu test etmek için bir main fonksiyonu yazalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/120710_0931_NesneYnelim3.png" alt="" /></p>
<p>Oy okuma işlemi için &#8220;oyoku&#8221; isimli fonksiyon yazılmıştır. Bu fonksiyonun özelliği, oyları okurken yanlış bir oy girilmesi durumunda, (oyların 1 ile 5 arasında olacağını hatırlayınız) bir istisna fırlatmasıdır. Bu istisna, try bloğu içerisinden çağrıldığı yerde yakalanır ve kodun 27nci satırında bulunan catch bloğu ile ekrana bir hata mesajı basılır. Şayet oy başarılı bir şekilde okunabilirse, bu durumda ilgili oy pusulasına (ki toplam 10 adet pusula bulunuyor) oy değeri kaydedilir. Şayet bir istisna burada oluşmamışsa kodun 25. Satırına geçebiliriz. İstisna oluşması durumunda kodun 25. Satırı hiç çalışmadan catch bloğuna gidilir.</p>
<p>Kodumuzun 25. satırında, adayların tutulduğu nesne dizisinin (object array) ilgili elemanının (hangi elemana oy verildiyse) oy miktarını 1 arttıran oysayisiniArttir() fonksiyonu çağrılır.</p>
<p>Son olarak kodun 31-33 satırları arasında, adayların oy durumları ekrana basılır.</p>
<p>Yukarıdaki kodda bulunan ve kendi istisnamız olan hatalioy sınıfını aşağıdaki şekilde kodlayabiliriz:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/120710_0931_NesneYnelim4.png" alt="" /></p>
<ol>
<li>
<div>Bir banka yazılımı için aşağıdaki özelliklerle program yazmanız isteniyor.  Sistemde tutulacak veriler:</div>
<ol>
<li>Hesap sahibinin ismi</li>
<li>Hesap numarası</li>
<li>Bakiye</li>
<li>Hesap tipi (vadeli / vadesiz)</li>
</ol>
</li>
</ol>
<p>Yukarıdaki hesap bilgileri için aşağıdaki işlemleri yapmanız isteniyor:</p>
<ol style="margin-left: 72pt;">
<li>Hesapların ilk değer olarak bakiyesinin 0 atanması gerekir.</li>
<li>Hesaba para yatırılabilir</li>
<li>Hesaptan para çekilebilir</li>
<li>Hesap bilgisi görüntülenebilir (sahibinin ismi, numarası, tipi ve bakiyesi)</li>
</ol>
<ol>
<li>2. Sorudaki programınızı, 10 müşteriye hizmet verebilecek şekilde genişletin.</li>
<li>2. Sorudaki programınızı, hesap hareketleri görüntülenecek şekilde genişletin. Buna göre bir hesap hareketinin, tarihi, saati, miktarı ve hesap numarası bulunur.</li>
</ol>
<p><strong>Çözüm:<br />
</strong></p>
<p>Yukarıdaki sorunun çözümü için basitçe bir hesap nesnesi oluşturmamız yeterli olacaktır. Yukarıdaki 4. soru için hesap hareketlerini tutan ilave bir sınıfa daha ihtiyacımız olacak. Öncelikle, hesapların tutulduğu bir hesap sınıfını programlayarak başlayalım.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/120710_0931_NesneYnelim5.png" alt="" /></p>
<p>Soruda tanımlandığı üzere, her hesap için hesapno, bakiye , hesap tipi ve hesap sahibi bilgilerini tutuyoruz. Ayrıca hesap hareketlerinden oluşan ilave bir dizi, her hareketi ayrıca kayıt altına alıyor.</p>
<p>Hesap sınıfımızın constructor fonksiyonunda, hesap bakiyesini 0 olarak atıyoruz.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/120710_0931_NesneYnelim6.png" alt="" /></p>
<p>Ayrıca sınıfımızdaki hesap hareketlerini tutan dizinin kaçıncı elemanında olduğumuz bilgisi, hhsayisi isimli değişkende durmaktadır. Bu değişken de henüz hesap hareketi olmadığı için 0 olarak atanıyor.</p>
<p>Sırasıyla hesap sınıfındaki metotların kodlamasını inceleyelim:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/120710_0931_NesneYnelim7.png" alt="" /></p>
<p>Yukarıda, hesap detaylarını ekrana basan fonksiyon verilmiştir. Fonksiyondaki 21nci satırda bulunan cout komutu ile ekrana hesabın temel 3 bilgisi bastırılmıştır. Ardında hesabın tipi yazıya çevrilerek bastırılmıştır. Hesap tipini tutmak için kullanılan int tipi, kullanıcı açısından anlamsız olabilir o yüzden yazıya çevirme işlemi yapılır.</p>
<p>Son olarak 27-30 satırları arasında, hesap hareketlerini bastırmak için, mevcut hesap hareketi sayısını tutan değişken kadar dönen döngü içerisinde her hesap hareketinin miktarı basılmaktadır.</p>
<p>Bu çıktının örneği aşağıda verilmiştir.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/120710_0931_NesneYnelim8.png" alt="" /></p>
<p>Yukarıdaki ekran görüntüsünde, örnek olarak bir hesabın detayları basılmış ve bu hesapta yapılan hesap hareketleri altında gösterilmiştir.</p>
<p>Hesap hareketi olarak kabul edilebilecek iki temel işlem para çekmek ve para yatırmak işlemleridir. Bunların kodlamasını aşağıda anlatalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/120710_0931_NesneYnelim9.png" alt="" /></p>
<p>Para çekme işlemi, belirtilen miktar kadar bakiyeyi azaltmamaktadır. Bu işlem sırasında öncelikle miktarın yeterli olup olmadığı kontrol edilir. Şayet miktar yeterli bulunursa bakiye azaltılır, şayet yeterli bulunmazsa bu durumda bir istisna (exception) fırlatılır. Burada fırlatılan istisna, proje kapsamında bizim tanımladığımız yetersizBakiye istisnasıdır.</p>
<p>Yetersi bakiye istisnası, basit bir şekilde bakiye bilgisini de içinde saklayan bir sınıf (class) olarak tasarlanabilir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/120710_0931_NesneYnelim10.png" alt="" /></p>
<p>Hesap hareketlerinin içerisine, ayrıca miktar konulurken -1 değeri ile çarpılmaktadır. Bunun anlamı, hesap hareketinin eksi değer olarak tutulmasıdır.</p>
<p>Benzer kodlama, para yatırma fonksiyonunda da kullanılmaktadır. Yatırılan miktar, hesap hareketlerine işlendikten sonra, bakiye değeri parametre olarak verilen miktar kadar arttırılmaktadır.</p>
<p>Hesap hareketlerinin detayı için sınıf kodlamasını aşağıdaki şekilde yazabiliriz:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/120710_0931_NesneYnelim11.png" alt="" /></p>
<p>Bu sınıf, basit bir şekilde hesapta yapılan işlemleri tutmak için tasarlanmıştır. İlgili üyelerin getter / setter fonksiyonlarının yazılması yeterlidir.</p>
<p><a href="http://www.bilgisayarkavramlari.com/wp-content/uploads/quizcozum.rar">Quiz sorularının kodlarını indirmek için tıklayınız.</a></p>

<p class="sayac_bilgi">438 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/12/07/nesne-yonelimli-programlama-dersi-quiz-cozumu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++ dilinde üzerine bindirme</title>
		<link>http://www.bilgisayarkavramlari.com/2010/10/11/c-dilinde-uzerine-bindirme/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/10/11/c-dilinde-uzerine-bindirme/#comments</comments>
		<pubDate>Mon, 11 Oct 2010 05:08:39 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Nesne Yönelimli Programlama]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>
		<category><![CDATA[overriding]]></category>
		<category><![CDATA[virtual function]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/10/11/c-dilinde-uzerine-bindirme/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu yazının amacı, C++ dili için fonksiyon üzerine bindirme (function overriding veya method overriding) konusunu açıklamaktır. Üzerine bindirme işlemi, basitçe aralarında miras (inheritance) ilişkisi bulunan iki sınıf için kullanılabilir. C++ dilindeki, nesneler arasında kurulan bu ilişki modeli hakkında daha detaylı bilgi için, bu bağlantıya tıklayabilirsiniz. Öncelikle iki sınıf tanımlayıp bu [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bu yazının amacı, C++ dili için fonksiyon üzerine bindirme (function overriding veya method overriding) konusunu açıklamaktır.</p>
<p>Üzerine bindirme işlemi, basitçe <a href="http://www.bilgisayarkavramlari.com/2007/04/14/inheritance-nesneler-arasi-miras-iliskisi/">aralarında miras (inheritance) ilişkisi bulunan iki sınıf</a> için kullanılabilir. C++ dilindeki, nesneler arasında kurulan bu ilişki modeli hakkında daha detaylı bilgi için, bu bağlantıya tıklayabilirsiniz.</p>
<p>Öncelikle iki sınıf tanımlayıp bu iki sınıf arasında miras ilişkisi kurulmalıdır. Bu miras ilişkisinden sonra, sınıflardan birisi, diğerine bazı fonksiyonlarını miras bırakacaktır. İşte fonksiyon üzerine bindirme de tam olarak burada devreye girer. Şayet miras alınan fonksiyonlar alt sınıfta yeniden tanımlanmak isteniyorsa, bu duruma üzerine bindirme (overriding) ismi verilir.</p>
<p>Örneğin, dikdörtgen olarak tanımlı bir sınıfımız bulunsun.</p>
<pre>class dikdortgen{</pre>
<pre>public:</pre>
<pre>   int x,y;</pre>
<pre>   int boy,en;</pre>
<pre>public:</pre>
<pre>   int alan();</pre>
<pre>};</pre>
<pre>int dikdortgen::alan(){</pre>
<pre>   return en *boy;</pre>
<pre>}</pre>
<p>Yukarıdaki bu tanıma uyan diğer bir iki boyutlu şekil ise, kare&#8217;dir. Bilindiği üzere kare kenarları birbirine eşit bir dikdörtgendir. O halde kare sınıfını aşağıdaki şekilde tanımlayabiliriz.</p>
<pre>class kare:public dikdörtgen{ // kare sınıfı, dikdörtgen sınıfından miras alır.</pre>
<pre>public:</pre>
<pre>   int alan();</pre>
<pre>};</pre>
<pre>kare::alan(){</pre>
<pre>   return en * en ;</pre>
<pre>}
};</pre>
<p>Yukarıdaki kare sınıfında görüldüğü üzere, her kare&#8217;nin zaten sahip olduğu x,y koordinatları ve en, boy bilgisi yeniden kodlanmamış bu bilgiler miras ile alınmıştır. Alan hesaplamak için yazılan alan() fonksiyonu ise, yeniden yazılmıştır. Bunun sebebi kare sınıfında sadece tek kenar bilgisinin yeterli olması ve bu durumda alan hesabının değişmesidir.</p>
<p>Şayet kare sınıfı için, yeniden alan fonksiyonu yazılmasaydı, dikdörtgen sınıfının alan fonksiyonunu kullanabilirdi. Ancak buradaki yeniden yazılan aynı isme ve parametrelere sahip olan alan fonksiyonu, üzerine yükleme işlemi yapmıştır (overriding).</p>
<p><strong>Yukarı Atamak (Upcasting)<br />
</strong></p>
<p>Miras ilişkisi içerisinde bulunan iki sınıftan tanımlanan iki nesne arasında atama yapılabilir. Örneğin yukarıdaki kodu ele alalım ve bu kodla oluşan sınıf diyagramını çizmeye çalışalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/101110_0508_Cdilindeze1.png" alt="" /></p>
<p>Yukarıdaki bu çizimden anlaşılacağı üzere, her kare bir dikdörtgendir ifadesi kullanılabilir. Bu ifade aynı zamanda dikdörtgen sınıfının, kare sınıfının atası olduğu, veya kare sınıfının, dikdörtgen sınıfının bir çocuğu olduğu şeklinde de yorumlanabilir.</p>
<p>Yukarıdaki bu ilişki şeklinde, bizim için dikdörtgen sınıfı üst, kare sınıfı ise alt sınıf olarak kabul edilebilir. Bu durumda kare sınıfından bir nesnenin, dikdörtgen sınıfından bir nesneye atanmasına upcasting ismi verilir. Burada nesne olduğu gibi kalmakta ancak <a href="http://www.bilgisayarkavramlari.com/2010/10/04/ornek-c-sinif-iliskileri/">nesne göstericisi (object referrer)</a> farklı bir sınıftan olmaktadır. Bu işlemin kod olarak karşılığı aşağıdaki şekildedir:</p>
<p>dikdörtgen *d = new kare();</p>
<p>Görüldüğü üzere kare sınıfından tanımlanan bir nesne, dikdörtgen sınıfından bir nesne göstericisi tarafından gösterilmiştir. Bu kullanım, tip belirsizliği yaşanan durumlarda sıklıkla konu olur. Örneğin kodlamak istediğimiz fonksiyon, bir parametre olarak dikdörtgen alıyor ve bu dikdörtgenin orjine (merkez 0,0 noktasına) uzaklığını ölçüyor olsun. Bu durumda fonksiyonumuz aşağıdaki şekilde olabilir:</p>
<pre>int mesafe(dikdörtgen *d){</pre>
<pre>   return sqrt(x*x+y*y);</pre>
<pre>}</pre>
<p>Yukarıdaki bu fonksiyon, her türlü dikdörtgeni kabul etmektedir. O halde bu fonksiyona bir dikdörtgen nesnesi veya bir kare nesnesi, parametre olarak verilebilir.</p>
<p>Upcasting işlemi, sanal fonksiyonların kullanımı açısından önem taşır.</p>
<p><strong>Sanal Fonksiyonlar (Virtual Functions)<br />
</strong></p>
<p>Yukarı atama işlemi sırasında yaşanan bir problem, yukarı yükleme işlemi sonrasında, nesnenin bir fonksiyonu çağırıldığında, ata sınıfından mı çocuk sınıfından mı fonksiyonun çalışacağıdır.</p>
<p>Örneğin, yukarıdaki miras konusunu ele alalım. Dikdörtgen sınıfından bir nesne göstericisinin içerisine, kare sınıfından bir nesne atanmıştır. Şimdi bu atamadan sonra</p>
<pre>d-&gt;alan();</pre>
<p>şeklinde bir fonksiyon çağırımı yapılırsa, acaba kare sınıfının mı, dikdörtgen sınıfının mı alan fonksiyonu çalışacaktır?</p>
<p>Herhangi özel bir durum olmaksızın, yukarıda yazdığımız kodlar için, d-&gt;alan() çağrımı, ata sınıfında (base class, ancestor, parent) olan alan fonksiyonunu çalıştıracaktır.</p>
<p>Peki acaba çocuk sınıftaki alan fonksiyonun çalışmasını isteseydik kodu nasıl değiştirmemiz gerekirdi?</p>
<p>Sınıf tanımı sırasında, ata sınıfta bulunan fonksiyonu tanımlarken başına virutal eklenmesi, bu sınıfın ileride bir şekilde üzerine yükleme yapıldığında (override), ve ayrıca yukarı atama yapıldığında (upcasting), üzerine yükleme yapılan fonksiyon tarafından çalıştırılacağıdır.</p>
<p>Örnek olarak yukarıdaki sınıf tanımını aşağıdaki şekilde değiştirirsek,</p>
<pre>class dikdortgen{</pre>
<pre>public:</pre>
<pre>   int x,y;</pre>
<pre>   int boy,en;</pre>
<pre>public:</pre>
<pre>virtual int alan(){</pre>
<pre>   return en*boy;</pre>
<pre>}</pre>
<pre>};</pre>
<p>Bu yeni tanımdan sonra yukarı atama yapılırsa,</p>
<pre>dikdörtgen *d = new kare();</pre>
<p>artık d göstericisinin alan fonksiyonu çağırıldığında,</p>
<pre>d-&gt;alan();</pre>
<p>çalışacak olan alan fonksiyonu, kare sınıfındaki alan fonksiyonudur. Çünkü dikdörtgen sınıfında bulunan alan fonksiyonu sanal bir fonksiyondur (virtual function).</p>

<p class="sayac_bilgi">287 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/10/11/c-dilinde-uzerine-bindirme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++ üzerinde çok şekillilik</title>
		<link>http://www.bilgisayarkavramlari.com/2010/10/08/c-uzerinde-cok-sekillilik/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/10/08/c-uzerinde-cok-sekillilik/#comments</comments>
		<pubDate>Fri, 08 Oct 2010 11:00:33 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Nesne Yönelimli Programlama]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/10/08/c-uzerinde-cok-sekillilik/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER C++ programlama dili, nesne yönelimli olmasından dolayı çok şekillilik (polymorphism) özelliğini destekler. Çok şekillilik (polymorphism) bir işin farklı şekillerle yapılabilmesidir. Örneğin bir metodun farklı şekillerde çağrılabilmesi, çok şekillik özelliği ile mümkündür. Bu yazıda, metotların ve işlemlerin (operators) üzerine yüklenmesi (overloading) anlatılacaktır. Amacımız bir fonksiyonu farklı şekillerde çalıştırabilmektir. Nesne yönelimli özelliği [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>C++ programlama dili, nesne yönelimli olmasından dolayı çok şekillilik (polymorphism) özelliğini destekler. Çok şekillilik (polymorphism) bir işin farklı şekillerle yapılabilmesidir. Örneğin bir metodun farklı şekillerde çağrılabilmesi, çok şekillik özelliği ile mümkündür. Bu yazıda, metotların ve işlemlerin (operators) üzerine <a href="http://www.bilgisayarkavramlari.com/2008/11/22/uzerineyukleme-overloading/">yüklenmesi (overloading)</a> anlatılacaktır.</p>
<p>Amacımız bir fonksiyonu farklı şekillerde çalıştırabilmektir. Nesne yönelimli özelliği olmayan dillerde, bir fonksiyon tek bir isimle bir kere tanımlanabilir. Örneğin aşağıdaki dikdörtgenin alanını hesaplayan fonksiyonu ele alalım:</p>
<pre>int alan(int a, int b){</pre>
<pre>   return a*b;</pre>
<pre>}</pre>
<p>Yukarıdaki fonksiyon gayet başarılı bir şekilde a ve b kenarları verilen dikdörtgenin alanını hesaplar. Ancak aynı alan hesabını örneğin float sayılar için düzenlemek istesek ve verilen değere göre çalışmasını istesek:</p>
<pre>float alan (float a, float b){</pre>
<pre>   return a*b;</pre>
<pre>}</pre>
<p>Şeklinde yazılan fonksiyon, aldığı parametreler itibariyle, farklı bir fonksiyon iken, nesne yönelimli özelliği bulunmayan dillerde, bu iki fonksiyonu aynı anda kodlamamız mümkün olmaz.</p>
<p>Benzer şekilde, her kare bir dikdörtgendir mantığıyla, tek kenar uzunluğu verildiğinde alan hesaplamak istersek</p>
<pre>int alan(int a){</pre>
<pre>   return a*a;</pre>
<pre>}</pre>
<p>Fonksiyonu, bir karenin alanını başarılı bir şekilde hesaplayabilrken, daha önceden tanımlı olan fonksiyonlarla çakışmaktadır.</p>
<p>C++, JAVA veya CSharp gibi diller için yukarıdaki bütün bu fonksiyon tanımları farklı anlama gelmektedir ve tek bir <a href="http://bilgisayarkavramlari.com/2008/07/15/sinif-class/">sınıf (class)</a> içerisinde tanımlanabilir. Örneğin aşağıdaki C++ sınıfını ele alalım</p>
<pre>class dikdörtgen{</pre>
<pre> public:</pre>
<pre>   int a,b;</pre>
<pre> public:</pre>
<pre>   int alan(int a,int b);</pre>
<pre>   float alan(float a,float b);</pre>
<pre>   int alan(int a);</pre>
<pre>};</pre>
<p>Yukarıdaki bu tanımlama, C++ dili açısından problemsiz bir tanımdır ve hangi alan fonksiyonunun çalıştırılacağı, verilen parametrelere göre algılanır.</p>
<p>Örneğin yukarıdaki tanımlardan sonra aşağıdaki main fonksiyonunu yazarsak:</p>
<pre>int main(){</pre>
<pre>   dikdörtgen *d = new dikdörtgen();</pre>
<pre>   cout &lt;&lt; d-&gt;alan(3,4) &lt;&lt; endl &lt;&lt; d-&gt;alan(2.2,7.8) &lt;&lt; endl &lt;&lt; alan(5) &lt;&lt; endl;</pre>
<pre>}</pre>
<p>Yukarıdaki kod, sorunsuz bir şekilde üç ayrı fonksiyonu çağırarak çalıştırır.</p>
<p>Yukarıdaki örnekte yapılan işlem, alan isimli <a href="http://www.bilgisayarkavramlari.com/2008/11/22/uzerineyukleme-overloading/">fonksiyonun üzerine yüklenmesidir (overloading).</a> Yani aynı isme sahip birden fazla fonksiyon tanımlanmış ve bu fonksiyonların parametre tipleri veya parametre sayılarına göre farklı durumlar için yeniden kodlanmıştır. Bu anlamda üzerine yükleme işlemi bir çok şekillilik işlemidir (polymorphism) ve aynı işi yapan birden fazla şekilde çalışmaya izin verir.</p>
<p>Üzerine yükleme işlemi, <a href="http://www.bilgisayarkavramlari.com/2008/11/24/yapici-constructor/">fonksiyonların yapıcıları (constructors)</a> için de kullanılabilir. Örneğin dikdörtgen tanımı sırasında farklı bilgiler ile bir dikdörtgenin tanımlanacağını düşünelim.</p>
<ul>
<li>Dikdörtgen hakkında hiçbir bilgi vermeyebiliriz</li>
<li>Dikdörtgenin kenarlarını verebiliriz</li>
<li>Dikdörtgenimiz özel olarak bir kare olabilir ve tek kenarını verebiliriz.</li>
</ul>
<p>Yukarıdaki bu üç farklı durum için, dikdörtgen tanımını değiştirmemiz gerekir. Bu durumda olası, <a href="http://www.bilgisayarkavramlari.com/2008/11/24/yapici-constructor/">yapıcı fonksiyonlarımız (constructors)</a> aşağıdaki şekilde olabilir :</p>
<p>public:</p>
<pre>dikdörtgen(){</pre>
<pre>   a=0;b=0;</pre>
<pre>}</pre>
<pre>dikdörtgen(int a){</pre>
<pre>   this-&gt;a = a; b= 0;</pre>
<pre>}</pre>
<pre>dikdörtgen(int a,int b){</pre>
<pre>   this-&gt;a=a;</pre>
<pre>   this-&gt;b=b;</pre>
<pre>}</pre>
<p>Benzer bir üzerine yükleme işlemi de, işlemler (operators) için yapılabilir. <a href="http://www.bilgisayarkavramlari.com/2009/04/20/islem-yukleme-operator-overloading/">İşlem üzerine yükleme (operatör overloading) için bağlantıdaki yazıyı okuyabilirsiniz .</a></p>

<p class="sayac_bilgi">255 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/10/08/c-uzerinde-cok-sekillilik/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

