<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gülsen Keskin</title>
    <description>The latest articles on DEV Community by Gülsen Keskin (@gulsenkeskin).</description>
    <link>https://dev.to/gulsenkeskin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F780579%2Ffb5057b1-1fa2-4ab1-8eb4-1fd5a7375673.jpg</url>
      <title>DEV Community: Gülsen Keskin</title>
      <link>https://dev.to/gulsenkeskin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gulsenkeskin"/>
    <language>en</language>
    <item>
      <title>C# Record Type</title>
      <dc:creator>Gülsen Keskin</dc:creator>
      <pubDate>Sat, 25 Oct 2025 16:36:11 +0000</pubDate>
      <link>https://dev.to/gulsenkeskin/c-record-type-bne</link>
      <guid>https://dev.to/gulsenkeskin/c-record-type-bne</guid>
      <description>&lt;h1&gt;
  
  
  C# 'ta Record Type Nedir?
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;Record&lt;/code&gt; anahtar kelimesi, geleneksel &lt;code&gt;class&lt;/code&gt; yapılarına göre daha sade bir sözdizimi sunarken, kritik özellikleriyle (özellikle &lt;strong&gt;imutability&lt;/strong&gt; ve &lt;strong&gt;değer eşitliği&lt;/strong&gt;) modern yazılım mimarilerinin ihtiyaçlarına cevap verir.&lt;/p&gt;

&lt;p&gt;Peki &lt;code&gt;record&lt;/code&gt; tam olarak nedir ve neden onu &lt;code&gt;class&lt;/code&gt; yerine tercih etmeliyiz?&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Record Nedir ve Temel Amacı Ne?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;record&lt;/code&gt; (kayıt), esasen &lt;strong&gt;değiştirilemez (immutable)&lt;/strong&gt; veri modelleri oluşturmak için tasarlanmış bir tiptir. Bir &lt;code&gt;record&lt;/code&gt; nesnesi bir kez oluşturulduktan sonra, içerdiği özelliklerin değeri değiştirilemez (doğru şekilde tanımlandığında).&lt;/p&gt;

&lt;p&gt;Bu, özellikle veri transfer nesneleri (DTO'lar), API yanıtları veya konfigürasyon ayarları gibi, sadece veri taşımakla yükümlü tiplerde veri güvenliğini ve öngörülebilirliğini artırır.&lt;/p&gt;

&lt;h3&gt;
  
  
  Temel Tanımlama
&lt;/h3&gt;

&lt;p&gt;Bir &lt;code&gt;record&lt;/code&gt; tanımlamak, geleneksel bir sınıfa göre çok daha kısadır.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Geleneksel Class (Sınıf) Tanımı: Uzun ve Tekrarlayan&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Surname&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Employee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;surname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;Surname&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;surname&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Record Tanımı (Positional Syntax): Kısa ve Öz&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt; &lt;span class="nc"&gt;EmployeeRecord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Surname&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tek bir satırlık &lt;code&gt;record&lt;/code&gt; tanımı, arka planda otomatik olarak &lt;code&gt;Name&lt;/code&gt; ve &lt;code&gt;Surname&lt;/code&gt; için &lt;strong&gt;&lt;code&gt;init&lt;/code&gt;&lt;/strong&gt; erişimcili (sadece başlatma anında değer alabilen) özellikleri ve bu özellikleri alan bir &lt;strong&gt;yapıcı (constructor)&lt;/strong&gt; oluşturur.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Record'ların Class'lardan Ayrıldığı Temel Özellikler
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;record&lt;/code&gt;'ları bu kadar güçlü yapan, derleyicinin arka planda otomatik olarak eklediği üç önemli özelliktir:&lt;/p&gt;

&lt;h3&gt;
  
  
  A. Değer Eşitliği (Value Equality)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;record&lt;/code&gt;'ların en radikal farkı, eşitlik karşılaştırması yapma şeklidir.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Class:&lt;/strong&gt; Referans Tipi olduğu için, &lt;code&gt;class&lt;/code&gt;'lar &lt;strong&gt;Referans Eşitliği&lt;/strong&gt; kullanır. İki nesne aynı bellek adresini işaret etmiyorsa eşit değildir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Record:&lt;/strong&gt; &lt;strong&gt;Değer Tipi Eşitliği&lt;/strong&gt; kullanır. İki &lt;code&gt;record&lt;/code&gt; nesnesinin &lt;strong&gt;tüm özellikleri aynı değere sahipse&lt;/strong&gt;, bu nesneler eşit kabul edilir.&lt;/li&gt;
&lt;/ul&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;EmployeeRecord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ayşe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Kaya"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;p2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;EmployeeRecord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ayşe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Kaya"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;p3&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Sonuç: True (Değerler aynı)&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;p3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Sonuç: True (Referans aynı) &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  B. With İfadesi (Non-Destructive Mutation)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;record&lt;/code&gt;'lar varsayılan olarak değiştirilemez (immutable) olduğu için, bir nesnenin sadece tek bir özelliğini değiştirmek istediğinizde onu değiştiremezsiniz. Bunun yerine, &lt;strong&gt;&lt;code&gt;with&lt;/code&gt;&lt;/strong&gt; ifadesini kullanarak mevcut nesneden yola çıkarak &lt;strong&gt;yeni bir kopya&lt;/strong&gt; oluşturursunuz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;oldProduct&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;101&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Monitör"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;5000.00m&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Fiyatı 6000.00 olan yeni bir Product nesnesi oluşturulur:&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;newProduct&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;oldProduct&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;6000.00m&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oldProduct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Çıktı: 5000.00 (Değişmedi)&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newProduct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Çıktı: 6000.00 (Yeni kopya)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  C. Otomatik ToString()
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;record&lt;/code&gt;'lar, içerdiği tüm özellik adlarını ve değerlerini gösteren, okunması kolay bir &lt;code&gt;ToString()&lt;/code&gt; metodunu otomatik olarak uygular. Bu, hata ayıklama (debugging) sırasında çok büyük bir kolaylık sağlar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;EmployeeRecord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Yeşim"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Yılmaz"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; 
&lt;span class="c1"&gt;// Çıktı: EmployeeRecord{ Name= Yeşim, Surname= Yılmaz}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Ne Zaman Class, Ne Zaman Record Kullanılmalı?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Senaryo&lt;/th&gt;
&lt;th&gt;Class (Sınıf)&lt;/th&gt;
&lt;th&gt;Record (Kayıt)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Temel Amaç&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Davranış, sorumluluk ve durum yönetimi.&lt;/td&gt;
&lt;td&gt;Veri taşıma, veri bütünlüğü ve değişmezlik.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Eşitlik&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Referans eşitliği (Aynı nesne mi?)&lt;/td&gt;
&lt;td&gt;Değer eşitliği (İçerikler aynı mı?)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Değiştirilebilirlik&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Varsayılan olarak değiştirilebilir (&lt;strong&gt;Mutable&lt;/strong&gt;).&lt;/td&gt;
&lt;td&gt;Varsayılan olarak değiştirilemez (&lt;strong&gt;Immutable&lt;/strong&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kullanım Alanları&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Servisler, Repositor'ler, UI Bileşenleri, Karmaşık İş Nesneleri.&lt;/td&gt;
&lt;td&gt;DTO'lar, Konfigürasyonlar, Modeller, Veri Küpleri.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Sonuç
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;record&lt;/code&gt; tipi, C# geliştiricilerine daha az kod yazarak, daha güvenli ve daha anlamlı veri odaklı yapılar oluşturma imkanı sunar. Özellikle mikroservisler ve API geliştirme gibi veri alışverişinin yoğun olduğu modern uygulamalarda &lt;strong&gt;veri bütünlüğünü&lt;/strong&gt; ve &lt;strong&gt;kod okunabilirliğini&lt;/strong&gt; artırmak için ideal bir çözümdür.&lt;/p&gt;

</description>
      <category>csharp</category>
    </item>
    <item>
      <title>Conda Komutları</title>
      <dc:creator>Gülsen Keskin</dc:creator>
      <pubDate>Sun, 21 Sep 2025 12:17:17 +0000</pubDate>
      <link>https://dev.to/gulsenkeskin/conda-komutlari-2ig2</link>
      <guid>https://dev.to/gulsenkeskin/conda-komutlari-2ig2</guid>
      <description>&lt;p&gt;&lt;strong&gt;Bilgisayarımızdaki sanal ortamların listelenmesi:&lt;/strong&gt;&lt;br&gt;
conda env list&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanal ortam oluşturma:&lt;/strong&gt;&lt;br&gt;
conda create -n virtual_environment_name&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanal ortamı aktif etme:&lt;/strong&gt;&lt;br&gt;
conda activate virtual_environment_name&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanal ortamı devre dışı bırakma:&lt;/strong&gt;&lt;br&gt;
conda deactivate virtual_environment_name&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanal ortam içerisindeki paketleri görüntüleme:&lt;/strong&gt;&lt;br&gt;
conda list&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanal ortama paket yükleme:&lt;/strong&gt;&lt;br&gt;
conda install package_name&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Birden fazla paketi aynı anda yüklemek için:&lt;/strong&gt;&lt;br&gt;
conda install package_name1 package_name2 package_name3 ...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paket silme:&lt;/strong&gt;&lt;br&gt;
conda remove package_name&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Belirli bir versiyona göre paket yükleme:&lt;/strong&gt;&lt;br&gt;
conda install package_name=1.20.1&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paket yükseltme:&lt;/strong&gt;&lt;br&gt;
conda upgrade package_name&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tüm paketlerin yükseltilmesi:&lt;/strong&gt;&lt;br&gt;
conda upgrade --all&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Environment dosyası oluşturma:&lt;/strong&gt;&lt;br&gt;
conda env export &amp;gt; environment.yaml&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Oluşturulan sanal ortamı silmek:&lt;/strong&gt;&lt;br&gt;
conda env remove -n virtual_environment_name&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Environment dosyasından sanal ortam oluşturmak:&lt;/strong&gt;&lt;br&gt;
conda env create -f environment.yaml&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pip kullanarak paket işlemleri:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paket yükleme:&lt;/strong&gt;&lt;br&gt;
pip install package_name&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Belirli versiyona göre paket yükleme:&lt;/strong&gt;&lt;br&gt;
pip install package_name==1.20.1&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>Mobile Architecture</title>
      <dc:creator>Gülsen Keskin</dc:creator>
      <pubDate>Sat, 21 Jan 2023 08:33:23 +0000</pubDate>
      <link>https://dev.to/gulsenkeskin/mobile-architecture-4dpd</link>
      <guid>https://dev.to/gulsenkeskin/mobile-architecture-4dpd</guid>
      <description>&lt;h2&gt;
  
  
  Uygulama Katmanları:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Data Katmanı:&lt;/strong&gt; API'lerle etkileşimden sorumlu olan katmandır.&lt;br&gt;
&lt;strong&gt;Domain Katmanı:&lt;/strong&gt; Data katmanından gelen verileri dönüştürmekle görevli olan katmandır.&lt;br&gt;
&lt;strong&gt;Business Logic Katmanı:&lt;/strong&gt; Uygulama state'ini yöneten katmandır.&lt;br&gt;
&lt;strong&gt;Presentation Katmanı:&lt;/strong&gt; UI bileşenlerini state'e göre işleyen katmandır.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Domain katmanı&lt;/code&gt; ham verileri &lt;code&gt;business logic&lt;/code&gt; katmanı tarafından tüketilen &lt;code&gt;domain&lt;/code&gt;'e (etki alanına) özgü modellere dönüştürür.&lt;br&gt;
&lt;code&gt;Business Logic&lt;/code&gt; katmanı &lt;code&gt;repository&lt;/code&gt;'nin sağladığı domain modellerinin değişmez durumunu (immutable state) korur ve kullanıcı arayüzünden gelen girdilere tepki verir ve state'e göre değişiklik yapılması gerektiğinde depo ile iletişim kurar.&lt;/p&gt;

&lt;p&gt;Her katman doğrudan ilişkili olmayan katmanlar arasındaki etkileşimleri önleyen bir ilişki zincirine sahip olmalıdır.&lt;br&gt;
Örneğin presentation katmanı, data katmanındaki apileri doğrudan çağırmamalı veya bunlarla hiçbir şekilde etkileşimde bulunmamalıdır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yeniden kullanılabilirliği göz önünde bulundurarak oluşturun:&lt;/strong&gt;&lt;br&gt;
Bu tavsiye özellikle data katmanı içindir. Data katmanındaki bileşenler, belirli bir ürüne uygulamaya bağlı olmadıkları ve daha geniş topluluğa fayda sağlayabilecekleri için genellikle açık kaynak için mükemmel adaylardır.&lt;/p&gt;

&lt;p&gt;Verileri ve domain katmanlarını paketler halinde izole etmek onları diğer uygulamalara aktarmaya veya istenirse pub.dev de yayınlamaya olanak tanır.&lt;/p&gt;

&lt;p&gt;Belirli bir model beklemek yerine kodlanmış JSON stringlerini depolamak için genel bir API oluşturabilir böylece bu API diğer domain alanlarında yerel bir depolama API'si olarak kullanılabilir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not: Bu yazı &lt;a href="https://verygood.ventures/blog/very-good-flutter-architecture?utm_source=github&amp;amp;utm_medium=readme&amp;amp;utm_campaign=app_architecture" rel="noopener noreferrer"&gt;very-good-flutter-architecture&lt;/a&gt; yazısının özeti niteliğini taşır.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kaynak:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://verygood.ventures/blog/very-good-flutter-architecture?utm_source=github&amp;amp;utm_medium=readme&amp;amp;utm_campaign=app_architecture" rel="noopener noreferrer"&gt;https://verygood.ventures/blog/very-good-flutter-architecture?utm_source=github&amp;amp;utm_medium=readme&amp;amp;utm_campaign=app_architecture&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Dart ??= Operatörü</title>
      <dc:creator>Gülsen Keskin</dc:creator>
      <pubDate>Wed, 18 Jan 2023 15:49:39 +0000</pubDate>
      <link>https://dev.to/gulsenkeskin/dart-operatoru-4gah</link>
      <guid>https://dev.to/gulsenkeskin/dart-operatoru-4gah</guid>
      <description>&lt;h3&gt;
  
  
  ??= Operatörü:
&lt;/h3&gt;

&lt;p&gt;??= Operatörü bir değişkene yalnızca o değişken null ise değer atamak için kullanılır.&lt;/p&gt;

&lt;p&gt;Örneğin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;int? a; // = null
a ??= 3;
print(a); // &amp;lt;-- Prints 3.

a ??= 5;
print(a); // &amp;lt;-- Still prints 3.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://dart.dev/codelabs/dart-cheatsheet" rel="noopener noreferrer"&gt;https://dart.dev/codelabs/dart-cheatsheet&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Mounted check in a stateless widget</title>
      <dc:creator>Gülsen Keskin</dc:creator>
      <pubDate>Tue, 17 Jan 2023 10:27:54 +0000</pubDate>
      <link>https://dev.to/gulsenkeskin/mounted-check-in-a-stateless-widget-356o</link>
      <guid>https://dev.to/gulsenkeskin/mounted-check-in-a-stateless-widget-356o</guid>
      <description>&lt;p&gt;If you want to use mounted check in a stateless widget its possible by making an extension on BuildContext&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;extension ContextExtensions on BuildContext {
  bool get mounted {
    try {
      widget;
      return true;
    } catch (e) {
      return false;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then you can use it like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (context.mounted)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://stackoverflow.com/a/74575955/14745090" rel="noopener noreferrer"&gt;https://stackoverflow.com/a/74575955/14745090&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>mobile</category>
      <category>extension</category>
    </item>
    <item>
      <title>Gradle to update dependencies command</title>
      <dc:creator>Gülsen Keskin</dc:creator>
      <pubDate>Fri, 13 Jan 2023 11:35:03 +0000</pubDate>
      <link>https://dev.to/gulsenkeskin/gradle-to-update-dependencies-command-5151</link>
      <guid>https://dev.to/gulsenkeskin/gradle-to-update-dependencies-command-5151</guid>
      <description>&lt;p&gt;&lt;code&gt;./gradlew clean build --refresh-dependencies&lt;/code&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>API Links</title>
      <dc:creator>Gülsen Keskin</dc:creator>
      <pubDate>Wed, 11 Jan 2023 13:39:58 +0000</pubDate>
      <link>https://dev.to/gulsenkeskin/api-links-3a12</link>
      <guid>https://dev.to/gulsenkeskin/api-links-3a12</guid>
      <description>&lt;p&gt;Weather API: &lt;a href="https://openweathermap.org/" rel="noopener noreferrer"&gt;https://openweathermap.org/&lt;/a&gt;&lt;br&gt;
Nasa API: &lt;a href="https://api.nasa.gov/" rel="noopener noreferrer"&gt;https://api.nasa.gov/&lt;/a&gt;&lt;br&gt;
Movie API: &lt;a href="https://www.themoviedb.org/documentation/api" rel="noopener noreferrer"&gt;https://www.themoviedb.org/documentation/api&lt;/a&gt;&lt;br&gt;
Voice API: &lt;a href="https://responsivevoice.org/api/" rel="noopener noreferrer"&gt;https://responsivevoice.org/api/&lt;/a&gt;&lt;br&gt;
Exchange Rate API: &lt;a href="https://www.exchangerate-api.com/" rel="noopener noreferrer"&gt;https://www.exchangerate-api.com/&lt;/a&gt;&lt;br&gt;
Meal API: &lt;a href="https://themealdb.com/api.php" rel="noopener noreferrer"&gt;https://themealdb.com/api.php&lt;/a&gt;&lt;br&gt;
Reqres: &lt;a href="https://reqres.in/" rel="noopener noreferrer"&gt;https://reqres.in/&lt;/a&gt;&lt;br&gt;
Marvel API: &lt;a href="https://developer.marvel.com/" rel="noopener noreferrer"&gt;https://developer.marvel.com/&lt;/a&gt;&lt;br&gt;
Mapbox: &lt;a href="https://www.mapbox.com/" rel="noopener noreferrer"&gt;https://www.mapbox.com/&lt;/a&gt;&lt;br&gt;
FavQs API: &lt;a href="https://favqs.com/api" rel="noopener noreferrer"&gt;https://favqs.com/api&lt;/a&gt;&lt;br&gt;
Edamam API: &lt;a href="https://www.edamam.com/" rel="noopener noreferrer"&gt;https://www.edamam.com/&lt;/a&gt;&lt;br&gt;
Fake Store API: &lt;a href="https://fakestoreapi.com/" rel="noopener noreferrer"&gt;https://fakestoreapi.com/&lt;/a&gt;&lt;br&gt;
Pokemon API: &lt;a href="https://pokeapi.co/" rel="noopener noreferrer"&gt;https://pokeapi.co/&lt;/a&gt;&lt;br&gt;
IGDB API: &lt;a href="https://www.igdb.com/api" rel="noopener noreferrer"&gt;https://www.igdb.com/api&lt;/a&gt;&lt;br&gt;
JSON Placeholder: &lt;a href="https://jsonplaceholder.typicode.com/" rel="noopener noreferrer"&gt;https://jsonplaceholder.typicode.com/&lt;/a&gt;&lt;br&gt;
Random User Generator: &lt;a href="https://randomuser.me/" rel="noopener noreferrer"&gt;https://randomuser.me/&lt;/a&gt;&lt;br&gt;
Public APIS: &lt;a href="https://github.com/public-apis/public-apis" rel="noopener noreferrer"&gt;https://github.com/public-apis/public-apis&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>link</category>
    </item>
    <item>
      <title>Dart Abstract and Factory Keywords</title>
      <dc:creator>Gülsen Keskin</dc:creator>
      <pubDate>Thu, 05 Jan 2023 15:07:46 +0000</pubDate>
      <link>https://dev.to/gulsenkeskin/dart-abstract-and-factory-keywords-oie</link>
      <guid>https://dev.to/gulsenkeskin/dart-abstract-and-factory-keywords-oie</guid>
      <description>&lt;h3&gt;
  
  
  abstract
&lt;/h3&gt;

&lt;p&gt;Örneklenemeyen bir soyut sınıf (abstract class) tanımlamak için abstract değiştiriciyi kullanın. Soyut sınıflar, genellikle bazı uygulamalarla arabirimleri(interfaces) tanımlamak için kullanışlıdır. Soyut sınıfınızın somutlaştırılabilir(instantiable) görünmesini istiyorsanız, bir factory constructor tanımlayın.&lt;/p&gt;

&lt;p&gt;Abstract sınıflar genellikle abstract method'lara sahiptir. &lt;/p&gt;

&lt;p&gt;Abstract bir methodu olan abstract bir sınıf örneği:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;abstract class AbstractContainer {
  // Define constructors, fields, methods...

  void updateChildren(); // Abstract method.
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  factory
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Factory constructors&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sınıfının yeni bir örneğini oluşturmayan bir constructor tanımlarken factory anahtar sözcüğünü kullanın. Örneğin, bir factory constructor önbellekten(cache) bir örnek(instance) döndürebilir veya bir alt türün(subtype) örneğini döndürebilir.&lt;br&gt;
Factory constructor'larının bir başka kullanım alanı da final değişkenleri başlatmaktır.&lt;/p&gt;

&lt;p&gt;İpucu: Bir final değişkeninin geç başlatılmasını ele almanın başka bir yolu da late final kullanmaktır (dikkatlice!).&lt;/p&gt;

&lt;p&gt;Aşağıdaki örnekte, Logger factory constructor'ı önbellekten nesneler döndürür ve Logger.fromJson factory constructor'ı JSON nesnesinden bir final değişken başlatır.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Logger {
  final String name;
  bool mute = false;

  // _cache is library-private, thanks to
  // the _ in front of its name.
  static final Map&amp;lt;String, Logger&amp;gt; _cache = &amp;lt;String, Logger&amp;gt;{};

  factory Logger(String name) {
    return _cache.putIfAbsent(name, () =&amp;gt; Logger._internal(name));
  }

  factory Logger.fromJson(Map&amp;lt;String, Object&amp;gt; json) {
    return Logger(json['name'].toString());
  }

  Logger._internal(this.name);

  void log(String msg) {
    if (!mute) print(msg);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not: Fatctory constructor'larının 'this'e erişimi yoktur.&lt;/p&gt;

&lt;p&gt;Kaynaklar:&lt;br&gt;
&lt;a href="https://dart.dev/guides/language/language-tour#abstract-classes" rel="noopener noreferrer"&gt;https://dart.dev/guides/language/language-tour#abstract-classes&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dart.dev/guides/language/language-tour#factory-constructors" rel="noopener noreferrer"&gt;https://dart.dev/guides/language/language-tour#factory-constructors&lt;/a&gt;&lt;/p&gt;

</description>
      <category>emptystring</category>
    </item>
    <item>
      <title>Dart Assert Keyword</title>
      <dc:creator>Gülsen Keskin</dc:creator>
      <pubDate>Thu, 05 Jan 2023 15:05:50 +0000</pubDate>
      <link>https://dev.to/gulsenkeskin/dart-assert-keyword-20ha</link>
      <guid>https://dev.to/gulsenkeskin/dart-assert-keyword-20ha</guid>
      <description>&lt;h3&gt;
  
  
  assert
&lt;/h3&gt;

&lt;p&gt;"assert" operatörü, Dart dilinde bir koşulun doğru olduğunu test etmek için kullanılır. Eğer koşul doğru değilse, bir "AssertionError" atar ve kodun çalışması durur. "assert" operatörü, genellikle test ve debug amaçlı kullanılır ve çalışma zamanında kapatılabilir.&lt;/p&gt;

&lt;p&gt;Kullanımı şöyledir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;assert(x &amp;gt; 0);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu örnekte, "x" değişkeninin sıfırdan büyük olduğu koşulu test edilir. Eğer koşul doğru değilse, bir "AssertionError" atılır ve kodun çalışması durdurulur.&lt;/p&gt;

&lt;p&gt;"assert" operatörü, ayrıca bir ikinci argüman olarak bir mesaj verilebilir. Bu mesaj, eğer koşul doğru değilse hata mesajı olarak kullanılır. Örnek:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;assert(x &amp;gt; 0, 'x değeri sıfırdan büyük olmalıdır');

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu örnekte, eğer "x" değişkeni sıfırdan büyük değilse, hata mesajı olarak "x değeri sıfırdan büyük olmalıdır" gösterilir. "x" değişkeni 0 dan büyükse, iddia başarılı olur ve yürütme devam eder. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://dart.dev/guides/language/language-tour#assert" rel="noopener noreferrer"&gt;https://dart.dev/guides/language/language-tour#assert&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dart</category>
      <category>flutter</category>
      <category>assert</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Dart Asenkron Programlama</title>
      <dc:creator>Gülsen Keskin</dc:creator>
      <pubDate>Thu, 05 Jan 2023 14:49:24 +0000</pubDate>
      <link>https://dev.to/gulsenkeskin/dart-asenkron-programlama-2c03</link>
      <guid>https://dev.to/gulsenkeskin/dart-asenkron-programlama-2c03</guid>
      <description>&lt;p&gt;Asenkron programlama genellikle callback fonksiyonlarını kullanır, ancak Dart Future ve Stream nesnelerini de alternatif olarak kullanıma sunar.&lt;br&gt;
Future , gelecekte bir zamanda sağlanacak bir sonuç için verilen söz gibidir. Stream , olaylar(events) gibi bir dizi değer almanın bir yoludur.&lt;/p&gt;

&lt;p&gt;Not: Her zaman Future veya Stream API'lerini doğrudan kullanmanız gerekmez. Dart dili, async ve await gibi anahtar sözcükleri kullanarak da asenkron kodlamayı destekler.&lt;/p&gt;
&lt;h2&gt;
  
  
  Future:
&lt;/h2&gt;

&lt;p&gt;Future  objeler, genellikle asenkron bir method tarafından döndürülen nesne olarak Dart kitaplıklarında görünür. Bir future tamamlandığında, değeri kullanıma hazırdır.&lt;/p&gt;
&lt;h3&gt;
  
  
  await kullanımı:
&lt;/h3&gt;

&lt;p&gt;Kodunuzun anlaşılabilirliğinin daha kolay olması açısından Future apisini kullanmak yerine await kullanmayı düşünün. &lt;/p&gt;

&lt;p&gt;Aşağıdaki method arka arkaya üç asenkron methodu yürütmek için Future'ın then() methodunu kullanır ve bir sonrakini yürütmeden önce her birinin tamamlanmasını bekler.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;void runUsingFuture() {
  // ...
  findEntryPoint().then((entryPoint) {
    return runExecutable(entryPoint, args);
  }).then(flushThenExit);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Await ifadelerine sahip eşdeğer kod, daha çok senkronize kod gibi görünür:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Future&amp;lt;void&amp;gt; runUsingAsyncAwait() async {
  // ...
  var entryPoint = await findEntryPoint();
  var exitCode = await runExecutable(entryPoint, args);
  await flushThenExit(exitCode);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Asenkron bir fonksiyon, Vadeli İşlemlerden exception'ları yakalayabilir. Örneğin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var entryPoint = await findEntryPoint();
try {
  var exitCode = await runExecutable(entryPoint, args);
  await flushThenExit(exitCode);
} catch (e) {
  // Handle the error...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gelecek tamamlandığında çalışacak kodu programlamak için then() öğesini kullanabilirsiniz. Örneğin, HTTP istekleri biraz zaman alabileceğinden, HttpRequest.getString() bir Future döndürür. then() işlevinin kullanılması, aşağıdaki örnekteki gibi Future tamamlandığında ve vaat edilen string değeri kullanılabilir olduğunda bazı kodlar çalıştırmanıza izin verir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HttpRequest.getString(url).then((String result) {
  print(result);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bir Future nesnesinin oluşturabileceği hataları veya istisnaları işlemek için catchError() öğesini kullanın.&lt;/p&gt;

&lt;p&gt;Not: catchError() işlevini, then() öğesinin sonucunda çağırdığınızdan emin olun.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Future result = costlyQuery(url);
result
    .then((value) =&amp;gt; expensiveWork(value))
    .then((_) =&amp;gt; lengthyComputation())
    .then((_) =&amp;gt; print('Done!'))
    .catchError((exception) {
  /* Handle exception... */
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yukarıdaki örnekte, yöntemler aşağıdaki sırayla çalışır:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;costlyQuery()&lt;/li&gt;
&lt;li&gt;expensiveWork()&lt;/li&gt;
&lt;li&gt;lengthyComputation()&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Aynı kodu aşağıdaki gibi await kullanarak da yazabilirsiniz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;try {
  final value = await costlyQuery(url);
  await expensiveWork(value);
  await lengthyComputation();
  print('Done!');
} catch (e) {
  /* Handle exception... */
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bazen algoritmanızın birçok asenkron işlevi çağırması ve devam etmeden önce hepsinin tamamlanmasını beklemesi gerekir. Birden çok vadeli fonksiyonu yönetmek için Future.wait() statik methodunu kullanın ve bunların tamamlanmasını bekleyin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Future&amp;lt;void&amp;gt; deleteLotsOfFiles() async =&amp;gt;  ...
Future&amp;lt;void&amp;gt; copyLotsOfFiles() async =&amp;gt;  ...
Future&amp;lt;void&amp;gt; checksumLotsOfOtherFiles() async =&amp;gt;  ...

await Future.wait([
  deleteLotsOfFiles(),
  copyLotsOfFiles(),
  checksumLotsOfOtherFiles(),
]);
print('Done with all the long steps!');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Stream
&lt;/h2&gt;

&lt;p&gt;Stream  nesneleri, veri dizilerini temsil eden Dart API'lerinde görünür. Örneğin, button tıklamaları gibi HTML olayları, akışlar(streams) kullanılarak iletilir. Bir dosyayı stream olarak da okuyabilirsiniz.&lt;/p&gt;

&lt;h3&gt;
  
  
  Asenkron bir for döngüsü kullanma
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;void main(List&amp;lt;String&amp;gt; arguments) async {
  // ...
  if (await FileSystemEntity.isDirectory(searchPath)) {
    final startingDir = Directory(searchPath);
    await for (final entity in startingDir.list()) {
      if (entity is File) {
        searchFile(entity, searchTerms);
      }
    }
  } else {
    searchFile(File(searchPath), searchTerms);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Önemli: Await for'u kullanmadan önce kodu daha anlaşılır hale getirdiğinden ve akışın(stream) tüm sonuçlarını gerçekten beklemek istediğinizden emin olun. DOM event listener'ları için await for kullanmamalısınız, çünkü DOM sonsuz olay akışları gönderir. Arka arkaya iki DOM olay dinleyicisini(event listener) kaydetmek için wait for'u kullanırsanız, ikinci tür olay asla işlenmez.&lt;/p&gt;

&lt;p&gt;Kaynak:&lt;br&gt;
&lt;a href="https://dart.dev/guides/libraries/library-tour#dartasync---asynchronous-programming" rel="noopener noreferrer"&gt;https://dart.dev/guides/libraries/library-tour#dartasync---asynchronous-programming&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>redis</category>
      <category>performance</category>
    </item>
    <item>
      <title>Dart as, is, is! operatörleri</title>
      <dc:creator>Gülsen Keskin</dc:creator>
      <pubDate>Thu, 05 Jan 2023 11:52:25 +0000</pubDate>
      <link>https://dev.to/gulsenkeskin/dart-as-is-is-operatorleri-4fmm</link>
      <guid>https://dev.to/gulsenkeskin/dart-as-is-is-operatorleri-4fmm</guid>
      <description>&lt;p&gt;&lt;strong&gt;Type test operatörleri:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;as, is, ve is! operatörleri, çalışma zamanında(runtime) nesnelerin türlerini kontrol etmek için kullanılır.&lt;/p&gt;

&lt;p&gt;"is" operatörü, nesne belirtilen türe sahipse geriye 'true' döner.&lt;/p&gt;

&lt;p&gt;Nesnenin T türünde olduğundan emin değilseniz, nesneyi kullanmadan önce türü kontrol etmek için is T'yi kullanın.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (employee is Person) {
  // Type check
  employee.firstName = 'Bob';
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"is!" operatörü, nesne belirtilen türde değilse geriye true döner.&lt;/p&gt;

&lt;p&gt;"as" operatörü, Dart dilinde bir nesnenin başka bir türde olduğunu belirtmek için kullanılır. Örneğin, bir "Object" tipindeki nesnenin gerçekte bir "String" olduğunu belirtmek için "as" operatörünü kullanabilirsiniz.&lt;/p&gt;

&lt;p&gt;Not: Bir nesneyi belirli bir türe çevirmek için as işlecini ancak ve ancak nesnenin o türde olduğundan eminseniz kullanın. Örneğin:&lt;/p&gt;

&lt;p&gt;Kullanımı şöyledir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;object as String
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu, "object" değişkeninin gerçekte bir "String" olduğunu belirtir ve bu değişkeni bir "String" türünde kullanmanıza izin verir. Eğer "object" değişkeni gerçekte bir "String" türü değilse, bu işlemin sonucu "null" olacaktır.&lt;/p&gt;

&lt;p&gt;"as" operatörünün bir diğer önemli kullanımı, bir sınıfın alt sınıfı veya eşdeğeri olduğunu belirtmek için "is" operatörüyle birlikte kullanılır. Örneğin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (object is String) {
  object as String;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu kod, "object" değişkeninin bir "String" türü olduğunu test eder ve eğer öyleyse, "object" değişkenini bir "String" türünde kullanmanıza izin verir.&lt;/p&gt;

&lt;p&gt;Kaynaklar: &lt;br&gt;
&lt;a href="https://dart.dev/guides/language/language-tour#type-test-operators" rel="noopener noreferrer"&gt;https://dart.dev/guides/language/language-tour#type-test-operators&lt;/a&gt;&lt;br&gt;
&lt;a href="https://chat.openai.com/chat" rel="noopener noreferrer"&gt;https://chat.openai.com/chat&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dart</category>
      <category>flutter</category>
      <category>mobile</category>
      <category>operators</category>
    </item>
    <item>
      <title>Bir kitaplığın yalnızca bir bölümünü içe aktarma</title>
      <dc:creator>Gülsen Keskin</dc:creator>
      <pubDate>Thu, 05 Jan 2023 10:50:39 +0000</pubDate>
      <link>https://dev.to/gulsenkeskin/bir-kitapligin-yalnizca-bir-bolumunu-ice-aktarma-3h1l</link>
      <guid>https://dev.to/gulsenkeskin/bir-kitapligin-yalnizca-bir-bolumunu-ice-aktarma-3h1l</guid>
      <description>&lt;p&gt;Bir kitaplığın yalnızca bir bölümünü kullanmak istiyorsanız, kitaplığı seçerek içe aktarabilirsiniz. Bunun için dart ve flutter da "show" keyword'ü kullanılır. Örneğin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Import only foo.
import 'package:lib1/lib1.dart' show foo;

// Import all names EXCEPT foo.
import 'package:lib2/lib2.dart' hide foo;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://dart.dev/guides/language/language-tour#importing-only-part-of-a-library" rel="noopener noreferrer"&gt;https://dart.dev/guides/language/language-tour#importing-only-part-of-a-library&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dart</category>
      <category>flutter</category>
      <category>mobile</category>
      <category>library</category>
    </item>
  </channel>
</rss>
