<?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://sonsuzus.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://sonsuzus.github.io/" rel="alternate" type="text/html" /><updated>2026-07-28T07:13:27+00:00</updated><id>https://sonsuzus.github.io/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">Fonksiyonlar Sahneye Çıkıyor: Birinci Sınıf Vatandaşlık ve Arrow Function’lar</title><link href="https://sonsuzus.github.io/posts/fonksiyonlar-sahneye-cikiyor-birinci-sinif-vatandaslik-ve-arrow-functionlar/" rel="alternate" type="text/html" title="Fonksiyonlar Sahneye Çıkıyor: Birinci Sınıf Vatandaşlık ve Arrow Function’lar" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/fonksiyonlar-sahneye-cikiyor-birinci-sinif-vatandaslik-ve-arrow-functionlar</id><content type="html" xml:base="https://sonsuzus.github.io/posts/fonksiyonlar-sahneye-cikiyor-birinci-sinif-vatandaslik-ve-arrow-functionlar/"><![CDATA[<p>Programlamada fonksiyonları yalnızca çağrıldığında çalışan kod paketleri olarak düşünmek eksik kalır. JavaScript gibi dillerde fonksiyonlar aynı zamanda değişkenlere atanabilir, başka fonksiyonlara gönderilebilir ve sonuç olarak döndürülebilir. Kısacası fonksiyonlar, dilin ayrıcalıklı üyeleri değil; diğer değerlerle aynı haklara sahip <strong>birinci sınıf vatandaşlarıdır</strong>.</p>

<p>``</p>

<h2 id="birinci-sınıf-vatandaş-ne-demektir">Birinci sınıf vatandaş ne demektir?</h2>

<p>Bir programlama dilinde bir değer aşağıdaki işlemleri destekliyorsa genellikle birinci sınıf kabul edilir:</p>

<ul>
  <li>Bir değişkene atanabilir.</li>
  <li>Veri yapılarında saklanabilir.</li>
  <li>Fonksiyonlara parametre olarak geçirilebilir.</li>
  <li>Başka bir fonksiyondan döndürülebilir.</li>
</ul>

<p>JavaScript fonksiyonları bu koşulların tamamını karşılar. Matematiksel açıdan bir fonksiyonu $f: A \rightarrow B$ biçiminde gösteririz. Bu ifade, $f$ fonksiyonunun $A$ kümesindeki bir girdiyi $B$ kümesindeki bir çıktıya dönüştürdüğünü söyler. Programlamadaki önemli fark, $f$ değerinin kendisini de taşıyabilmemizdir.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">topla</span> <span class="o">=</span> <span class="nf">function </span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span><span class="p">;</span>
<span class="p">};</span>

<span class="kd">const</span> <span class="nx">hesapla</span> <span class="o">=</span> <span class="nx">topla</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">hesapla</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">6</span><span class="p">));</span> <span class="c1">// 10</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">topla</code> fonksiyonu çalıştırılmadan <code class="language-plaintext highlighter-rouge">hesapla</code> değişkenine atanır. Parantez kullanılmaması kritiktir: <code class="language-plaintext highlighter-rouge">topla</code> fonksiyonun kendisini, <code class="language-plaintext highlighter-rouge">topla()</code> ise fonksiyon çağrısının sonucunu ifade eder.</p>

<h2 id="fonksiyonları-parametre-olarak-geçirmek">Fonksiyonları parametre olarak geçirmek</h2>

<p>Bir fonksiyona başka bir fonksiyon verilmesine <strong>callback</strong> yaklaşımı denir. Callback alan fonksiyon ise yüksek dereceli fonksiyondur. Bu yapı, davranışı veriden ayırarak tekrar kullanılabilir kod üretmemizi sağlar.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">uygula</span><span class="p">(</span><span class="nx">sayi</span><span class="p">,</span> <span class="nx">islem</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nf">islem</span><span class="p">(</span><span class="nx">sayi</span><span class="p">);</span>
<span class="p">}</span>

<span class="kd">const</span> <span class="nx">ikiyleCarp</span> <span class="o">=</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span> <span class="o">*</span> <span class="mi">2</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">karesiniAl</span> <span class="o">=</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span> <span class="o">**</span> <span class="mi">2</span><span class="p">;</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">uygula</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="nx">ikiyleCarp</span><span class="p">));</span> <span class="c1">// 10</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">uygula</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="nx">karesiniAl</span><span class="p">));</span> <span class="c1">// 25</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">uygula</code>, hangi hesabın yapılacağını bilmez; yalnızca aldığı davranışı çalıştırır. Matematiksel olarak bunu $uygula(x, f) = f(x)$ şeklinde düşünebiliriz. Böylece aynı mekanizma, farklı fonksiyonlarla farklı sonuçlar üretir.</p>

<h2 id="fonksiyondan-fonksiyon-döndürmek">Fonksiyondan fonksiyon döndürmek</h2>

<p>Fonksiyonlar sonuç olarak da üretilebilir. Bu teknik yapılandırılabilir ve özelleştirilebilir işlemler oluşturmak için kullanışlıdır.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">carpaniOlustur</span><span class="p">(</span><span class="nx">carpan</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nx">sayi</span> <span class="o">=&gt;</span> <span class="nx">sayi</span> <span class="o">*</span> <span class="nx">carpan</span><span class="p">;</span>
<span class="p">}</span>

<span class="kd">const</span> <span class="nx">ucleCarp</span> <span class="o">=</span> <span class="nf">carpaniOlustur</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">ucleCarp</span><span class="p">(</span><span class="mi">7</span><span class="p">));</span> <span class="c1">// 21</span>
</code></pre></div></div>

<p>Döndürülen fonksiyon, dış fonksiyon tamamlandıktan sonra bile <code class="language-plaintext highlighter-rouge">carpan</code> değerini hatırlar. Bu davranışa <strong>closure</strong> denir. Adeta fonksiyon küçük bir sırt çantası taşır ve doğduğu kapsamın değişkenlerini yanında götürür.</p>

<h2 id="arrow-function-avantajları">Arrow function avantajları</h2>

<p>Arrow function sözdizimi özellikle kısa callback ifadelerinde kodu sadeleştirir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Klasik fonksiyon</th>
      <th>Arrow function</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yazım</td>
      <td><code class="language-plaintext highlighter-rouge">function (x) { return x * 2; }</code></td>
      <td><code class="language-plaintext highlighter-rouge">x =&gt; x * 2</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">this</code> davranışı</td>
      <td>Çağrılma biçimine göre belirlenir</td>
      <td>Dış kapsamdaki <code class="language-plaintext highlighter-rouge">this</code> değerini kullanır</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">arguments</code> nesnesi</td>
      <td>Bulunur</td>
      <td>Bulunmaz</td>
    </tr>
    <tr>
      <td>Constructor kullanımı</td>
      <td><code class="language-plaintext highlighter-rouge">new</code> ile kullanılabilir</td>
      <td><code class="language-plaintext highlighter-rouge">new</code> ile kullanılamaz</td>
    </tr>
    <tr>
      <td>Kısa callback uygunluğu</td>
      <td>Daha uzun</td>
      <td>Genellikle daha okunaklı</td>
    </tr>
  </tbody>
</table>

<p>Tek ifadeli arrow function’larda <code class="language-plaintext highlighter-rouge">return</code> ve süslü parantezler çıkarılabilir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">fiyatlar</span> <span class="o">=</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">300</span><span class="p">];</span>
<span class="kd">const</span> <span class="nx">kdvliFiyatlar</span> <span class="o">=</span> <span class="nx">fiyatlar</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="nx">fiyat</span> <span class="o">=&gt;</span> <span class="nx">fiyat</span> <span class="o">*</span> <span class="mf">1.20</span><span class="p">);</span>
</code></pre></div></div>

<p>Ancak arrow function her durumda daha iyi değildir. Nesne metotlarında dinamik <code class="language-plaintext highlighter-rouge">this</code> gerekiyorsa klasik fonksiyon tercih edilmelidir.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">kullanici</span> <span class="o">=</span> <span class="p">{</span>
  <span class="na">ad</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Ada</span><span class="dl">"</span><span class="p">,</span>
  <span class="nf">selamla</span><span class="p">()</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Merhaba, </span><span class="p">${</span><span class="k">this</span><span class="p">.</span><span class="nx">ad</span><span class="p">}</span><span class="s2">!`</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Sonuç olarak birinci sınıf fonksiyonlar; callback, closure, olay yönetimi ve fonksiyonel programlama gibi pek çok yaklaşımın temelidir. Arrow function’lar bu gücü kısa bir sözdizimiyle sunar, fakat <code class="language-plaintext highlighter-rouge">this</code> ve constructor farklılıkları unutulmamalıdır. Fonksiyonları yalnızca çalışan bloklar değil, taşınabilen ve birleştirilebilen değerler olarak gördüğünüzde JavaScript çok daha esnek bir oyun alanına dönüşür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="JavaScript" /><category term="Fonksiyonel Programlama" /><category term="Arrow Functions" /><summary type="html"><![CDATA[Programlamada fonksiyonları yalnızca çağrıldığında çalışan kod paketleri olarak düşünmek eksik kalır. JavaScript gibi dillerde fonksiyonlar aynı zamanda değişkenlere atanabilir, başka fonksiyonlara gönderilebilir ve sonuç olarak döndürülebilir. Kısacası fonksiyonlar, dilin ayrıcalıklı üyeleri değil; diğer değerlerle aynı haklara sahip birinci sınıf vatandaşlarıdır.]]></summary></entry><entry><title type="html">JavaScript Dizileri ve Yüksek Mertebe Metotlarla Veriyi Dönüştürme</title><link href="https://sonsuzus.github.io/posts/javascript-dizileri-ve-yuksek-mertebe-metotlarla-veriyi-donusturme/" rel="alternate" type="text/html" title="JavaScript Dizileri ve Yüksek Mertebe Metotlarla Veriyi Dönüştürme" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/javascript-dizileri-ve-yuksek-mertebe-metotlarla-veriyi-donusturme</id><content type="html" xml:base="https://sonsuzus.github.io/posts/javascript-dizileri-ve-yuksek-mertebe-metotlarla-veriyi-donusturme/"><![CDATA[<p>Bir alışveriş sepetindeki ürünlerden sınav notlarına kadar pek çok veri, yazılım dünyasında listeler hâlinde karşımıza çıkar. JavaScript dizileri bu verileri tek bir değişkende düzenli biçimde saklarken <code class="language-plaintext highlighter-rouge">map</code>, <code class="language-plaintext highlighter-rouge">filter</code> ve <code class="language-plaintext highlighter-rouge">reduce</code> gibi yüksek mertebe metotlar, döngü karmaşasına kapılmadan verileri dönüştürmemizi sağlar.
``</p>
<h2 id="dizi-nedir">Dizi nedir?</h2>

<p>Dizi, birden fazla değeri sıralı biçimde saklayan veri yapısıdır. JavaScript’te köşeli parantezlerle oluşturulur ve her elemanın sıfırdan başlayan bir indeksi vardır.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">diller</span> <span class="o">=</span> <span class="p">[</span><span class="dl">"</span><span class="s2">JavaScript</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">Python</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">Go</span><span class="dl">"</span><span class="p">];</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">diller</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span> <span class="c1">// JavaScript</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">diller</span><span class="p">.</span><span class="nx">length</span><span class="p">);</span> <span class="c1">// 3</span>
</code></pre></div></div>

<p>Bir dizide $n$ eleman varsa geçerli indeksler $0$ ile $n-1$ arasındadır. Örneğin üç elemanlı bir dizinin son elemanı <code class="language-plaintext highlighter-rouge">diller[2]</code> olur. Son elemana daha okunaklı biçimde <code class="language-plaintext highlighter-rouge">diller.at(-1)</code> kullanılarak da erişilebilir.</p>

<p>Diziler yalnızca metin değil; sayı, nesne ve hatta başka diziler barındırabilir. Yine de uygulamada aynı amaca hizmet eden verileri bir arada tutmak kodun anlaşılmasını kolaylaştırır.</p>

<h2 id="yüksek-mertebe-metot-nedir">Yüksek mertebe metot nedir?</h2>

<p>Yüksek mertebe fonksiyon, başka bir fonksiyonu parametre olarak alabilen veya sonuç olarak fonksiyon döndürebilen fonksiyondur. Dizi metotları, her eleman için çalıştırılacak bir geri çağırma fonksiyonu alır.</p>

<table>
  <thead>
    <tr>
      <th>Metot</th>
      <th>Temel amaç</th>
      <th>Sonuç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">map</code></td>
      <td>Her elemanı dönüştürmek</td>
      <td>Aynı uzunlukta yeni dizi</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">filter</code></td>
      <td>Koşula uyanları seçmek</td>
      <td>Yeni ve çoğunlukla daha kısa dizi</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">reduce</code></td>
      <td>Elemanları tek sonuçta birleştirmek</td>
      <td>Sayı, nesne, dizi veya başka bir değer</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">forEach</code></td>
      <td>Her eleman için işlem yapmak</td>
      <td><code class="language-plaintext highlighter-rouge">undefined</code></td>
    </tr>
  </tbody>
</table>

<p>Bu metotlar kaynak diziyi doğrudan değiştirmez. Böylece beklenmedik yan etkiler azalır ve veri akışı daha kolay takip edilir.</p>

<h2 id="map-her-elemanı-dönüştür"><code class="language-plaintext highlighter-rouge">map</code>: Her elemanı dönüştür</h2>

<p><code class="language-plaintext highlighter-rouge">map</code>, dizideki her elemanı verilen fonksiyondan geçirir. Matematiksel olarak bir $f$ fonksiyonunun tüm elemanlara uygulanması gibi düşünülebilir:</p>

\[[x_1,x_2,\ldots,x_n] \rightarrow [f(x_1),f(x_2),\ldots,f(x_n)]\]

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">fiyatlar</span> <span class="o">=</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">250</span><span class="p">,</span> <span class="mi">80</span><span class="p">];</span>
<span class="kd">const</span> <span class="nx">kdvliFiyatlar</span> <span class="o">=</span> <span class="nx">fiyatlar</span><span class="p">.</span><span class="nf">map</span><span class="p">((</span><span class="nx">fiyat</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">fiyat</span> <span class="o">*</span> <span class="mf">1.20</span><span class="p">);</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">kdvliFiyatlar</span><span class="p">);</span> <span class="c1">// [120, 300, 96]</span>
</code></pre></div></div>

<p>Burada her fiyat yüzde 20 KDV eklenerek dönüştürülür. Orijinal <code class="language-plaintext highlighter-rouge">fiyatlar</code> dizisi değişmez.</p>

<h2 id="filter-i̇stenmeyenleri-ele"><code class="language-plaintext highlighter-rouge">filter</code>: İstenmeyenleri ele</h2>

<p><code class="language-plaintext highlighter-rouge">filter</code>, geri çağırma fonksiyonu <code class="language-plaintext highlighter-rouge">true</code> döndüren elemanları yeni diziye taşır. Bir sınıftaki başarılı notları seçelim:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">notlar</span> <span class="o">=</span> <span class="p">[</span><span class="mi">45</span><span class="p">,</span> <span class="mi">82</span><span class="p">,</span> <span class="mi">67</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">91</span><span class="p">];</span>
<span class="kd">const</span> <span class="nx">basariliNotlar</span> <span class="o">=</span> <span class="nx">notlar</span><span class="p">.</span><span class="nf">filter</span><span class="p">((</span><span class="nx">not</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">not</span> <span class="o">&gt;=</span> <span class="mi">50</span><span class="p">);</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">basariliNotlar</span><span class="p">);</span> <span class="c1">// [82, 67, 91]</span>
</code></pre></div></div>

<p>Koşul bir süzgeç gibi çalışır. En kötü durumda bütün elemanlar incelendiği için zaman karmaşıklığı $O(n)$ olur.</p>

<h2 id="reduce-diziyi-tek-sonuca-indir"><code class="language-plaintext highlighter-rouge">reduce</code>: Diziyi tek sonuca indir</h2>

<p><code class="language-plaintext highlighter-rouge">reduce</code>, biriktirici ve mevcut eleman üzerinden ilerler. İkinci argüman başlangıç değeridir; verilmesi, özellikle boş dizilerde hata riskini azaltır.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">sepet</span> <span class="o">=</span> <span class="p">[</span>
  <span class="p">{</span> <span class="na">ad</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Klavye</span><span class="dl">"</span><span class="p">,</span> <span class="na">fiyat</span><span class="p">:</span> <span class="mi">900</span> <span class="p">},</span>
  <span class="p">{</span> <span class="na">ad</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Fare</span><span class="dl">"</span><span class="p">,</span> <span class="na">fiyat</span><span class="p">:</span> <span class="mi">500</span> <span class="p">},</span>
  <span class="p">{</span> <span class="na">ad</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Kulaklık</span><span class="dl">"</span><span class="p">,</span> <span class="na">fiyat</span><span class="p">:</span> <span class="mi">1200</span> <span class="p">}</span>
<span class="p">];</span>

<span class="kd">const</span> <span class="nx">toplam</span> <span class="o">=</span> <span class="nx">sepet</span><span class="p">.</span><span class="nf">reduce</span><span class="p">(</span>
  <span class="p">(</span><span class="nx">biriken</span><span class="p">,</span> <span class="nx">urun</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">biriken</span> <span class="o">+</span> <span class="nx">urun</span><span class="p">.</span><span class="nx">fiyat</span><span class="p">,</span>
  <span class="mi">0</span>
<span class="p">);</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">toplam</span><span class="p">);</span> <span class="c1">// 2600</span>
</code></pre></div></div>

<p>Toplam, matematiksel olarak $\sum_{i=1}^{n} fiyat_i$ işlemidir. Biriktirici başlangıçta <code class="language-plaintext highlighter-rouge">0</code> değerini alır ve her ürünün fiyatıyla güncellenir.</p>

<h2 id="metotları-zincirlemek">Metotları zincirlemek</h2>

<p>Asıl eğlence metotlar birleştiğinde başlar. Önce pahalı ürünleri seçip sonra adlarını dönüştürebiliriz:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">pahaliUrunAdlari</span> <span class="o">=</span> <span class="nx">sepet</span>
  <span class="p">.</span><span class="nf">filter</span><span class="p">((</span><span class="nx">urun</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">urun</span><span class="p">.</span><span class="nx">fiyat</span> <span class="o">&gt;=</span> <span class="mi">800</span><span class="p">)</span>
  <span class="p">.</span><span class="nf">map</span><span class="p">((</span><span class="nx">urun</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">urun</span><span class="p">.</span><span class="nx">ad</span><span class="p">.</span><span class="nf">toUpperCase</span><span class="p">());</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">pahaliUrunAdlari</span><span class="p">);</span> <span class="c1">// ["KLAVYE", "KULAKLIK"]</span>
</code></pre></div></div>

<p>Her zincir halkası yeni bir sonuç üretir. Ancak her metot diziyi ayrı dolaştığından devasa veri kümelerinde gereksiz zincirler maliyet yaratabilir. Günlük uygulamalarda ise okunabilirlik kazancı çoğunlukla daha değerlidir.</p>

<p>Kısacası <code class="language-plaintext highlighter-rouge">map</code> dönüştürür, <code class="language-plaintext highlighter-rouge">filter</code> seçer, <code class="language-plaintext highlighter-rouge">reduce</code> biriktirir. Hangi metodu kullanacağınıza karar verirken “Yeni bir liste mi, seçilmiş elemanlar mı, yoksa tek bir sonuç mu istiyorum?” sorusunu sormanız yeterlidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="JavaScript" /><category term="Diziler" /><category term="Fonksiyonel Programlama" /><summary type="html"><![CDATA[Bir alışveriş sepetindeki ürünlerden sınav notlarına kadar pek çok veri, yazılım dünyasında listeler hâlinde karşımıza çıkar. JavaScript dizileri bu verileri tek bir değişkende düzenli biçimde saklarken map, filter ve reduce gibi yüksek mertebe metotlar, döngü karmaşasına kapılmadan verileri dönüştürmemizi sağlar.]]></summary></entry><entry><title type="html">JavaScript Kurulumu: Tarayıcı Konsolundan VS Code ve Node.js’e</title><link href="https://sonsuzus.github.io/posts/javascript-kurulumu-tarayici-konsolundan-vs-code-ve-nodejse/" rel="alternate" type="text/html" title="JavaScript Kurulumu: Tarayıcı Konsolundan VS Code ve Node.js’e" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/javascript-kurulumu-tarayici-konsolundan-vs-code-ve-nodejse</id><content type="html" xml:base="https://sonsuzus.github.io/posts/javascript-kurulumu-tarayici-konsolundan-vs-code-ve-nodejse/"><![CDATA[<p>JavaScript öğrenmeye başlamak için devasa bir kurulum sihrine ihtiyacınız yoktur; modern bir tarayıcı bile ilk programınızı çalıştırmaya yeter. Ancak gerçek projeler geliştirmek istediğinizde tarayıcı konsolu, Node.js, VS Code ve canlı sunucu araçlarından oluşan düzenli bir çalışma ortamı kurmak büyük rahatlık sağlar. Gelin JavaScript atölyemizin ışıklarını birlikte açalım.
``</p>
<h2 id="javascript-nerede-çalışır">JavaScript nerede çalışır?</h2>

<p>JavaScript kodunu çalıştıran temel bileşene <strong>JavaScript motoru</strong> denir. Google Chrome ve Node.js, V8 motorunu kullanır. Firefox ise SpiderMonkey adlı farklı bir motora sahiptir. Motor, yazdığımız kaynak kodunu bilgisayarın işleyebileceği komutlara dönüştürür.</p>

<p>Bir programın yaklaşık çalışma süresini teorik olarak şöyle düşünebiliriz:</p>

\[T_{toplam} = T_{ayrıştırma} + T_{derleme} + T_{çalıştırma}\]

<p>Modern motorlar, sık kullanılan kodları çalışma sırasında optimize eden <strong>JIT (Just-in-Time)</strong> derleme yöntemlerinden yararlanır. Dolayısıyla JavaScript yalnızca “satır satır okunan basit bir betik dili” değildir.</p>

<table>
  <thead>
    <tr>
      <th>Ortam</th>
      <th>Temel kullanım</th>
      <th style="text-align: right">Tarayıcı API’leri</th>
      <th style="text-align: right">Dosya sistemi erişimi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tarayıcı konsolu</td>
      <td>Deneme ve hata ayıklama</td>
      <td style="text-align: right">Var</td>
      <td style="text-align: right">Kısıtlı</td>
    </tr>
    <tr>
      <td>HTML içindeki JavaScript</td>
      <td>Web arayüzleri</td>
      <td style="text-align: right">Var</td>
      <td style="text-align: right">Kısıtlı</td>
    </tr>
    <tr>
      <td>Node.js</td>
      <td>Sunucu ve komut satırı uygulamaları</td>
      <td style="text-align: right">Yok</td>
      <td style="text-align: right">Var</td>
    </tr>
  </tbody>
</table>

<h2 id="tarayıcı-konsoluyla-ilk-buluşma">Tarayıcı konsoluyla ilk buluşma</h2>

<p>Chrome, Edge veya Firefox’ta <code class="language-plaintext highlighter-rouge">F12</code> tuşuna basarak geliştirici araçlarını açın ve <strong>Console</strong> sekmesine geçin. Burada herhangi bir dosya oluşturmadan JavaScript çalıştırabilirsiniz:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">ad</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">Ada</span><span class="dl">'</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">dersSayisi</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Merhaba </span><span class="p">${</span><span class="nx">ad</span><span class="p">}</span><span class="s2">! Bugün </span><span class="p">${</span><span class="nx">dersSayisi</span><span class="p">}</span><span class="s2"> ders var.`</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">table</span><span class="p">({</span> <span class="nx">ad</span><span class="p">,</span> <span class="nx">dersSayisi</span> <span class="p">});</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">console.log</code> değerleri görüntülerken <code class="language-plaintext highlighter-rouge">console.table</code>, nesneleri tablo biçiminde sunar. Konsol hızlı deneyler için harikadır; fakat yazdığınız komutlar kalıcı bir proje düzeni oluşturmaz.</p>

<h2 id="nodejs-kurulumu">Node.js kurulumu</h2>

<p>Node.js, JavaScript’i tarayıcı dışında çalıştıran bir çalışma zamanıdır. Resmî Node.js sitesinden <strong>LTS</strong> sürümünü indirin. LTS, uzun süre desteklenen ve yeni başlayanlar için daha güvenli olan sürümdür. Kurulumla birlikte paket yöneticisi <strong>npm</strong> de gelir.</p>

<p>Terminalde kurulumu doğrulayın:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>node <span class="nt">--version</span>
npm <span class="nt">--version</span>
</code></pre></div></div>

<p>Ardından <code class="language-plaintext highlighter-rouge">merhaba.js</code> adlı bir dosya oluşturup şu kodu yazın:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">sayilar</span> <span class="o">=</span> <span class="p">[</span><span class="mi">4</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">23</span><span class="p">,</span> <span class="mi">42</span><span class="p">];</span>
<span class="kd">const</span> <span class="nx">toplam</span> <span class="o">=</span> <span class="nx">sayilar</span><span class="p">.</span><span class="nf">reduce</span><span class="p">((</span><span class="nx">sonuc</span><span class="p">,</span> <span class="nx">sayi</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">sonuc</span> <span class="o">+</span> <span class="nx">sayi</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Toplam:</span><span class="dl">'</span><span class="p">,</span> <span class="nx">toplam</span><span class="p">);</span>
</code></pre></div></div>

<p>Dosyayı terminalden <code class="language-plaintext highlighter-rouge">node merhaba.js</code> komutuyla çalıştırabilirsiniz. Buradaki toplam işleminin matematiksel gösterimi şöyledir:</p>

\[S = \sum_{i=1}^{n} x_i\]

<h2 id="vs-codeu-hazırlamak">VS Code’u hazırlamak</h2>

<p>VS Code’u kurduktan sonra bir proje klasörü açın. Daha konforlu kod yazmak için şu eklentiler yararlıdır:</p>

<table>
  <thead>
    <tr>
      <th>Eklenti</th>
      <th>Görevi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>ESLint</td>
      <td>Olası kod hatalarını ve kurallara aykırılıkları gösterir</td>
    </tr>
    <tr>
      <td>Prettier</td>
      <td>Kod biçimini otomatik olarak düzenler</td>
    </tr>
    <tr>
      <td>Live Server</td>
      <td>HTML dosyasını yerel sunucuda açar ve yeniler</td>
    </tr>
    <tr>
      <td>Error Lens</td>
      <td>Hataları editör içinde görünür hâle getirir</td>
    </tr>
  </tbody>
</table>

<p>Prettier kurulduktan sonra ayarlardan <strong>Format On Save</strong> seçeneğini etkinleştirebilirsiniz. Böylece dosyayı her kaydettiğinizde girintiler ve boşluklar otomatik düzeltilir.</p>

<h2 id="canlı-sunucuyla-küçük-proje">Canlı sunucuyla küçük proje</h2>

<p>Proje klasöründe <code class="language-plaintext highlighter-rouge">index.html</code> ve <code class="language-plaintext highlighter-rouge">app.js</code> dosyaları oluşturun. HTML dosyanızın kapanış <code class="language-plaintext highlighter-rouge">body</code> etiketinden önce JavaScript’i bağlayın:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;button</span> <span class="na">id=</span><span class="s">"dugme"</span><span class="nt">&gt;</span>Tıkla<span class="nt">&lt;/button&gt;</span>
<span class="nt">&lt;script </span><span class="na">src=</span><span class="s">"app.js"</span><span class="nt">&gt;&lt;/script&gt;</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">app.js</code> içinde düğmeye davranış kazandırın:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">dugme</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">'</span><span class="s1">#dugme</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">let</span> <span class="nx">sayac</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

<span class="nx">dugme</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">click</span><span class="dl">'</span><span class="p">,</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">sayac</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
  <span class="nx">dugme</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="s2">`</span><span class="p">${</span><span class="nx">sayac</span><span class="p">}</span><span class="s2"> kez tıklandı`</span><span class="p">;</span>
<span class="p">});</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">index.html</code> dosyasına sağ tıklayıp <strong>Open with Live Server</strong> seçeneğini kullanın. Sayfa genellikle <code class="language-plaintext highlighter-rouge">localhost:5500</code> adresinde açılır ve kaydettiğiniz değişiklikler otomatik yenilenir. Artık konsol deneylerinden dosya tabanlı projelere geçmeye hazırsınız: tarayıcı arayüzü yönetir, Node.js araçları çalıştırır, VS Code ise tüm ekibi aynı masada buluşturur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="JavaScript" /><category term="Node.js" /><category term="VS Code" /><summary type="html"><![CDATA[JavaScript öğrenmeye başlamak için devasa bir kurulum sihrine ihtiyacınız yoktur; modern bir tarayıcı bile ilk programınızı çalıştırmaya yeter. Ancak gerçek projeler geliştirmek istediğinizde tarayıcı konsolu, Node.js, VS Code ve canlı sunucu araçlarından oluşan düzenli bir çalışma ortamı kurmak büyük rahatlık sağlar. Gelin JavaScript atölyemizin ışıklarını birlikte açalım.]]></summary></entry><entry><title type="html">JavaScript Temelleri: Dinamik Tip Sisteminin Perde Arkası</title><link href="https://sonsuzus.github.io/posts/javascript-temelleri-dinamik-tip-sisteminin-perde-arkasi/" rel="alternate" type="text/html" title="JavaScript Temelleri: Dinamik Tip Sisteminin Perde Arkası" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/javascript-temelleri-dinamik-tip-sisteminin-perde-arkasi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/javascript-temelleri-dinamik-tip-sisteminin-perde-arkasi/"><![CDATA[<p>JavaScript’e C veya C++ dünyasından gelenlerin ilk şaşkınlığı genellikle şudur: Bir değişken nasıl olur da önce sayı, birkaç satır sonra metin olabilir? Bunun nedeni JavaScript’in <strong>dinamik tipli</strong> bir dil olmasıdır. Tür bilgisi değişken adına değil, çalışma zamanındaki değere bağlıdır. Bu esneklik hızlı geliştirme sağlarken bazı sürprizleri de beraberinde getirir.
``</p>
<h2 id="statik-ve-dinamik-tipleme-nedir">Statik ve dinamik tipleme nedir?</h2>

<p>C++ gibi statik tipli dillerde değişkenin türü derleme aşamasında belirlenir. Örneğin <code class="language-plaintext highlighter-rouge">int</code> olarak tanımlanmış bir değişkene metin atamak derleme hatası üretir. JavaScript’te ise değişkenler belirli türlerde değerleri saklayan sabit kutular değil, farklı değerlere yöneltilebilen etiketler gibidir.</p>

<p>Teorik olarak bir değişkeni zamana bağlı bir eşleme şeklinde düşünebiliriz:</p>

\[V(t) \rightarrow (değer, tür)\]

<p>Burada $t$ çalışma zamanındaki anı temsil eder. JavaScript motoru, işlemi gerçekleştirirken değerin güncel türünü inceler.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Statik tip sistemi</th>
      <th>Dinamik tip sistemi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tür kontrolü</td>
      <td>Genellikle derleme zamanında</td>
      <td>Çalışma zamanında</td>
    </tr>
    <tr>
      <td>Değişkenin türü</td>
      <td>Önceden belirlenir</td>
      <td>Tutulan değere göre değişir</td>
    </tr>
    <tr>
      <td>Hata yakalama</td>
      <td>Daha erken</td>
      <td>Program çalışırken olabilir</td>
    </tr>
    <tr>
      <td>Esneklik</td>
      <td>Daha sınırlı</td>
      <td>Daha yüksek</td>
    </tr>
    <tr>
      <td>Tipik örnekler</td>
      <td>C, C++, Rust</td>
      <td>JavaScript, Python, Ruby</td>
    </tr>
  </tbody>
</table>

<h2 id="değişken-değil-değer-tür-taşır">Değişken değil, değer tür taşır</h2>

<p>Aşağıdaki kodda <code class="language-plaintext highlighter-rouge">veri</code> değişkeninin kendisine kalıcı bir tür verilmez:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">veri</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="k">typeof</span> <span class="nx">veri</span><span class="p">);</span> <span class="c1">// number</span>

<span class="nx">veri</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Merhaba</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="k">typeof</span> <span class="nx">veri</span><span class="p">);</span> <span class="c1">// string</span>

<span class="nx">veri</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="k">typeof</span> <span class="nx">veri</span><span class="p">);</span> <span class="c1">// boolean</span>
</code></pre></div></div>

<p>Kod geçerlidir çünkü <code class="language-plaintext highlighter-rouge">let</code>, yeniden atamaya izin verir. <code class="language-plaintext highlighter-rouge">const</code> ise türü sabitlemez; yalnızca değişkenin başka bir değere yeniden bağlanmasını engeller. Örneğin <code class="language-plaintext highlighter-rouge">const liste = []</code> ile oluşturulan dizinin içeriği değiştirilebilir.</p>

<p>JavaScript’in temel değer türleri <code class="language-plaintext highlighter-rouge">string</code>, <code class="language-plaintext highlighter-rouge">number</code>, <code class="language-plaintext highlighter-rouge">bigint</code>, <code class="language-plaintext highlighter-rouge">boolean</code>, <code class="language-plaintext highlighter-rouge">undefined</code>, <code class="language-plaintext highlighter-rouge">symbol</code> ve <code class="language-plaintext highlighter-rouge">null</code> olarak sıralanır. Nesneler, diziler ve fonksiyonlar ise referans davranışı gösteren yapılardır. İlginç bir tarihsel ayrıntı olarak <code class="language-plaintext highlighter-rouge">typeof null</code> sonucu <code class="language-plaintext highlighter-rouge">"object"</code> döner. Bu, dilin ilk sürümlerinden kalan ve uyumluluk nedeniyle düzeltilemeyen ünlü bir tuzaktır.</p>

<h2 id="tip-dönüşümü-ve-zorlaması">Tip dönüşümü ve zorlaması</h2>

<p>JavaScript bazı işlemlerde türleri otomatik olarak dönüştürür. Buna <strong>type coercion</strong>, yani tip zorlama denir:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">5</span><span class="dl">"</span> <span class="o">+</span> <span class="mi">2</span><span class="p">);</span> <span class="c1">// "52"</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">5</span><span class="dl">"</span> <span class="o">-</span> <span class="mi">2</span><span class="p">);</span> <span class="c1">// 3</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nc">Number</span><span class="p">(</span><span class="dl">"</span><span class="s2">5</span><span class="dl">"</span><span class="p">)</span> <span class="o">+</span> <span class="mi">2</span><span class="p">);</span> <span class="c1">// 7</span>
</code></pre></div></div>

<p>İlk işlemde <code class="language-plaintext highlighter-rouge">+</code> operatörü metin birleştirmeyi seçer. İkinci işlemde <code class="language-plaintext highlighter-rouge">-</code> yalnızca sayısal anlam taşıdığı için <code class="language-plaintext highlighter-rouge">"5"</code> sayıya çevrilir. Genel fikir, işlemin uygulanabilmesi için değerlerin ortak bir alana dönüştürülmesidir:</p>

\[op(a, b) = op(convert(a), convert(b))\]

<p>Ancak dönüşüm kuralları her operatörde aynı değildir. Bu nedenle örtük dönüşüme güvenmek yerine <code class="language-plaintext highlighter-rouge">Number()</code>, <code class="language-plaintext highlighter-rouge">String()</code> ve <code class="language-plaintext highlighter-rouge">Boolean()</code> gibi açık dönüşümler kullanmak kodun niyetini anlaşılır kılar.</p>

<h2 id="eşitlik--mı--mi">Eşitlik: <code class="language-plaintext highlighter-rouge">==</code> mı, <code class="language-plaintext highlighter-rouge">===</code> mi?</h2>

<table>
  <thead>
    <tr>
      <th>Operatör</th>
      <th>Tür dönüşümü</th>
      <th>Örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">==</code></td>
      <td>Uygulayabilir</td>
      <td><code class="language-plaintext highlighter-rouge">5 == "5"</code> → <code class="language-plaintext highlighter-rouge">true</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">===</code></td>
      <td>Uygulamaz</td>
      <td><code class="language-plaintext highlighter-rouge">5 === "5"</code> → <code class="language-plaintext highlighter-rouge">false</code></td>
    </tr>
  </tbody>
</table>

<p>Sıkı eşitlik operatörü <code class="language-plaintext highlighter-rouge">===</code>, hem türü hem değeri karşılaştırır. Beklenmeyen dönüşümleri azaltmak için modern JavaScript kodunda genellikle <code class="language-plaintext highlighter-rouge">===</code> ve <code class="language-plaintext highlighter-rouge">!==</code> tercih edilir.</p>

<h2 id="dinamik-yapı-kontrolsüzlük-değildir">Dinamik yapı kontrolsüzlük değildir</h2>

<p>Dinamik tipleme, kuralların bulunmadığı anlamına gelmez; kontrollerin farklı bir zamanda yapıldığı anlamına gelir. Güvenilir kod için girişleri doğrulamak, <code class="language-plaintext highlighter-rouge">typeof</code>, <code class="language-plaintext highlighter-rouge">Array.isArray()</code> ve null kontrollerini kullanmak önemlidir. Daha büyük projelerde TypeScript, JavaScript’in üzerine statik analiz katmanı ekleyerek hataları çalıştırmadan önce gösterebilir.</p>

<p>Sonuç olarak JavaScript’in tip sistemi bir sihirbaz değil, çalışma zamanında karar veren hızlı bir hakemdir. Kurallarını öğrendiğinizde esneklik avantaja dönüşür; öğrenmediğinizde ise <code class="language-plaintext highlighter-rouge">"5" + 2</code> size küçük ama unutulmaz bir şaka yapabilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="JavaScript" /><category term="dinamik tipleme" /><category term="programlama temelleri" /><summary type="html"><![CDATA[JavaScript’e C veya C++ dünyasından gelenlerin ilk şaşkınlığı genellikle şudur: Bir değişken nasıl olur da önce sayı, birkaç satır sonra metin olabilir? Bunun nedeni JavaScript’in dinamik tipli bir dil olmasıdır. Tür bilgisi değişken adına değil, çalışma zamanındaki değere bağlıdır. Bu esneklik hızlı geliştirme sağlarken bazı sürprizleri de beraberinde getirir.]]></summary></entry><entry><title type="html">JavaScript Veri Tipleri, Bellek ve Otomatik Tip Dönüşümleri</title><link href="https://sonsuzus.github.io/posts/javascript-veri-tipleri-bellek-ve-otomatik-tip-donusumleri/" rel="alternate" type="text/html" title="JavaScript Veri Tipleri, Bellek ve Otomatik Tip Dönüşümleri" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/javascript-veri-tipleri-bellek-ve-otomatik-tip-donusumleri</id><content type="html" xml:base="https://sonsuzus.github.io/posts/javascript-veri-tipleri-bellek-ve-otomatik-tip-donusumleri/"><![CDATA[<p>JavaScript’te <code class="language-plaintext highlighter-rouge">"5" + 2</code> işleminin <code class="language-plaintext highlighter-rouge">"52"</code>, <code class="language-plaintext highlighter-rouge">"5" - 2</code> işleminin ise <code class="language-plaintext highlighter-rouge">3</code> üretmesi ilk bakışta motorun zar attığını düşündürebilir. Oysa bu davranışların arkasında belirli dönüşüm kuralları bulunur. İlkel ve referans tiplerinin bellekte nasıl temsil edildiğini, değerlerin nasıl kopyalandığını ve otomatik tip dönüşümünün hangi adımlarla gerçekleştiğini anlamak; şaşırtıcı hataları önlemenin en etkili yollarından biridir.</p>

<p>``</p>

<h2 id="i̇lkel-ve-referans-tipleri">İlkel ve referans tipleri</h2>

<p>JavaScript’in ilkel veri tipleri <code class="language-plaintext highlighter-rouge">string</code>, <code class="language-plaintext highlighter-rouge">number</code>, <code class="language-plaintext highlighter-rouge">bigint</code>, <code class="language-plaintext highlighter-rouge">boolean</code>, <code class="language-plaintext highlighter-rouge">undefined</code>, <code class="language-plaintext highlighter-rouge">symbol</code> ve <code class="language-plaintext highlighter-rouge">null</code> değerleridir. Bunlar değiştirilemez, yani <strong>immutable</strong> değerlerdir. Örneğin bir metni büyük harfe çevirdiğimizde mevcut metin değişmez; yeni bir değer oluşturulur.</p>

<p>Nesneler, diziler ve fonksiyonlar ise referans tipleri olarak anılır. Teknik olarak JavaScript standardı “stack” ve “heap” kullanımını zorunlu kılmaz; bu ayrıntı motora bağlıdır. Bununla birlikte zihinsel model olarak ilkel değerlerin doğrudan, nesnelerin ise bellekteki bir nesneye erişim sağlayan referans üzerinden işlendiğini düşünebiliriz.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>İlkel değer</th>
      <th>Referans değer</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Örnek</td>
      <td><code class="language-plaintext highlighter-rouge">42</code>, <code class="language-plaintext highlighter-rouge">true</code>, <code class="language-plaintext highlighter-rouge">"merhaba"</code></td>
      <td><code class="language-plaintext highlighter-rouge">{}</code>, <code class="language-plaintext highlighter-rouge">[]</code>, <code class="language-plaintext highlighter-rouge">function(){}</code></td>
    </tr>
    <tr>
      <td>Değiştirilebilirlik</td>
      <td>Immutable</td>
      <td>İçeriği değiştirilebilir</td>
    </tr>
    <tr>
      <td>Atama sonucu</td>
      <td>Değer kopyalanır</td>
      <td>Referans kopyalanır</td>
    </tr>
    <tr>
      <td>Karşılaştırma</td>
      <td>Değere göre</td>
      <td>Nesne kimliğine göre</td>
    </tr>
  </tbody>
</table>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">puanA</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">puanB</span> <span class="o">=</span> <span class="nx">puanA</span><span class="p">;</span>
<span class="nx">puanB</span> <span class="o">=</span> <span class="mi">20</span><span class="p">;</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">puanA</span><span class="p">);</span> <span class="c1">// 10</span>

<span class="kd">const</span> <span class="nx">kullaniciA</span> <span class="o">=</span> <span class="p">{</span> <span class="na">ad</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Ada</span><span class="dl">"</span> <span class="p">};</span>
<span class="kd">const</span> <span class="nx">kullaniciB</span> <span class="o">=</span> <span class="nx">kullaniciA</span><span class="p">;</span>
<span class="nx">kullaniciB</span><span class="p">.</span><span class="nx">ad</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Ece</span><span class="dl">"</span><span class="p">;</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">kullaniciA</span><span class="p">.</span><span class="nx">ad</span><span class="p">);</span> <span class="c1">// "Ece"</span>
</code></pre></div></div>

<p>İlk bölümde <code class="language-plaintext highlighter-rouge">puanB</code>, sayısal değerin bağımsız bir kopyasını alır. İkinci bölümde iki değişken aynı nesneye erişir. Kabaca $A \rightarrow O$ ve $B \rightarrow O$ şeklinde gösterebileceğimiz bu durumda nesne <code class="language-plaintext highlighter-rouge">O</code> üzerinde yapılan değişiklik her iki değişkenden de görülebilir.</p>

<h2 id="coercion-nasıl-çalışır">Coercion nasıl çalışır?</h2>

<p><strong>Type coercion</strong>, bir değerin işlem sırasında başka bir tipe otomatik dönüştürülmesidir. JavaScript motoru operatörün beklentisine göre <code class="language-plaintext highlighter-rouge">ToPrimitive</code>, <code class="language-plaintext highlighter-rouge">ToString</code>, <code class="language-plaintext highlighter-rouge">ToNumber</code> ve <code class="language-plaintext highlighter-rouge">ToBoolean</code> gibi soyut işlemler uygular.</p>

<p><code class="language-plaintext highlighter-rouge">+</code> operatörü özel davranır: Operandlardan biri primitive dönüşümden sonra metinse birleştirme yapar. <code class="language-plaintext highlighter-rouge">-</code>, <code class="language-plaintext highlighter-rouge">*</code> ve <code class="language-plaintext highlighter-rouge">/</code> ise değerleri genellikle sayıya dönüştürür.</p>

<table>
  <thead>
    <tr>
      <th>İfade</th>
      <th style="text-align: right">Sonuç</th>
      <th>Temel neden</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">"5" + 2</code></td>
      <td style="text-align: right"><code class="language-plaintext highlighter-rouge">"52"</code></td>
      <td>Sayı metne dönüşür</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">"5" - 2</code></td>
      <td style="text-align: right"><code class="language-plaintext highlighter-rouge">3</code></td>
      <td>Metin sayıya dönüşür</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">true + 1</code></td>
      <td style="text-align: right"><code class="language-plaintext highlighter-rouge">2</code></td>
      <td>$ToNumber(true)=1$</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">null + 1</code></td>
      <td style="text-align: right"><code class="language-plaintext highlighter-rouge">1</code></td>
      <td>$ToNumber(null)=0$</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">undefined + 1</code></td>
      <td style="text-align: right"><code class="language-plaintext highlighter-rouge">NaN</code></td>
      <td>Sayısal dönüşüm başarısızdır</td>
    </tr>
  </tbody>
</table>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">10</span><span class="dl">"</span> <span class="o">+</span> <span class="mi">5</span><span class="p">);</span>       <span class="c1">// "105"</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">10</span><span class="dl">"</span> <span class="o">*</span> <span class="mi">2</span><span class="p">);</span>       <span class="c1">// 20</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nc">Number</span><span class="p">(</span><span class="dl">"</span><span class="s2">10</span><span class="dl">"</span><span class="p">));</span>   <span class="c1">// 10</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nc">String</span><span class="p">(</span><span class="kc">false</span><span class="p">));</span>   <span class="c1">// "false"</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nc">Boolean</span><span class="p">([]));</span>     <span class="c1">// true</span>
</code></pre></div></div>

<p>Son üç satır <strong>açık dönüşüm</strong> yapar. Niyet görünür olduğu için üretim kodunda otomatik dönüşüme güvenmek yerine <code class="language-plaintext highlighter-rouge">Number</code>, <code class="language-plaintext highlighter-rouge">String</code> ve <code class="language-plaintext highlighter-rouge">Boolean</code> kullanmak çoğunlukla daha güvenlidir.</p>

<h2 id="truthy-ve-falsy-değerler">Truthy ve falsy değerler</h2>

<p>Koşullarda değerler boolean tipe dönüştürülür. <code class="language-plaintext highlighter-rouge">false</code>, <code class="language-plaintext highlighter-rouge">0</code>, <code class="language-plaintext highlighter-rouge">-0</code>, <code class="language-plaintext highlighter-rouge">0n</code>, <code class="language-plaintext highlighter-rouge">""</code>, <code class="language-plaintext highlighter-rouge">null</code>, <code class="language-plaintext highlighter-rouge">undefined</code> ve <code class="language-plaintext highlighter-rouge">NaN</code> falsy’dir; diğer değerler truthy kabul edilir. Boş dizi ve boş nesnenin de truthy olması sık karşılaşılan bir sürprizdir.</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if </span><span class="p">([])</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Boş dizi bile truthy!</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nc">Boolean</span><span class="p">(</span><span class="dl">"</span><span class="s2">0</span><span class="dl">"</span><span class="p">));</span> <span class="c1">// true</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nc">Boolean</span><span class="p">(</span><span class="mi">0</span><span class="p">));</span>   <span class="c1">// false</span>
</code></pre></div></div>

<h2 id="eşitlik-tuzağı">Eşitlik tuzağı</h2>

<p>Gevşek eşitlik operatörü <code class="language-plaintext highlighter-rouge">==</code>, karşılaştırmadan önce dönüşüm yapabilir. Sıkı eşitlik <code class="language-plaintext highlighter-rouge">===</code> ise tipler farklıysa doğrudan <code class="language-plaintext highlighter-rouge">false</code> döndürür.</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="mi">0</span> <span class="o">==</span> <span class="kc">false</span><span class="p">);</span>  <span class="c1">// true</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="mi">0</span> <span class="o">===</span> <span class="kc">false</span><span class="p">);</span> <span class="c1">// false</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="kc">null</span> <span class="o">==</span> <span class="kc">undefined</span><span class="p">);</span>  <span class="c1">// true</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="kc">null</span> <span class="o">===</span> <span class="kc">undefined</span><span class="p">);</span> <span class="c1">// false</span>
</code></pre></div></div>

<p>Özetle, referans paylaşımını anlamak beklenmedik nesne değişikliklerini; coercion kurallarını bilmek ise garip görünen işlem sonuçlarını açıklar. Varsayılan tercihi <code class="language-plaintext highlighter-rouge">===</code> yapmak ve dönüşümleri açıkça belirtmek, JavaScript motoruyla tahmin oyunu oynamaktan çok daha huzurludur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="JavaScript" /><category term="Veri Tipleri" /><category term="Type Coercion" /><summary type="html"><![CDATA[JavaScript’te "5" + 2 işleminin "52", "5" - 2 işleminin ise 3 üretmesi ilk bakışta motorun zar attığını düşündürebilir. Oysa bu davranışların arkasında belirli dönüşüm kuralları bulunur. İlkel ve referans tiplerinin bellekte nasıl temsil edildiğini, değerlerin nasıl kopyalandığını ve otomatik tip dönüşümünün hangi adımlarla gerçekleştiğini anlamak; şaşırtıcı hataları önlemenin en etkili yollarından biridir.]]></summary></entry><entry><title type="html">Kendi Kendini Yazan Kod: Otomatik Programlama Rüyasının Antik Kökleri</title><link href="https://sonsuzus.github.io/posts/kendi-kendini-yazan-kod-otomatik-programlama-ruyasinin-antik-kokleri/" rel="alternate" type="text/html" title="Kendi Kendini Yazan Kod: Otomatik Programlama Rüyasının Antik Kökleri" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/kendi-kendini-yazan-kod-otomatik-programlama-ruyasinin-antik-kokleri</id><content type="html" xml:base="https://sonsuzus.github.io/posts/kendi-kendini-yazan-kod-otomatik-programlama-ruyasinin-antik-kokleri/"><![CDATA[<p>Bugün bir LLM’ye “bana bir REST API yaz” dediğimizde birkaç saniye içinde kodla karşılaşmak büyüleyici görünüyor. Ancak makinenin talimat üretmesi, insanın niyetini biçimsel işlemlere dönüştürmesi ve hatta kendi davranışını kurması fikri yeni değil. Otomatik programlama rüyası; mekanik ördeklerden derleyicilere, mantık makinelerinden modern kod asistanlarına uzanan binlerce yıllık bir merakın son perdesi.
``</p>

<h2 id="otomatlardan-algoritmalara">Otomatlardan algoritmalara</h2>

<p>Antik dünyada “kendi kendine çalışan” nesneler hem mühendislik hem de mitoloji konusuydu. İskenderiyeli Heron’un su, buhar ve karşı ağırlıklarla çalışan düzenekleri; tapınak kapılarını otomatik açabiliyor, küçük gösteriler sahneleyebiliyordu. Bunlar program yazmıyordu ama önemli bir düşünceyi somutlaştırıyordu: Doğru mekanizma kurulursa davranış, insan müdahalesi olmadan tekrar üretilebilir.</p>

<p>Bir otomatın temel mantığını şöyle düşünebiliriz:</p>

\[\text{Durum}_{t+1} = f(\text{Durum}_t, \text{Girdi}_t)\]

<p>Bu ifade modern yazılımın da kalbidir. Makine mevcut durumunu ve girdiyi alır, belirlenmiş kurallarla yeni bir duruma geçer. Antik otomat ile bilgisayar programı arasındaki fark, kuralların pirinç dişliler yerine sembollerle temsil edilmesidir.</p>

<h2 id="hesaplamayı-mekanikleştirmek">Hesaplamayı mekanikleştirmek</h2>

<ol>
  <li>yüzyılda Leibniz, akıl yürütmenin sembolik bir hesaplamaya dönüştürülebileceğini düşündü. Ünlü hayali kabaca şuydu: İnsanlar tartışmak yerine “hesaplayalım” diyebilmeliydi. 19. yüzyılda Charles Babbage’ın Analitik Makinesi genel amaçlı hesaplama fikrini, Ada Lovelace’ın notları ise makine için işlem dizileri tasarlama anlayışını ortaya koydu.</li>
</ol>

<p>Bu gelişim birkaç katmanda ilerledi:</p>

<table>
  <thead>
    <tr>
      <th>Dönem</th>
      <th>İnsan ne söyler?</th>
      <th>Makine ne üretir?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Mekanik otomat</td>
      <td>Fiziksel düzenek</td>
      <td>Önceden belirlenmiş hareket</td>
    </tr>
    <tr>
      <td>Makine dili</td>
      <td>Sayısal komutlar</td>
      <td>Elektriksel işlemler</td>
    </tr>
    <tr>
      <td>Derleyici</td>
      <td>Yüksek seviyeli kod</td>
      <td>Makine kodu</td>
    </tr>
    <tr>
      <td>Program sentezi</td>
      <td>Kısıtlar ve örnekler</td>
      <td>Uygun program</td>
    </tr>
    <tr>
      <td>LLM</td>
      <td>Doğal dilde niyet</td>
      <td>Olası kaynak kodu</td>
    </tr>
  </tbody>
</table>

<p>Derleyiciler bu hikâyenin sessiz kahramanlarıdır. İlk dönemlerde “makine kodu gerçekten program yazabilir mi?” kuşkusu yaşanıyordu. Grace Hopper’ın öncülük ettiği derleyiciler, insanın daha soyut ifadelerinin otomatik olarak düşük seviyeli komutlara çevrilebileceğini gösterdi.</p>

<h2 id="kod-aramak-mı-kod-tahmin-etmek-mi">Kod aramak mı, kod tahmin etmek mi?</h2>

<p>Klasik program sentezi, belirli koşulları sağlayan programı bir arama uzayında bulmaya çalışır. Örneğin hedefimiz $f(x)=2x+1$ davranışını üreten ifadeyi keşfetmek olsun:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Küçük bir program sentezleyici: aday ifadeleri test eder.
</span><span class="n">adaylar</span> <span class="o">=</span> <span class="p">[</span>
    <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span>
    <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">x</span><span class="p">,</span>
    <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span>
    <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="o">*</span> <span class="n">x</span>
<span class="p">]</span>

<span class="n">ornekler</span> <span class="o">=</span> <span class="p">[(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span> <span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">11</span><span class="p">)]</span>

<span class="k">for</span> <span class="n">aday</span> <span class="ow">in</span> <span class="n">adaylar</span><span class="p">:</span>
    <span class="k">if</span> <span class="nf">all</span><span class="p">(</span><span class="nf">aday</span><span class="p">(</span><span class="n">girdi</span><span class="p">)</span> <span class="o">==</span> <span class="n">beklenen</span> <span class="k">for</span> <span class="n">girdi</span><span class="p">,</span> <span class="n">beklenen</span> <span class="ow">in</span> <span class="n">ornekler</span><span class="p">):</span>
        <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Uygun program bulundu:</span><span class="sh">"</span><span class="p">,</span> <span class="n">aday</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu yaklaşım doğrulanabilir örneklere dayanır. LLM ise çoğunlukla dev bir kod ve metin koleksiyonundan öğrendiği olasılık dağılımını kullanır. Bir sonraki kod parçasını yaklaşık olarak</p>

\[P(\text{token}_n \mid \text{token}_1,\ldots,\text{token}_{n-1},\text{istem})\]

<p>olasılığına göre seçer. Yani LLM, geleneksel anlamda bütün seçenekleri deneyip matematiksel olarak doğru programı bulmaz; bağlama en uygun görünen devamı üretir.</p>

<h2 id="aynı-rüya-yeni-motor">Aynı rüya, yeni motor</h2>

<p>Uzman sistemler kuralları, genetik programlama evrimi, program sentezi kısıt çözmeyi, LLM’ler ise istatistiksel öğrenmeyi kullandı. Yöntemler değişse de amaç aynı kaldı: İnsan “ne” istediğini söylesin, makine “nasıl” yapılacağını oluştursun.</p>

<p>Fakat akıcı kod doğruluk garantisi değildir. Üretilen program test edilmeli, güvenlik açıkları incelenmeli ve gereksinimlerle karşılaştırılmalıdır. Bugünün kod asistanı bağımsız bir yazılım tanrısından çok, inanılmaz hızlı fakat zaman zaman kendinden fazla emin bir çıraktır. Otomatik programlama rüyası gerçekleşiyor; sadece hayal edildiği gibi tek tuşla değil, insan ile makinenin birlikte düşünmesiyle.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="yapay zeka" /><category term="LLM" /><category term="programlama tarihi" /><summary type="html"><![CDATA[Bugün bir LLM’ye “bana bir REST API yaz” dediğimizde birkaç saniye içinde kodla karşılaşmak büyüleyici görünüyor. Ancak makinenin talimat üretmesi, insanın niyetini biçimsel işlemlere dönüştürmesi ve hatta kendi davranışını kurması fikri yeni değil. Otomatik programlama rüyası; mekanik ördeklerden derleyicilere, mantık makinelerinden modern kod asistanlarına uzanan binlerce yıllık bir merakın son perdesi.]]></summary></entry><entry><title type="html">Modern JavaScript’te var, let ve const: Kapsamın Görünmeyen Sınırları</title><link href="https://sonsuzus.github.io/posts/modern-javascriptte-var-let-ve-const-kapsamin-gorunmeyen-sinirlari/" rel="alternate" type="text/html" title="Modern JavaScript’te var, let ve const: Kapsamın Görünmeyen Sınırları" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/modern-javascriptte-var-let-ve-const-kapsamin-gorunmeyen-sinirlari</id><content type="html" xml:base="https://sonsuzus.github.io/posts/modern-javascriptte-var-let-ve-const-kapsamin-gorunmeyen-sinirlari/"><![CDATA[<p>JavaScript’te değişken tanımlamak kolay görünür: Bir anahtar kelime seçer, isim verir ve değeri atarsınız. Ancak <code class="language-plaintext highlighter-rouge">var</code>, <code class="language-plaintext highlighter-rouge">let</code> ve <code class="language-plaintext highlighter-rouge">const</code> arasındaki seçim yalnızca sözdizimsel bir tercih değildir. Bu kelimeler; değişkenin nerede erişilebilir olduğunu, ne zaman oluşturulduğunu ve yeniden atanıp atanamayacağını belirler. Yanlış seçim, özellikle iç içe bloklarda oldukça şaşırtıcı hatalar doğurabilir.</p>

<p>``</p>

<h2 id="kısa-bir-tarih-yolculuğu">Kısa bir tarih yolculuğu</h2>

<p>JavaScript’in ilk sürümlerinde değişken tanımlamak için yalnızca <code class="language-plaintext highlighter-rouge">var</code> bulunuyordu. Dil başlangıçta küçük tarayıcı betikleri için tasarlandığından blok kapsamı önemli bir ihtiyaç sayılmamıştı. Uygulamalar büyüyünce <code class="language-plaintext highlighter-rouge">var</code> davranışları hata kaynağına dönüştü. ECMAScript 2015, yani ES6 ile <code class="language-plaintext highlighter-rouge">let</code> ve <code class="language-plaintext highlighter-rouge">const</code> eklenerek modern kapsam modeli güçlendirildi.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th><code class="language-plaintext highlighter-rouge">var</code></th>
      <th><code class="language-plaintext highlighter-rouge">let</code></th>
      <th><code class="language-plaintext highlighter-rouge">const</code></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kapsam</td>
      <td>Fonksiyon</td>
      <td>Blok</td>
      <td>Blok</td>
    </tr>
    <tr>
      <td>Yeniden atama</td>
      <td>Evet</td>
      <td>Evet</td>
      <td>Hayır</td>
    </tr>
    <tr>
      <td>Aynı kapsamda yeniden tanımlama</td>
      <td>Evet</td>
      <td>Hayır</td>
      <td>Hayır</td>
    </tr>
    <tr>
      <td>Hoisting</td>
      <td><code class="language-plaintext highlighter-rouge">undefined</code> ile erişilebilir</td>
      <td>TDZ içinde</td>
      <td>TDZ içinde</td>
    </tr>
    <tr>
      <td>İlk değer zorunlu mu?</td>
      <td>Hayır</td>
      <td>Hayır</td>
      <td>Evet</td>
    </tr>
  </tbody>
</table>

<h2 id="fonksiyon-ve-blok-kapsamı">Fonksiyon ve blok kapsamı</h2>

<p>Fonksiyon kapsamı, bir değişkenin tanımlandığı fonksiyonun tamamında erişilebilir olmasıdır. Blok kapsamı ise erişimi <code class="language-plaintext highlighter-rouge">{</code> ve <code class="language-plaintext highlighter-rouge">}</code> arasındaki bölgeyle sınırlar. <code class="language-plaintext highlighter-rouge">if</code>, <code class="language-plaintext highlighter-rouge">for</code> ve <code class="language-plaintext highlighter-rouge">while</code> gövdeleri birer blok oluşturur.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">kapsamTesti</span><span class="p">()</span> <span class="p">{</span>
  <span class="k">if </span><span class="p">(</span><span class="kc">true</span><span class="p">)</span> <span class="p">{</span>
    <span class="kd">var</span> <span class="nx">eskiDegisken</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">var dışarı çıkabilir</span><span class="dl">"</span><span class="p">;</span>
    <span class="kd">let</span> <span class="nx">modernDegisken</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">let blokta kalır</span><span class="dl">"</span><span class="p">;</span>
    <span class="kd">const</span> <span class="nx">sabitDegisken</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">const da blokta kalır</span><span class="dl">"</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">eskiDegisken</span><span class="p">);</span> <span class="c1">// Çalışır</span>
  <span class="c1">// console.log(modernDegisken); // ReferenceError</span>
  <span class="c1">// console.log(sabitDegisken);  // ReferenceError</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">var</code>, <code class="language-plaintext highlighter-rouge">if</code> bloğunu önemsemez ve <code class="language-plaintext highlighter-rouge">kapsamTesti</code> fonksiyonuna bağlanır. <code class="language-plaintext highlighter-rouge">let</code> ile <code class="language-plaintext highlighter-rouge">const</code> ise yalnızca tanımlandıkları blokta yaşar. Bu sınır, aynı değişken adının yanlışlıkla başka bir değeri ezmesini önler.</p>

<p>Kapsamları iç içe halkalar gibi düşünebiliriz. JavaScript bir ismi önce mevcut kapsamda, ardından dış kapsamlarda arar. İç içe kapsam sayısı $n$ ise en kötü durumda kavramsal olarak $n$ ortam kontrol edilir:</p>

\[T(n) = O(n)\]

<p>Bu ifade çoğunlukla performans hesabından ziyade sözcüksel kapsam zincirini anlamak için yararlıdır.</p>

<h2 id="hoisting-ve-geçici-ölü-bölge">Hoisting ve geçici ölü bölge</h2>

<p>Üç anahtar kelimeyle oluşturulan bildirimler de kapsamın başında kayda alınır; fakat erişim davranışları aynı değildir. <code class="language-plaintext highlighter-rouge">var</code>, bildirim satırından önce <code class="language-plaintext highlighter-rouge">undefined</code> değerini verir. <code class="language-plaintext highlighter-rouge">let</code> ve <code class="language-plaintext highlighter-rouge">const</code> ise bildirim çalıştırılana kadar <strong>Temporal Dead Zone</strong>, yani geçici ölü bölge içindedir.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">puan</span><span class="p">);</span> <span class="c1">// undefined</span>
<span class="kd">var</span> <span class="nx">puan</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>

<span class="c1">// console.log(seviye); // ReferenceError</span>
<span class="kd">let</span> <span class="nx">seviye</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
</code></pre></div></div>

<p>Bu nedenle “<code class="language-plaintext highlighter-rouge">let</code> hoist edilmez” sözü teknik olarak eksiktir. Bildirim bilinir, fakat erken erişime izin verilmez. Böylece değer oluşturulmadan önce kullanma hataları sessizce ilerlemek yerine görünür hâle gelir.</p>

<h2 id="const-gerçekten-sabit-mi"><code class="language-plaintext highlighter-rouge">const</code> gerçekten sabit mi?</h2>

<p><code class="language-plaintext highlighter-rouge">const</code>, değerin tamamen değişmez olduğunu değil, değişken bağının yeniden atanamayacağını söyler. Bir nesnenin içeriği hâlâ değiştirilebilir.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">kullanici</span> <span class="o">=</span> <span class="p">{</span> <span class="na">ad</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Ada</span><span class="dl">"</span><span class="p">,</span> <span class="na">puan</span><span class="p">:</span> <span class="mi">10</span> <span class="p">};</span>
<span class="nx">kullanici</span><span class="p">.</span><span class="nx">puan</span> <span class="o">+=</span> <span class="mi">5</span><span class="p">;</span> <span class="c1">// Geçerli: nesnenin alanı değişiyor</span>

<span class="c1">// kullanici = {}; // TypeError: bağ yeniden atanamaz</span>
</code></pre></div></div>

<p>Gerçek değişmezlik gerekiyorsa <code class="language-plaintext highlighter-rouge">Object.freeze()</code> gibi ek yöntemler kullanılmalıdır. Ancak bu yöntem varsayılan olarak yalnızca yüzeysel dondurma yapar.</p>

<h2 id="hangisini-seçmeliyiz">Hangisini seçmeliyiz?</h2>

<p>Modern JavaScript’te güvenli başlangıç noktası <code class="language-plaintext highlighter-rouge">const</code> kullanmaktır. Değer daha sonra yeniden atanacaksa <code class="language-plaintext highlighter-rouge">let</code> tercih edilir. <code class="language-plaintext highlighter-rouge">var</code> ise eski kodları anlamak veya özel uyumluluk ihtiyaçları dışında genellikle kullanılmamalıdır.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">maksimum</span> <span class="o">=</span> <span class="mi">100</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">toplam</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

<span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">maksimum</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">toplam</span> <span class="o">+=</span> <span class="nx">i</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu yaklaşım niyeti açıkça gösterir: <code class="language-plaintext highlighter-rouge">maksimum</code> değişmeyecek, <code class="language-plaintext highlighter-rouge">toplam</code> ve sayaç ise güncellenecektir. Kısacası <code class="language-plaintext highlighter-rouge">const</code> varsayılanınız, <code class="language-plaintext highlighter-rouge">let</code> bilinçli alternatifiniz, <code class="language-plaintext highlighter-rouge">var</code> ise JavaScript tarih müzesindeki dikkatle incelenmesi gereken eseriniz olsun.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="JavaScript" /><category term="Scope" /><category term="Değişkenler" /><summary type="html"><![CDATA[JavaScript’te değişken tanımlamak kolay görünür: Bir anahtar kelime seçer, isim verir ve değeri atarsınız. Ancak var, let ve const arasındaki seçim yalnızca sözdizimsel bir tercih değildir. Bu kelimeler; değişkenin nerede erişilebilir olduğunu, ne zaman oluşturulduğunu ve yeniden atanıp atanamayacağını belirler. Yanlış seçim, özellikle iç içe bloklarda oldukça şaşırtıcı hatalar doğurabilir.]]></summary></entry><entry><title type="html">Nesneler ve JSON: Gerçek Dünyayı Anahtar-Değerlerle Modellemek</title><link href="https://sonsuzus.github.io/posts/nesneler-ve-json-gercek-dunyayi-anahtar-degerlerle-modellemek/" rel="alternate" type="text/html" title="Nesneler ve JSON: Gerçek Dünyayı Anahtar-Değerlerle Modellemek" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/nesneler-ve-json-gercek-dunyayi-anahtar-degerlerle-modellemek</id><content type="html" xml:base="https://sonsuzus.github.io/posts/nesneler-ve-json-gercek-dunyayi-anahtar-degerlerle-modellemek/"><![CDATA[<p>Bir kullanıcıyı, otomobili veya kahve makinesini yazılım dünyasına taşımak istediğimizde yalnızca birkaç bağımsız değişken kullanmak kısa sürede karmaşaya yol açar. Nesneler, bir varlığa ait bilgileri anlamlı bir bütün hâlinde toplar. JSON ise bu anahtar-değer düzenini sistemler arasında aktarılabilen standart bir metne dönüştürür.
``</p>
<h2 id="nesne-nedir">Nesne nedir?</h2>

<p>Nesne, ilişkili verileri ve bazı programlama dillerinde bu veriler üzerinde çalışan davranışları bir arada tutan yapıdır. Örneğin gerçek dünyadaki bir otomobilin markası, hızı ve rengi vardır; ayrıca hızlanabilir veya fren yapabilir. Yazılım modelinde özellikler <strong>anahtar-değer çiftleriyle</strong>, davranışlar ise metotlarla temsil edilebilir.</p>

<p>Matematiksel açıdan basitleştirilmiş bir nesneyi, anahtarlar kümesinden değerlere yapılan bir eşleme gibi düşünebiliriz:</p>

\[O: K \rightarrow V\]

<p>Burada $K$ anahtarlar kümesini, $V$ ise olası değerleri gösterir. Örneğin <code class="language-plaintext highlighter-rouge">renk</code> anahtarı <code class="language-plaintext highlighter-rouge">kırmızı</code> değerine eşlenebilir. Bir nesnedeki çiftlerin sayısı $n$ ise yapı kabaca şöyle ifade edilir:</p>

\[O = \{(k_1,v_1),(k_2,v_2),\ldots,(k_n,v_n)\}\]

<p>JavaScript ile basit bir otomobil nesnesi oluşturalım:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">otomobil</span> <span class="o">=</span> <span class="p">{</span>
  <span class="na">marka</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Volta</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">renk</span><span class="p">:</span> <span class="dl">"</span><span class="s2">kırmızı</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">hiz</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
  <span class="na">elektrikli</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
  <span class="nf">hizlan</span><span class="p">(</span><span class="nx">miktar</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">hiz</span> <span class="o">+=</span> <span class="nx">miktar</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">};</span>

<span class="nx">otomobil</span><span class="p">.</span><span class="nf">hizlan</span><span class="p">(</span><span class="mi">30</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">otomobil</span><span class="p">.</span><span class="nx">hiz</span><span class="p">);</span> <span class="c1">// 30</span>
</code></pre></div></div>

<p>Bu kodda <code class="language-plaintext highlighter-rouge">marka</code>, <code class="language-plaintext highlighter-rouge">renk</code>, <code class="language-plaintext highlighter-rouge">hiz</code> ve <code class="language-plaintext highlighter-rouge">elektrikli</code> birer özellik; <code class="language-plaintext highlighter-rouge">hizlan</code> ise nesnenin durumunu değiştiren bir metottur. <code class="language-plaintext highlighter-rouge">this.hiz</code>, işlemin ilgili otomobil nesnesinin hızına uygulanmasını sağlar. Böylece veri ile davranış aynı model altında buluşur.</p>

<h2 id="anahtar-değer-yaklaşımının-gücü">Anahtar-değer yaklaşımının gücü</h2>

<p>Düz değişkenler kullansaydık <code class="language-plaintext highlighter-rouge">otomobilMarka</code>, <code class="language-plaintext highlighter-rouge">otomobilRenk</code> ve <code class="language-plaintext highlighter-rouge">otomobilHiz</code> gibi giderek uzayan isimlere ihtiyaç duyardık. Nesne yapısı, bu bilgileri ortak bir bağlamda toplar.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Düzen</th>
      <th>Genişletilebilirlik</th>
      <th>Kullanım örneği</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Bağımsız değişkenler</td>
      <td>Dağınık olabilir</td>
      <td>Yeni alanlarda zorlaşır</td>
      <td>Küçük hesaplamalar</td>
    </tr>
    <tr>
      <td>Dizi</td>
      <td>Sıraya bağlıdır</td>
      <td>İndeksleri hatırlatır</td>
      <td>Benzer değer listeleri</td>
    </tr>
    <tr>
      <td>Nesne</td>
      <td>Anahtarlarla anlamlıdır</td>
      <td>Yeni özellik eklemek kolaydır</td>
      <td>Varlık modelleme</td>
    </tr>
  </tbody>
</table>

<p>Nesneler iç içe de geçebilir. Bir kullanıcının adresi başka bir nesne, siparişleri ise nesnelerden oluşan bir dizi olabilir. Bu sayede karmaşık ilişkiler, ağaç benzeri bir yapı kazanır.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">kullanici</span> <span class="o">=</span> <span class="p">{</span>
  <span class="na">id</span><span class="p">:</span> <span class="mi">42</span><span class="p">,</span>
  <span class="na">ad</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Ada</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">adres</span><span class="p">:</span> <span class="p">{</span>
    <span class="na">sehir</span><span class="p">:</span> <span class="dl">"</span><span class="s2">İzmir</span><span class="dl">"</span><span class="p">,</span>
    <span class="na">postaKodu</span><span class="p">:</span> <span class="dl">"</span><span class="s2">35000</span><span class="dl">"</span>
  <span class="p">},</span>
  <span class="na">roller</span><span class="p">:</span> <span class="p">[</span><span class="dl">"</span><span class="s2">editor</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">yazar</span><span class="dl">"</span><span class="p">]</span>
<span class="p">};</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">kullanici</span><span class="p">.</span><span class="nx">adres</span><span class="p">.</span><span class="nx">sehir</span><span class="p">);</span> <span class="c1">// İzmir</span>
</code></pre></div></div>

<p>Nokta gösterimi, iç içe geçmiş verilere okunabilir biçimde erişir. Dinamik bir anahtar kullanılacaksa <code class="language-plaintext highlighter-rouge">kullanici[alanAdi]</code> biçimindeki köşeli parantez gösterimi tercih edilir.</p>

<h2 id="json-ile-yapısal-bağ">JSON ile yapısal bağ</h2>

<p>JSON, açılımıyla <strong>JavaScript Object Notation</strong>, nesne benzeri verileri metin olarak temsil eden bağımsız bir veri formatıdır. Bir API’nin sunucudan tarayıcıya kullanıcı bilgisi göndermesi buna tipik örnektir.</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">42</span><span class="p">,</span><span class="w">
  </span><span class="nl">"ad"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Ada"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"aktif"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
  </span><span class="nl">"roller"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"editor"</span><span class="p">,</span><span class="w"> </span><span class="s2">"yazar"</span><span class="p">],</span><span class="w">
  </span><span class="nl">"adres"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"sehir"</span><span class="p">:</span><span class="w"> </span><span class="s2">"İzmir"</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>JSON ile JavaScript nesnesi akrabadır fakat aynı şey değildir:</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>JavaScript nesnesi</th>
      <th>JSON</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Anahtarlar</td>
      <td>Tırnaksız olabilir</td>
      <td>Çift tırnak zorunludur</td>
    </tr>
    <tr>
      <td>Metotlar</td>
      <td>Bulunabilir</td>
      <td>Bulunamaz</td>
    </tr>
    <tr>
      <td>Yorum satırı</td>
      <td>Kullanılabilir</td>
      <td>Standartta desteklenmez</td>
    </tr>
    <tr>
      <td>Amaç</td>
      <td>Program içinde çalışmak</td>
      <td>Veri saklamak ve aktarmak</td>
    </tr>
    <tr>
      <td>Veri türleri</td>
      <td>Çok geniştir</td>
      <td>Metin, sayı, boolean, null, dizi ve nesne</td>
    </tr>
  </tbody>
</table>

<p>Bir nesneyi JSON metnine çevirmeye <strong>serileştirme</strong>, JSON metnini yeniden kullanılabilir nesneye dönüştürmeye <strong>ayrıştırma</strong> denir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">jsonMetni</span> <span class="o">=</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">stringify</span><span class="p">(</span><span class="nx">kullanici</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">geriDonenNesne</span> <span class="o">=</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">parse</span><span class="p">(</span><span class="nx">jsonMetni</span><span class="p">);</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">geriDonenNesne</span><span class="p">.</span><span class="nx">ad</span><span class="p">);</span> <span class="c1">// Ada</span>
</code></pre></div></div>

<p>Bu dönüşüm sırasında fonksiyonlar ve <code class="language-plaintext highlighter-rouge">undefined</code> gibi JSON tarafından desteklenmeyen değerler korunmaz. Ayrıca güvenilmeyen bir kaynaktan gelen verinin biçimi mutlaka doğrulanmalıdır; geçerli JSON olması, içeriğinin güvenli veya iş kurallarına uygun olduğu anlamına gelmez.</p>

<p>Sonuç olarak nesneler gerçek dünya varlıklarını anlamlı özelliklerle modeller, anahtar-değer düzeni verilere isim kazandırır, JSON ise bu yapıyı farklı diller ve sistemler arasında taşınabilir hâle getirir. Kısacası nesne sahnedeki oyuncuysa JSON onun seyahat çantasıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="nesneler" /><category term="JSON" /><category term="veri modelleme" /><summary type="html"><![CDATA[Bir kullanıcıyı, otomobili veya kahve makinesini yazılım dünyasına taşımak istediğimizde yalnızca birkaç bağımsız değişken kullanmak kısa sürede karmaşaya yol açar. Nesneler, bir varlığa ait bilgileri anlamlı bir bütün hâlinde toplar. JSON ise bu anahtar-değer düzenini sistemler arasında aktarılabilen standart bir metne dönüştürür.]]></summary></entry><entry><title type="html">Operatörlerden Döngülere: Programlarda Karar ve Akış Kontrolü</title><link href="https://sonsuzus.github.io/posts/operatorlerden-dongulere-programlarda-karar-ve-akis-kontrolu/" rel="alternate" type="text/html" title="Operatörlerden Döngülere: Programlarda Karar ve Akış Kontrolü" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/operatorlerden-dongulere-programlarda-karar-ve-akis-kontrolu</id><content type="html" xml:base="https://sonsuzus.github.io/posts/operatorlerden-dongulere-programlarda-karar-ve-akis-kontrolu/"><![CDATA[<p>Bir programı yalnızca sırayla çalışan komutlar bütünü olmaktan çıkaran şey, karar verebilmesi ve belirli işlemleri tekrarlayabilmesidir. Operatörler verileri işlerken akış kontrol yapıları programın hangi yoldan ilerleyeceğini belirler. Kısacası operatörler mutfaktaki araçlar, koşullar ve döngüler ise şefin tarif planıdır.
``</p>

<h2 id="operatörlerin-temel-mantığı">Operatörlerin Temel Mantığı</h2>

<p>Operatör, bir veya daha fazla değer üzerinde işlem yapan semboldür. Örneğin <code class="language-plaintext highlighter-rouge">5 + 3</code> ifadesinde <code class="language-plaintext highlighter-rouge">+</code> operatör, <code class="language-plaintext highlighter-rouge">5</code> ve <code class="language-plaintext highlighter-rouge">3</code> ise operand olarak adlandırılır. Matematiksel açıdan bu işlem $f(a,b)=a+b$ biçiminde düşünülebilir.</p>

<h3 id="aritmetik-operatörler">Aritmetik operatörler</h3>

<p>Aritmetik operatörler sayısal hesaplamalarda kullanılır:</p>

<table>
  <thead>
    <tr>
      <th>Operatör</th>
      <th>İşlem</th>
      <th>Örnek</th>
      <th>Sonuç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">+</code></td>
      <td>Toplama</td>
      <td><code class="language-plaintext highlighter-rouge">8 + 2</code></td>
      <td><code class="language-plaintext highlighter-rouge">10</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">-</code></td>
      <td>Çıkarma</td>
      <td><code class="language-plaintext highlighter-rouge">8 - 2</code></td>
      <td><code class="language-plaintext highlighter-rouge">6</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">*</code></td>
      <td>Çarpma</td>
      <td><code class="language-plaintext highlighter-rouge">8 * 2</code></td>
      <td><code class="language-plaintext highlighter-rouge">16</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/</code></td>
      <td>Bölme</td>
      <td><code class="language-plaintext highlighter-rouge">8 / 2</code></td>
      <td><code class="language-plaintext highlighter-rouge">4</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">%</code></td>
      <td>Kalan</td>
      <td><code class="language-plaintext highlighter-rouge">8 % 3</code></td>
      <td><code class="language-plaintext highlighter-rouge">2</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">**</code></td>
      <td>Üs alma</td>
      <td><code class="language-plaintext highlighter-rouge">2 ** 3</code></td>
      <td><code class="language-plaintext highlighter-rouge">8</code></td>
    </tr>
  </tbody>
</table>

<p>Kalan operatörü özellikle bir sayının çift olup olmadığını anlamakta kullanışlıdır. Bir $n$ sayısı için $n \bmod 2=0$ ise sayı çifttir.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">sayi</span> <span class="o">=</span> <span class="mi">14</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">ciftMi</span> <span class="o">=</span> <span class="nx">sayi</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">===</span> <span class="mi">0</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">ciftMi</span><span class="p">);</span> <span class="c1">// true</span>
</code></pre></div></div>

<p>Bu kod, bölme işleminin sonucuna değil kalanına bakarak sayı hakkında karar verir.</p>

<h3 id="karşılaştırma-ve-mantıksal-operatörler">Karşılaştırma ve mantıksal operatörler</h3>

<p>Karşılaştırma operatörleri <code class="language-plaintext highlighter-rouge">true</code> veya <code class="language-plaintext highlighter-rouge">false</code> üretir. Mantıksal operatörler ise birden fazla koşulu birleştirir.</p>

<table>
  <thead>
    <tr>
      <th>Tür</th>
      <th>Operatörler</th>
      <th>Anlam</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Karşılaştırma</td>
      <td><code class="language-plaintext highlighter-rouge">&gt;</code>, <code class="language-plaintext highlighter-rouge">&lt;</code>, <code class="language-plaintext highlighter-rouge">&gt;=</code>, <code class="language-plaintext highlighter-rouge">&lt;=</code></td>
      <td>Büyüklük ilişkisi</td>
    </tr>
    <tr>
      <td>Eşitlik</td>
      <td><code class="language-plaintext highlighter-rouge">===</code>, <code class="language-plaintext highlighter-rouge">!==</code></td>
      <td>Değer ve tür eşitliği/eşitsizliği</td>
    </tr>
    <tr>
      <td>Mantıksal VE</td>
      <td><code class="language-plaintext highlighter-rouge">&amp;&amp;</code></td>
      <td>Tüm koşullar doğru olmalı</td>
    </tr>
    <tr>
      <td>Mantıksal VEYA</td>
      <td><code class="language-plaintext highlighter-rouge">\|\|</code></td>
      <td>En az bir koşul doğru olmalı</td>
    </tr>
    <tr>
      <td>Mantıksal DEĞİL</td>
      <td><code class="language-plaintext highlighter-rouge">!</code></td>
      <td>Sonucu tersine çevirir</td>
    </tr>
  </tbody>
</table>

<p><code class="language-plaintext highlighter-rouge">A &amp;&amp; B</code> ifadesi yalnızca iki koşul da doğruysa doğrudur. <code class="language-plaintext highlighter-rouge">A || B</code> için tek bir doğru yeterlidir. Bu davranışlar sırasıyla matematikteki $A \land B$ ve $A \lor B$ ifadelerine karşılık gelir.</p>

<h2 id="karar-yapıları">Karar Yapıları</h2>

<p><code class="language-plaintext highlighter-rouge">if-else</code>, koşula göre farklı kodların çalıştırılmasını sağlar:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">yas</span> <span class="o">=</span> <span class="mi">20</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">biletiVar</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>

<span class="k">if </span><span class="p">(</span><span class="nx">yas</span> <span class="o">&gt;=</span> <span class="mi">18</span> <span class="o">&amp;&amp;</span> <span class="nx">biletiVar</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Etkinliğe girebilirsiniz.</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="k">if </span><span class="p">(</span><span class="nx">yas</span> <span class="o">&lt;</span> <span class="mi">18</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Yaş sınırı karşılanmıyor.</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Bilet gerekli.</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Burada koşullar yukarıdan aşağıya değerlendirilir ve ilk doğru dal çalıştırılır. Çok sayıda sabit değerin karşılaştırıldığı durumlarda <code class="language-plaintext highlighter-rouge">switch-case</code> daha okunaklı olabilir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">rol</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">editor</span><span class="dl">"</span><span class="p">;</span>

<span class="k">switch </span><span class="p">(</span><span class="nx">rol</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">case</span> <span class="dl">"</span><span class="s2">admin</span><span class="dl">"</span><span class="p">:</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Tam yetki verildi.</span><span class="dl">"</span><span class="p">);</span>
    <span class="k">break</span><span class="p">;</span>
  <span class="k">case</span> <span class="dl">"</span><span class="s2">editor</span><span class="dl">"</span><span class="p">:</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">İçerik düzenleme yetkisi verildi.</span><span class="dl">"</span><span class="p">);</span>
    <span class="k">break</span><span class="p">;</span>
  <span class="nl">default</span><span class="p">:</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Salt okunur erişim verildi.</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">break</code>, eşleşen bölüm tamamlandıktan sonra diğer seçeneklere geçilmesini önler.</p>

<h2 id="döngü-mekanizmaları">Döngü Mekanizmaları</h2>

<p>Döngüler, bir işlemi koşul sağlandığı sürece tekrarlar. <code class="language-plaintext highlighter-rouge">for</code>, tekrar sayısı biliniyorsa; <code class="language-plaintext highlighter-rouge">while</code>, tekrarın bir koşula bağlı olduğu durumlarda tercih edilir.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">toplam</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

<span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;=</span> <span class="mi">5</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">toplam</span> <span class="o">+=</span> <span class="nx">i</span><span class="p">;</span>
<span class="p">}</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">toplam</span><span class="p">);</span> <span class="c1">// 15</span>
</code></pre></div></div>

<p>Bu döngü $1+2+3+4+5=15$ toplamını hesaplar. Aynı fikir <code class="language-plaintext highlighter-rouge">while</code> ile şöyle kurulabilir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">enerji</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>

<span class="k">while </span><span class="p">(</span><span class="nx">enerji</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Kalan enerji: </span><span class="p">${</span><span class="nx">enerji</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
  <span class="nx">enerji</span><span class="o">--</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Döngülerde koşulun bir noktada yanlış olması gerekir; aksi hâlde sonsuz döngü oluşur. <code class="language-plaintext highlighter-rouge">break</code> döngüyü tamamen sonlandırırken <code class="language-plaintext highlighter-rouge">continue</code> yalnızca mevcut turu atlar. Doğru operatörü doğru kontrol yapısıyla birleştirmek, hem okunabilir hem de hatalara karşı dayanıklı programların temelidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="operatörler" /><category term="akış kontrolü" /><category term="döngüler" /><summary type="html"><![CDATA[Bir programı yalnızca sırayla çalışan komutlar bütünü olmaktan çıkaran şey, karar verebilmesi ve belirli işlemleri tekrarlayabilmesidir. Operatörler verileri işlerken akış kontrol yapıları programın hangi yoldan ilerleyeceğini belirler. Kısacası operatörler mutfaktaki araçlar, koşullar ve döngüler ise şefin tarif planıdır.]]></summary></entry><entry><title type="html">Terminaldeki Yalnızlık: Uzaktan Çalışma Yazılımcının Zihinsel Haritasını Nasıl Değiştiriyor?</title><link href="https://sonsuzus.github.io/posts/terminaldeki-yalnizlik-uzaktan-calisma-yazilimcinin-zihinsel-haritasini-nasil-degistiriyor/" rel="alternate" type="text/html" title="Terminaldeki Yalnızlık: Uzaktan Çalışma Yazılımcının Zihinsel Haritasını Nasıl Değiştiriyor?" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/terminaldeki-yalnizlik-uzaktan-calisma-yazilimcinin-zihinsel-haritasini-nasil-degistiriyor</id><content type="html" xml:base="https://sonsuzus.github.io/posts/terminaldeki-yalnizlik-uzaktan-calisma-yazilimcinin-zihinsel-haritasini-nasil-degistiriyor/"><![CDATA[<p>Uzaktan çalışmak ilk bakışta yazılımcının doğal yaşam alanı gibi görünür: Sessiz bir oda, güçlü bir bilgisayar ve toplantılar arasında uzanan kesintisiz kodlama saatleri… Ancak ofis sohbetleri, omuz üzerinden yapılan kısa yardımlar ve birlikte içilen kahveler kaybolduğunda yalnızca çalışma ortamı değil, zihnin problem çözme biçimi de değişir. Terminal aynı terminaldir; fakat ona bakan kişi artık farklı bir bilişsel haritada ilerler.</p>

<p>``</p>

<h2 id="sosyal-temas-neden-teknik-bir-meseledir">Sosyal temas neden teknik bir meseledir?</h2>

<p>Programlama bireysel yapılan bir etkinlik gibi görünse de yazılım geliştirme, yoğun biçimde sosyal geri bildirime dayanır. Bir meslektaşa “Bu yaklaşım sana da garip geliyor mu?” diye sormak, yalnızca bilgi istemek değildir. Bu soru düşünceyi dışarı çıkarır, varsayımları görünür hâle getirir ve zihinsel yükü paylaşır.</p>

<p>Bilişsel yükü basitleştirilmiş biçimde şöyle gösterebiliriz:</p>

\[L_{toplam} = L_{problem} + L_{araçlar} + L_{belirsizlik} - D_{sosyal\ destek}\]

<p>Burada problem karmaşıklığı ve kullanılan araçların yükü sabit kalsa bile sosyal destek azaldığında hissedilen toplam yük artabilir. Ofiste beş dakikalık bir konuşmayla çözülebilecek belirsizlik, uzaktan çalışan bir geliştiricinin zihninde saatlerce dönebilir.</p>

<h2 id="kod-yazma-alışkanlıkları-nasıl-değişiyor">Kod yazma alışkanlıkları nasıl değişiyor?</h2>

<p>İzolasyon her yazılımcıyı aynı biçimde etkilemez. Bazıları sessizlik sayesinde “akış” durumuna daha kolay girerken bazıları görünmez bir tekrar döngüsüne yakalanır: hata mesajını oku, aynı kodu değiştir, yeniden çalıştır ve neden ilerlenemediğini kimseye anlatma.</p>

<table>
  <thead>
    <tr>
      <th>Boyut</th>
      <th>Sağlıklı uzaktan çalışma</th>
      <th>Yoğun sosyal izolasyon</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Hata ayıklama</td>
      <td>Hipotez kurma ve küçük deneyler</td>
      <td>Rastgele değişiklik yapma</td>
    </tr>
    <tr>
      <td>Yardım isteme</td>
      <td>Erken ve bağlamlı iletişim</td>
      <td>Gereğinden uzun süre bekleme</td>
    </tr>
    <tr>
      <td>Kod kalitesi</td>
      <td>Düzenli inceleme ve dokümantasyon</td>
      <td>“Yeter ki çalışsın” yaklaşımı</td>
    </tr>
    <tr>
      <td>Odaklanma</td>
      <td>Planlı kesintisiz bloklar</td>
      <td>Zaman algısının kaybolması</td>
    </tr>
    <tr>
      <td>Öğrenme</td>
      <td>Eşli çalışma ve paylaşım</td>
      <td>Aynı kaynaklara kapanma</td>
    </tr>
  </tbody>
</table>

<p>İzolasyon, geliştiriciyi daha bağımsız yapabilir; fakat bağımsızlık ile içe kapanma aynı şey değildir. Bağımsız geliştirici önce araştırır, sonra bulgularını paylaşır. İçe kapanan geliştirici ise yardım istemeyi başarısızlık gibi yorumlayabilir.</p>

<h2 id="problem-çözme-tarzındaki-dönüşüm">Problem çözme tarzındaki dönüşüm</h2>

<p>Sosyal etkileşim azaldığında iç konuşma güçlenir. Bunun olumlu tarafı, kişinin kendi düşünme sürecini daha iyi izlemesidir. Olumsuz tarafıysa doğrulanmamış varsayımların yankı odasına dönüşmesidir. Bu nedenle “kauçuk ördek hata ayıklama” yöntemi uzaktan çalışmada şaşırtıcı derecede değerlidir: Problemi bir nesneye, not dosyasına veya boş sohbet penceresine adım adım anlatmak.</p>

<p>Küçük bir günlük aracı da düşünce kalıplarını görünür kılabilir:</p>

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

<span class="n">problem</span> <span class="o">=</span> <span class="nf">input</span><span class="p">(</span><span class="sh">"</span><span class="s">Takıldığın problem nedir? </span><span class="sh">"</span><span class="p">)</span>
<span class="n">hypothesis</span> <span class="o">=</span> <span class="nf">input</span><span class="p">(</span><span class="sh">"</span><span class="s">Şu anki hipotezin nedir? </span><span class="sh">"</span><span class="p">)</span>
<span class="n">next_step</span> <span class="o">=</span> <span class="nf">input</span><span class="p">(</span><span class="sh">"</span><span class="s">Deneyeceğin en küçük adım nedir? </span><span class="sh">"</span><span class="p">)</span>

<span class="k">with</span> <span class="nf">open</span><span class="p">(</span><span class="sh">"</span><span class="s">debug-journal.md</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">a</span><span class="sh">"</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="sh">"</span><span class="s">utf-8</span><span class="sh">"</span><span class="p">)</span> <span class="k">as</span> <span class="nb">file</span><span class="p">:</span>
    <span class="nb">file</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span>
        <span class="sa">f</span><span class="sh">"</span><span class="se">\n</span><span class="s">## </span><span class="si">{</span><span class="n">datetime</span><span class="p">.</span><span class="nf">now</span><span class="p">()</span><span class="si">:</span><span class="o">%</span><span class="n">Y</span><span class="o">-%</span><span class="n">m</span><span class="o">-%</span><span class="n">d</span> <span class="o">%</span><span class="n">H</span><span class="si">:</span><span class="o">%</span><span class="n">M</span><span class="si">}</span><span class="se">\n</span><span class="sh">"</span>
        <span class="sa">f</span><span class="sh">"</span><span class="s">- Problem: </span><span class="si">{</span><span class="n">problem</span><span class="si">}</span><span class="se">\n</span><span class="sh">"</span>
        <span class="sa">f</span><span class="sh">"</span><span class="s">- Hipotez: </span><span class="si">{</span><span class="n">hypothesis</span><span class="si">}</span><span class="se">\n</span><span class="sh">"</span>
        <span class="sa">f</span><span class="sh">"</span><span class="s">- Sonraki adım: </span><span class="si">{</span><span class="n">next_step</span><span class="si">}</span><span class="se">\n</span><span class="sh">"</span>
    <span class="p">)</span>
</code></pre></div></div>

<p>Bu kod problemi çözmez; düşünceyi yapılandırır. Günlükte aynı hipotezin tekrarlandığını görmek, yardım isteme zamanının geldiğini gösterebilir.</p>

<h2 id="zihinsel-haritayı-yeniden-dengelemek">Zihinsel haritayı yeniden dengelemek</h2>

<p>Sağlıklı uzaktan çalışma için iletişim yalnızca toplantı takvimine bırakılmamalıdır. Kısa eşli programlama oturumları, yazılı günlük durum paylaşımları ve gündemsiz sanal kahveler farklı ihtiyaçları karşılar. Ayrıca yardım istemek için bir eşik belirlenebilir: Örneğin 30 dakika boyunca yeni kanıt üretilmediyse problem özetlenip ekip kanalında paylaşılır.</p>

<p>Verimliliği yalnızca yazılan kod satırıyla ölçmek de yanıltıcıdır. Daha gerçekçi bir yaklaşım şöyledir:</p>

\[V = \frac{Değer \times Sürdürülebilirlik}{Bilişsel\ Yorgunluk + Yeniden\ İşleme}\]

<p>Saatlerce yalnız çalışmak kısa vadede üretken görünebilir; ancak yorgunluk ve yeniden işleme arttığında gerçek verim düşer. Uzaktan çalışan yazılımcının ihtiyacı sürekli çevrim içi olmak değil, gerektiğinde erişilebilir insan bağlantıları kurmaktır. Çünkü bazen en zor hata kod tabanında değil, “Bunu tek başıma çözmeliyim” varsayımında saklanır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="uzaktan çalışma" /><category term="yazılımcı psikolojisi" /><category term="problem çözme" /><summary type="html"><![CDATA[Uzaktan çalışmak ilk bakışta yazılımcının doğal yaşam alanı gibi görünür: Sessiz bir oda, güçlü bir bilgisayar ve toplantılar arasında uzanan kesintisiz kodlama saatleri… Ancak ofis sohbetleri, omuz üzerinden yapılan kısa yardımlar ve birlikte içilen kahveler kaybolduğunda yalnızca çalışma ortamı değil, zihnin problem çözme biçimi de değişir. Terminal aynı terminaldir; fakat ona bakan kişi artık farklı bir bilişsel haritada ilerler.]]></summary></entry></feed>