<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://program.sonsuz.us/feed.xml" rel="self" type="application/atom+xml" /><link href="https://program.sonsuz.us/" rel="alternate" type="text/html" /><updated>2026-10-21T18:05:43+00:00</updated><id>https://program.sonsuz.us/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">C# İstisna Yönetimi: try-catch-finally ile Hataları Kontrol Altına Almak</title><link href="https://program.sonsuz.us/posts/c-istisna-yonetimi-try-catch-finally-ile-hatalari-kontrol-altina-almak/" rel="alternate" type="text/html" title="C# İstisna Yönetimi: try-catch-finally ile Hataları Kontrol Altına Almak" /><published>2026-10-21T00:00:00+00:00</published><updated>2026-10-21T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-istisna-yonetimi-try-catch-finally-ile-hatalari-kontrol-altina-almak</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-istisna-yonetimi-try-catch-finally-ile-hatalari-kontrol-altina-almak/"><![CDATA[<p>Bir uygulamanın hiç hata üretmemesi neredeyse imkânsızdır; önemli olan, hata ortaya çıktığında sistemin nasıl davrandığıdır. C# istisna yönetimi, beklenmeyen durumları ana program akışından ayırarak uygulamanın kontrollü biçimde tepki vermesini sağlar. Dosya bulunamaması, ağ bağlantısının kesilmesi veya geçersiz kullanıcı girdisi artık birer felaket değil, yönetilebilir senaryolardır.
``</p>
<h2 id="i̇stisna-nedir">İstisna nedir?</h2>

<p>İstisna, program çalışırken normal akışı bozan olağan dışı bir durumu temsil eden nesnedir. C# içerisindeki bütün istisnalar doğrudan veya dolaylı olarak <code class="language-plaintext highlighter-rouge">System.Exception</code> sınıfından türetilir.</p>

<p>Bir işlemin başarısız olma olasılığını $P(E)$, hatanın sisteme vereceği zararı da $C(E)$ ile gösterirsek basitleştirilmiş risk hesabı şöyle yazılabilir:</p>

\[R = P(E) \times C(E)\]

<p>İstisna yönetimi hatanın oluşma ihtimalini her zaman azaltmaz; fakat $C(E)$ değerini düşürerek hatanın uygulamanın tamamına yayılmasını engeller.</p>

<table>
  <thead>
    <tr>
      <th>Yapı</th>
      <th>Görevi</th>
      <th>Ne zaman çalışır?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">try</code></td>
      <td>Riskli kodu çevreler</td>
      <td>Her denemede</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">catch</code></td>
      <td>Belirli istisnayı yakalar</td>
      <td>Eşleşen hata oluştuğunda</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">finally</code></td>
      <td>Kaynak temizliği yapar</td>
      <td>Hata olsa da olmasa da</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">throw</code></td>
      <td>İstisna oluşturur veya yeniden fırlatır</td>
      <td>Koşul sağlandığında</td>
    </tr>
  </tbody>
</table>

<h2 id="try-catch-finally-mimarisi">try-catch-finally mimarisi</h2>

<p>Aşağıdaki örnek bir dosyayı okumayı dener, olası hataları türlerine göre izole eder ve işlem sonunda bilgi verir:</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">try</span>
<span class="p">{</span>
    <span class="kt">string</span> <span class="n">metin</span> <span class="p">=</span> <span class="n">File</span><span class="p">.</span><span class="nf">ReadAllText</span><span class="p">(</span><span class="s">"ayarlar.json"</span><span class="p">);</span>
    <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">metin</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">catch</span> <span class="p">(</span><span class="n">FileNotFoundException</span> <span class="n">ex</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">$"Dosya bulunamadı: </span><span class="p">{</span><span class="n">ex</span><span class="p">.</span><span class="n">FileName</span><span class="p">}</span><span class="s">"</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">catch</span> <span class="p">(</span><span class="n">UnauthorizedAccessException</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">"Dosyaya erişim yetkiniz yok."</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">catch</span> <span class="p">(</span><span class="n">IOException</span> <span class="n">ex</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">$"Girdi/çıktı hatası: </span><span class="p">{</span><span class="n">ex</span><span class="p">.</span><span class="n">Message</span><span class="p">}</span><span class="s">"</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">finally</span>
<span class="p">{</span>
    <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">"Dosya okuma denemesi tamamlandı."</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">catch</code> blokları özelden genele doğru sıralanmalıdır. Önce <code class="language-plaintext highlighter-rouge">Exception</code> yakalanırsa daha özel bloklara sıra gelmez. Ayrıca her yerde genel <code class="language-plaintext highlighter-rouge">Exception</code> yakalayıp hatayı sessizce yutmak, yangın alarmının pilini çıkarmaya benzer: ortam sessizleşir ama yangın devam eder.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Dezavantaj</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Özel istisnayı yakalamak</td>
      <td>Anlamlı ve hedefli tepki sağlar</td>
      <td>Daha fazla blok gerektirebilir</td>
    </tr>
    <tr>
      <td>Genel <code class="language-plaintext highlighter-rouge">Exception</code> yakalamak</td>
      <td>Son savunma hattı oluşturur</td>
      <td>Gerçek hata nedenini gizleyebilir</td>
    </tr>
    <tr>
      <td>Hatayı yutmak</td>
      <td>Akış görünürde sürer</td>
      <td>Teşhis ve veri güvenliği zorlaşır</td>
    </tr>
    <tr>
      <td>Loglayıp yeniden fırlatmak</td>
      <td>Katmanlar arası görünürlük sağlar</td>
      <td>Aynı hata birden fazla kez loglanabilir</td>
    </tr>
  </tbody>
</table>

<p>Bir istisnayı aynı çağrı yığını bilgisiyle yeniden göndermek için <code class="language-plaintext highlighter-rouge">throw;</code> kullanılmalıdır. <code class="language-plaintext highlighter-rouge">throw ex;</code> ifadesi yığın izini değiştirerek hatanın gerçek kaynağını bulmayı zorlaştırabilir.</p>

<h2 id="özel-hata-sınıfları">Özel hata sınıfları</h2>

<p>İş kuralları için hazır istisnalar her zaman yeterince açıklayıcı değildir. Örneğin stok miktarının yetersiz olması teknik değil, alan odaklı bir problemdir:</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">YetersizStokException</span> <span class="p">:</span> <span class="n">Exception</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">int</span> <span class="n">MevcutStok</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>

    <span class="k">public</span> <span class="nf">YetersizStokException</span><span class="p">(</span><span class="kt">string</span> <span class="n">mesaj</span><span class="p">,</span> <span class="kt">int</span> <span class="n">mevcutStok</span><span class="p">)</span>
        <span class="p">:</span> <span class="k">base</span><span class="p">(</span><span class="n">mesaj</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">MevcutStok</span> <span class="p">=</span> <span class="n">mevcutStok</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">SiparisVer</span><span class="p">(</span><span class="kt">int</span> <span class="n">istenen</span><span class="p">,</span> <span class="kt">int</span> <span class="n">stok</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">istenen</span> <span class="p">&gt;</span> <span class="n">stok</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">throw</span> <span class="k">new</span> <span class="nf">YetersizStokException</span><span class="p">(</span>
            <span class="s">"İstenen miktar stoktan fazla."</span><span class="p">,</span> <span class="n">stok</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu sınıf, hataya yalnızca mesaj değil, <code class="language-plaintext highlighter-rouge">MevcutStok</code> gibi yapılandırılmış bağlam da ekler. Üst katman böylece kullanıcıya uygun bildirim gösterebilir veya işlemi başka bir depoya yönlendirebilir.</p>

<h2 id="sağlam-kullanım-ilkeleri">Sağlam kullanım ilkeleri</h2>

<ul>
  <li>İstisnaları yalnızca gerçekten olağan dışı durumlarda kullanın; normal kontrol akışını <code class="language-plaintext highlighter-rouge">throw</code> ile kurmayın.</li>
  <li><code class="language-plaintext highlighter-rouge">ArgumentException</code>, <code class="language-plaintext highlighter-rouge">InvalidOperationException</code> ve <code class="language-plaintext highlighter-rouge">FileNotFoundException</code> gibi uygun hazır türleri tercih edin.</li>
  <li>Hataları bağlam bilgisiyle loglayın; parola ve erişim anahtarı gibi hassas verileri kaydetmeyin.</li>
  <li><code class="language-plaintext highlighter-rouge">IDisposable</code> kaynaklarında mümkünse <code class="language-plaintext highlighter-rouge">using</code> kullanın; derleyici gerekli temizliği güvenli biçimde oluşturur.</li>
  <li>Kullanıcıya sade mesaj, geliştiriciye ise ayrıntılı log sağlayın.</li>
</ul>

<p>Doğru tasarlanmış istisna yönetimi hataları yok etmez; onları sınırlar, görünür kılar ve uygulamanın güvenli biçimde toparlanmasına yardımcı olur. Kısacası <code class="language-plaintext highlighter-rouge">try-catch-finally</code>, kodun emniyet kemeridir: kazayı engellemeyebilir ama sonucunu ciddi ölçüde kontrol eder.</p>

<p><img src="/img/c-istisna-yonetimi-11.svg" alt="c-istisna-yonetimi-11" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="csharp" /><category term="exception" /><category term="hata-yönetimi" /><category term="try-catch" /><category term="dotnet" /><category term="özel-istisnalar" /><summary type="html"><![CDATA[Bir uygulamanın hiç hata üretmemesi neredeyse imkânsızdır; önemli olan, hata ortaya çıktığında sistemin nasıl davrandığıdır. C# istisna yönetimi, beklenmeyen durumları ana program akışından ayırarak uygulamanın kontrollü biçimde tepki vermesini sağlar. Dosya bulunamaması, ağ bağlantısının kesilmesi veya geçersiz kullanıcı girdisi artık birer felaket değil, yönetilebilir senaryolardır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-istisna-yonetimi-11.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-istisna-yonetimi-11.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C++ Kurucularında Sanal Fonksiyonlar: Polimorfizm Neden Devreye Girmez?</title><link href="https://program.sonsuz.us/posts/c-kurucularinda-sanal-fonksiyonlar-polimorfizm-neden-devreye-girmez/" rel="alternate" type="text/html" title="C++ Kurucularında Sanal Fonksiyonlar: Polimorfizm Neden Devreye Girmez?" /><published>2026-10-21T00:00:00+00:00</published><updated>2026-10-21T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-kurucularinda-sanal-fonksiyonlar-polimorfizm-neden-devreye-girmez</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-kurucularinda-sanal-fonksiyonlar-polimorfizm-neden-devreye-girmez/"><![CDATA[<p><img src="/img/c-kurucularinda-sanal-30.svg" alt="c-kurucularinda-sanal-30" /></p>

<p>C++ ile nesne yönelimli programlama yaparken kurucu içinde sanal bir fonksiyon çağırmak ilk bakışta gayet mantıklı görünebilir. Sonuçta fonksiyon <code class="language-plaintext highlighter-rouge">virtual</code> olarak tanımlanmıştır; nesne türetilmiş sınıfa aitse onun sürümü çalışmalıdır, değil mi? Ne yazık ki C++ burada bilinçli biçimde farklı davranır. Kurucu çalışırken sanal çağrı, o anda kurulmakta olan sınıfın uygulamasına bağlanır; henüz hazır olmayan türetilmiş sınıfa gönderilmez.
``</p>
<h2 id="temel-örnek">Temel örnek</h2>

<p>Aşağıdaki kod, sık karşılaşılan beklenti ile gerçek davranış arasındaki farkı gösterir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span>
<span class="k">class</span> <span class="nc">Base</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="n">Base</span><span class="p">()</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Base kuruluyor</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
        <span class="n">initialize</span><span class="p">();</span>
    <span class="p">}</span>

    <span class="k">virtual</span> <span class="kt">void</span> <span class="nf">initialize</span><span class="p">()</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Base::initialize</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">virtual</span> <span class="o">~</span><span class="n">Base</span><span class="p">()</span> <span class="o">=</span> <span class="k">default</span><span class="p">;</span>
<span class="p">};</span>

<span class="k">class</span> <span class="nc">Derived</span> <span class="o">:</span> <span class="k">public</span> <span class="n">Base</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="n">Derived</span><span class="p">()</span> <span class="o">:</span> <span class="n">value</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Derived kuruluyor</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="kt">void</span> <span class="n">initialize</span><span class="p">()</span> <span class="k">override</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Derived::initialize, value = "</span>
                  <span class="o">&lt;&lt;</span> <span class="n">value</span> <span class="o">&lt;&lt;</span> <span class="sc">'\n'</span><span class="p">;</span>
    <span class="p">}</span>

<span class="k">private</span><span class="o">:</span>
    <span class="kt">int</span> <span class="n">value</span><span class="p">;</span>
<span class="p">};</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">Derived</span> <span class="n">object</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Programın önemli çıktısı şöyledir:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Base kuruluyor
Base::initialize
Derived kuruluyor
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">object</code>, <code class="language-plaintext highlighter-rouge">Derived</code> türünde olmasına rağmen <code class="language-plaintext highlighter-rouge">Base</code> kurucusundaki çağrı <code class="language-plaintext highlighter-rouge">Derived::initialize()</code> fonksiyonuna gitmez. Bu bir derleyici hatası veya polimorfizm arızası değil, nesnenin yaşam döngüsünü koruyan dil kuralıdır.</p>

<h2 id="nesne-hangi-sırayla-oluşur">Nesne hangi sırayla oluşur?</h2>

<p>Bir <code class="language-plaintext highlighter-rouge">Derived</code> nesnesinin kurulumu basitleştirilmiş biçimde şu sırayı izler:</p>

<ol>
  <li>Bellek ayrılır.</li>
  <li><code class="language-plaintext highlighter-rouge">Base</code> alt nesnesi kurulur.</li>
  <li><code class="language-plaintext highlighter-rouge">Derived</code> üyeleri başlatılır.</li>
  <li><code class="language-plaintext highlighter-rouge">Derived</code> kurucusunun gövdesi çalışır.</li>
  <li>Nesne tam bir <code class="language-plaintext highlighter-rouge">Derived</code> olarak kullanılabilir.</li>
</ol>

<p>Kurulum ilerlemesini yaklaşık olarak $P = c / n$ ile düşünebiliriz. Burada $c$ tamamlanan aşama, $n$ toplam aşama sayısıdır. <code class="language-plaintext highlighter-rouge">Base</code> kurucusu çalışırken $P &lt; 1$ olduğundan, türetilmiş bölüm henüz geçerli durumuna ulaşmamıştır.</p>

<p>Eğer çağrı <code class="language-plaintext highlighter-rouge">Derived::initialize()</code> fonksiyonuna yönlendirilseydi, bu fonksiyon henüz başlatılmamış <code class="language-plaintext highlighter-rouge">value</code> üyesini okuyabilirdi. Böyle bir erişim tanımsız veya anlamsal açıdan bozuk davranışlara kapı açardı. C++ bu nedenle kurulum sırasında nesnenin dinamik türünü geçici olarak kurulmakta olan sınıfla sınırlar.</p>

<table>
  <thead>
    <tr>
      <th>Çağrının yapıldığı yer</th>
      <th>Seçilen uygulama</th>
      <th>Türemiş bölüm hazır mı?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Base</code> kurucusu</td>
      <td><code class="language-plaintext highlighter-rouge">Base::initialize()</code></td>
      <td>Hayır</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Derived</code> kurucusu gövdesi</td>
      <td><code class="language-plaintext highlighter-rouge">Derived::initialize()</code></td>
      <td>Büyük ölçüde evet</td>
    </tr>
    <tr>
      <td>Kurulum tamamlandıktan sonra</td>
      <td>Dinamik türe göre</td>
      <td>Evet</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Base</code> yıkıcısı</td>
      <td><code class="language-plaintext highlighter-rouge">Base</code> sürümü</td>
      <td>Hayır; türemiş bölüm yıkılmıştır</td>
    </tr>
  </tbody>
</table>

<p>Aynı kural yıkıcılar için de geçerlidir. Yıkım ters sırada gerçekleştiği için temel sınıf yıkıcısı çalışırken türetilmiş bölüm artık yaşamını tamamlamıştır.</p>

<h2 id="daha-güvenli-tasarım-iki-aşamalı-başlatma">Daha güvenli tasarım: iki aşamalı başlatma</h2>

<p>Polimorfik davranış gerekiyorsa sanal fonksiyonu nesne tamamen kurulduktan sonra çağırabilirsiniz:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Base</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="k">virtual</span> <span class="kt">void</span> <span class="n">initialize</span><span class="p">()</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">virtual</span> <span class="o">~</span><span class="n">Base</span><span class="p">()</span> <span class="o">=</span> <span class="k">default</span><span class="p">;</span>
<span class="p">};</span>

<span class="k">class</span> <span class="nc">Derived</span> <span class="o">:</span> <span class="k">public</span> <span class="n">Base</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="kt">void</span> <span class="n">initialize</span><span class="p">()</span> <span class="k">override</span> <span class="p">{</span>
        <span class="c1">// Tüm üyeler artık güvenle kullanılabilir.</span>
    <span class="p">}</span>
<span class="p">};</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">Derived</span> <span class="n">object</span><span class="p">;</span>
    <span class="n">object</span><span class="p">.</span><span class="n">initialize</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Daha kontrollü bir seçenek fabrika fonksiyonudur. Fabrika önce nesneyi oluşturur, ardından sanal başlatmayı gerçekleştirir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;memory&gt;</span><span class="cp">
</span>
<span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o">&lt;</span><span class="n">Base</span><span class="o">&gt;</span> <span class="n">createDerived</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">auto</span> <span class="n">object</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">make_unique</span><span class="o">&lt;</span><span class="n">Derived</span><span class="o">&gt;</span><span class="p">();</span>
    <span class="n">object</span><span class="o">-&gt;</span><span class="n">initialize</span><span class="p">();</span>
    <span class="k">return</span> <span class="n">object</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kurucuda sanal çağrı</td>
      <td>Kısa görünür</td>
      <td>Beklenen override çalışmaz</td>
    </tr>
    <tr>
      <td>Açık <code class="language-plaintext highlighter-rouge">initialize()</code> çağrısı</td>
      <td>Basit ve anlaşılır</td>
      <td>Çağırmayı unutmak mümkündür</td>
    </tr>
    <tr>
      <td>Fabrika fonksiyonu</td>
      <td>Kurulum adımlarını merkezileştirir</td>
      <td>Tasarıma ek katman getirir</td>
    </tr>
    <tr>
      <td>Kurucuya bağımlılık verme</td>
      <td>Nesneyi hemen geçerli kılar</td>
      <td>Daha fazla tasarım planlaması ister</td>
    </tr>
  </tbody>
</table>

<p>Özetle, kurucu içindeki sanal çağrı polimorfizmi tamamen kapatmaz; çağrıyı nesnenin güvenli biçimde kurulmuş bölümüne sınırlar. Gerçek dinamik gönderim gerekiyorsa işlemi kurulum sonrasına taşımak veya fabrika deseni kullanmak en temiz çözümdür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c++" /><category term="constructor" /><category term="sanal-fonksiyon" /><category term="polimorfizm" /><category term="nesne-yönelimli-programlama" /><summary type="html"><![CDATA[C++ ile nesne yönelimli programlama yaparken kurucu içinde sanal bir fonksiyon çağırmak ilk bakışta gayet mantıklı görünebilir. Sonuçta fonksiyon virtual olarak tanımlanmıştır; nesne türetilmiş sınıfa aitse onun sürümü çalışmalıdır, değil mi? Ne yazık ki C++ burada bilinçli biçimde farklı davranır. Kurucu çalışırken sanal çağrı, o anda kurulmakta olan sınıfın uygulamasına bağlanır; henüz hazır olmayan türetilmiş sınıfa gönderilmez.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-kurucularinda-sanal-30.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-kurucularinda-sanal-30.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C++’ta Statik ve Dinamik Bağlamayı Karıştırınca Patlayan Tasarımlar</title><link href="https://program.sonsuz.us/posts/cta-statik-ve-dinamik-baglamayi-karistirinca-patlayan-tasarimlar/" rel="alternate" type="text/html" title="C++’ta Statik ve Dinamik Bağlamayı Karıştırınca Patlayan Tasarımlar" /><published>2026-10-21T00:00:00+00:00</published><updated>2026-10-21T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/cta-statik-ve-dinamik-baglamayi-karistirinca-patlayan-tasarimlar</id><content type="html" xml:base="https://program.sonsuz.us/posts/cta-statik-ve-dinamik-baglamayi-karistirinca-patlayan-tasarimlar/"><![CDATA[<p>C++’ta bir fonksiyon çağrısının hangi gövdeye gideceği her zaman göründüğü kadar basit değildir. Derleyici bazen kararı derleme zamanında verir, bazen de çalışma zamanındaki gerçek nesne türüne bakar. Statik ve dinamik bağlamayı aynı tasarım içinde bilinçsizce karıştırmak; yanlış fonksiyonların çağrılmasına, kaynak sızıntılarına ve “Ama bu sınıfı ezmiştim!” şaşkınlığına yol açabilir.</p>

<p><img src="/img/cta-statik-ve-16.svg" alt="cta-statik-ve-16" /></p>

<p>``</p>

<h2 id="bağlama-tam-olarak-nedir">Bağlama tam olarak nedir?</h2>

<p>Bağlama, bir çağrı ifadesinin çalıştırılacak fonksiyon gövdesiyle eşleştirilmesidir. Statik bağlamada karar, değişkenin derleme zamanındaki türüne göre verilir. Dinamik bağlamada ise <code class="language-plaintext highlighter-rouge">virtual</code> mekanizması üzerinden nesnenin çalışma zamanındaki gerçek türü kullanılır.</p>

<p>Bunu kabaca şöyle düşünebiliriz:</p>

\[secim = f(T_{statik}, T_{dinamik}, virtual)\]

<p>Fonksiyon sanal değilse çoğunlukla $T_{statik}$ belirleyicidir. Sanal fonksiyon çağrısında ise uygun koşullarda $T_{dinamik}$ devreye girer.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Statik bağlama</th>
      <th>Dinamik bağlama</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Karar zamanı</td>
      <td>Derleme zamanı</td>
      <td>Çalışma zamanı</td>
    </tr>
    <tr>
      <td>Temel ölçüt</td>
      <td>İfadenin statik türü</td>
      <td>Nesnenin gerçek türü</td>
    </tr>
    <tr>
      <td>Tipik araçlar</td>
      <td>Overload, normal metot</td>
      <td><code class="language-plaintext highlighter-rouge">virtual</code>, <code class="language-plaintext highlighter-rouge">override</code></td>
    </tr>
    <tr>
      <td>Maliyet</td>
      <td>Genellikle doğrudan çağrı</td>
      <td>Genellikle sanal tablo erişimi</td>
    </tr>
    <tr>
      <td>Yaygın risk</td>
      <td>Yanlış overload seçimi</td>
      <td>Hatalı yaşam döngüsü tasarımı</td>
    </tr>
  </tbody>
</table>

<h2 id="hata-1-sanal-olmayan-yıkıcı">Hata 1: Sanal olmayan yıkıcı</h2>

<p>Polimorfik bir taban sınıfın yıkıcısını sanal yapmamak, en tehlikeli karışıklıklardan biridir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span>
<span class="k">class</span> <span class="nc">Kaynak</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="o">~</span><span class="n">Kaynak</span><span class="p">()</span> <span class="p">{</span> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Kaynak kapandı</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span> <span class="p">}</span>
<span class="p">};</span>

<span class="k">class</span> <span class="nc">Dosya</span> <span class="o">:</span> <span class="k">public</span> <span class="n">Kaynak</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="o">~</span><span class="n">Dosya</span><span class="p">()</span> <span class="p">{</span> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Dosya kapandı</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span> <span class="p">}</span>
<span class="p">};</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">Kaynak</span><span class="o">*</span> <span class="n">kaynak</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Dosya</span><span class="p">;</span>
    <span class="k">delete</span> <span class="n">kaynak</span><span class="p">;</span> <span class="c1">// Tanımsız davranış!</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">delete</code> işlemi taban işaretçisi üzerinden yapıldığı için yıkıcının dinamik davranması gerekir. Çözüm basittir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">virtual</span> <span class="o">~</span><span class="n">Kaynak</span><span class="p">()</span> <span class="o">=</span> <span class="k">default</span><span class="p">;</span>
</code></pre></div></div>

<p>Bir sınıfta sanal metot varsa yıkıcının da genellikle sanal olması beklenir.</p>

<h2 id="hata-2-varsayılan-argümanların-sanal-olduğunu-sanmak">Hata 2: Varsayılan argümanların sanal olduğunu sanmak</h2>

<p>Sanal fonksiyonun gövdesi dinamik, varsayılan argümanı ise statik olarak seçilir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span>
<span class="k">struct</span> <span class="nc">Bildirim</span> <span class="p">{</span>
    <span class="k">virtual</span> <span class="kt">void</span> <span class="n">gonder</span><span class="p">(</span><span class="kt">int</span> <span class="n">oncelik</span> <span class="o">=</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">oncelik</span> <span class="o">&lt;&lt;</span> <span class="sc">'\n'</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>

<span class="k">struct</span> <span class="nc">Alarm</span> <span class="o">:</span> <span class="n">Bildirim</span> <span class="p">{</span>
    <span class="kt">void</span> <span class="n">gonder</span><span class="p">(</span><span class="kt">int</span> <span class="n">oncelik</span> <span class="o">=</span> <span class="mi">9</span><span class="p">)</span> <span class="k">override</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">oncelik</span> <span class="o">&lt;&lt;</span> <span class="sc">'\n'</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">Alarm</span> <span class="n">alarm</span><span class="p">;</span>
    <span class="n">Bildirim</span><span class="o">&amp;</span> <span class="n">b</span> <span class="o">=</span> <span class="n">alarm</span><span class="p">;</span>
    <span class="n">b</span><span class="p">.</span><span class="n">gonder</span><span class="p">();</span> <span class="c1">// Alarm::gonder çalışır, fakat argüman 1 olur.</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Ortaya hibrit bir sonuç çıkar: gövde alt sınıftan, değer taban sınıftan gelir. Varsayılan değeri tek yerde tanımlamak veya parametresiz ayrı bir sanal olmayan arayüz kullanmak daha güvenlidir.</p>

<h2 id="hata-3-kurucuda-sanal-çağrı">Hata 3: Kurucuda sanal çağrı</h2>

<p>Kurucu sırasında nesnenin alt sınıf bölümü henüz hazır değildir. Bu nedenle taban kurucusundan yapılan sanal çağrı, alt sınıf sürümüne gitmez:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">struct</span> <span class="nc">Motor</span> <span class="p">{</span>
    <span class="n">Motor</span><span class="p">()</span> <span class="p">{</span> <span class="n">baslat</span><span class="p">();</span> <span class="p">}</span>
    <span class="k">virtual</span> <span class="kt">void</span> <span class="nf">baslat</span><span class="p">()</span> <span class="p">{</span> <span class="cm">/* taban davranışı */</span> <span class="p">}</span>
<span class="p">};</span>

<span class="k">struct</span> <span class="nc">TurboMotor</span> <span class="o">:</span> <span class="n">Motor</span> <span class="p">{</span>
    <span class="kt">void</span> <span class="n">baslat</span><span class="p">()</span> <span class="k">override</span> <span class="p">{</span> <span class="cm">/* turbo henüz hazır olmayabilir */</span> <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Nesneyi oluşturduktan sonra çağrılan bir <code class="language-plaintext highlighter-rouge">initialize()</code> metodu veya fabrika fonksiyonu kullanmak daha açık bir yaşam döngüsü sağlar.</p>

<h2 id="hata-4-nesne-dilimleme">Hata 4: Nesne dilimleme</h2>

<p>Alt sınıf nesnesini değer olarak taban türe kopyalamak dinamik tür bilgisini keser:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">calistir</span><span class="p">(</span><span class="n">Motor</span> <span class="n">motor</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// Kopyalama ve dilimleme</span>
    <span class="n">motor</span><span class="p">.</span><span class="n">baslat</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bunun yerine <code class="language-plaintext highlighter-rouge">Motor&amp;</code>, <code class="language-plaintext highlighter-rouge">Motor*</code> veya uygun bir akıllı işaretçi kullanılmalıdır.</p>

<h2 id="sağlam-tasarım-kontrol-listesi">Sağlam tasarım kontrol listesi</h2>

<ul>
  <li>Ezilen her metoda <code class="language-plaintext highlighter-rouge">override</code> ekleyin.</li>
  <li>Polimorfik tabanlarda sanal yıkıcı kullanın.</li>
  <li>Sanal metotlarda farklı varsayılan argümanlardan kaçının.</li>
  <li>Kurucu ve yıkıcılarda sanal dispatch’e güvenmeyin.</li>
  <li>Polimorfik nesneleri değer yerine referans veya işaretçiyle taşıyın.</li>
  <li>Overload ile override kavramlarını aynı şey sanmayın.</li>
</ul>

<p>Kısacası <code class="language-plaintext highlighter-rouge">virtual</code>, tasarıma sihir serpiştiren bir kelime değildir. Hangi kararın derleyiciye, hangisinin çalışma zamanına bırakıldığını açıkça belirlemek gerekir; aksi hâlde kod derlenir, çalışır ve tam en kötü anda yanlış şeyi yapar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c++" /><category term="binding" /><category term="polimorfizm" /><category term="oop" /><category term="tasarım-hataları" /><category term="virtual" /><summary type="html"><![CDATA[C++’ta bir fonksiyon çağrısının hangi gövdeye gideceği her zaman göründüğü kadar basit değildir. Derleyici bazen kararı derleme zamanında verir, bazen de çalışma zamanındaki gerçek nesne türüne bakar. Statik ve dinamik bağlamayı aynı tasarım içinde bilinçsizce karıştırmak; yanlış fonksiyonların çağrılmasına, kaynak sızıntılarına ve “Ama bu sınıfı ezmiştim!” şaşkınlığına yol açabilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/cta-statik-ve-16.png" /><media:content medium="image" url="https://program.sonsuz.us/img/cta-statik-ve-16.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">df ve du Neden Farklı Sonuç Gösterir? Disk Kullanımının İki Yüzü</title><link href="https://program.sonsuz.us/posts/df-ve-du-neden-farkli-sonuc-gosterir-disk-kullaniminin-iki-yuzu/" rel="alternate" type="text/html" title="df ve du Neden Farklı Sonuç Gösterir? Disk Kullanımının İki Yüzü" /><published>2026-10-21T00:00:00+00:00</published><updated>2026-10-21T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/df-ve-du-neden-farkli-sonuc-gosterir-disk-kullaniminin-iki-yuzu</id><content type="html" xml:base="https://program.sonsuz.us/posts/df-ve-du-neden-farkli-sonuc-gosterir-disk-kullaniminin-iki-yuzu/"><![CDATA[<p>Linux sunucunuz “Disk doldu!” diye alarm verirken <code class="language-plaintext highlighter-rouge">du</code> ile yaptığınız kontrolde hâlâ bolca yer görünmesi kafa karıştırıcı olabilir. Aslında <code class="language-plaintext highlighter-rouge">df</code> ve <code class="language-plaintext highlighter-rouge">du</code> aynı şeyi hatalı biçimde ölçmez; disk kullanımına farklı katmanlardan bakar. Biri dosya sisteminin muhasebe kayıtlarını, diğeri erişilebilen dosya ve dizinleri inceler.</p>

<p>``</p>

<h2 id="temel-fark-dosya-sistemi-ve-dosyalar">Temel fark: dosya sistemi ve dosyalar</h2>

<p><code class="language-plaintext highlighter-rouge">df</code>, adını “disk free” ifadesinden alır. Bağlı dosya sistemlerinin toplam, kullanılmış ve boş blok sayılarını çekirdek üzerinden sorgular:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">df</span> <span class="nt">-h</span>
</code></pre></div></div>

<p>Buradaki <code class="language-plaintext highlighter-rouge">-h</code>, değerleri GiB ve MiB gibi okunabilir birimlerle gösterir. Basitleştirilmiş biçimde <code class="language-plaintext highlighter-rouge">df</code> hesabı şöyledir:</p>

\[Kullanılan\ Alan = Toplam\ Bloklar - Boş\ Bloklar\]

<p><code class="language-plaintext highlighter-rouge">du</code> ise “disk usage” anlamına gelir ve belirtilen yoldaki dosya ağacını dolaşır. Bulabildiği dosyaların kapladığı blokları toplar:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">du</span> <span class="nt">-sh</span> /var
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">-s</code> yalnızca toplam sonucu, <code class="language-plaintext highlighter-rouge">-h</code> ise okunabilir birimleri verir. Yaklaşık hesap şu şekilde düşünülebilir:</p>

\[du(D) = \sum_{f \in D} Ayrılan\ Bloklar(f)\]

<p>Dolayısıyla <code class="language-plaintext highlighter-rouge">df</code> bütün dosya sistemini, <code class="language-plaintext highlighter-rouge">du</code> ise seçilen dizin ağacında erişebildiği girdileri raporlar.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th><code class="language-plaintext highlighter-rouge">df</code></th>
      <th><code class="language-plaintext highlighter-rouge">du</code></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Veri kaynağı</td>
      <td>Dosya sistemi metadata bilgileri</td>
      <td>Dizin ve dosya ağacı</td>
    </tr>
    <tr>
      <td>Temel soru</td>
      <td>Bölümde ne kadar yer kaldı?</td>
      <td>Bu dizin ne kadar yer kaplıyor?</td>
    </tr>
    <tr>
      <td>Silinmiş açık dosyaları görür mü?</td>
      <td>Evet, kullanılan alana dahil eder</td>
      <td>Hayır</td>
    </tr>
    <tr>
      <td>Yetki sorunlarından etkilenir mi?</td>
      <td>Genellikle hayır</td>
      <td>Evet</td>
    </tr>
    <tr>
      <td>Bağlama noktalarından etkilenir mi?</td>
      <td>Her dosya sistemini ayrı gösterir</td>
      <td>Başka dosya sistemlerine geçebilir</td>
    </tr>
    <tr>
      <td>Çalışma maliyeti</td>
      <td>Genellikle çok hızlı</td>
      <td>Büyük ağaçlarda yavaş olabilir</td>
    </tr>
  </tbody>
</table>

<h2 id="en-yaygın-fark-silinmiş-ama-açık-dosyalar">En yaygın fark: silinmiş ama açık dosyalar</h2>

<p>Bir uygulama büyük bir log dosyasını açık tutarken dosya <code class="language-plaintext highlighter-rouge">rm</code> ile silinirse dizin girdisi kaldırılır. Ancak süreç dosya tanımlayıcısını kapatıncaya kadar veri blokları serbest bırakılmaz. Bu durumda <code class="language-plaintext highlighter-rouge">du</code> dosyayı bulamaz, fakat <code class="language-plaintext highlighter-rouge">df</code> blokları hâlâ kullanımda görür.</p>

<p>Bu hayalet dosyaları bulmak için:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>lsof +L1
</code></pre></div></div>

<p>Çıktıda büyük bir dosya görürseniz ilgili servisi kontrollü biçimde yeniden başlatmak genellikle alanı serbest bırakır:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>systemctl restart uygulama-servisi
</code></pre></div></div>

<p>Üretim ortamında süreci doğrudan öldürmek yerine önce servis etkisini ve log yapılandırmasını incelemek daha güvenlidir.</p>

<h2 id="diğer-ayrışma-nedenleri">Diğer ayrışma nedenleri</h2>

<p>Dosya sistemleri, normal kullanıcıların diski tamamen doldurmasını engellemek için ayrılmış bloklara sahip olabilir. Örneğin ext4 üzerinde yüzde 5 rezerv varsa normal kullanıcı boş alan göremezken <code class="language-plaintext highlighter-rouge">root</code> bu alanı kullanabilir. <code class="language-plaintext highlighter-rouge">df</code> çıktısındaki “available” değeri bu nedenle basit boş blok sayısından farklı olabilir.</p>

<p>Sparse, yani seyrek dosyalar da ayrı bir tuzaktır. Dosyanın mantıksal boyutu 10 GB olduğu hâlde diskte yalnızca birkaç MB blok ayrılmış olabilir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">truncate</span> <span class="nt">-s</span> 10G seyrek.img
<span class="nb">ls</span> <span class="nt">-lh</span> seyrek.img
<span class="nb">du</span> <span class="nt">-h</span> seyrek.img
<span class="nb">du</span> <span class="nt">--apparent-size</span> <span class="nt">-h</span> seyrek.img
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">ls</code> ve <code class="language-plaintext highlighter-rouge">du --apparent-size</code> mantıksal boyutu, standart <code class="language-plaintext highlighter-rouge">du</code> ise gerçekten ayrılmış alanı gösterir.</p>

<p>Ayrıca <code class="language-plaintext highlighter-rouge">du /</code> komutu <code class="language-plaintext highlighter-rouge">/mnt</code> veya <code class="language-plaintext highlighter-rouge">/proc</code> gibi alt bağlama noktalarına geçebilir. Yalnızca kök dosya sistemini incelemek için <code class="language-plaintext highlighter-rouge">-x</code> kullanmak daha doğru bir karşılaştırma sağlar:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo du</span> <span class="nt">-xsh</span> /
<span class="nb">df</span> <span class="nt">-h</span> /
</code></pre></div></div>

<h2 id="pratik-teşhis-sırası">Pratik teşhis sırası</h2>

<p>Önce <code class="language-plaintext highlighter-rouge">df -hT</code> ile dolu dosya sistemini ve türünü belirleyin. Ardından aynı bağlama noktasında <code class="language-plaintext highlighter-rouge">du -x</code> kullanın. Sonuçlar ciddi ölçüde farklıysa <code class="language-plaintext highlighter-rouge">lsof +L1</code> ile silinmiş açık dosyaları, <code class="language-plaintext highlighter-rouge">df -i</code> ile inode tükenmesini ve bağlama noktalarını kontrol edin.</p>

<p>Kısacası <code class="language-plaintext highlighter-rouge">df</code> diskin muhasebecisi, <code class="language-plaintext highlighter-rouge">du</code> ise klasörleri tek tek gezen envanter görevlisidir. Raporların farklı çıkması çoğu zaman hata değil, iki aracın farklı sorulara cevap vermesidir.</p>

<p><img src="/img/df-ve-du-10.svg" alt="df-ve-du-10" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="linux" /><category term="shell" /><category term="df" /><category term="du" /><category term="disk-kullanımı" /><category term="sistem-yönetimi" /><summary type="html"><![CDATA[Linux sunucunuz “Disk doldu!” diye alarm verirken du ile yaptığınız kontrolde hâlâ bolca yer görünmesi kafa karıştırıcı olabilir. Aslında df ve du aynı şeyi hatalı biçimde ölçmez; disk kullanımına farklı katmanlardan bakar. Biri dosya sisteminin muhasebe kayıtlarını, diğeri erişilebilen dosya ve dizinleri inceler.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/df-ve-du-10.png" /><media:content medium="image" url="https://program.sonsuz.us/img/df-ve-du-10.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Humanoid Robotlarda Dengeli Adımlar: Yürüme Döngüsünde Faz Analizi</title><link href="https://program.sonsuz.us/posts/humanoid-robotlarda-dengeli-adimlar-yurume-dongusunde-faz-analizi/" rel="alternate" type="text/html" title="Humanoid Robotlarda Dengeli Adımlar: Yürüme Döngüsünde Faz Analizi" /><published>2026-10-21T00:00:00+00:00</published><updated>2026-10-21T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/humanoid-robotlarda-dengeli-adimlar-yurume-dongusunde-faz-analizi</id><content type="html" xml:base="https://program.sonsuz.us/posts/humanoid-robotlarda-dengeli-adimlar-yurume-dongusunde-faz-analizi/"><![CDATA[<p>İnsansı bir robotun yürümesi, uzaktan bakıldığında sırayla sağ ve sol ayağı öne atmaktan ibaret görünebilir. Oysa robot açısından her adım; temas kuvvetleri, gövde momentumu, eklem açıları ve zamanlamanın birlikte yönetildiği dinamik bir denge problemidir. Faz analizi, robotun bu karmaşık hareketin neresinde bulunduğunu ve küçük bir bozucudan sonra güvenli döngüsüne dönüp dönemeyeceğini anlamamızı sağlar.
``</p>

<h2 id="yürüme-döngüsü-neden-periyodiktir">Yürüme döngüsü neden periyodiktir?</h2>

<p>Bir gait cycle, aynı ayağın iki benzer teması arasındaki hareket dizisidir. Döngü genellikle <strong>tek destek</strong>, <strong>çift destek</strong>, <strong>salınım</strong> ve <strong>temas geçişi</strong> evrelerine ayrılır. Eklem açıları tam olarak tekrarlanmasa bile sistem durumunun benzer bir yörüngeyi izlemesi beklenir.</p>

<p>Robotun durumu şu vektörle gösterilebilir:</p>

\[\mathbf{x}(t)=[\mathbf{q}(t),\dot{\mathbf{q}}(t)]^T\]

<p>Burada $\mathbf{q}$ eklem konumlarını, $\dot{\mathbf{q}}$ ise hızları temsil eder. Kararlı yürüyüşte durum uzayındaki hareket, <strong>limit döngü</strong> adı verilen kapalı bir yörünge oluşturur. Robot küçük bir itme aldığında yörüngeden uzaklaşabilir; önemli olan birebir aynı noktaya değil, tekrar bu döngüye yaklaşmasıdır. Buna <strong>yörüngesel kararlılık</strong> denir.</p>

<h2 id="zaman-değil-faz-neden-önemlidir">Zaman değil, faz neden önemlidir?</h2>

<p>Sadece saate bakarak “robot adımın yüzde 40’ında” demek yanıltıcı olabilir. Yokuş, zemin esnekliği veya dışarıdan gelen bir itme adım süresini değiştirir. Faz değişkeni ise hareketin fiziksel ilerleyişini takip eder:</p>

\[\phi \in [0,2\pi), \qquad \dot{\phi}=\omega\]

<p>Örneğin kalça açısı ve açısal hızı birlikte kullanılarak faz düzleminde bir yörünge çizilebilir. Böylece kontrolcü, kronometreden bağımsız biçimde ayağın salınımın başında mı yoksa yere temas etmek üzere mi olduğunu anlayabilir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>İzlenen bilgi</th>
      <th>Bozuculara tepki</th>
      <th>Temel risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Zaman tabanlı kontrol</td>
      <td>Geçen süre</td>
      <td>Sınırlı uyum</td>
      <td>Hareket ile saat ayrışabilir</td>
    </tr>
    <tr>
      <td>Olay tabanlı kontrol</td>
      <td>Topuk teması gibi olaylar</td>
      <td>Temaslarda güçlü</td>
      <td>İki olay arasında az bilgi verir</td>
    </tr>
    <tr>
      <td>Faz tabanlı kontrol</td>
      <td>Döngüdeki sürekli ilerleme</td>
      <td>Yüksek uyum</td>
      <td>Güvenilir faz kestirimi gerekir</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/humanoid-robotlarda-dengeli-62.svg" alt="humanoid-robotlarda-dengeli-62" /></p>

<h2 id="kararlılık-nasıl-ölçülür">Kararlılık nasıl ölçülür?</h2>

<p>Yürümenin belirli bir olayında, örneğin sağ topuk temasında, sistem durumu örneklenebilir. Bu kesite <strong>Poincaré kesiti</strong> denir. Ardışık adımlar arasındaki ilişki</p>

\[\mathbf{x}_{k+1}=P(\mathbf{x}_k)\]

<p>şeklinde yazılır. Sabit yürüyüş için $\mathbf{x}^<em>=P(\mathbf{x}^</em>)$ olmalıdır. Haritanın sabit nokta çevresindeki özdeğerleri, yani Floquet çarpanları, kritik bilgiyi verir. Baskın çarpanın mutlak değeri $\vert \lambda_{max}\vert &lt;1$ ise sapmalar küçülür; $\vert \lambda_{max}\vert &gt;1$ ise robot birkaç adım sonra dramatik bir “yerçekimiyle tanışma” yaşayabilir.</p>

<h2 id="basit-bir-faz-portresi">Basit bir faz portresi</h2>

<p>Aşağıdaki Python kodu, idealize edilmiş bir eklem hareketinin açı-hız faz portresini üretir. Kapalı eğri, periyodik davranışın görsel imzasıdır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="n">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>

<span class="c1"># Bir adımlık örnek kalça açısı
</span><span class="n">phase</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="n">pi</span><span class="p">,</span> <span class="mi">500</span><span class="p">)</span>
<span class="n">angle</span> <span class="o">=</span> <span class="mf">0.35</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="nf">sin</span><span class="p">(</span><span class="n">phase</span><span class="p">)</span>
<span class="n">angular_velocity</span> <span class="o">=</span> <span class="mf">0.35</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="nf">cos</span><span class="p">(</span><span class="n">phase</span><span class="p">)</span>

<span class="n">plt</span><span class="p">.</span><span class="nf">plot</span><span class="p">(</span><span class="n">angle</span><span class="p">,</span> <span class="n">angular_velocity</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">xlabel</span><span class="p">(</span><span class="sh">"</span><span class="s">Eklem açısı (rad)</span><span class="sh">"</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">ylabel</span><span class="p">(</span><span class="sh">"</span><span class="s">Açısal hız (rad/s)</span><span class="sh">"</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">title</span><span class="p">(</span><span class="sh">"</span><span class="s">Kalça Eklemi Faz Portresi</span><span class="sh">"</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">grid</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">axis</span><span class="p">(</span><span class="sh">"</span><span class="s">equal</span><span class="sh">"</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">show</span><span class="p">()</span>
</code></pre></div></div>

<p>Gerçek robotta eğrinin kalınlaşması sensör gürültüsünü, giderek genişlemesi kararsızlığı, bozucu sonrası yeniden daralması ise toparlanmayı gösterebilir. Bu analiz; ZMP, basınç merkezi ve gövde kütle merkezi ölçümleriyle birleştirildiğinde daha anlamlı hâle gelir.</p>

<h2 id="kontrolcüye-sağladığı-avantaj">Kontrolcüye sağladığı avantaj</h2>

<p>Faz analizi sayesinde kontrol sistemi ayağın yere temas zamanını ayarlayabilir, adım uzunluğunu değiştirebilir ve gövde momentumunu dengeleyebilir. Ayrıca farklı hızlardaki yürüyüşler tek bir faz koordinatında karşılaştırılabilir. Kısacası faz, robotun yalnızca <strong>ne yaptığını</strong> değil, hareketin <strong>hangi bölümünde ve ne kadar kararlı biçimde</strong> yaptığını söyler. Dengeli bir humanoid için doğru adım kadar, doğru anda atılan adım da belirleyicidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="robotik" /><category term="humanoid" /><category term="yürüme-döngüsü" /><category term="faz-analizi" /><category term="kararlılık" /><category term="kontrol-sistemleri" /><summary type="html"><![CDATA[İnsansı bir robotun yürümesi, uzaktan bakıldığında sırayla sağ ve sol ayağı öne atmaktan ibaret görünebilir. Oysa robot açısından her adım; temas kuvvetleri, gövde momentumu, eklem açıları ve zamanlamanın birlikte yönetildiği dinamik bir denge problemidir. Faz analizi, robotun bu karmaşık hareketin neresinde bulunduğunu ve küçük bir bozucudan sonra güvenli döngüsüne dönüp dönemeyeceğini anlamamızı sağlar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/humanoid-robotlarda-dengeli-62.png" /><media:content medium="image" url="https://program.sonsuz.us/img/humanoid-robotlarda-dengeli-62.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">İki Bacaklı Robotlarda Ters Sarkaç ile Denge Kontrolü</title><link href="https://program.sonsuz.us/posts/iki-bacakli-robotlarda-ters-sarkac-ile-denge-kontrolu/" rel="alternate" type="text/html" title="İki Bacaklı Robotlarda Ters Sarkaç ile Denge Kontrolü" /><published>2026-10-21T00:00:00+00:00</published><updated>2026-10-21T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/iki-bacakli-robotlarda-ters-sarkac-ile-denge-kontrolu</id><content type="html" xml:base="https://program.sonsuz.us/posts/iki-bacakli-robotlarda-ters-sarkac-ile-denge-kontrolu/"><![CDATA[<p><img src="/img/iki-bacakli-robotlarda-52.svg" alt="iki-bacakli-robotlarda-52" /></p>

<p>İki bacak üzerinde yürümek insanlar için sıradan, robotlar için ise sürekli çözülmesi gereken bir denge problemidir. Robotun kütle merkezi destek alanının dışına çıktığında yer çekimi hemen devreye girer ve pahalı metal kahramanımız yere doğru dramatik bir yolculuğa başlar. Ters sarkaç modeli, bu karmaşık gövde ve eklem sistemini daha anlaşılır bir fizik problemine dönüştürerek denge denetleyicilerinin tasarlanmasını kolaylaştırır.</p>

<p>``</p>

<h2 id="robot-neden-ters-sarkaç-olarak-modellenir">Robot neden ters sarkaç olarak modellenir?</h2>

<p>Klasik sarkaçta kütle aşağıdadır ve sistem doğal olarak kararlı durumuna dönmek ister. Ters sarkaçta ise kütle dönme noktasının üzerindedir. Küçük bir eğim bile kütlenin daha fazla uzaklaşmasına yol açar. İki bacaklı robot da ayakları üzerinde dururken benzer biçimde <strong>doğal olarak kararsızdır</strong>.</p>

<p>Basitleştirilmiş modelde robotun toplam kütlesi, kütle merkezinde bulunan noktasal bir $m$ kütlesi olarak kabul edilir. Bacak ise uzunluğu $l$ olan, kütlesiz bir çubuk gibi düşünülür. Robotun dikey eksene göre açısı $\theta$ ise temel dinamik yaklaşık olarak şöyledir:</p>

\[ml^2\ddot{\theta}=mgl\sin(\theta)+\tau\]

<p>Burada $g$ yer çekimi ivmesini, $\tau$ ise ayak bileği veya eş değer eklem torkunu gösterir. Denge çevresindeki küçük açılarda $\sin(\theta)\approx\theta$ kabulü yapılabilir:</p>

\[\ddot{\theta}\approx\frac{g}{l}\theta+\frac{1}{ml^2}\tau\]

<p>$\theta$ katsayısının pozitif olması kritik ayrıntıdır: kontrol uygulanmazsa eğim kendiliğinden büyür.</p>

<h2 id="basitleştirme-seçenekleri">Basitleştirme seçenekleri</h2>

<table>
  <thead>
    <tr>
      <th>Model</th>
      <th>Varsayım</th>
      <th>Avantaj</th>
      <th>Sınırlama</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ters sarkaç</td>
      <td>Tek dönme noktası ve sabit bacak</td>
      <td>Basit kontrol tasarımı</td>
      <td>Yürüyüş ayrıntılarını az temsil eder</td>
    </tr>
    <tr>
      <td>Doğrusal ters sarkaç</td>
      <td>Kütle merkezi yüksekliği sabittir</td>
      <td>ZMP ve adım planlamada hızlıdır</td>
      <td>Dikey hareketleri ihmal eder</td>
    </tr>
    <tr>
      <td>Çok bağlantılı model</td>
      <td>Gövde ve eklemler ayrıdır</td>
      <td>Daha gerçekçi sonuç verir</td>
      <td>Hesaplama maliyeti yüksektir</td>
    </tr>
  </tbody>
</table>

<p>Özellikle <strong>Doğrusal Ters Sarkaç Modeli</strong> (LIPM), kütle merkezinin yatay hareketini incelemek için kullanılır. Sabit $z_c$ yüksekliğinde yatay dinamik:</p>

\[\ddot{x}=\frac{g}{z_c}(x-p)\]

<p>şeklindedir. Buradaki $x$ kütle merkezinin yatay konumu, $p$ ise basınç merkezi veya ideal koşullarda Zero Moment Point (ZMP) konumudur. Dengeyi korumak için $p$ değerinin ayağın oluşturduğu destek çokgeni içinde kalması gerekir.</p>

<h2 id="denetleyici-nasıl-müdahale-eder">Denetleyici nasıl müdahale eder?</h2>

<p>Robot; IMU, eklem enkoderleri ve ayak tabanı kuvvet sensörlerinden veri toplar. Bu ölçümlerle açı, açısal hız ve kütle merkezi durumu tahmin edilir. Ardından PID, durum geri besleme veya LQR gibi bir denetleyici düzeltici tork üretir.</p>

<p>Durum vektörü $X=[\theta,\dot{\theta}]^T$ seçildiğinde LQR yaklaşımı</p>

\[u=-KX\]

<p>kontrol yasasını kullanır. $K$ kazancı, açı hatası ile enerji tüketimi arasında sistematik bir denge kurar. Aşağıdaki Python örneği, basitleştirilmiş bir geri besleme döngüsünü simüle eder:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>

<span class="n">m</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="n">g</span> <span class="o">=</span> <span class="mf">20.0</span><span class="p">,</span> <span class="mf">0.8</span><span class="p">,</span> <span class="mf">9.81</span>
<span class="n">dt</span> <span class="o">=</span> <span class="mf">0.002</span>
<span class="n">K</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="mf">450.0</span><span class="p">,</span> <span class="mf">90.0</span><span class="p">])</span>
<span class="n">state</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="mf">0.12</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">])</span>  <span class="c1"># açı ve açısal hız
</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">3000</span><span class="p">):</span>
    <span class="n">theta</span><span class="p">,</span> <span class="n">omega</span> <span class="o">=</span> <span class="n">state</span>
    <span class="n">torque</span> <span class="o">=</span> <span class="o">-</span><span class="n">K</span> <span class="o">@</span> <span class="n">state</span>
    <span class="n">acceleration</span> <span class="o">=</span> <span class="p">(</span><span class="n">g</span> <span class="o">/</span> <span class="n">l</span><span class="p">)</span> <span class="o">*</span> <span class="n">theta</span> <span class="o">+</span> <span class="n">torque</span> <span class="o">/</span> <span class="p">(</span><span class="n">m</span> <span class="o">*</span> <span class="n">l</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span>

    <span class="n">omega</span> <span class="o">+=</span> <span class="n">acceleration</span> <span class="o">*</span> <span class="n">dt</span>
    <span class="n">theta</span> <span class="o">+=</span> <span class="n">omega</span> <span class="o">*</span> <span class="n">dt</span>
    <span class="n">state</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="n">theta</span><span class="p">,</span> <span class="n">omega</span><span class="p">])</span>

<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Son açı: </span><span class="si">{</span><span class="n">np</span><span class="p">.</span><span class="nf">degrees</span><span class="p">(</span><span class="n">state</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="si">:</span><span class="p">.</span><span class="mi">4</span><span class="n">f</span><span class="si">}</span><span class="s"> derece</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Kod, robot öne eğildiğinde ters yönde tork uygulayarak açıyı sıfıra yaklaştırır. Gerçek robotta tork sınırları, sensör gürültüsü, gecikme ve ayağın kayması da modele eklenmelidir.</p>

<h2 id="ayakta-durmaktan-yürümeye">Ayakta durmaktan yürümeye</h2>

<p>Yürüme sırasında destek noktası sürekli değişir. Denetleyici yalnızca mevcut düşüşü engellemez; bir sonraki ayağın nereye basacağını da planlar. Küçük bozucular ayak bileği torkuyla, daha büyük bozucular kalça hareketiyle, çok güçlü itmeler ise yeni bir adımla karşılanır. Böylece ters sarkaç modeli, kusursuz bir robot kopyası olmaktan ziyade, karmaşık denge problemini gerçek zamanlı çözülebilen kullanışlı bir haritaya dönüştürür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="robotik" /><category term="denge kontrolü" /><category term="ters sarkaç" /><category term="biped robot" /><category term="lqr" /><category term="zmp" /><summary type="html"><![CDATA[İki bacak üzerinde yürümek insanlar için sıradan, robotlar için ise sürekli çözülmesi gereken bir denge problemidir. Robotun kütle merkezi destek alanının dışına çıktığında yer çekimi hemen devreye girer ve pahalı metal kahramanımız yere doğru dramatik bir yolculuğa başlar. Ters sarkaç modeli, bu karmaşık gövde ve eklem sistemini daha anlaşılır bir fizik problemine dönüştürerek denge denetleyicilerinin tasarlanmasını kolaylaştırır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/iki-bacakli-robotlarda-52.png" /><media:content medium="image" url="https://program.sonsuz.us/img/iki-bacakli-robotlarda-52.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Python Çoklu Kalıtımında MRO: Metotlar Neden Beklenmedik Yere Gidiyor?</title><link href="https://program.sonsuz.us/posts/python-coklu-kalitiminda-mro-metotlar-neden-beklenmedik-yere-gidiyor/" rel="alternate" type="text/html" title="Python Çoklu Kalıtımında MRO: Metotlar Neden Beklenmedik Yere Gidiyor?" /><published>2026-10-21T00:00:00+00:00</published><updated>2026-10-21T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/python-coklu-kalitiminda-mro-metotlar-neden-beklenmedik-yere-gidiyor</id><content type="html" xml:base="https://program.sonsuz.us/posts/python-coklu-kalitiminda-mro-metotlar-neden-beklenmedik-yere-gidiyor/"><![CDATA[<p>Python’da çoklu kalıtım ilk bakışta oldukça masum görünür: Bir sınıf, birden fazla sınıftan özellik kazanır ve herkes mutlu olur. Ancak aynı isimli metotlar, elmas biçimli kalıtım zincirleri ve <code class="language-plaintext highlighter-rouge">super()</code> çağrıları devreye girdiğinde Python’ın hangi metodu çalıştırdığı şaşırtıcı olabilir. Bu karar rastgele verilmez; arka planda Method Resolution Order, yani MRO adı verilen kesin bir sıralama bulunur.
``</p>
<h2 id="mro-tam-olarak-nedir">MRO tam olarak nedir?</h2>

<p>MRO, bir özellik veya metot aranırken sınıfların hangi sırayla ziyaret edileceğini belirtir. Python 3 bu sırayı oluşturmak için <strong>C3 doğrusallaştırma</strong> algoritmasını kullanır. Amaç; çocuk sınıfları ebeveynlerden önce tutmak, sınıf bildirimindeki soldan sağa önceliği korumak ve kalıtım ağında tutarlı bir sıra üretmektir.</p>

<p>Bir <code class="language-plaintext highlighter-rouge">C</code> sınıfı, <code class="language-plaintext highlighter-rouge">B1, B2, ..., Bn</code> sınıflarından türetiliyorsa sıralama kabaca şöyle ifade edilir:</p>

\[L(C) = [C] + merge(L(B_1), L(B_2), \ldots, L(B_n), [B_1, B_2, \ldots, B_n])\]

<p>Buradaki <code class="language-plaintext highlighter-rouge">merge</code>, başka listelerin kuyruklarında bulunmayan uygun bir baş elemanı seçer. Bu kural, bir sınıfın kendi alt sınıfından önce aranmasını engeller.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Arama mantığı</th>
      <th>Olası sonuç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tekli kalıtım</td>
      <td>Çocuktan ebeveyne doğru</td>
      <td>Genellikle tahmin edilebilir</td>
    </tr>
    <tr>
      <td>Basit çoklu kalıtım</td>
      <td>Soldaki ebeveyn önce</td>
      <td>Aynı adlı metot gölgelenebilir</td>
    </tr>
    <tr>
      <td>Elmas kalıtım</td>
      <td>C3 MRO sırası izlenir</td>
      <td>Ortak ata yalnızca bir kez işlenir</td>
    </tr>
    <tr>
      <td>Doğrudan sınıf çağrısı</td>
      <td>Belirtilen sınıf zorla kullanılır</td>
      <td>Zincir ve diğer sınıflar atlanabilir</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/python-coklu-kalitiminda-68.svg" alt="python-coklu-kalitiminda-68" /></p>

<h2 id="beklenmedik-davranış-örneği">Beklenmedik davranış örneği</h2>

<p>Aşağıdaki örnekte iki ara sınıf aynı metodu değiştirir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Temel</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">mesaj</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="sh">"</span><span class="s">Temel</span><span class="sh">"</span>

<span class="k">class</span> <span class="nc">A</span><span class="p">(</span><span class="n">Temel</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">mesaj</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="sh">"</span><span class="s">A -&gt; </span><span class="sh">"</span> <span class="o">+</span> <span class="nf">super</span><span class="p">().</span><span class="nf">mesaj</span><span class="p">()</span>

<span class="k">class</span> <span class="nc">B</span><span class="p">(</span><span class="n">Temel</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">mesaj</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="sh">"</span><span class="s">B -&gt; </span><span class="sh">"</span> <span class="o">+</span> <span class="nf">super</span><span class="p">().</span><span class="nf">mesaj</span><span class="p">()</span>

<span class="k">class</span> <span class="nc">C</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">):</span>
    <span class="k">pass</span>

<span class="n">nesne</span> <span class="o">=</span> <span class="nc">C</span><span class="p">()</span>
<span class="nf">print</span><span class="p">(</span><span class="n">nesne</span><span class="p">.</span><span class="nf">mesaj</span><span class="p">())</span>
<span class="nf">print</span><span class="p">(</span><span class="n">C</span><span class="p">.</span><span class="nf">mro</span><span class="p">())</span>
</code></pre></div></div>

<p>Çıktı şu yapıdadır:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>A -&gt; B -&gt; Temel
[C, A, B, Temel, object]
</code></pre></div></div>

<p>Şaşırtıcı nokta, <code class="language-plaintext highlighter-rouge">A</code> içindeki <code class="language-plaintext highlighter-rouge">super()</code> çağrısının doğrudan <code class="language-plaintext highlighter-rouge">Temel</code> sınıfına gitmemesidir. <code class="language-plaintext highlighter-rouge">super()</code>, “ebeveynimi çağır” anlamına gelmez; <strong>mevcut MRO’da benden sonraki sınıfa geç</strong> demektir. Dolayısıyla <code class="language-plaintext highlighter-rouge">C(A, B)</code> için <code class="language-plaintext highlighter-rouge">A</code> sonrasında <code class="language-plaintext highlighter-rouge">B</code> çalışır.</p>

<p>Ebeveynlerin sırasını değiştirirsek sonuç da değişir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">D</span><span class="p">(</span><span class="n">B</span><span class="p">,</span> <span class="n">A</span><span class="p">):</span>
    <span class="k">pass</span>

<span class="nf">print</span><span class="p">(</span><span class="nc">D</span><span class="p">().</span><span class="nf">mesaj</span><span class="p">())</span>
<span class="c1"># B -&gt; A -&gt; Temel
</span></code></pre></div></div>

<p>Yalnızca sınıf bildirimindeki sıra değişmesine rağmen davranış tersine dönmüştür. Özellikle mixin kullanılan büyük projelerde bu durum sessiz ve zor bulunan hatalar doğurabilir.</p>

<h2 id="super-zinciri-nasıl-güvenli-kurulur"><code class="language-plaintext highlighter-rouge">super()</code> zinciri nasıl güvenli kurulur?</h2>

<p>İşbirlikçi çoklu kalıtımda zincire katılan bütün sınıflar uyumlu davranmalıdır. Her sınıf <code class="language-plaintext highlighter-rouge">super()</code> çağırmalı, metot imzaları birbiriyle çelişmemeli ve zincir doğrudan sınıf adıyla kesilmemelidir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">KayitMixin</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">kaydet</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
        <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Kayıt günlüğü oluşturuldu</span><span class="sh">"</span><span class="p">)</span>
        <span class="k">return</span> <span class="nf">super</span><span class="p">().</span><span class="nf">kaydet</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">DogrulamaMixin</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">kaydet</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">kwargs</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">ad</span><span class="sh">"</span><span class="p">):</span>
            <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sh">"</span><span class="s">ad gerekli</span><span class="sh">"</span><span class="p">)</span>
        <span class="k">return</span> <span class="nf">super</span><span class="p">().</span><span class="nf">kaydet</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Depo</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">kaydet</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
        <span class="k">return</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Kaydedildi: </span><span class="si">{</span><span class="n">kwargs</span><span class="p">[</span><span class="sh">'</span><span class="s">ad</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="sh">"</span>

<span class="k">class</span> <span class="nc">Servis</span><span class="p">(</span><span class="n">KayitMixin</span><span class="p">,</span> <span class="n">DogrulamaMixin</span><span class="p">,</span> <span class="n">Depo</span><span class="p">):</span>
    <span class="k">pass</span>
</code></pre></div></div>

<p>Bu tasarımda her katman yalnızca kendi görevini yapar ve kontrolü sıradaki sınıfa bırakır. <code class="language-plaintext highlighter-rouge">Servis.mro()</code> çağrısı, gerçek yürütme yolunu incelemenin en pratik yöntemidir.</p>

<h2 id="akılda-tutulması-gerekenler">Akılda tutulması gerekenler</h2>

<p>MRO’yu bir soy ağacından çok, Python’ın önceden hazırladığı bir ziyaret listesi gibi düşünün. <code class="language-plaintext highlighter-rouge">super()</code> bu listede tek adım ilerler. Beklenmedik bir sonuçla karşılaştığınızda <code class="language-plaintext highlighter-rouge">Sinif.__mro__</code> veya <code class="language-plaintext highlighter-rouge">Sinif.mro()</code> çıktısını kontrol edin; ebeveyn sırasını bilinçli belirleyin ve doğrudan <code class="language-plaintext highlighter-rouge">A.metot(self)</code> çağrılarından kaçının. Çoklu kalıtım güçlüdür, fakat MRO okunmadan kullanıldığında kod tabanına küçük bir labirent yerleştirebilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="python" /><category term="mro" /><category term="çoklu-kalıtım" /><category term="oop" /><category term="c3-doğrusallaştırma" /><category term="super" /><summary type="html"><![CDATA[Python’da çoklu kalıtım ilk bakışta oldukça masum görünür: Bir sınıf, birden fazla sınıftan özellik kazanır ve herkes mutlu olur. Ancak aynı isimli metotlar, elmas biçimli kalıtım zincirleri ve super() çağrıları devreye girdiğinde Python’ın hangi metodu çalıştırdığı şaşırtıcı olabilir. Bu karar rastgele verilmez; arka planda Method Resolution Order, yani MRO adı verilen kesin bir sıralama bulunur.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/python-coklu-kalitiminda-68.png" /><media:content medium="image" url="https://program.sonsuz.us/img/python-coklu-kalitiminda-68.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Python Dekoratörlerinde Kimlik Krizi: functools.wraps ile Metadata’yı Korumak</title><link href="https://program.sonsuz.us/posts/python-dekoratorlerinde-kimlik-krizi-functoolswraps-ile-metadatayi-korumak/" rel="alternate" type="text/html" title="Python Dekoratörlerinde Kimlik Krizi: functools.wraps ile Metadata’yı Korumak" /><published>2026-10-21T00:00:00+00:00</published><updated>2026-10-21T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/python-dekoratorlerinde-kimlik-krizi-functoolswraps-ile-metadatayi-korumak</id><content type="html" xml:base="https://program.sonsuz.us/posts/python-dekoratorlerinde-kimlik-krizi-functoolswraps-ile-metadatayi-korumak/"><![CDATA[<p>Python dekoratörleri, bir fonksiyonun davranışını kaynak kodunu değiştirmeden genişletmenin zarif bir yoludur. Ancak dekoratörümüzü dikkatsizce yazarsak orijinal fonksiyonun adı, docstring’i ve diğer metadata bilgileri ortadan kaybolabilir. Fonksiyon çalışmaya devam eder ama sahneye başka birinin kimliğiyle çıkar. Neyse ki <code class="language-plaintext highlighter-rouge">functools.wraps</code>, bu küçük kimlik krizini çözmek için standart kütüphanede bizi bekler.
``</p>
<h2 id="dekoratör-aslında-ne-yapar">Dekoratör aslında ne yapar?</h2>

<p>Bir dekoratör, bir fonksiyonu parametre olarak alır ve yerine genellikle başka bir fonksiyon döndürür. Matematiksel olarak dekoratör dönüşümünü şöyle düşünebiliriz:</p>

\[D(f) = g\]

<p>Burada $f$ orijinal fonksiyon, $D$ dekoratör ve $g$ çağrıların yönlendirildiği yeni fonksiyondur. Python’daki <code class="language-plaintext highlighter-rouge">@dekorator</code> sözdizimi ise temelde şu eşitliğin kısa yazımıdır:</p>

\[f = D(f)\]

<p>Basit bir zamanlama dekoratörü yazalım:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">time</span>

<span class="k">def</span> <span class="nf">zaman_olc</span><span class="p">(</span><span class="n">func</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">wrapper</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
        <span class="n">baslangic</span> <span class="o">=</span> <span class="n">time</span><span class="p">.</span><span class="nf">perf_counter</span><span class="p">()</span>
        <span class="n">sonuc</span> <span class="o">=</span> <span class="nf">func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
        <span class="n">sure</span> <span class="o">=</span> <span class="n">time</span><span class="p">.</span><span class="nf">perf_counter</span><span class="p">()</span> <span class="o">-</span> <span class="n">baslangic</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Çalışma süresi: </span><span class="si">{</span><span class="n">sure</span><span class="si">:</span><span class="p">.</span><span class="mi">6</span><span class="n">f</span><span class="si">}</span><span class="s"> saniye</span><span class="sh">"</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">sonuc</span>

    <span class="k">return</span> <span class="n">wrapper</span>

<span class="nd">@zaman_olc</span>
<span class="k">def</span> <span class="nf">topla</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">İki sayıyı toplar.</span><span class="sh">"""</span>
    <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">wrapper</code>, farklı imzalara sahip fonksiyonlarla çalışabilmek için <code class="language-plaintext highlighter-rouge">*args</code> ve <code class="language-plaintext highlighter-rouge">**kwargs</code> kullanır. Önce zamanı kaydeder, orijinal fonksiyonu çalıştırır ve geçen süreyi ekrana yazar.</p>

<h2 id="metadata-neden-kaybolur">Metadata neden kaybolur?</h2>

<p>Dekoratör uygulandıktan sonra <code class="language-plaintext highlighter-rouge">topla</code> değişkeni artık orijinal fonksiyonu değil, döndürülen <code class="language-plaintext highlighter-rouge">wrapper</code> fonksiyonunu gösterir. Bu nedenle aşağıdaki sonuçlar şaşırtıcı olabilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">print</span><span class="p">(</span><span class="n">topla</span><span class="p">.</span><span class="n">__name__</span><span class="p">)</span>  <span class="c1"># wrapper
</span><span class="nf">print</span><span class="p">(</span><span class="n">topla</span><span class="p">.</span><span class="n">__doc__</span><span class="p">)</span>   <span class="c1"># None
</span></code></pre></div></div>

<p>Python açısından ortada gizem yoktur: Yeni nesnenin metadata’sı okunmaktadır. Sorun özellikle dokümantasyon araçlarında, hata ayıklamada, testlerde ve fonksiyon adını kullanan framework’lerde belirginleşir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Dekoratörsüz</th>
      <th>Sıradan dekoratör sonrası</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">__name__</code></td>
      <td><code class="language-plaintext highlighter-rouge">topla</code></td>
      <td><code class="language-plaintext highlighter-rouge">wrapper</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">__doc__</code></td>
      <td><code class="language-plaintext highlighter-rouge">İki sayıyı toplar.</code></td>
      <td><code class="language-plaintext highlighter-rouge">None</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">__module__</code></td>
      <td>Tanımlandığı modül</td>
      <td>Dekoratörün modülü</td>
    </tr>
    <tr>
      <td>İzleme kolaylığı</td>
      <td>Yüksek</td>
      <td>Daha düşük</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/python-dekoratorlerinde-kimlik-57.svg" alt="python-dekoratorlerinde-kimlik-57" /></p>

<h2 id="functoolswraps-kurtarmaya-geliyor">functools.wraps kurtarmaya geliyor</h2>

<p>Çözüm, iç fonksiyonun üzerine <code class="language-plaintext highlighter-rouge">@wraps(func)</code> eklemektir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">time</span>
<span class="kn">from</span> <span class="n">functools</span> <span class="kn">import</span> <span class="n">wraps</span>

<span class="k">def</span> <span class="nf">zaman_olc</span><span class="p">(</span><span class="n">func</span><span class="p">):</span>
    <span class="nd">@wraps</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
    <span class="k">def</span> <span class="nf">wrapper</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
        <span class="n">baslangic</span> <span class="o">=</span> <span class="n">time</span><span class="p">.</span><span class="nf">perf_counter</span><span class="p">()</span>
        <span class="n">sonuc</span> <span class="o">=</span> <span class="nf">func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
        <span class="n">sure</span> <span class="o">=</span> <span class="n">time</span><span class="p">.</span><span class="nf">perf_counter</span><span class="p">()</span> <span class="o">-</span> <span class="n">baslangic</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Çalışma süresi: </span><span class="si">{</span><span class="n">sure</span><span class="si">:</span><span class="p">.</span><span class="mi">6</span><span class="n">f</span><span class="si">}</span><span class="s"> saniye</span><span class="sh">"</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">sonuc</span>

    <span class="k">return</span> <span class="n">wrapper</span>

<span class="nd">@zaman_olc</span>
<span class="k">def</span> <span class="nf">topla</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">İki sayıyı toplar.</span><span class="sh">"""</span>
    <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>

<span class="nf">print</span><span class="p">(</span><span class="n">topla</span><span class="p">.</span><span class="n">__name__</span><span class="p">)</span>  <span class="c1"># topla
</span><span class="nf">print</span><span class="p">(</span><span class="n">topla</span><span class="p">.</span><span class="n">__doc__</span><span class="p">)</span>   <span class="c1"># İki sayıyı toplar.
</span></code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">wraps</code>, kendi başına sihirli bir kopyalama motoru değildir; <code class="language-plaintext highlighter-rouge">functools.update_wrapper</code> fonksiyonunun dekoratör biçiminde kullanılmasını sağlar. Varsayılan olarak <code class="language-plaintext highlighter-rouge">__module__</code>, <code class="language-plaintext highlighter-rouge">__name__</code>, <code class="language-plaintext highlighter-rouge">__qualname__</code>, <code class="language-plaintext highlighter-rouge">__doc__</code>, <code class="language-plaintext highlighter-rouge">__annotations__</code> ve <code class="language-plaintext highlighter-rouge">__type_params__</code> gibi nitelikleri wrapper’a aktarır. Ayrıca wrapper’ın sözlüğünü günceller.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th style="text-align: right">İsim korunur mu?</th>
      <th style="text-align: right">Docstring korunur mu?</th>
      <th style="text-align: right">Orijinale erişim</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Düz <code class="language-plaintext highlighter-rouge">wrapper</code></td>
      <td style="text-align: right">Hayır</td>
      <td style="text-align: right">Hayır</td>
      <td style="text-align: right">Closure üzerinden</td>
    </tr>
    <tr>
      <td>Elle kopyalama</td>
      <td style="text-align: right">Kısmen</td>
      <td style="text-align: right">Kısmen</td>
      <td style="text-align: right">Genellikle hayır</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">@wraps(func)</code></td>
      <td style="text-align: right">Evet</td>
      <td style="text-align: right">Evet</td>
      <td style="text-align: right"><code class="language-plaintext highlighter-rouge">__wrapped__</code> ile</td>
    </tr>
  </tbody>
</table>

<h2 id="bonus-__wrapped__-ve-introspection">Bonus: <code class="language-plaintext highlighter-rouge">__wrapped__</code> ve introspection</h2>

<p><code class="language-plaintext highlighter-rouge">wraps</code>, wrapper’a <code class="language-plaintext highlighter-rouge">__wrapped__</code> niteliğini de ekler. Böylece orijinal fonksiyona doğrudan ulaşılabilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">print</span><span class="p">(</span><span class="n">topla</span><span class="p">.</span><span class="nf">__wrapped__</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">))</span>  <span class="c1"># 7; zaman ölçümü yapılmaz
</span></code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">inspect.signature</code> gibi introspection araçları da bu zinciri takip ederek anlamlı sonuçlar üretir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">inspect</span> <span class="kn">import</span> <span class="n">signature</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">signature</span><span class="p">(</span><span class="n">topla</span><span class="p">))</span>  <span class="c1"># (a, b)
</span></code></pre></div></div>

<p>Bu özellik yalnızca kozmetik değildir. IDE desteği, otomatik API dokümantasyonu, bağımlılık enjeksiyonu ve test araçları doğru metadata’ya güvenir. Özetle dekoratör yazarken <code class="language-plaintext highlighter-rouge">@wraps(func)</code> kullanmak, emniyet kemeri takmak gibidir: Kod onsuz da ilerleyebilir, fakat ilk sert virajda neden gerekli olduğunu anlarsınız.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="python" /><category term="dekoratör" /><category term="functools" /><category term="metadata" /><category term="wraps" /><summary type="html"><![CDATA[Python dekoratörleri, bir fonksiyonun davranışını kaynak kodunu değiştirmeden genişletmenin zarif bir yoludur. Ancak dekoratörümüzü dikkatsizce yazarsak orijinal fonksiyonun adı, docstring’i ve diğer metadata bilgileri ortadan kaybolabilir. Fonksiyon çalışmaya devam eder ama sahneye başka birinin kimliğiyle çıkar. Neyse ki functools.wraps, bu küçük kimlik krizini çözmek için standart kütüphanede bizi bekler.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/python-dekoratorlerinde-kimlik-57.png" /><media:content medium="image" url="https://program.sonsuz.us/img/python-dekoratorlerinde-kimlik-57.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Python’da Sınıf ve Örnek Değişkenleri: Gizli Veri Paylaşımı Tuzağı</title><link href="https://program.sonsuz.us/posts/pythonda-sinif-ve-ornek-degiskenleri-gizli-veri-paylasimi-tuzagi/" rel="alternate" type="text/html" title="Python’da Sınıf ve Örnek Değişkenleri: Gizli Veri Paylaşımı Tuzağı" /><published>2026-10-21T00:00:00+00:00</published><updated>2026-10-21T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/pythonda-sinif-ve-ornek-degiskenleri-gizli-veri-paylasimi-tuzagi</id><content type="html" xml:base="https://program.sonsuz.us/posts/pythonda-sinif-ve-ornek-degiskenleri-gizli-veri-paylasimi-tuzagi/"><![CDATA[<p>Python’da nesne yönelimli programlama yaparken sınıf değişkenleri ile örnek değişkenleri arasındaki küçük görünen fark, beklenmedik sonuçlara yol açabilir. Özellikle liste veya sözlük gibi değiştirilebilir bir nesne sınıf değişkeni olarak tanımlandığında, bir örnekte yapılan değişiklik diğer örneklerde de ortaya çıkar. Böylece birbirinden bağımsız olması beklenen nesneler, farkında olmadan aynı veriyi paylaşmaya başlar.</p>

<p><img src="/img/pythonda-sinif-ve-54.svg" alt="pythonda-sinif-ve-54" /></p>

<p>``</p>

<h2 id="sınıf-değişkeni-nedir">Sınıf değişkeni nedir?</h2>

<p>Sınıf değişkeni, sınıf gövdesinde tanımlanır ve sınıfın bütün örnekleri tarafından paylaşılır. Bir sınıftan $n$ adet nesne üretilse bile ilgili sınıf değişkeni için genellikle tek bir ortak nesne bulunur:</p>

\[\text{paylaşılan veri sayısı} = 1\]

<p>Örnek değişkeni ise çoğunlukla <code class="language-plaintext highlighter-rouge">__init__</code> içinde <code class="language-plaintext highlighter-rouge">self</code> üzerinden oluşturulur. Her örnek kendi değerini taşır:</p>

\[\text{bağımsız veri sayısı} = n\]

<p>Temel farkı şöyle özetleyebiliriz:</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Sınıf değişkeni</th>
      <th>Örnek değişkeni</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tanımlandığı yer</td>
      <td>Sınıf gövdesi</td>
      <td>Genellikle <code class="language-plaintext highlighter-rouge">__init__</code> metodu</td>
    </tr>
    <tr>
      <td>Erişim</td>
      <td><code class="language-plaintext highlighter-rouge">Sinif.deger</code> veya <code class="language-plaintext highlighter-rouge">nesne.deger</code></td>
      <td><code class="language-plaintext highlighter-rouge">nesne.deger</code></td>
    </tr>
    <tr>
      <td>Paylaşım</td>
      <td>Bütün örneklerde ortak</td>
      <td>Her örneğe özel</td>
    </tr>
    <tr>
      <td>Uygun kullanım</td>
      <td>Sabitler, sayaçlar, ortak ayarlar</td>
      <td>Kullanıcı adı, bakiye, kişisel liste</td>
    </tr>
  </tbody>
</table>

<h2 id="tehlikeli-örnek-ortak-liste">Tehlikeli örnek: Ortak liste</h2>

<p>Aşağıdaki sınıfta <code class="language-plaintext highlighter-rouge">gorevler</code>, sınıf seviyesinde tanımlanmıştır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Kullanici</span><span class="p">:</span>
    <span class="n">gorevler</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">ad</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">ad</span> <span class="o">=</span> <span class="n">ad</span>

    <span class="k">def</span> <span class="nf">gorev_ekle</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">gorev</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">gorevler</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">gorev</span><span class="p">)</span>

<span class="n">ayse</span> <span class="o">=</span> <span class="nc">Kullanici</span><span class="p">(</span><span class="sh">'</span><span class="s">Ayşe</span><span class="sh">'</span><span class="p">)</span>
<span class="n">mehmet</span> <span class="o">=</span> <span class="nc">Kullanici</span><span class="p">(</span><span class="sh">'</span><span class="s">Mehmet</span><span class="sh">'</span><span class="p">)</span>

<span class="n">ayse</span><span class="p">.</span><span class="nf">gorev_ekle</span><span class="p">(</span><span class="sh">'</span><span class="s">Raporu hazırla</span><span class="sh">'</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">ayse</span><span class="p">.</span><span class="n">gorevler</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">mehmet</span><span class="p">.</span><span class="n">gorevler</span><span class="p">)</span>
</code></pre></div></div>

<p>Her iki çıktı da <code class="language-plaintext highlighter-rouge">['Raporu hazırla']</code> olur. Mehmet rapor hazırlamak istememişti; ancak Python onu projeye gönüllü yazdı! Bunun nedeni, <code class="language-plaintext highlighter-rouge">ayse.gorevler</code> ile <code class="language-plaintext highlighter-rouge">mehmet.gorevler</code> ifadelerinin aynı listeyi bulmasıdır.</p>

<p>Bunu kimlik kontrolüyle doğrulayabiliriz:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">print</span><span class="p">(</span><span class="n">ayse</span><span class="p">.</span><span class="n">gorevler</span> <span class="ow">is</span> <span class="n">mehmet</span><span class="p">.</span><span class="n">gorevler</span><span class="p">)</span>  <span class="c1"># True
</span><span class="nf">print</span><span class="p">(</span><span class="nf">id</span><span class="p">(</span><span class="n">ayse</span><span class="p">.</span><span class="n">gorevler</span><span class="p">)</span> <span class="o">==</span> <span class="nf">id</span><span class="p">(</span><span class="n">mehmet</span><span class="p">.</span><span class="n">gorevler</span><span class="p">))</span>  <span class="c1"># True
</span></code></pre></div></div>

<p>Python bir niteliği ararken önce örneğin kendi alanına, ardından sınıfa bakar. <code class="language-plaintext highlighter-rouge">gorevler</code> örneklerin içinde bulunmadığı için sınıftaki ortak listeye ulaşılır. <code class="language-plaintext highlighter-rouge">append</code>, yeni bir liste atamak yerine mevcut listeyi yerinde değiştirir.</p>

<h2 id="doğru-çözüm-listeyi-örnekte-oluşturmak">Doğru çözüm: Listeyi örnekte oluşturmak</h2>

<p>Her kullanıcının bağımsız görev listesine sahip olması için liste <code class="language-plaintext highlighter-rouge">__init__</code> içinde tanımlanmalıdır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Kullanici</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">ad</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">ad</span> <span class="o">=</span> <span class="n">ad</span>
        <span class="n">self</span><span class="p">.</span><span class="n">gorevler</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="k">def</span> <span class="nf">gorev_ekle</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">gorev</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">gorevler</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">gorev</span><span class="p">)</span>

<span class="n">ayse</span> <span class="o">=</span> <span class="nc">Kullanici</span><span class="p">(</span><span class="sh">'</span><span class="s">Ayşe</span><span class="sh">'</span><span class="p">)</span>
<span class="n">mehmet</span> <span class="o">=</span> <span class="nc">Kullanici</span><span class="p">(</span><span class="sh">'</span><span class="s">Mehmet</span><span class="sh">'</span><span class="p">)</span>

<span class="n">ayse</span><span class="p">.</span><span class="nf">gorev_ekle</span><span class="p">(</span><span class="sh">'</span><span class="s">Raporu hazırla</span><span class="sh">'</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">ayse</span><span class="p">.</span><span class="n">gorevler</span><span class="p">)</span>    <span class="c1"># ['Raporu hazırla']
</span><span class="nf">print</span><span class="p">(</span><span class="n">mehmet</span><span class="p">.</span><span class="n">gorevler</span><span class="p">)</span>  <span class="c1"># []
</span></code></pre></div></div>

<p>Artık her <code class="language-plaintext highlighter-rouge">Kullanici</code> oluşturulduğunda bellekte yeni bir liste üretilir. Dolayısıyla kimlik karşılaştırması <code class="language-plaintext highlighter-rouge">False</code> sonucunu verir.</p>

<h2 id="her-sınıf-değişkeni-kötü-müdür">Her sınıf değişkeni kötü müdür?</h2>

<p>Hayır. Değişmez veya gerçekten ortak olması gereken bilgiler için sınıf değişkenleri oldukça kullanışlıdır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Kullanici</span><span class="p">:</span>
    <span class="n">uygulama_adi</span> <span class="o">=</span> <span class="sh">'</span><span class="s">Görev Ustası</span><span class="sh">'</span>
    <span class="n">kullanici_sayisi</span> <span class="o">=</span> <span class="mi">0</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">ad</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">ad</span> <span class="o">=</span> <span class="n">ad</span>
        <span class="n">self</span><span class="p">.</span><span class="n">gorevler</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="n">Kullanici</span><span class="p">.</span><span class="n">kullanici_sayisi</span> <span class="o">+=</span> <span class="mi">1</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">uygulama_adi</code> bütün kullanıcılar için ortaktır. <code class="language-plaintext highlighter-rouge">kullanici_sayisi</code> ise oluşturulan toplam örnek sayısını izler. Buna karşılık <code class="language-plaintext highlighter-rouge">ad</code> ve <code class="language-plaintext highlighter-rouge">gorevler</code>, kullanıcıya özgüdür.</p>

<h2 id="atama-ile-değiştirme-arasındaki-ince-fark">Atama ile değiştirme arasındaki ince fark</h2>

<p><code class="language-plaintext highlighter-rouge">nesne.gorevler = []</code> yazmak, örnek üzerinde yeni bir nitelik oluşturabilir ve sınıf değişkenini gölgeleyebilir. Fakat <code class="language-plaintext highlighter-rouge">nesne.gorevler.append(...)</code> ortak nesneyi doğrudan değiştirir. Bu nedenle yalnızca çıktıya bakmak yerine verinin nerede tanımlandığını sorgulamak önemlidir.</p>

<p>Pratik kural şudur: Bir değer nesneye özgüyse <code class="language-plaintext highlighter-rouge">self</code> ile oluşturun. Liste, sözlük veya küme gibi değiştirilebilir yapıları sınıf gövdesine koymadan önce mutlaka “Bunun bütün örneklerce paylaşılmasını gerçekten istiyor muyum?” diye sorun. Cevap hayırsa doğru adres <code class="language-plaintext highlighter-rouge">__init__</code> metodudur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="python" /><category term="sınıflar" /><category term="oop" /><category term="değişkenler" /><category term="hata ayıklama" /><summary type="html"><![CDATA[Python’da nesne yönelimli programlama yaparken sınıf değişkenleri ile örnek değişkenleri arasındaki küçük görünen fark, beklenmedik sonuçlara yol açabilir. Özellikle liste veya sözlük gibi değiştirilebilir bir nesne sınıf değişkeni olarak tanımlandığında, bir örnekte yapılan değişiklik diğer örneklerde de ortaya çıkar. Böylece birbirinden bağımsız olması beklenen nesneler, farkında olmadan aynı veriyi paylaşmaya başlar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/pythonda-sinif-ve-54.png" /><media:content medium="image" url="https://program.sonsuz.us/img/pythonda-sinif-ve-54.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Robot Kollarında Yer Çekimi Telafisiyle Daha Az Enerji, Daha Akıllı Hareket</title><link href="https://program.sonsuz.us/posts/robot-kollarinda-yer-cekimi-telafisiyle-daha-az-enerji-daha-akilli-hareket/" rel="alternate" type="text/html" title="Robot Kollarında Yer Çekimi Telafisiyle Daha Az Enerji, Daha Akıllı Hareket" /><published>2026-10-21T00:00:00+00:00</published><updated>2026-10-21T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/robot-kollarinda-yer-cekimi-telafisiyle-daha-az-enerji-daha-akilli-hareket</id><content type="html" xml:base="https://program.sonsuz.us/posts/robot-kollarinda-yer-cekimi-telafisiyle-daha-az-enerji-daha-akilli-hareket/"><![CDATA[<p>Bir robot kolu hareketsiz görünürken bile motorları pek dinlenmez. Eklemler, kolun ve taşıdığı yükün aşağı düşmesini önlemek için sürekli tork üretir. Yer çekimi telafisi, bu zorunlu yükü yazılımsal kontrol, yaylar, karşı ağırlıklar veya başka mekanik düzeneklerle dengeleyerek enerji tüketimini azaltmayı amaçlar. Kısacası robot, kendi kolunu taşımak yerine asıl görevine odaklanır.</p>

<p>``</p>

<h2 id="yer-çekimi-robot-kolunu-nasıl-etkiler">Yer çekimi robot kolunu nasıl etkiler?</h2>

<p>Robot kolunun her bağlantısının bir kütlesi ve kütle merkezi vardır. Yer çekimi bu merkezlerde kuvvet oluşturur; eklem motorları da ters yönde tork üretmek zorunda kalır. Basit, tek eklemli bir kol için gerekli dengeleme torku yaklaşık olarak şöyledir:</p>

\[\tau_g = m g l_c \cos(\theta)\]

<p>Burada $m$ bağlantının kütlesi, $g$ yer çekimi ivmesi, $l_c$ eklem ile kütle merkezi arasındaki mesafe, $\theta$ ise kolun açısıdır. Çok eklemli robotlarda tüm bağlantılar birbirini etkiler ve denklem vektörel hâle gelir:</p>

\[M(q)\ddot{q} + C(q,\dot{q})\dot{q} + G(q) + F(\dot{q}) = \tau\]

<p>$G(q)$ terimi, eklemlerin yer çekimine karşı üretmesi gereken torkları temsil eder. Telafinin temel fikri, denetleyiciye önceden hesaplanmış $G(q)$ değerini eklemektir:</p>

\[\tau_{motor} = \tau_{kontrol} + G(q)\]

<p>Böylece geri besleme denetleyicisi büyük konum hataları oluşmasını beklemeden doğru torku uygular.</p>

<h2 id="yazılımsal-ve-mekanik-telafi-aynı-şey-mi">Yazılımsal ve mekanik telafi aynı şey mi?</h2>

<p>Hayır. Yazılımsal telafi hareket kalitesini artırır ancak motorun fiziksel olarak tork üretme zorunluluğunu ortadan kaldırmaz. Mekanik telafi ise yükün bir kısmını gerçekten yaylara veya karşı ağırlıklara aktarabilir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Dezavantaj</th>
      <th>Enerji etkisi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Model tabanlı yazılım</td>
      <td>Hassas ve ayarlanabilir</td>
      <td>Doğru model gerektirir</td>
      <td>Gereksiz düzeltmeleri azaltır</td>
    </tr>
    <tr>
      <td>Yay veya gazlı amortisör</td>
      <td>Elektrik harcamadan tork sağlar</td>
      <td>Çalışma aralığı sınırlı olabilir</td>
      <td>Statik tüketimi ciddi azaltabilir</td>
    </tr>
    <tr>
      <td>Karşı ağırlık</td>
      <td>Basit ve güvenilir</td>
      <td>Kütleyi ve ataleti artırır</td>
      <td>Tutma enerjisini azaltır</td>
    </tr>
    <tr>
      <td>Rejeneratif sürücü</td>
      <td>İnişte enerjiyi geri kazanır</td>
      <td>Uyumlu donanım gerekir</td>
      <td>Enerjiyi sisteme geri besler</td>
    </tr>
  </tbody>
</table>

<p>En iyi sonuç çoğu zaman hibrit çözümdür: mekanik sistem yükün büyük bölümünü taşırken yazılım kalan hatayı düzeltir.</p>

<h2 id="enerji-tasarrufu-nasıl-hesaplanır">Enerji tasarrufu nasıl hesaplanır?</h2>

<p>Bir eklemde elektriksel tüketimi kabaca tork ve açısal hızla ilişkilendirebiliriz:</p>

\[P_{mekanik} = \tau \omega\]

<p>Kol sabitken $\omega=0$ olduğundan mekanik güç sıfır görünür. Fakat motor sargılarından akım geçtiği için $P_{bakır}=I^2R$ kaybı devam eder. Bu önemli ayrıntı, “hareket etmeyen robot enerji harcamaz” düşüncesini bozar.</p>

<p>Aşağıdaki Python kodu, telafi öncesi ve sonrası bakır kaybını yaklaşık olarak karşılaştırır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">math</span>

<span class="n">mass</span> <span class="o">=</span> <span class="mf">8.0</span>          <span class="c1"># kg
</span><span class="n">length</span> <span class="o">=</span> <span class="mf">0.45</span>       <span class="c1"># metre
</span><span class="n">angle</span> <span class="o">=</span> <span class="n">math</span><span class="p">.</span><span class="nf">radians</span><span class="p">(</span><span class="mi">30</span><span class="p">)</span>
<span class="n">torque_constant</span> <span class="o">=</span> <span class="mf">0.8</span>  <span class="c1"># Nm/A
</span><span class="n">resistance</span> <span class="o">=</span> <span class="mf">1.2</span>       <span class="c1"># ohm
</span><span class="n">compensation</span> <span class="o">=</span> <span class="mf">0.70</span>    <span class="c1"># mekanik olarak karşılanan oran
</span>
<span class="n">gravity_torque</span> <span class="o">=</span> <span class="n">mass</span> <span class="o">*</span> <span class="mf">9.81</span> <span class="o">*</span> <span class="n">length</span> <span class="o">*</span> <span class="n">math</span><span class="p">.</span><span class="nf">cos</span><span class="p">(</span><span class="n">angle</span><span class="p">)</span>
<span class="n">current_before</span> <span class="o">=</span> <span class="n">gravity_torque</span> <span class="o">/</span> <span class="n">torque_constant</span>
<span class="n">current_after</span> <span class="o">=</span> <span class="n">gravity_torque</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">compensation</span><span class="p">)</span> <span class="o">/</span> <span class="n">torque_constant</span>

<span class="n">loss_before</span> <span class="o">=</span> <span class="n">current_before</span><span class="o">**</span><span class="mi">2</span> <span class="o">*</span> <span class="n">resistance</span>
<span class="n">loss_after</span> <span class="o">=</span> <span class="n">current_after</span><span class="o">**</span><span class="mi">2</span> <span class="o">*</span> <span class="n">resistance</span>
<span class="n">saving</span> <span class="o">=</span> <span class="mi">100</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">loss_after</span> <span class="o">/</span> <span class="n">loss_before</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Yer çekimi torku: </span><span class="si">{</span><span class="n">gravity_torque</span><span class="si">:</span><span class="p">.</span><span class="mi">2</span><span class="n">f</span><span class="si">}</span><span class="s"> Nm</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Tahmini bakır kaybı azalması: %</span><span class="si">{</span><span class="n">saving</span><span class="si">:</span><span class="p">.</span><span class="mi">1</span><span class="n">f</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Akım azaldığında kayıp karesel olarak düştüğü için yüzde 70 tork telafisi, ideal koşullarda yüzde 91 civarında bakır kaybı azalması sağlayabilir. Gerçek sistemlerde sürücü kayıpları, sürtünme ve değişken yük nedeniyle sonuç daha düşük olur.</p>

<h2 id="tasarımda-dikkat-edilmesi-gerekenler">Tasarımda dikkat edilmesi gerekenler</h2>

<p>Yanlış kütle veya kütle merkezi tahmini robotun titremesine, sürüklenmesine ya da gereğinden fazla tork üretmesine yol açabilir. Ayrıca karşı ağırlık enerji kazandırırken robotun ataletini yükseltip hızlı hareketleri pahalılaştırabilir. Bu nedenle başarı yalnızca “daha büyük yay” seçmekten değil; görev çevrimi, yük değişimi, güvenlik ve hareket hızını birlikte değerlendirmekten geçer.</p>

<p>Doğru tasarlanan yer çekimi telafisi daha küçük motorlar, daha düşük sıcaklık, uzun batarya ömrü ve daha güvenli insan-robot etkileşimi sağlar. Robot koluna görünmez bir destek eli vermek, enerji verimliliğinin en etkili yollarından biridir.</p>

<p><img src="/img/robot-kollarinda-yer-30.svg" alt="robot-kollarinda-yer-30" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="robotik" /><category term="yer çekimi telafisi" /><category term="enerji verimliliği" /><category term="kontrol sistemleri" /><category term="robot kolları" /><category term="mekatronik" /><summary type="html"><![CDATA[Bir robot kolu hareketsiz görünürken bile motorları pek dinlenmez. Eklemler, kolun ve taşıdığı yükün aşağı düşmesini önlemek için sürekli tork üretir. Yer çekimi telafisi, bu zorunlu yükü yazılımsal kontrol, yaylar, karşı ağırlıklar veya başka mekanik düzeneklerle dengeleyerek enerji tüketimini azaltmayı amaçlar. Kısacası robot, kendi kolunu taşımak yerine asıl görevine odaklanır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/robot-kollarinda-yer-30.png" /><media:content medium="image" url="https://program.sonsuz.us/img/robot-kollarinda-yer-30.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>