<?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: hdemiray</title>
    <description>The latest articles on DEV Community by hdemiray (@hdemiray).</description>
    <link>https://dev.to/hdemiray</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%2F544212%2F25d358b1-bd35-4170-b5a2-1322a00f607a.png</url>
      <title>DEV Community: hdemiray</title>
      <link>https://dev.to/hdemiray</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hdemiray"/>
    <language>en</language>
    <item>
      <title>Pair Programming Nedir ? Faydaları Nelerdir ?</title>
      <dc:creator>hdemiray</dc:creator>
      <pubDate>Mon, 18 Jan 2021 22:06:03 +0000</pubDate>
      <link>https://dev.to/hdemiray/pair-programming-nedir-faydalari-nelerdir-450g</link>
      <guid>https://dev.to/hdemiray/pair-programming-nedir-faydalari-nelerdir-450g</guid>
      <description>&lt;p&gt;&lt;strong&gt;Pair programming&lt;/strong&gt; 2 yazılımcının bir proje veya problem üzerinde çalışmasıdır. İkili programlama da denilebilir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agile&lt;/strong&gt;(çevik yazılım geliştirme) yöntemlerindendir.&lt;/p&gt;

&lt;p&gt;2 yazılımcı bilgisayar başına oturur ikiside aynı anda yazamayacağı için biri Observer(gözlemci) diğeri ise Driver(sürücü) rollerine geçer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sürücü&lt;/strong&gt;, projeyi geliştiren veya probleme çözüm arayan kişi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gözlemci&lt;/strong&gt; ise  problem çözümünü inceleyen,  feedback'ler veren ve sürücüyü yönlendiren kişidir.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Eşleşmeler&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Bu ikili çalışmada 3 farklı eşleşme olabilir&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Uzman&lt;/td&gt;
&lt;td&gt;Uzman&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Acemi&lt;/td&gt;
&lt;td&gt;Uzman&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Acemi&lt;/td&gt;
&lt;td&gt;Acemi&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Bunları incelediğimizde :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uzman - Uzman&lt;/strong&gt; : Çok iyi sonuçlar alınır. Kötü yanı ise, deneyim yüksek seviyede olduğu için, eğer ortada bir problem varsa çözümlere genelde deneyim ile ulaşırlar ve bu yeni fikirler açısından olumsuz bir durumdur.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Acemi - Uzman&lt;/strong&gt; : Bu ikili en fazla verim alınan modeldir. Uzman geliştiricinin acemiye akıl hocalığı yapması ve gelişimine destek vermesi açısından önemlidir. Acemi geliştiricinin öğrenmeye açık olması ve sorgulayıcılığı ile yeni fikirler ortaya çıkacaktır. Çırak usta ilişkisi ile aceminin gelişimi gözlemlenebilecektir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Acemi - Acemi&lt;/strong&gt; : Bir acemi geliştiricinin akıl hocası yoksa eğer. Tek başına çalışmaktansa 2 aceminin beraber çalışması, farklı bakış açısından faydalı olur.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Pair Programming Faydaları&lt;/strong&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Disiplin artırır.&lt;/li&gt;
&lt;li&gt;Kodun kalitesi artar.&lt;/li&gt;
&lt;li&gt;Ortak kod sahipliği oluşur, birinin yazdığından diğerinin de haberi vardır ve bunun üzerine aynı bilgi ile tartışabilirler.&lt;/li&gt;
&lt;li&gt;Moral ve motivasyonu yüksek tutar. Bir işte iki kişinin çalışması kodu yazan kişiyi motive eder.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Şirketler bunu kullanıyor mu?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Şirketlerin çoğu pair programmingi uygulamıyor, bunu maaliyetli buluyor bir işe iki kişi verildiği için.&lt;/p&gt;

&lt;p&gt;Ancak burada maaliyetten çok bir kazanç var, ortaya çıkan iş daha kaliteli ve ileriye dönük oluyor.&lt;/p&gt;

&lt;p&gt;Ekip ve takım olarak çalışan start up veya kurumsal firmalar mutlaka bu konuya önem veriyor.&lt;/p&gt;

&lt;p&gt;Pair Programming için yanyana olma zorunluluğu yoktur.&lt;br&gt;
Driver roldeki kişi ekranını Gözlemci kişiye paylaşarak ta eşli programlama yapılabilir.&lt;/p&gt;

&lt;p&gt;Yine pair programminge çok benzeyen diğer eşli programlama türü olan &lt;strong&gt;Mob Programming&lt;/strong&gt; (Çoklu programlama) ise ekipler tarafından kullanılır, burada 1 kişi sürücü ve ekibin geri kalanı gözlemci olur.&lt;/p&gt;

</description>
      <category>pairprogramming</category>
      <category>programming</category>
    </item>
    <item>
      <title>C# İle Generic Sınıflara Giriş</title>
      <dc:creator>hdemiray</dc:creator>
      <pubDate>Wed, 23 Dec 2020 22:44:22 +0000</pubDate>
      <link>https://dev.to/hdemiray/c-i-le-generic-siniflara-giris-32o</link>
      <guid>https://dev.to/hdemiray/c-i-le-generic-siniflara-giris-32o</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Generic sınıflar OOP programlama yaparken C# ta kurtarıcı bir özelliğe sahiptir. Bu yüzden genericleri çok iyi anlamamız gerekiyor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Generic nedir ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Örneklerle açıklamaya çalışayım.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Kurduğumuz bir &lt;code&gt;CRUD&lt;/code&gt; operasyonlarını içeren yapıyı her nesne için tekrar tekrar yazmamak için onu bir tip kullanmaya zorlamadan generic bir yapı oluşturarak her nesnemize uyarlanabilir hale getireceğiz.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Customer sınıfımızı ve onun Crud operasyonlarını içeren DAL interface'i üzerinden gidelim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  interface ICustomerDal  
  {
        List&amp;lt;Customer&amp;gt; GetAll();
        Customer Get(int id);
        void Add(Customer customer);
        void Update(Customer customer);
        void Delete(Customer customer);
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ICustomerDal customer classı için crud operasyonlarının imzalarını tutan bir interface. b&lt;/p&gt;

&lt;p&gt;Burada bir sıkıntımız yok ancak aynı işlemlere ihtiyaç duyan birden fazla sınıfımız olunca ve işlemler birbirine çok benzeyince;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  interface IProductDal  
  {
        List&amp;lt;Product&amp;gt; GetAll();
        Product Get(int id);
        void Add(Product product);
        void Update(Product product);
        void Delete(Product product);
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Tip (customer,product) kısmını generic bir yapıyla halledebilirsek eğer bize çok faydası olacaktır.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yeni bir interface oluşturuyorum ve ismini Irepository koyuyorum.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    interface IRepository&amp;lt;T&amp;gt;
    {
        List&amp;lt;T&amp;gt; GetAll();
        T Get(int id);
        void Add(T entity);
        void Update(T entity);
        void Delete(T entity);

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

&lt;/div&gt;



&lt;p&gt;Yeni interface'imizin içerisine aynı metodları koyuyorum. Bu sefer listelerde gördüğümüz tip belirme olayını interface'in isimlendirme kısmında görüyoruz.&lt;/p&gt;

&lt;p&gt; Bunun anlamı ben implemente edildiğim yerden bir tip alacağım ve içerimde bulunan metod ve alanlarda bu T yerine ne geldiyse onları uygulayacağım.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kullanım Şekli&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Artık ICustomerDal ve IProductDal interfacelerimizi boş bırakıyoruz ve Irepository implementasyonu gerçekleştiriyoruz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    interface ICustomerDal:IRepository&amp;lt;Customer&amp;gt;
    {
       
    }
    interface IProductDal:IRepository&amp;lt;Product&amp;gt;
    {
        
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Görüldüğü gibi çalışacağımız tipi implemente ederken söylüyoruz ve kolayca uygulamış oluyoruz. Artık ortak operasyonları IRepository içerisine sadece product sınıfına veya customer sınıfına özel olan işleri ise onların interfaclerinde yazıyoruz ve aynı yapıyı daha az kod, daha sürdürülebilir bir yapı ile kurmuş oluyoruz.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>genericclass</category>
    </item>
    <item>
      <title>Asp.Net Web Servis Giriş Rest-Ful Web Api</title>
      <dc:creator>hdemiray</dc:creator>
      <pubDate>Mon, 21 Dec 2020 00:11:04 +0000</pubDate>
      <link>https://dev.to/hdemiray/asp-net-web-servis-giris-rest-ful-web-api-445d</link>
      <guid>https://dev.to/hdemiray/asp-net-web-servis-giris-rest-ful-web-api-445d</guid>
      <description>&lt;p&gt;&lt;strong&gt;Web Servislere neden ihtiyaç duyulur ?&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;İnternete erişimi olan cihazların platform bağımlı olmaksızın bu cihazla iletişime geçmek ve http protokolü ile veri iletmek.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Metotlarımızı http protokolü üzerinden paylaşabiliriz.&lt;/li&gt;
&lt;li&gt;Diğer yazılımcıların sadece arayüze odaklanması sağlanabilir.&lt;/li&gt;
&lt;li&gt;İş bölümü için uygundur&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Rest-Ful (Reperestantional State Transfer)&lt;/strong&gt; : Restful Api'ler yukarıdaki 3 özelliğin tamamını sağlar.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Servislerde genelde ortak format olarak json format seçilir.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Json format hem hafiftir. (Boyut olarak)&lt;/li&gt;
&lt;li&gt;Okunması diğer formatlara göre (xml vb..) çok daha kolaydır.&lt;/li&gt;
&lt;li&gt;Kabul görmüş bir formattır genelde bu uygulanır.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Rest-ful Web Api&lt;/strong&gt;'ler http protokolü kullanır , yani bir url'e ihtiyacımız var. Kısaca yazacağımız servisi kullanabilmek için server'a atmamız ve internete açmamız gerekir.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Url (&lt;a href="https://api.github.com/users"&gt;https://api.github.com/users&lt;/a&gt;) &lt;/li&gt;
&lt;li&gt;İnternet Media Type (Json,xml,images vs..)&lt;/li&gt;
&lt;li&gt;Standart HTTP Metodları kullanırız (GET,POST,PUT,DELETE vs..)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;WEB SERVİSLERİNİN AMACI FARKLI PLATFORMLAR  ARASINDA AYNI VERİ PAYLAŞIMINI SAĞLAMAK&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>webservices</category>
    </item>
    <item>
      <title>C# MVC Bundle Config İle Minify İşlemleri</title>
      <dc:creator>hdemiray</dc:creator>
      <pubDate>Mon, 21 Dec 2020 00:01:34 +0000</pubDate>
      <link>https://dev.to/hdemiray/c-mvc-bundle-config-i-le-minify-i-slemleri-31oh</link>
      <guid>https://dev.to/hdemiray/c-mvc-bundle-config-i-le-minify-i-slemleri-31oh</guid>
      <description>&lt;p&gt;Web sitelerinde açılışta her bir javascript ve css dosyaları için requestler gider ve bunların sayısı sitenin açılış hızını düşürebilir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bundle minify&lt;/strong&gt; işlemi ile hem tüm scriptleri tek bir dosya ile gönderecek hemde dosyanın minify edilmesini yani yorum satırları silinmiş gereksiz satırlardan arınmış bir şekilde birleştirecek.&lt;/p&gt;

&lt;p&gt;Bunun için ilk önce Projeye Nuget yardımı ile &lt;br&gt;
&lt;code&gt;Microsoft.Asp.Net.Optimization&lt;/code&gt; yüklenir&lt;br&gt;
daha sonra yeni bir class açarız ve içerisine static bir metot yazarız ve bu dışarıdan BundleCollection tipinde veri alır&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; public static void RegisterBundles(BundleCollection bundles)
        {
            bundles.Add(new ScriptBundle("~/bundles/scripts").Include(
               "~/Scripts/jquery-3.0.0.js",
               "~/Scripts/jquery.unobtrusive-ajax.min.js",
               "~/Scripts/bootstrap.js",
               "~/Scripts/DataTables/jquery.dataTables.js",
               "~/Scripts/DataTables/dataTables.bootstrap.js",
               "~/Scripts/custom.js",
               "~/Scripts/bootbox.js"
                ));

            bundles.Add(new StyleBundle("~/bundles/styles").Include(
                  "~/Content/bootstrap.css",
                  "~/Content/StyleSheet1.css",
                  "~/Content/DataTables/css/dataTables.bootstrap.css"
                ));
        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ve buraya dosya yolları eklenir daha sonra &lt;code&gt;layout&lt;/code&gt; 'tan bu alanlar silinir &lt;br&gt;
yerlerine ise &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;@Scripts.Render("~/bundles/scripts")&lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/styles"&gt;@styles&lt;/a&gt;.Render("~/bundles/styles")&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Eklenir daha sonra bu işlemi çağırmak için &lt;code&gt;Global.asax&lt;/code&gt; dosyasına&lt;/p&gt;

&lt;p&gt;&lt;code&gt;BundleConfig.RegisterBundles(BundleTable.Bundles);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;burada kendi yazdığımız sınıfı ve metodu çağırdık ve bundlecollection tipinde bir veri gönderdik.&lt;/p&gt;

&lt;p&gt;Son olarak ise &lt;code&gt;View&lt;/code&gt;'in altında bulunan &lt;code&gt;webconfig&lt;/code&gt; dosyasına &lt;code&gt;namespace&lt;/code&gt; ekleyeceğiz&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;add namespace="System.Web.Optimization"/&amp;gt;&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;bu işlem proje yayınlanmadan önce yapılmalı yani bu şekilde proje geliştirmek sağlıklı değildir&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>csharpminifying</category>
    </item>
    <item>
      <title>C# Anti Forgery Token</title>
      <dc:creator>hdemiray</dc:creator>
      <pubDate>Sun, 20 Dec 2020 23:53:45 +0000</pubDate>
      <link>https://dev.to/hdemiray/c-anti-forgery-token-2h9f</link>
      <guid>https://dev.to/hdemiray/c-anti-forgery-token-2h9f</guid>
      <description>&lt;p&gt;&lt;strong&gt;CSRF&lt;/strong&gt; saldırıları olarak geçen ;&lt;br&gt;
arama çubuğunu post olarak veri yollamak veri ele geçirmek için kullanırlar.&lt;/p&gt;

&lt;p&gt;Direkt oradan veri yollayamaması için &lt;code&gt;controller&lt;/code&gt;dan http post olan kısımı&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[ValidateAntiForgeryToken] olarak başlatıyoruz ve pos formunun içerisine&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;@html.AntiforgeryToken()&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;metodunu koyuyoruz.&lt;/p&gt;

</description>
      <category>antiforgerytoken</category>
    </item>
    <item>
      <title>Abstract Classes / Abstract Sınıflar</title>
      <dc:creator>hdemiray</dc:creator>
      <pubDate>Sun, 20 Dec 2020 23:50:14 +0000</pubDate>
      <link>https://dev.to/hdemiray/abstract-classes-abstract-siniflar-maj</link>
      <guid>https://dev.to/hdemiray/abstract-classes-abstract-siniflar-maj</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Class yapısına sahiptir. Referans tiptir ama tamamen somut bir yapıya sahiptir. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Classın içerisinde operasyonlar bulunur.&lt;br&gt;
&lt;strong&gt;Class&lt;/strong&gt; : İçerisinde birbirisiyle ilgili operasyonları , &lt;code&gt;field&lt;/code&gt; ve &lt;code&gt;propertyleri&lt;/code&gt; tutan yapı.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Abstract Classta&lt;/code&gt; tanımlanan bir operasyon &lt;code&gt;inherit&lt;/code&gt; edildiği sınıfta ezilmek (&lt;code&gt;override&lt;/code&gt;) zorundadır.&lt;br&gt;
Tamamlanmış operasyon (&lt;code&gt;metod&lt;/code&gt;) da tutabilir yarım operasyonlarıda tutabilir(imza şeklinde).&lt;/p&gt;

&lt;p&gt;Bir sınıf sadece bir sınıfı &lt;code&gt;inherit&lt;/code&gt; edebileceği için dolayısı ile bir &lt;code&gt;abstract class inherit&lt;/code&gt; edebilir başka bir &lt;code&gt;classı inherit&lt;/code&gt; edemez.&lt;br&gt;
&lt;strong&gt;Abstract&lt;/strong&gt; classların normal classlardan tek farkı kabaca &lt;strong&gt;newlenememesi&lt;/strong&gt; çünkü içerisinde tamamlanmamış operasyonlarda barındırabilir.&lt;/p&gt;

&lt;p&gt;Peki abstract classlar &lt;code&gt;constructor&lt;/code&gt; içerebilir mi ? Evet &lt;br&gt;
Peki Nasıl çalışır ? &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sadece inherit edildiği class newlendiğinde çalışır ve constructor &lt;code&gt;protected&lt;/code&gt; isim belirteci ile tanımlanmalıdır çünkü sadece &lt;code&gt;inherit&lt;/code&gt; edildiği yerde kullanılabilir.&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        abstract class MevzuatBase
        {
            public abstract void Degerlendir();
            public void Kaydet(){
                Console.Write("Kaydedildi !");
            }
        }
        class AMevzuat:MevzuatBase
        {
            public override void Degerlendir(){
                Console.Write("A Mevzuat Değerlendirdi !");
            }
        }
        
        class AMevzuat:MevzuatBase
        {
            public override void Degerlendir(){
                Console.Write("A Mevzuat Değerlendirdi !");
            }
        }```

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

&lt;/div&gt;

</description>
      <category>abstractclasses</category>
    </item>
    <item>
      <title>C# Access Modifiers Private, Public, Internal, Protected Nedir ? / Erişim Bildirgeçleri</title>
      <dc:creator>hdemiray</dc:creator>
      <pubDate>Sun, 20 Dec 2020 23:45:39 +0000</pubDate>
      <link>https://dev.to/hdemiray/c-access-modifiers-private-public-internal-protected-nedir-erisim-bildirgecleri-4lmo</link>
      <guid>https://dev.to/hdemiray/c-access-modifiers-private-public-internal-protected-nedir-erisim-bildirgecleri-4lmo</guid>
      <description>&lt;p&gt;Bir class oluşturulduğunda bu classın default erişim belirteci &lt;code&gt;internal&lt;/code&gt; 'dır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Erişim Belirteçleri :&lt;/strong&gt; &lt;code&gt;Public, Internal, Protected, Private&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Internal&lt;/strong&gt;: Proje namespace'inden harici bir alanda referans verilse dahi kullanılamaz. Aynı assembly içinde geçerli demektir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public&lt;/strong&gt;: Referans verildiği heryerde kullanılabilir. Farklı assemblylerde fieldd property yada classlarını kullanabilir.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;En üst seviyeli bir class public veya internal olarak kullanılmak zorundadır.&lt;br&gt;
Private veya protected olarak yalnızca başka bir classın içerisinde tanımlanabilir.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Private&lt;/strong&gt;: Private sadece bir üst blokta geçerlidir(kıvırcık parantez). Ve inherit edildiği yerde kullanılamaz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class MyClass()
{
    class MyOtherClass()
    {
        //buradan alttaki değişkene erişemeyiz.
    }
    private MyPrivateClass()
    {
        //bu class yalnızca üst classta kullanılabilir.
        private int num=1;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bir field'ın default belirteci &lt;code&gt;private&lt;/code&gt;'dır. Örn:   &lt;code&gt;int num=1;&lt;/code&gt; &lt;code&gt;private&lt;/code&gt; bir değişkendir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Protected&lt;/strong&gt;: Private ile aynı özellikleri taşır bir üst parantezde çalışır onun haricinde inherit edildiği yerde de erişilebilir. Ancak private inherit edildiği yerde erişilemez.&lt;/p&gt;

</description>
      <category>internalprotected</category>
    </item>
    <item>
      <title>IoC (Inversion of Control) Container</title>
      <dc:creator>hdemiray</dc:creator>
      <pubDate>Sun, 20 Dec 2020 23:38:28 +0000</pubDate>
      <link>https://dev.to/hdemiray/ioc-inversion-of-control-container-1p6d</link>
      <guid>https://dev.to/hdemiray/ioc-inversion-of-control-container-1p6d</guid>
      <description>&lt;p&gt;&lt;strong&gt;Nedir ?&lt;/strong&gt; &lt;code&gt;Dependency inversion&lt;/code&gt; uygularken kullandığımız &lt;code&gt;dependency injection&lt;/code&gt; tasarım dilinde bir interface örneği istenirse ona somut olan sınıftan verir arkada örneğini tutar(new) ve yaşam döngüsünü tutar tek seferlikmi çalışacak (&lt;code&gt;singelton&lt;/code&gt;) her seferinde yeniden mi oluşturulacak gibi.&lt;/p&gt;

&lt;p&gt;Bu kontrol araçlarına örnek olarak&lt;br&gt;&lt;br&gt;
&lt;code&gt;Ninject, Unity(Microsoft), Castle Windsow, Structure Map.&lt;br&gt;
Dry IoC , LightInject&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nasıl Kullanılır projeye eklenir.(&lt;code&gt;Ninject&lt;/code&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bunlar farklı dosyalardaki farklı configurasyonlar olarak düşünelim.&lt;/p&gt;

&lt;p&gt;Katmanlar arası geçişte &lt;code&gt;singleton&lt;/code&gt; kullanıyoruz&lt;br&gt;
&lt;br&gt;
 &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kernel.Bind&amp;lt;IMevzuat&amp;gt;().To&amp;lt;IkinciMevzuat&amp;gt;().SingletonScope(); 

CustomerManager CustomerManager=new CustomerManager(kernel.Get&amp;lt;IMevzuat&amp;gt;());
CustomerManager.Add();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Kernel&lt;/strong&gt; bir kutu gibidir ona koyduğumuzu isteyen heryere dağıtır tek &lt;br&gt;
Noktadan kontrol imkanı sunar. &lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ioccontainer</category>
    </item>
    <item>
      <title>C# Değer Ve Referans Tipler Nedir ? Farkları Nelerdir ? / Value And Referance Type What Are The Differences ?</title>
      <dc:creator>hdemiray</dc:creator>
      <pubDate>Sun, 20 Dec 2020 23:34:45 +0000</pubDate>
      <link>https://dev.to/hdemiray/c-deger-ve-referans-tipler-nedir-farklari-nelerdir-value-and-referance-type-what-are-the-differences-1j53</link>
      <guid>https://dev.to/hdemiray/c-deger-ve-referans-tipler-nedir-farklari-nelerdir-value-and-referance-type-what-are-the-differences-1j53</guid>
      <description>&lt;p&gt;Nesnel programlama büyük ölçüde referans tiplerin üzerine kuruludur.&lt;/p&gt;

&lt;p&gt;Referans Tip Çalışma Şekli&lt;/p&gt;

&lt;p&gt;Değer tip ve referans tipler bellekte iki ayrı alanda tutulur.&lt;br&gt;
Bu alanlar &lt;strong&gt;Stack&lt;/strong&gt; ve &lt;strong&gt;Heap&lt;/strong&gt; bölümleridir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; alanında sayısal ifadeler tutulur bunlar değer tiplidir: &lt;em&gt;int,double,decimal,bool(0,1),enum(1,2,3,4,5),stack(sınıflara benzer)&lt;/em&gt; tipte yapılar da stack alanında tutulur.&lt;/p&gt;

&lt;p&gt;Değer tip sadece tanımlanan sayıda durur.&lt;br&gt;
ÖRN: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;int sayi1;&lt;/code&gt; Tanımladığı anda stackte tutulur&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sayi1=10;&lt;/code&gt; Stack te sayi1=10 olarak tutulur&lt;br&gt;
&lt;code&gt;int sayi2=sayi1&lt;/code&gt;  Stack te sayi2=10 olarak tutulur ve sayi1 deki değişiklik sayi2 yi etkilemez.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Referans Tipler:&lt;/strong&gt; &lt;em&gt;class, interface,abstract class, string, diziler, &lt;strong&gt;int array&lt;/strong&gt;&lt;/em&gt; de olsa dizide olsa referans tiplidir. Referans tipler newlenenlerdir (stack hariç).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EK BİLGİ:&lt;/strong&gt; Stringler referans tiplidir ancak çalışma şekli değer tip gibidir.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;string[] sehirler;&lt;/code&gt;Tanımladığımızda stackte yer tutar.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;string[] sehirler = new string[]{"Ankara","İstanbul","İzmir"};&lt;br&gt;
string[] sehirler2 = new string[]{"Adana","Bursa","Bolu"};&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;İçerisine değer verildiğinde bir numara atanır ve heap bölümünde &lt;code&gt;new string[]{"Ankara","İstanbul","İzmir"};&lt;/code&gt; şeklinde bu numara ile bir referans alanı tutar.&lt;/p&gt;

&lt;h4&gt;
  
  
  ASIL FARK BU NOKTADA
&lt;/h4&gt;

&lt;p&gt;//bu iki değeri eşitlersek eğer&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sehirler2 = sehirler;&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;bu iki değeri eşitlersek eğer sehirler2 tanımlanırken stackte aldığı numara sehirler dizisinin aldığı değere eşitleniyor ve her ikiside heap bölümünde aynı noktayı referans gösteriyor sehirler2 nin asıl değerine herhangi bir müdahele olmuyor &lt;/p&gt;

&lt;p&gt;Bu noktada eğer şehirler 2 de bir alanda değişiklik yaparsak bu şehirler dizisinide etkileyecektir. Çünkü şehirler 2 de artık referans olarak şehirler dizisinin heapteki alanını gösteriyor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;sehirler2[0]= "Eskişehir";&lt;br&gt;
Console.Write(sehirler[0]);&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Bu koddan alacağımız sonuç Ankara değil "Eskişehir" olacaktır.&lt;/p&gt;

&lt;p&gt;Peki şehirler2 nin başlangıçta gösterdiği referansa ne olacak ? &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Garbage Collector&lt;/strong&gt; dediğimiz nesne&lt;br&gt;
Referansı kalmamış o referansı gösteren hiçbir tanım kalmamışsa&lt;br&gt;
O referansı bellekten silecek yapıdır. Çöpçümüzdür.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>valueandreferancetype</category>
    </item>
    <item>
      <title>Framework ve Library Nedir ? Farkları Nelerdir ?</title>
      <dc:creator>hdemiray</dc:creator>
      <pubDate>Sun, 20 Dec 2020 23:19:31 +0000</pubDate>
      <link>https://dev.to/hdemiray/framework-ve-library-nedir-farklari-nelerdir-2k0f</link>
      <guid>https://dev.to/hdemiray/framework-ve-library-nedir-farklari-nelerdir-2k0f</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Framework uygulama çatısıdır.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Uygulama o çatıda geliştirilir. &lt;strong&gt;Örn ASP.NET MVC&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Kütüphane bir çatının altında yardımcı yapılardır.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Kütüphane&lt;/strong&gt; basitleştirilmiş kod fonksiyonlar topluluğudur.&lt;br&gt;
Framework bir uygulama çatısıdır uygulama o yapıya göre inşa edilir.&lt;br&gt;
&lt;strong&gt;Örn AngularJs.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>frameworkandlibrary</category>
    </item>
    <item>
      <title>Yazılımda Interface Nedir ?</title>
      <dc:creator>hdemiray</dc:creator>
      <pubDate>Sun, 20 Dec 2020 23:15:26 +0000</pubDate>
      <link>https://dev.to/hdemiray/yazilimda-interface-nedir-7fe</link>
      <guid>https://dev.to/hdemiray/yazilimda-interface-nedir-7fe</guid>
      <description>&lt;p&gt;Yazılımsal olarak classlara arayüz görevi görür ve classların o operasyonları imzalamasını zorunlu hale getirir.&lt;/p&gt;

&lt;p&gt;Sürdürülebilir yazılımın en büyük üyelerindendir.&lt;br&gt;
Interface'ler ile sürdürülebilir yazlımlar geliştiririz.&lt;/p&gt;

&lt;p&gt;Projelerimizde olay insanların gündelik hayatlarıdır. Dolayısı ile gündelik hayat her gün değişkenlik gösteriyor.&lt;br&gt;
Kurallar değişiyo, ihtiyaçlar değişiyor vs.&lt;/p&gt;

&lt;p&gt;Interfaceler ile yazılımda değişim denilen süreci kolayca yönetebiliyoruz. Yani if programcılığının önüne geçiyoruz ve spagetti kodlardan kurtuluyoruz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public static void Main()
{

    CustomerManager CustomerManager =new CustomerManager(BirinciMevzuat);
}


class CustomerManager 
{

    private IMevzuat _mevzuat;
    public CustomerManager(IMevzuat mevzuat)
    {
        _mevzuat = mevzuat
    }
    public void Add()
    {
        _mevzuat.IslemYap();
    }
}
interface IMevzuat
{
    void IslemYap();
}
class BırıncıMevzuat: IMevzuat
{
    public void IslemYap()
    {
        Console.Write("Birinci Mevzuat işlem yaptı");
    }
}
class IkinciMevzuat: IMevzuat
{
    public void IslemYap()
    {
        Console.Write("İkinci Mevzuat işlem yaptı");
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>interfacenedir</category>
    </item>
    <item>
      <title>SOLID Programlama Prensipleri / SOLID Principles</title>
      <dc:creator>hdemiray</dc:creator>
      <pubDate>Sun, 20 Dec 2020 23:13:45 +0000</pubDate>
      <link>https://dev.to/hdemiray/solid-programlama-prensipleri-solid-principles-4bdg</link>
      <guid>https://dev.to/hdemiray/solid-programlama-prensipleri-solid-principles-4bdg</guid>
      <description>&lt;p&gt;Prensipler bakımı ve anlaşılması kolay kod yazmak için vardır.&lt;/p&gt;

&lt;p&gt;Bu prensiplerin nerede ve nasıl kullanılması bilinmesi gerekir. &lt;br&gt;
Ama bu her zaman ve heryerde doğru olan bir önerme değildir.&lt;br&gt;
(Örneğin prototip aşamasındaki bir proje için.)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;S- Single Responsibility Principle&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bir Componenet sadece bir amaç için değiştirilmeli.&lt;br&gt;
Component = Sınıf, library, fonksiyon  vb..&lt;/p&gt;

&lt;p&gt;Kodun küçük ve bir amaca hizmet eden compenentler şeklinde tasarlanması yeniden kullanilabilirliği arttırır.&lt;/p&gt;

&lt;p&gt;Componentlerin küçük olması daha rahat anlaşılmalarını sağlar.&lt;/p&gt;

&lt;p&gt;Eğer birden fazla amaca hizmet ediyorsa o zaman bu prensibi ihlal ediyor demektir.&lt;/p&gt;

&lt;p&gt;Örneğin bir Account Sınıfı&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.Text;
 
namespace SOLID
{
    public class Account
    {
 
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Street { get; set; }
        public int ZipCode { get; set; }
        public string City { get; set; }
        public Guid AccountId { get; set; }
        public string Password { get; set; }
        public string UserName { get; set; }
 
        public void ChangePasswırd(string newPassword) =&amp;gt; Console.WriteLine($"Changed password to {newPassword}");
        public void ChangeAddress(string street, int zipCode, string city) =&amp;gt; Console.WriteLine("Changed adress");
        public string GetAccountHolderFirstName(Guid accountNumber) =&amp;gt; this.FirstName;
        public string GetAccountHolderLastName(Guid accountNumber) =&amp;gt; this.LastName;
 
        public void DepositMoney(decimal amount) =&amp;gt; Console.WriteLine($"{amount} has been deposited to {this.AccountId}");
        public void WithdrawMoney(decimal amount) =&amp;gt; Console.WriteLine($"{amount} has been withdrawn from {this.AccountId}");
        public void Login(string username, string password) =&amp;gt; Console.WriteLine($"{username} has tried to log in.");
        public void Logout(string username) =&amp;gt; Console.WriteLine($"{username} has tried to log out.");
 
    }
}

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

&lt;/div&gt;



&lt;p&gt;Görüldüğü gibi içerisinde birçok metod özellik vb şeyler var.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class AddressVerifier
{
    public bool IsAddressValid(Account account)
    {
        //burada account ile tonlarca gereksiz ozellik geliyor
        return true;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Burada Account sınıfı ile adresin doğruluğu kontrol edilmek isteniyor ancak adresten başka tonlarca özellik geliyor. Bu tarz sıkıntıları engellemek için ;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class Account
{
    public Guid AccountId { get; set; }
    public Profile Profile { get; set; }
    public Address Address { get; set; }
}

public class Address
{
    public string  Street { get; set; }
    public int ZipCode { get; set; }
    public string City { get; set; }
    public string Country { get; set; }
}
public class AddressVerifier
{
   public bool IsAdrressValid(Address address)
   {
        return true;
   }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Şeklinde yapmak en doğrusu olacaktır.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;O - Open/Closed Principle&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bir Componenet değişime kapalı , gelişime açık olmalıdır. Var olan kodları değiştirerek değil genişleterek kullanmak.&lt;/p&gt;

&lt;p&gt;Genelde (backward compatibility) sorunlarını çözmek için yararlı olur. &lt;/p&gt;

&lt;p&gt;Örneğin zipCode yani Türkiye'de posta kodu olarak geçen bu kod ile o eyaletin veya şehrin var olup olmadığına bakacağız.&lt;/p&gt;

&lt;p&gt;Burada basitçe gelen koda göre kodun geçerli olup olmadığı kontrol ediliyor. Bölge icabı zip Kod 10 un altında olanlar geçersiz koddur.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class AddressVerifier
{
   public static bool IsValidZipCode(int zipCode)
   {
       if (zipCode &amp;lt; 10)
       {
           return false;
       }
       return true;
   }
}

Doğruluk kontrol edildikten sonra başka bir sınıfta kullanılıyor ve doğru bir kod ise karşılaştırmaya giriyor
public class StateFinder
{
    public String GetStateNameForZipCode(int zipCode)
    {
        if (!AddressVerifier.IsValidZipCode(zipCode))
        {
           throw new InvalidOperationException($"Invalid ZipCode : {zipCode}");
        }
 
        switch (zipCode)
        {
           case 11:
              return "California";
           case 12:
              return "Utah";
           default:
              throw new InvalidOperationException($"No state is found with {zipCode}");
        }
    }
}

namespace SOLID_S
{
    class Program
    {
        static void Main(string[] args)
        {
            var stateFinder = new StateFinder();
            try
            {
                Console.WriteLine(stateFinder.GetStateNameForZipCode(11));
                Console.WriteLine(stateFinder.GetStateNameForZipCode(9));
            }
            catch (InvalidOperationException exception)
            {
                Console.WriteLine(exception.Message);
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Böyle bir çalışmada ekrana çıkacak olan yazı;&lt;/p&gt;

&lt;p&gt;Baştada söylendiği gibi değişime kapalı gelişime açık olmalı. Yani örneğin bir tane daha ülkenin desteklenmesi istendi &lt;br&gt;
Ve bu ülkenin geçerli olan zip kodları bizimkini kapsıyor 10 dan küçük değilde 5 ten küçük olmayanlar geçersiz sayılıyor.&lt;br&gt;
Bu durumda biz sınıfımızı değiştirmiş oluruz böylece kodda hatalar da yaratmış olabiliriz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class AddressVerifier
{
   public static bool IsValidZipCode(int zipCode)
   {
       if (zipCode &amp;lt; 5)
       {
           return false;
       }
       return true;
   }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Var olan bir sınıftaki metodu değiştirmiş olduk ve ihlal gerçekleştirmiş olduk. Bu bize programın işleyişinde hatalar getirecektir.&lt;br&gt;
Yeni Ekran çıktısı;&lt;/p&gt;

&lt;p&gt;Şimdi yapacağımız şey ise iki ülkenin farklı yerlerde değerlendirilmesini sağlamak.&lt;br&gt;
Bunun için static metodumuz olan IsValidZipCode 'u virtual olarak tanımlıyoruz. Yeni bir sınıf açıyoruz ve implemente ediyoruz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class AddressVerifier
{
   public virtual bool IsValidZipCode(int zipCode)
   {
       if (zipCode &amp;lt; 10)
       {
           return false;
       }
       return true;
   }
}

public class GermanAddressVerifier : AddressVerifier
{
   public override bool IsValidZipCode(int zipCode)
   {
       if (zipCode &amp;lt; 5)
       {
           return false;
       }
       return true;
   }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Address verifier sınıflarımız bu şekilde olmalı.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace SOLID_S
{
    public class StateFinder
    {

    //Artık burada kullanılmak istenen ülkenin verifier'i gönderilecek.
        public string GetStateNameForZipCode(int zipCode,AddressVerifier verifier)
        {
            if (!verifier.IsValidZipCode(zipCode))
            {
                throw new InvalidOperationException($"Invalid ZipCode : {zipCode}");
            }
 
            switch (zipCode)
            {
                case 9:
                    return "Munih";
                case 8:
                    return "Berlin";
                case 11:
                    return "California";
                case 12:
                    return "Utah";
                default:
                    throw new InvalidOperationException($"No state is found with {zipCode}");
            }
        }
 
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SON OLARAK PROGRAM SINIFINA KULLANILISI GORMEK ICIN BAKARSAK &lt;br&gt;
//Artık burada kullanılmak istenen ülkenin verifier'i parametre olarak gönderilecek.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace SOLID_S
{
    class Program
    {
        static void Main(string[] args)
        {
            var stateFinder = new StateFinder();
            try
            {
                var addressVerifier = new AddressVerifier();
 
                Console.WriteLine(stateFinder.GetStateNameForZipCode(11,addressVerifier));
                Console.WriteLine(stateFinder.GetStateNameForZipCode(9,addressVerifier));
            }
            catch (InvalidOperationException exception)
            {
                Console.WriteLine(exception.Message);
            }
 
            try
            {
                var addressVerifier = new GermanyAddressVerifier();
                Console.WriteLine(stateFinder.GetStateNameForZipCode(9, addressVerifier));
            }
            catch (InvalidOperationException exception)
            {
                Console.WriteLine(exception.Message);
            }
        }
    }
}

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

&lt;/div&gt;



&lt;p&gt;BU ŞEKİLDE ARTIK ADDRESS VERİFİER SINIFIMIZI DEĞİŞTİRMEMİŞ GELİŞTİRMİŞ OLDUK&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;L - Liskov's Substitution Principle&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Birbirinden kalıtım alan sınıfların sistemi bozmadan değiştirilebilimesini esas alır.&lt;br&gt;
Sistemin kararlılığının bozulmaması için değişim zamanında değişimin sorunsuz gerçekleşmesini istiyor.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;A - Invariants (Değişmeyen şeyler) *&lt;/em&gt;: Sınıfta asla değişmeyen özellikler : örneğin bir matematik sınıfı var ve içinde pi sayısını tutan değişken var bunun değişmemesi gerekir.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;B - Pre-Conditions (İşlem yapılmadan önce yapılan kontroller) *&lt;/em&gt;:  Bir metod yazdınız örneğin para yatırma metodu  miktar isimli bir parametre alıyor ve metodun doğru çalışması için belli değerler arasında değerler alması bekleniyor. Miktar eksi olması beklenmez miktarı kontrol etme işlemi pre-conditions'lardandır. &lt;/p&gt;

&lt;p&gt;*&lt;em&gt;C - Post-conditions (İşlem sonrası yapılan kontroller) *&lt;/em&gt;:  Örneğin para yatırma işlemi tamamlandı daha sonra paranın 0 ' dan büyük olmasının kontrolünü sağlamak post-conditions'lardır.&lt;/p&gt;

&lt;p&gt;Bu kontroller sayesinde yapılan hatalar hemen farkedilir ve sistemin yanlış verilerle çalışmaması sağlanır.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace SOLID_S
{
    //KONTROLCU BIR SINIF YAPIYORUZ 
    public class Require
    {
        public static void That(Func&amp;lt;bool&amp;gt; check)
        {
            if (!check())
            {
                throw new ArgumentException("Invalid argument has been passed");
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;REQUIRE SINIFININ POST CONDITION'I ADDRESS SERVICE SINIFININ PRE-CONDITION'IDIR&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;YANI BIR KODUN POST CONDITION'I BASKA BIR KOD PARCASININ PRE-CONDITION'I OLABILIR&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace SOLID_S
{
    public class AddressService
    {
        public void ChangeAddress(Guid accountId, Address newAddress) =&amp;gt; Console.WriteLine("Changed address"); 
 
        public virtual Address GetAddressForUser(int userId)
        {
            Require.That(() =&amp;gt; userId &amp;gt; 10);
 
            var address = new Address()
            {
                Street = "Testreet",
                ZipCode = 12312,
                City = "Tokat",
                Country = "USA",
                State = "New England"
 
            };
 
            Require.That(() =&amp;gt; address.ZipCode &amp;gt; 1000);
            return address;
        }
    }
}

public class AccountService
{
    public void ChangeAddress(Address address)
    {
        Require.That(() =&amp;gt; address.ZipCode &amp;gt; 1000); 
        Console.WriteLine("Account address has been changed succesfully");
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;BU SEKILDE YAZILIMA KONTROLLER KOYARAK YAPILAN HATALARI CABUK ALGILAMA VE OLASI DURUMLARI ONLEME ICIN TEDBIRLER OLUSTURULMUSTUR&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;I - Interface Segregation Principle&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Başka sınıfları kullanan kodların ihtiyaçlarından fazlasını kullanmasını engellemek ve bu sayede&lt;br&gt;
Bakımını ve okunabilirliğini arttırmak amacıyla sunulmuş bir prensiptir.&lt;/p&gt;

&lt;p&gt;Bir sınıfın işlevleri tutarlı ve ufak arayüzler ile bölünür.&lt;/p&gt;

&lt;p&gt;Örneğin bir aşevi classimiz olsun ve bu aşevi class'ı  insanlara yemek verme metodu olsun.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public interface IHuman
{
    void Eat();
    void Talk();
    void Walk();
    void Sleep();
}

public class Asevi
{
    public void AddToList(IHuman human)
    {
        throw new NotImplementedException();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eğer buraya bir hayvan ekleyecek olursak onun içinde ayrı bir metod yazmamız gerekir şöyle ki;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public interface IAnimal
{
    void Eat();
    void Talk();
    void Walk();
    void Sleep();
    void Bite();
}

public class Asevi
{
    public void AddToList(IHuman human)
    {
        throw new NotImplementedException();
    }

    public void AddToList(IAnimal animal)
    {
        throw new NotImplementedException();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Görüldüğü gibi bir metod daha eklemem gerekiyor ve kodlar fazlaca büyüyor. Asevinin aradığı ortak özelliği&lt;br&gt;
Yani yemek yeme özelliğini kullanarak tek metodda bu işi çözebiliriz ve aralarında ilişki oluşturmuş oluruz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace SOLID_I
{
    public class Asevi
    {
        public void AddToList(IOmnivore human)
        {
            throw new NotImplementedException();
        }
    }
 
    public interface IHuman :IOmnivore
    {
        void Talk();
        void Walk();
        void Sleep();
    }
 
    public interface IAnimal :IOmnivore
    {
        void Walk();
        void Sleep();
        void Bite();
    }
 
    public interface IOmnivore
    {
        void Eat();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Her ikisinin icerisindeki yemek yeme fonksiyonunu interface olarak SEGREGATE (ayırma) ettik ve onu human ile animal interface'lerine miras olarak aldık böylece ikiside eat fonksiyonunu bir interface 'dan  almış oldu ve Asevi sınıfına tek bir metod eklemek yeterli gelmiş oldu. Bundan sonraki eklenecek farklı canlı türlerinde yemek yemesi ana özellik olarak alınacak ve hala tek bir metod üzerinden sürdürülebilir olacak.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;D - Dependency Inversion Principle&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yüksek seviyeli sınıfların düşük seviyeli sınıfları kendi halleriyle değilde soyut halleri ile kullanmasını konu alır. Buda bağımlılığı düşürür.&lt;/p&gt;

&lt;p&gt;Genel anlamda anlattığı şey bir sınıf eğer başka bir sınıfı kullanacaksa onu newlemeden yani soyut bir başka sınıf ile kullanmalıdır.&lt;/p&gt;

&lt;p&gt;Dependenc Inversion Prensibinde temel olarak bir tasarım dili kullanılır bu Dependency Injection'dır&lt;/p&gt;

&lt;p&gt;Ctor'dan bağımlılık sınıfının implementasyonu olan interfacei geçmektir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class CustomerManager 
{
    private IMevzuat _mevzuat;
    public CustomerManager(IMevzuat mevzuat)
    {
        _mevzuat = mevzuat
    }
    public void Add()
    {
        _mevzuat.IslemYap();
    }
}



class CustomerManager 
{
    private IMevzuat _mevzuat;
    public CustomerManager(IMevzuat mevzuat)
    {
        _mevzuat = mevzuat
    }
    public void Add()
    {
        _mevzuat.IslemYap();
    }
}
interface IMevzuat
{
    void IslemYap();
}
class BırıncıMevzuat: IMevzuat
{
    public void IslemYap()
    {
        Console.Write("Birinci Mevzuat işlem yaptı");
    }
}
class IkinciMevzuat: IMevzuat
{
    public void IslemYap()
    {
        Console.Write("İkinci Mevzuat işlem yaptı");
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu yapı sayesnde yeni mevzuat eklense dahi customer manager sınıfında herhangi bir değişiklik yapmaya gerek kalmaz interface onu otomatık getirir.&lt;/p&gt;

&lt;p&gt;Katmanlı mimarilerdeki katmanların geçişini sağlamak için dependency injection tasarım deseni yaygın olarak kullanılır. (Bkz: IoC Container &lt;a href="https://dev.to/hdemiray/ioc-inversion-of-control-container-1p6d"&gt;Link&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Business katmanı veri erişim katmanı ile iletişim kurarken veri erişim katmanındaki somutla değil soyutla iletişim kurar. &lt;br&gt;
Eğer veri erişim katmanında entity framework ile yapılmışsa ve ileride bunu değiştirereceği zaman business katmanında değişmemesi için.&lt;/p&gt;

</description>
      <category>solidprensipleri</category>
    </item>
  </channel>
</rss>
