<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Ceyhun Çözvelioğlu on Medium]]></title>
        <description><![CDATA[Stories by Ceyhun Çözvelioğlu on Medium]]></description>
        <link>https://medium.com/@ceyhuncozvelioglu?source=rss-a3be8d6885b9------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*D9xYSc6mmBTkjLmzlVC7PQ.jpeg</url>
            <title>Stories by Ceyhun Çözvelioğlu on Medium</title>
            <link>https://medium.com/@ceyhuncozvelioglu?source=rss-a3be8d6885b9------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 27 May 2026 00:33:03 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@ceyhuncozvelioglu/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[C#’ta Değişkenler (ValueType-Reference Type, Stack-Heap Kavramları, Boxing-Unboxing Kavramları )…]]></title>
            <link>https://medium.com/software-development-turkey/c-ta-de%C4%9Fi%C5%9Fkenler-valuetype-reference-type-stack-heap-kavramlar%C4%B1-boxing-unboxing-kavramlar%C4%B1-2cf31cd55155?source=rss-a3be8d6885b9------2</link>
            <guid isPermaLink="false">https://medium.com/p/2cf31cd55155</guid>
            <category><![CDATA[value-type]]></category>
            <category><![CDATA[değişkenler]]></category>
            <category><![CDATA[boxing]]></category>
            <category><![CDATA[reference-type]]></category>
            <category><![CDATA[unboxing]]></category>
            <dc:creator><![CDATA[Ceyhun Çözvelioğlu]]></dc:creator>
            <pubDate>Sun, 09 May 2021 03:57:38 GMT</pubDate>
            <atom:updated>2021-05-09T03:57:38.964Z</atom:updated>
            <content:encoded><![CDATA[<h3>C#’ta Değişkenler (ValueType-Reference Type, Stack-Heap Kavramları, Boxing-Unboxing Kavramları ) [Veri Serisi — Değişkenler]</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YStY_1eD576woerxuspq_g.jpeg" /></figure><p>Herkese merhaba,</p><p>Hiç bilmeyenler için değişkenleri, yazılımda herhangi bir veriyi sakladığımız birer kutu gibi düşünebiliriz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*xLfKkdDZQgaZZr8R65y-Jg.png" /><figcaption>Credit: Steven Curtis</figcaption></figure><p>Gerçek hayattan kutu örneğiyle devam edersek; bu kutuların (<em>değişken</em>) içerisinde birer veri saklandığını (<em>değişkenin değeri</em>), kutuların farklı ebatlarda olabileceğini (<em>değişken boyutu</em>), saklanan her verinin farklı tiplerde (<em>değişkenin türü</em>) olabileceğini ve kutuların üstüne de birer isim yazdığımızı (<em>değişkenin adı</em>) düşünebiliriz.</p><h3>Değişken Tipleri</h3><p>Şimdi değişkenleri genel olarak bir tabloda, tip, boyut, aralık ve CTS karşılıkları olarak inceleyelim.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/657/1*zcW98PxKed_pQPl6qUU8Ww.jpeg" /></figure><p>Yukarıdaki tabloda CTS (Common Type System) karşılıkları kısmında CTS kavramını ilk kez görenler, detaylar için <a href="http://cozvelioglu.com/bir-exe-uygulamasinin-anatomisi-clr-cil-jit-cts-kavramlari/">Bir .exe Uygulamasının Anatomisi (CLR, CIL, JIT, CTS Kavramları)</a> başlıklı yazımdaki “<em>CTS (Common Type System) Nedir?</em>” kısmını okuyabilir.</p><p>Yukarıdaki tabloya bakarak gerçek hayattan örneklemeye devam edersek tip için kutunun tipini, boyut için kutunun ebatını, aralık için kutunun taşıyabileceği içeriğin hacminin en alt ve en üst limitlerini, CTS karşılıkları için de kutunun evrensel olarak kabul görmüş dünyanın neresine giderseniz gidin kutu dünyasında standartlaşmış bir adı olarak düşünebiliriz.</p><p>Akıllara hemen “<strong><em>C#’ta neden farklı farklı değişken tipleri ve bunların farklı boyutları, kapasiteleri var ki? Tek bir tane değişken türü olsa da bu kadar uğraşmasak olmaz mıydı?</em></strong>” gibi bir soru gelebilir. Elbette tek bir veri tipi olması biz yazılım geliştirenlerin işini bir hayli kolaylaştıracaktı ancak yazılım geliştirmede yalnızca kod yazan kişiler olarak kendi kolaylıklarımızdan sorumlu değiliz. Geliştirdiğimiz her yazılımın tükettiği kaynaklar mevcut. Tüketilen kaynakları optimum kullanmak da bizlerin sorumluluğu arasındadır. Elimizdeki kaynakları ne kadar iyi kullandığımız bizlerin ne kadar iyi birer yazılım geliştirici olduğunu gösteren bir faktördür. Önceden belirlenmiş değişken tiplerinin ve boyutlarının olmasının sebebi .NET Framework’ün, yazılım içerisinde kullanacağımız verinin tipini bilmek istemesinden kaynaklanmaktadır. .NET framework veri tipini bilmek istiyor çünkü elindeki memory kaynağını ona göre organize edecektir. Bu sebeple bu kadar farklı veri tipi ve önceden belirlenmiş standart boyutları ve aralıkları bulunmaktadır.</p><p>Gerçek hayattan örnek vermemiz gerekirse, evden eve taşıma yapan her şey dahil bir nakliye firmanızın olduğunu ve elinizde büyük küçük çeşitli kamyonetlerin, kamyonların, tırların yer aldığını düşünün. Bir müşterinin sizi aradığını ve eşyasını İstanbul’dan Hakkari’ye taşıtmak istediğini varsayalım. Firma olarak maliyeti belirlemek ve müşteriye de sunduğunuz hizmet için bir fiyat verebilmek için müşterinin eşyasının miktarını bilmeniz gerekir ki buna uygun kamyonet, kamyon veya tır seçip o eşyayı en uygun araca yükleyebilesiniz. Yalnızca bir koltuk ve bir televizyonu olan bir müşteri için koca bir tır’ı İstanbul’dan Hakkari’ye gönderir miydiniz? Yoksa daha uygun ve maliyetinizi azaltacak küçük bir kamyonet işinizi zaten çok güzel görmez miydi? Bu sayede siz kamyoneti yola çıkardığınızda çok daha fazla eşyası olan başka bir müşteri için tırınız hazırda beklerdi :)</p><p>İşte bu örnekten de anlaşılacağı üzere, .NET Framework de kod yazarken veriyi saklayacağı tipin kendisine bildirilmesini istiyor ki ona uygun hafızada yerini ayırabilsin. Kullanacağınız verinin tipine göre seçim yapmak oldukça isabetli olacaktır.</p><h3>Value Type ve Reference Type Nedir?</h3><p>C#’ta tipler “value type (değer tipi)” ve “reference type (referans tipi)” olarak ikiye ayrılır.</p><p><strong>Value Type (Değer Tipi): </strong>C#’ta kullanılan value type’lar önceden boyutu kesin olarak belirlenmiş, içerisinde direkt olarak veri tutan tiplerdir. Yukarıdaki değişken tablosunda boyut sütununa bir bakalım. Boyutlarının kesin olarak byte karşılıkları yazan değişken tiplerinin hepsi (int, long, float, double, decimal, char, bool, byte, short) birer value type’dır.</p><p><strong>Reference Type (Referans Tipi):</strong> İçerisinde direkt olarak veriyi değil, verinin tutulduğu hafıza adresini barındıran yani referansını tutan tiplerdir. Yine yukarıdaki değişken tablosuna baktığımızda string’in belirli bir boyutu olmadığını görürüz. Bu sebeple string’e value type diyemeyiz. string bir reference type’dır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/661/1*uDAp5jx5f4M02_f-jf8LQg.jpeg" /></figure><p>Kod içerisinde bir tipin value type olup olmadığını öğrenmenin oldukça basit bir yöntemi vardır. Örneğin int tipinin kodda value type olup olmadığını aşağıdaki paylaştığım küçük kod parçası sayesinde öğrenebiliriz.</p><blockquote><strong>bool </strong>kontrol = <strong>typeof</strong>(int).<strong>IsValueType</strong>;</blockquote><p><strong>IsValueType</strong> property’si sayesinde bir tipin value type olup olmadığını kolayca öğrenebiliriz.</p><h3>Stack ve Heap Kavramları Nedir?</h3><p>Stack ve Heap, memory’de (RAM/bellek) bulunan mantıksal yapılardır. Bu yapıların detaylarına geçmeden önce stack’in kısıtlı ama hızlı, heap’in ise stack’e görece daha geniş bir alana ama yine stack’e göre daha yavaş bir yapıya sahip olduğunu bilmek işimize yarayacaktır.</p><h3>Stack</h3><ul><li><strong>Value Type</strong>’lar (Değer Tipleri) <strong>Stack</strong>’te tutulur.</li><li><strong>Stack</strong>’te veriler üst üste ve son giren ilk çıkar (<strong>LIFO — Last In First Out</strong>) mantığıyla tutulur ve sırası gelmeden aradaki bir değer ile işlem yapılmaz.</li><li>Stack’te bir veriye erişmek, Heap’e göre daha hızlıdır.</li><li>Oluşturulan veriler Stack’in kapsamında çıkınca otomatik olarak yok edilir.</li><li>Program çalışmadan önce Stack’te yer ayrılır. Eğer yazılımı geliştiren kişi tarafından bu bölüm aşılırsa meşhur Stackoverflow hatası ile karşılaşılır.</li></ul><h3>Heap</h3><ul><li><strong>Reference Type</strong>’ların (Referans tiplerin) değeri <strong>Heap</strong>’te, değerin <strong>Heap</strong>’te saklandığı adresin bilgisi ise <strong>Stack</strong>’te tutulur. (Yani bir reference type saklanırken memory’nin hem Heap bölgesi hem de Stack bölgesi kullanılmaktadır. Dikkat edilmesi gereken referans tipin değerinin Heap’te saklanırken, o değerin adresinin Stack’te saklandığıdır.)</li><li>Heap’te veriler karışık bir şekilde tutulur, Stack gibi belirli bir sırada tutulmaz.</li><li><strong>Heap</strong> bölgesindeki bir veriye erişmek, Stack’e oranla daha <strong>maliyetlidir (yavaştır).</strong></li><li>Heap bölgesindeki bir verinin silinmesi C# için <strong>Garbage Collector</strong> algoritmasına bağlıdır.</li><li>Program çalıştırılmadan önce yer ayrılmaz, programın çalışma zamanında yer ayrılır.</li></ul><h3>Boxing ve Unboxing Kavramları Nedir?</h3><h3>Boxing</h3><p>Boxing işlemi, value type (değer tipi) bir değişkeni, reference type (referans tipi) bir nesneye aktarmaya denir.</p><blockquote><strong>int </strong>sayi = 123; // value type bir degisken tanimlandi</blockquote><blockquote><strong>object </strong>obje = sayi; // bu atamada sayi degiskenine dolaylı olarak (implicity) boxing islemi uygulandi</blockquote><h3>Unboxing</h3><p>Reference type (referans tipi) değişkenin işaret ettiği değeri, value type (değer tipi) bir değişkene aktarmaya denir.</p><blockquote><strong>int </strong>sayi1 = 123; //value type degisken tanimlandi ve degeri atandi</blockquote><blockquote><strong>object </strong>obje = sayi1; // Boxing islemi</blockquote><blockquote><strong>int </strong>sayi2 = (<strong>int</strong>)obje; // Unboxing islemi</blockquote><p><strong>Not</strong>: Unboxing işlemi gerçekleştirilirken, boxing işleminde kullanılan veri tipinin aynısının kullanıldığına dikkat edilmelidir. Aksi hale veri tipleri uyuşmayacağından <strong>InvalidCastException</strong> hatası alınacaktır.</p><h3>Boxing ve Unboxing Hakkında Ek Bilgiler</h3><ul><li>Boxing işlemi, normal bir atama işleminden 20 kat daha uzun sürmektedir.</li><li>Unboxing işlemi, normal bir atama işleminden 4 kat daha uzun sürmektedir.</li><li>Bu sebeplerden dolayı gerekli olmayan aşırı boxing ve unboxing kullanımı uygulamanızı gözle görülür biçimde yavaşlatacaktır.</li></ul><p><a href="http://cozvelioglu.com/c-ile-yazilim-gelistirmede-veri-serisi-veri-serisi-baslangic/">Veri Serisi</a>’nin ilk makalesi olan Değişkenler’in böylece sonuna geldik. Herkese keyifli kodlamalar dilerim :)!</p><p>Bu yazı ilk olarak <a href="http://cozvelioglu.com/cta-degiskenler-valuetype-reference-type-stack-heap-kavramlari-boxing-unboxing-kavramlari-veri-serisi-degiskenler/">http://cozvelioglu.com/cta-degiskenler-valuetype-reference-type-stack-heap-kavramlari-boxing-unboxing-kavramlari-veri-serisi-degiskenler/</a> adresinde yayınlanmıştır.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2cf31cd55155" width="1" height="1" alt=""><hr><p><a href="https://medium.com/software-development-turkey/c-ta-de%C4%9Fi%C5%9Fkenler-valuetype-reference-type-stack-heap-kavramlar%C4%B1-boxing-unboxing-kavramlar%C4%B1-2cf31cd55155">C#’ta Değişkenler (ValueType-Reference Type, Stack-Heap Kavramları, Boxing-Unboxing Kavramları )…</a> was originally published in <a href="https://medium.com/software-development-turkey">SDTR</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[C# ile Yazılım Geliştirmede Veri Serisi [Veri Serisi — Başlangıç]]]></title>
            <link>https://medium.com/software-development-turkey/c-ile-yaz%C4%B1l%C4%B1m-geli%C5%9Ftirmede-veri-serisi-veri-serisi-ba%C5%9Flang%C4%B1%C3%A7-e3246044772c?source=rss-a3be8d6885b9------2</link>
            <guid isPermaLink="false">https://medium.com/p/e3246044772c</guid>
            <category><![CDATA[koleksiyonlar]]></category>
            <category><![CDATA[veri]]></category>
            <category><![CDATA[değişkenler]]></category>
            <category><![CDATA[serisi]]></category>
            <category><![CDATA[cozvelioglu]]></category>
            <dc:creator><![CDATA[Ceyhun Çözvelioğlu]]></dc:creator>
            <pubDate>Sun, 09 May 2021 03:46:56 GMT</pubDate>
            <atom:updated>2021-05-10T14:42:44.617Z</atom:updated>
            <content:encoded><![CDATA[<h3>C# ile Yazılım Geliştirmede Veri Serisi [Veri Serisi — Başlangıç]</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FAFZU0LOSUIQ77sfPh1gkA.jpeg" /></figure><p>Herkese merhaba,</p><p>C# ile hangi platform için yazılım geliştirirsek geliştirelim işin özünde hepimiz ortak bir paydada buluşuyoruz; tek kelimeyle: ‘<strong>veri</strong>’. Bir masaüstü uygulaması da yazsak, ASP.NET ile bir web uygulaması da geliştirsek, ortak kaygımız hep verinin alınması/işlenmesi oluyor. Bir kullanıcının sisteme login olurken kullanıcı adı ve şifresini alıp kontrollerinin gerçekleştirilmesinden, bir hastane otomasyonu yazılımında ilgili hastayı bulmak ve bilgilerine erişmek gibi ve bunu çok daha farklı örneklerle arttırsak dahi işimiz özünde bir veriyi bulmak, o veriyi güncellemek, eklemek, silmek gibi işlemler oluyor. Bu sebeple C#’ta yazılım geliştirirken bir veriyi kod içerisinde tuttuğumuz değişkenlerden, efektif veri kullanımı için seçeceğimiz veri yapısına kadar hepsi bir bütün olarak performansa, sistemin kararlılığına etki eden birer kriter oluyor. İşte ‘<strong>Veri Serisi</strong>’ adını verdiğim seri ile aşağıda maddeler halinde yazdığım başlıkları birer arşiv oluşturması amacıyla yazmaya başlıyorum.</p><ol><li><a href="https://medium.com/software-development-turkey/c-ta-de%C4%9Fi%C5%9Fkenler-valuetype-reference-type-stack-heap-kavramlar%C4%B1-boxing-unboxing-kavramlar%C4%B1-2cf31cd55155"><strong>Değişkenler (Variables)</strong></a></li></ol><ul><li>Değişken tipleri</li><li>Value Type/Reference Type Nedir?</li><li>Stack/Heap Kavramları</li><li>Boxing/Unboxing Kavramları</li></ul><p><strong>2. Diziler (Arrays)</strong></p><ul><li>Array’lere genel bakış</li><li>Tek boyutlu array’ler/Çok boyutlu array’ler</li></ul><p><strong>3. Generic Olmayan Koleksiyonlar (Non-Generic Collections)</strong> (<em>Alt başlık olarak geçen her bir madde ayrı birer makale konusu olacaktır</em>)</p><ul><li>ArrayList</li><li>Stack</li><li>Queue</li><li>Hashtable</li><li>SortedList</li></ul><p><strong>4. Generic Koleksiyonlar (Generic Collections)</strong> (<em>Alt başlık olarak geçen her bir madde ayrı birer makale konusu olacaktır</em>)</p><ul><li>List&lt;T&gt;,</li><li>Stack&lt;T&gt;</li><li>Queue&lt;T&gt;</li><li>Dictionary&lt;K,T&gt;</li><li>SortedDictionary&lt;K,T&gt;</li></ul><p>Yukarıdaki makalesi tamamlanan başlığı link olarak zaman içerisinde ekleyeceğim :)</p><p>Çok fazla içerik kabul edilemeyecek bu yazıyı aslında bir serinin başlangıcını ve serideki içeriklere hızlı erişim amaçlı bir indeksleme olarak düşünebilirsiniz. Katkı sağlamak istediğiniz ek maddeler ve konular olursa yorumlarda belirtirseniz çok sevinirim.</p><p>Herkese keyifli kodlamalar :)!</p><p>Bu yazı ilk olarak <a href="http://cozvelioglu.com/c-ile-yazilim-gelistirmede-veri-serisi-veri-serisi-baslangic/">http://cozvelioglu.com/c-ile-yazilim-gelistirmede-veri-serisi-veri-serisi-baslangic/</a> adresinde yayınlanmıştır.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e3246044772c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/software-development-turkey/c-ile-yaz%C4%B1l%C4%B1m-geli%C5%9Ftirmede-veri-serisi-veri-serisi-ba%C5%9Flang%C4%B1%C3%A7-e3246044772c">C# ile Yazılım Geliştirmede Veri Serisi [Veri Serisi — Başlangıç]</a> was originally published in <a href="https://medium.com/software-development-turkey">SDTR</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Bir .exe Uygulamasının Anatomisi (CLR, CIL, JIT, CTS Kavramları)]]></title>
            <link>https://medium.com/software-development-turkey/bir-exe-uygulamas%C4%B1n%C4%B1n-anatomisi-clr-cil-jit-cts-kavramlar%C4%B1-eb5ee74a8525?source=rss-a3be8d6885b9------2</link>
            <guid isPermaLink="false">https://medium.com/p/eb5ee74a8525</guid>
            <category><![CDATA[lrc]]></category>
            <category><![CDATA[nedir]]></category>
            <category><![CDATA[ct]]></category>
            <category><![CDATA[derleyici]]></category>
            <category><![CDATA[jit]]></category>
            <dc:creator><![CDATA[Ceyhun Çözvelioğlu]]></dc:creator>
            <pubDate>Thu, 14 Jan 2021 04:37:54 GMT</pubDate>
            <atom:updated>2021-03-28T15:21:08.190Z</atom:updated>
            <content:encoded><![CDATA[<h3>Bir .exe Uygulamasının Anatomisi (CLR, CIL, JIT, CTS Kavramları)</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*He8qZdDEbL-rn6zY2P_ywA.jpeg" /><figcaption>www.cozvelioglu.com</figcaption></figure><p>Herkese merhaba,</p><p>Uzunca bir süre yazmaya ara vermiştim, bu süreçte eski yazılarımla ilgili o kadar güzel feedbackler aldım ki geri döneceğim zaman aslında sadece kendime notlar alırım diye çıktığım bu yolun farklı bir sorumluluk yüklediğini de böylece fark etmiş oldum. Pandemi, karantina, evden çalışma derken hepimizin uzunca saatlerini evde bilgisayar başında geçirdiği şu günlerde kod yazarken en büyük destekçilerimden olan Spotify Desktop versiyonu ile müzik dinlerken bir ışık yandı zihnimde. .NET Framework’te çalışan bir exe programını ameliyat masasına yatırıp tüm süreci baştan sona kısaca incelemek. Bu sebeple bu yazımda zaman zaman benim de karıştırdığım/detaylarını hatırlamakta güçlük çektiğim <strong>CLR, CIL, JIT, CTS</strong> gibi kavramları masaya yatıracağız. Yolu desktop programlarıyla kesişen herkesin bilmesinde fayda olan bu kavramları inceleyeceğiz.</p><p>Sözü fazla uzatmadan en güzel öğrenme şeklinin diyagramlar/tablolar/görsellerle desteklendiğine olan sonsuz inancım sebebiyle bir .NET uygulamasının çalışması için bir araya gelen bileşenleri içeren şu görselle başlayalım.</p><figure><img alt="Bir exe uygulamasını Compile Time ve Run Time’da çalıştıran bileşenler" src="https://cdn-images-1.medium.com/max/762/0*Kzdy2b9J-LdeZTYG.png" /><figcaption>Bir exe uygulamasını Compile Time ve Run Time’da çalıştıran bileşenler</figcaption></figure><p>Bu kavramları daha iyi idrak edebilmek adına iki kavramın üstünden hızlıca geçmemiz faydalı olacaktır. Diyagramda yer alan her bir bileşeni masaya yatırıp çok derinlerine dalmadan fakat suya da yazı yazmadan inceleyeceğiz :)</p><h3>Compile Time ve Run Time Nedir?</h3><h4>Compile Time (Derleme Zamanı)</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/0*9vsMNqQi_QcL_GxL.jpg" /><figcaption>Basitçe compile işlemi yüksek seviyeli bir dilin daha düşük seviyeli bir dile dönüştürülmesi işlemidir</figcaption></figure><p>Compile işlemi; oldukça basit ve akılda kalıcı bir izahla “<strong>yüksek seviyeli bir dilin daha düşük seviyeli bir dile dönüştürülmesi işlemidir</strong>”. Yani biz yazılım geliştiriciler tarafından yazılmış kod, compile işleminden sonra makinelerin seviyesine yaklaşmaktadır. İşte bu işlemi gerçekleştiren mekanizmaya <strong>Compiler(Derleyici)</strong> derken, bu süreçte yaşanan tüm işlemleri zaman açısından anlatmak için de <strong>Compile Time (Derleme Zamanı)</strong> kavramını kullanmaktayız. Yukarıdaki compiler diyagramında Compilation Error kısmı ise, yüksek seviyeli bir dilin compile edilme işlemi sırasında oluşan hataları anlatmaktadır. Compile Time hatalarının en güzel tarafı .exe dosyası daha oluşturulmadan derleme işlemi sırasında hata alınmasıdır. ‘<em>Syntax Error (Sözdizimi Hatası)’</em> hatasını Compilation Error’a örnek olarak verebiliriz.</p><h4>Run Time (Çalışma Zamanı)</h4><p><strong>Programın çalıştırıldığı andan sonlandırılıncaya kadar geçen süreci</strong> anlatmak için kullanılan kavramdır. Compile Time’da olduğu gibi Run Time’da da hatalar almak pek mümkündür ki aslında kıyaslandığında en acı senaryo Run Time errorlardır. Bazen bir run time hatasını bulmak için çok fazla efor sarfetmek gerekebilir. Basitçe yine neleri Run Time Error’a örnek olarak verebiliriz diye düşündüğümüzde aşağıdaki örnek maddeler en azından bu kavramı daha iyi idrak etmeye yardımcı olacaktır;</p><ul><li>Bellek yetersiz hatası</li><li>Programda bir dosya için işlem yapacağımızı düşünelim ve bu dosyanın yolunu kod içerisinden sabit bir şekilde verdiğimizi düşünelim. Kod burada compile işlemini başarıyla geçecektir ve program çalıştırıldığında eğer kodda belirttiğimiz dosya yolunda ilgili dosya bulunamazsa hata oluşacaktır. Bu hata örneği compilation error ve run time error arasındaki farkı güzel bir şekilde idrak etmeye yardımcı olacaktır.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*oCqU95wQA0fY-TxX.png" /></figure><p>Compile Time ve Run Time kavramlarına da neşter vurarak damarlarında gezindiğimize göre ana konumuza tekrar geri dönelim. Bir .exe uzantılı programın .NET Framework’te çalışması için yazdığımız kod öncelikle compile işlemiyle daha düşük seviyeli bir dile çevriliyor. Yukarıdaki görselde de görüleceği üzere VB.NET ile yazılmış bir kod .NET Framework içerisinde yer alan VB.NET compiler ile, C# ile yazılmış bir kod C# Compiler ile ve F#/C++ gibi dillerle yazılmış kodlar da yine .NET Framework içerisinde yer alan o dile özgü compilerlar ile compile edilmektedir. Bu kısımdan itibaren önemli olan şey tüm bu farklı dillerde yazılan kodlar compilation sonrası <strong>CIL (Common Intermediate Language)</strong> denilen bir ara dile çevrilmektedir.</p><p>O halde ana diyagramımızdan nerede olduğumuza geri dönüp bir bakacak olursak şu anda yazdığımız kodu compile ettik ve CIL (Common Intermediate Language) oluştu. Derleme işlemi sırasında bir hata oluşmadıysa artık Compile Time’ı sorunsuz bir şekilde aşmış bulunuyoruz. Şimdi CIL (Common Intermediate Language) nedir, biraz da bu kavramı inceleyelim.</p><h3>CIL (Common Intermediate Language) Nedir?</h3><p>CIL veya .NET Framework için MSIL olarak adlandırılır. Türkçe’ye <strong>Ortak Ara Dil</strong> olarak çevrilmektedir ve ara dil olarak nitelendirilmesinin sebebi; <strong>C# kadar yüksek seviyeli yani bir insanın rahatça anlayabileceği kadar kolay bir dil olmamasına karşın, makine dili kadar da insandan uzak bir dil değildir</strong>.</p><p>Compilation işlemi sonrası CIL’e dönüştürülen kodlarımız exe dosyası olarak kaydedilir. Bu aşamadan itibaren artık çalıştırılabilir bir executable file’ımız mevcuttur. Burada dikkat edersek .exe içerisinde direkt olarak makine kodları yer almamaktadır, yazdığımız koddan CIL’e dönüştürülmüş kodlar yer almaktadır. Bu sebeple exe dosyasının çalışması için makinede muhakkak .NET Framework’ün yer alması gerekmektedir. Çünkü çalıştırma işlemini .NET Framework içerisindeki CLR mekanizması gerçekleştirecektir.</p><p><strong>Not:</strong> Bir exe dosyasını compile edildikten sonra direkt olarak başka birisine verdiğimizde aslında bir bakıma projenin kaynak kodlarını da vermiş oluyoruz. Decompiler’lar aracılığı ile eğer herhangi bir şifreleme algoritması veya güvenlik aracı ile exe’mizi şifrelemezsek kolayca kaynak koduna erişilebileceğini unutmayalım.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/0*g3INZ58jyUcBGUVP.jpg" /></figure><p>CIL içerisinde Metadata olarak adlandırılan bir yapı daha vardır. Metadata programda kullanılan veri tiplerini, oluşturduğumuz sınıfları, sınıfların methodlarını, özelliklerini ve diğer bilgilerini de içerir. Yani CIL’e biraz daha üstten genel bir bakış atarsak, CIL içerisinde değişken tanımları, değişkenlerin nasıl saklanacağı, methodların nasıl çalıştırılacağı, aritmetik ve lojik işlemler, bellek kullanımı gibi birçok işin nasıl yapılacağı açıklanır.</p><p>Sihir gibi değil mi? :) Bir “Hello World” uygulamasının CIL kodunu inceleyelim dilerseniz. Visual Studio ile basit bir Hello World console application projesi oluşturup, konsola “Hello World” yazdıran kodu yazalım.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/469/0*5YEyYdW-CgOpcp2h.jpg" /></figure><p>Kodu derledikten sonra, CIL kodunu görüntüleyebilmek için <strong>IL DASM</strong> tool’unu kullanabiliriz. Bu toola’a Developer Command Prompt’a <strong>ildasm</strong> yazarak kolay bir şekilde ulaşabiliyoruz. IL DASM ile exe dosyasını açtığımızda ilk olarak aşağıdaki görüntü bizi karşılamaktadır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/380/0*HcXJ7sgqwLkrer_x.jpg" /></figure><p>Burada programın manifesto bilgisine, methodlarına ve classlarının özelliklerine erişebiliyoruz. Gelin şimdi bir de Main methodunun CIL kodunun nasıl olduğunu görüntüleyelim.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/620/0*IYk0nNvklIgDWqc9.png" /></figure><p>İşte sihirli kısım. CIL kodunu anlamak aslında çok da zor değil. Örneğin; <strong>ldstr “Hello World” </strong>satırında ‘Hello World’ stringinin load edileceği bilgisi yer alıyor. Hemen bir altındaki call çağrısıyla hangi methodun çağrılacağı belirtilmiş. Görüldüğü gibi, CIL ne makine dili kadar insandan uzak ne de C# kadar insana yakın.</p><p>Artık kodumuz derlendi, exe dosyası oluşturuldu ve çalıştırılmaya hazır. Run Time’daki operasyonlara geçerek, exe dosyasının .NET Framework’te nasıl çalıştırıldığını inceleyelim.</p><h3>CLR (Common Language Runtime) Nedir?</h3><p>CLR (Common Language Runtime) .NET Framework’te programların çalışmasını kontrol eden ve işletim sistemi ile program arasında yer alan bir arabirimdir. CIL kodlarını çalıştıran ana mekanizmadır. CIL kodları daha önce de incelediğimiz gibi makine dili değil bir ara dildir. Bu sebeple programın çalıştırılabilmesi için bu ara dili alıp makine diline çevirecek ve makinede işletecek bir mekanizmaya ihtiyaç duymaktaydık. Bu ihtiyacı CLR karşılamaktadır.</p><p>CLR, içerisinde yer alan <strong>JIT (Just in Time)</strong> derleyicisi ile, CIL kodunu alır makine koduna çevirir ve programın çalışmasını sağlar. Akıllara hemen ‘İyi de neden böyle bir şeye ihtiyaç duyuyoruz ki, direkt olarak neden yazdığımız kodlar makine diline çevrilmiyor da ara bir dile dönüştürülerek CLR’a ihtiyaç duyuyoruz?’ gibi bir soru gelebilir. CLR’ın bize sağladığı avantaj programlarımızı platform bağımsız çalıştırabilmemizi sağlamasından ileri geliyor. .NET Framework yüklü herhangi bir makinede CIL kodunu CLR işleteceği için kaynak kullanımları, performans ile ilgili maksimum optimizasyonu da yine JIT derleyicisi ile beraber sağlamış oluyor.</p><p>Hazır JIT kavramı geçmişken, JIT derleyicisi nedir hemen inceleyelim.</p><h3>JIT (Just in Time) Compiler Nedir?</h3><p>C#’ta CIL’e compile ettiğimiz program çalıştırılırken CLR aracılığı ile JIT derleyiciler devreye girer. Bu derleyiciler CIL kodunu işleyerek programın çalıştırıldığı sistemin ve işlemcinin anlayabileceği makine kodunu oluştururlar. Burada bir miktar kafa karışıklığı yaşanmış olabilir. “Bir defa kod yazıyoruz ve iki kere mi derleme işlemi uygulanıyor?” gibi bir soru akıllara gelebilir. En başta yazdığımız bir kod iki kere derleniyor evet. Önce bizim yazdığımız C# kodu C# derleyicisi ile CIL’e dönüştürülüyor ve bu oluşan CIL, CLR mekanizması içerisindeki JIT derleyicileri ile makine koduna çevriliyor. Just in Time denilmesinin sebebi, Türkçe’ye ‘<strong>O an</strong>’ veya ‘<strong>Tam o anda</strong>’ şeklinde çevirerek biraz daha türlerini incelediğimizde daha net ortaya çıkacaktır.</p><p>3 çeşit JIT compiler bulunmaktadır. Bunlar</p><ol><li>Normal-JIT</li><li>Econo-JIT</li><li>Pre-JIT</li></ol><h4>1. Normal-JIT</h4><p>Normal-JIT derleyiciler; programın tamamını tek seferde derlemez. Program çalışırken parça parça derleme işlemi gerçekleştirilir. Her method çalıştırılmadan önce derlenir ve derlenen methodun makine dili kodları <strong>önbellekte tutulur</strong>. Böylece program içerisinde derlenmiş bir methodun tekrar çalıştırılması gerektiğinde yeniden derleme işlemi gerçekleştirilmez ve bu method önbellekten çekilir.</p><h4>2. Econo-JIT</h4><p>Econo-JIT derleyicilerde de programın tamamı tek seferde derlenmez. Yine Normal-JIT gibi program çalışırken parça parça derleme işlemi gerçekleştirilir. Her method yine çalıştırılmadan önce derlenir ancak Normal-JIT’ten farklı olarak derlenen methodun makine dili kodları <strong>önbellekte tutulmaz</strong>. Her method her çağrılışında yeniden derlenir.</p><h4>3. Pre-JIT</h4><p>Tüm program en baştan tek seferde makine koduna çevrilip sonra çalıştırılır. Programın daha hızlı çalışmasını sağlasa da diğer JIT derleyici türlerine göre daha fazla hafıza gerektirmektedir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/691/1*06pNFxyNto7Bh46WZS1hmg.png" /><figcaption>JIT Türleri Karşılaştırma Tablosu</figcaption></figure><p>CLR içerisinde yer alan başka bir yapı ise CTS (Common Type System) yapısıdır. Bu yapıyı da inceleyerek bir .NET programının çalışma anatomisini tamamlamış olalım.</p><h3>CTS (Common Type System) Nedir?</h3><p>Bütün veri tiplerinin tanımlı olduğu bir sistem olarak düşünebiliriz. CTS sayesinde .NET Framework’te farklı dillerde yazılmış programların veri tipleri arasındaki uyum sağlanmış olur.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/0*sgaHYJopWzFDAH0O.jpg" /></figure><p>Örneğin VB.NET ile yazılmış bir <strong>Integer</strong> değişkeni, C#’ta <strong>int</strong> olarak yazılsa da CTS karşılıkları <strong>System.Int32</strong>&#39;dir ve RAM’de kapladıkları alan aynıdır. Bu sayede tipler arasındaki uyum sağlanmış olur, değişen tek şey dillerdeki syntax olmaktadır.</p><h3>Özet</h3><ul><li>Yazılan kod, o dile özgü derleyici ile CIL (Common Intermediate Language)’e çevrilir.</li><li>CIL içerisinde Metadata yapısını da barındırır.</li><li>CLR mekanizması aracılığı ile CIL kodları JIT derleyicileri ile derlenerek program çalıştırılır.</li></ul><p>Bu yazı ilk olarak <a href="http://cozvelioglu.com/bir-exe-uygulamasinin-anatomisi-clr-cil-jit-cts-kavramlari/">http://cozvelioglu.com/bir-exe-uygulamasinin-anatomisi-clr-cil-jit-cts-kavramlari/</a> adresinde yayınlanmıştır.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=eb5ee74a8525" width="1" height="1" alt=""><hr><p><a href="https://medium.com/software-development-turkey/bir-exe-uygulamas%C4%B1n%C4%B1n-anatomisi-clr-cil-jit-cts-kavramlar%C4%B1-eb5ee74a8525">Bir .exe Uygulamasının Anatomisi (CLR, CIL, JIT, CTS Kavramları)</a> was originally published in <a href="https://medium.com/software-development-turkey">SDTR</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[String İşlemleri ile İlgili Bazı Detaylar]]></title>
            <link>https://medium.com/software-development-turkey/string-i%CC%87%C5%9Flemleri-ile-i%CC%87lgili-baz%C4%B1-detaylar-755822d34add?source=rss-a3be8d6885b9------2</link>
            <guid isPermaLink="false">https://medium.com/p/755822d34add</guid>
            <category><![CDATA[yazılım]]></category>
            <category><![CDATA[string-builder]]></category>
            <category><![CDATA[c-sharp-programming]]></category>
            <category><![CDATA[refactoring]]></category>
            <category><![CDATA[performans]]></category>
            <dc:creator><![CDATA[Ceyhun Çözvelioğlu]]></dc:creator>
            <pubDate>Mon, 15 Jul 2019 18:17:03 GMT</pubDate>
            <atom:updated>2021-03-28T15:23:14.553Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*R8wQfd8rKmi_7njJV8UxOg.jpeg" /></figure><p>Bu yazımda C#’ta string birleştirme işlemi yaparken oluşabilecek performans problemlerini, .ToString() ile Convert.ToString() methodları arasında ne gibi bir fark olduğunu ve iki string’i karşılaştırırken kullandığımız .Equals() methodu hakkında ufak bir detayı inceleyeceğiz.</p><p><strong><em>“String birleştirme işlemleri neden maliyetli?</em></strong>” sorusunun cevabı aslında stringlerin .NET Framework’teki tanımlanmalarından ileri gelmektedir. String tipi .NET Framework’te<strong> immutable (değişmez)</strong> olarak tanımlanmıştır. İlk olarak immutable kavramı bilmeyenler ve yeniden hatırlamak isteyenler için nedir, ne değildir inceleyip; yavaş yavaş string işlemlerinin performanslarına doğru yol alalım isterim.</p><h4>İmmutable (Değişmez) Nedir?</h4><p>Immutable nesneler bir kez oluşturulduktan sonra içeriği değiştirilemeyen nesnelere verilen bir tanımlamadır. String tipi de immutable tanımlandığı için, stringler üzerinde yapılan birleştirme işleminde her seferinde memory’de yeni bir string oluşturulacak ve geliştirdiğiniz programın performans sorunuyla karşılaşması muhtemel bir hal alacaktır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/957/0*6dZFQ_wK6JiLCZyx.png" /><figcaption>© Bazlur Rahman | Dzone</figcaption></figure><p>Örneğin, yukarıdaki görselde str isimli bir string oluşturulurken başlangıç değeri olarak “Hello” atanmıştır. Sonrasında str ile “world” birleştirme işlemine tabi tutulup yine str değişkenine atansa dahi memory’de “Hello world” isimli yeni bir String objesi oluşturulmuş ve str artık “Hello world”ü referans göstermektedir. str tanımlanırken verilen “Hello” değeri, artık referans gösterilmeyen bir String objesi olarak memory’de hala yer tutmaya devam etmektedir.</p><h4>String Birleştirme İşlemleri (StringBuilder Kullanımı)</h4><pre>s = &quot;Hello&quot; + &quot;World&quot; + &quot;I am&quot; &quot;an&quot; + &quot;engineer&quot;;</pre><p>Yukarıdaki gibi bir birleştirme işlemi her + operatörünün kullanımıyla memory’de yeni bir string oluşturacağından maliyetli bir işlem olacaktır. Özellikle bir döngü içerisinde bu birleştirme işlemi devam ettiği sürece performansta o oranda bir kayıp yaşanacak ve memory’i gereksiz yere işgal etmiş oluruz. Bunun yerine string’ler ile birleştirme yapacağımız zaman <strong>StringBuilder</strong> sınıfından yararlanmak performans açısından kaydadeğer bir ilerleme sağlar.</p><p>Yukarıdaki birleştirme işlemini StringBuilder ile aşağıdaki şekilde yapabiliriz.</p><pre>StringBuilder sb = new StringBuilder(&quot;Hello&quot;);<br>sb.Append(&quot;World&quot;);<br>sb.Append(&quot;I am&quot;);<br>sb.Append(&quot;an&quot;);<br>sb.Append(&quot;engineer&quot;);<br>string s = sb.ToString();</pre><p>Son satırda StringBuilder objesini ToString() ile string’e çevirerek memory’de yalnızca bir defa string oluşturmuş oluruz. Bir döngü içerisinde stringlerle ilgili birleştirme işlemi yapılacaksa StringBuilder kullanımı oldukça önem kazanıyor, unutulmaması adına bir kez daha belirtmiş olayım.</p><h4>String Bölme İşlemleri (Split Kullanımı ile İlgili Ufak Bir İpucu)</h4><p>Elimizde belli bir karaktere göre ayırmamız gereken bir string olduğunda sıkça kullandığımız bir methoddur Split() methodu. Genellikle aşağıdaki şekilde kullanılır;</p><pre>string str = &quot;Ceyhun-Cozvelioglu&quot;;<br> string[] temp1 = str.Split(&#39;-&#39;);</pre><p>Split işlemini aşağıdaki şekilde uyguladığımızda biraz daha performanslı bir sonuç elde ederiz;</p><pre>string str = &quot;Ceyhun-Cozvelioglu&quot;;<br> string[] temp = str.Split(new char[] { &#39;-&#39; });</pre><p><strong>ÖNEMLİ: </strong>Bu yöntem anlamlı bir performans kazancı <strong>sağlamamaktadır</strong>. Hatta string içerisindeki ayırıcı karakter sayısı arttıkça birbirine yakın sonuçlar elde edilmektedir. Yine de yazıya konu etmeden geçmek istemediğim için bir köşede bulunması amacıyla ele almış bulundum. Performans bazen çok kritik bir önem teşkil etse de büyük ve kalabalık ekiplerin üzerinde çalıştığı projelerde kodun okunabilir olması yerine göre çok daha fazla önem arz ediyor. Bu durumlarda anlamlı bir performans kazancı olmadığı sürece böyle bir yöntemin kullanılması kod okunabilirliğini olumsuz etkileyebileceğinden seçim yaparken bu faktörlerin de göz ardı edilmemesi gerekiyor.</p><h4>String Equals ile İlgili Ufak Bir Detay</h4><p>İki string tipindeki veriyi karşılaştırmak istediğimizde, imdadımıza yetişen bir methoddur Equals methodu. Aşağıdaki gibi bir kullanımda true return edecek ve if bloğunun içerisine girerek akıştaki kodumuzu işletecektir.</p><pre>string str = &quot;Ceyhun&quot;;</pre><pre>if(str.Equals(&quot;Ceyhun&quot;))<br>    ...</pre><p>Peki ya veritabanından veya servisten çekeceğimiz bir string değeri bir başka değerle kıyaslayacağımız zaman null gelmesi durumunda Equals methodumuz nasıl bir davranış gösterir?</p><pre>try {  <br>    string str = null;  <br>    if (str.Equals(&quot;Ceyhun&quot;)) {  <br>        Console.WriteLine(&quot;if&quot;);  <br>    } else {  <br>        Console.WriteLine(&quot;else&quot;);  <br>    }  <br>} catch (Exception ex) {  <br>    Console.WriteLine(ex.Message);  <br>}  <br>Console.ReadLine();</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/0*glJijQ-J0Su_YjmO.png" /><figcaption>Output Görüntüsü</figcaption></figure><p>str değişkenimiz null olduğu için exception fırlatılacak ve programımız crash olacaktır. Bu sebeple karşılaştırma için kullanacağımız string değişkenini null kontrolünden sonra kullanmamız daha güvenli olacaktır.</p><p>Peki aşağıdaki gibi bir durumda nasıl bir çıktıyla karşılaşırız?</p><pre>try {  <br>    string str = null;  <br>    if (&quot;Ceyhun&quot;.Equals(str)) {  <br>        Console.WriteLine(&quot;if&quot;);  <br>    } else {  <br>        Console.WriteLine(&quot;else&quot;);  <br>    }  <br>} catch (Exception ex) {  <br>    Console.WriteLine(ex.Message);  <br>}  <br>Console.ReadLine();</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/0*drrnVkSQW2F4-EtZ.png" /><figcaption>Output Görüntüsü</figcaption></figure><p>Equals metodunu kullanacağımız string null değilse eğer içerisine argüman olarak gönderdiğimiz string değer null olsa bile karşılaştırma işlemi sorunsuz bir şekilde yapılacaktır.</p><p>Özetle, string bir referans type olduğu için null değer alabilir. Bu sebeple String sınıfına ait bir methodu kullanmadan önce, string için bir null kontrolü yapmak ve null değilse işleme devam etmek programın stabilitesi açısından faydalı olacaktır.</p><p>Yukarıdaki duruma bir örnek de .ToString() methodu ile Convert.ToString() methodu arasındaki farkı verebiliriz.</p><h4>.ToString() ile Convert.ToString() Arasındaki Fark</h4><p>İki method da string’e dönüştürme işlemi için kullanılır ancak aralarında ufak bir fark mevcuttur. Eğer dönüşüm yapılacak obje değeri null ise .ToString() ile yapılan dönüştürme işleminde “NULL Reference Exception” fırlatılırken, Convert.ToString() ile yapılan dönüşümde exception fırlatılmaz.</p><pre>//Null reference exception fırlatılacaktır. <br>object obj = null;  <br>string  str = obj.ToString();  <br>  <br>//str stringinin değeri null olacaktır. Exception fırlatılmaz.<br>object obj = null;  <br>string str = Convert.ToString(obj);</pre><p><strong>Özet Olarak</strong></p><ul><li>Stringler .NET Framework içerisinde immutable olarak tanımlanmıştır.</li><li>Stringler ile yapılan birleştirme işlemlerinde StringBuilder kullanımı performans açısından önemlidir.</li><li>Stringlerin NULL kontrolü yapıldıktan sonra işlemlere tabi tutulması güzel bir kazanım olacaktır.</li><li>Bir objeyi string’e dönüştürmek için Convert.ToString() methodunu kullanmak best practice’tir.</li></ul><p>Bu yazımda string’ler hakkında bazı ufak ancak gözden kaçtığı taktirde can sıkabilecek detayları inceledik. String’leri benzine benzetiyorum zaman zaman, herkesin kullanmak durumunda olduğu ancak maliyeti yüksek bir yapı, neyse ki yazılımda maliyeti düşürmenin yolları mevcut :)</p><p>Herkese iyi günler, keyifli kodlamalar dilerim :)!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=755822d34add" width="1" height="1" alt=""><hr><p><a href="https://medium.com/software-development-turkey/string-i%CC%87%C5%9Flemleri-ile-i%CC%87lgili-baz%C4%B1-detaylar-755822d34add">String İşlemleri ile İlgili Bazı Detaylar</a> was originally published in <a href="https://medium.com/software-development-turkey">SDTR</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Basit Olmasına Rağmen Kolayca Unutulabilen Bazı Teknik Kavramlar]]></title>
            <link>https://medium.com/software-development-turkey/basit-olmas%C4%B1na-ra%C4%9Fmen-kolayca-unutulabilen-baz%C4%B1-teknik-kavramlar-78d3608fcc63?source=rss-a3be8d6885b9------2</link>
            <guid isPermaLink="false">https://medium.com/p/78d3608fcc63</guid>
            <category><![CDATA[parametre]]></category>
            <category><![CDATA[method-imzası]]></category>
            <category><![CDATA[derleyici]]></category>
            <category><![CDATA[ide]]></category>
            <category><![CDATA[argüman]]></category>
            <dc:creator><![CDATA[Ceyhun Çözvelioğlu]]></dc:creator>
            <pubDate>Mon, 24 Jun 2019 06:15:24 GMT</pubDate>
            <atom:updated>2019-06-24T06:15:24.118Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*opeXmRmh0MYRrgwBSriaHg.jpeg" /></figure><p>Bu yazımda teknik sohbetlerde ve sorularda yer alan fakat zaman zaman kolayca karıştırılabilen, unutulmaya yüz tutmuş temel bazı kavramları işledim. Derli toplu bir şekilde bir köşede durmasının faydalı olacağını düşünüyorum. Sözü fazla uzatmadan kavramlara geçelim :)</p><h3>Method İmzası (Method Signature) Nedir?</h3><p>Method imzası; methodun ismini ve aldığı parametrelerin tipleriyle birlikte sayısını belirten bir kavramdır. Unutulmaması gereken durum, method imzasına <strong>dönüş tipinin dahil olmadığıdır</strong>.</p><p>Örnek:</p><pre>int Carp(int sayi1, int sayi2);</pre><pre>int Carp(int sayi1, int sayi2, int sayi3);</pre><p>Yukarıdaki ilk Carp methodunun imzası<strong> Carp(int,int)</strong> şeklindeyken ikinci Carp methodunun imzası <strong>Carp(int,int,int)</strong> şeklindedir.</p><p><strong>Ufak bir not:</strong> Method imzası kavramı özellikle <em>Method Overload</em> konusunda karşımıza çıkmaktadır.</p><h3>Parametre ve Argüman Nedir? Farkları Nelerdir?</h3><p><strong>Parametre</strong>, bir method tanımlanırken methodda input olarak kullanılacak değişkenleri belirttiğimiz kavramdır. Örnek:</p><pre>int Topla(int x, int y)  //int x ve int y Topla methodunun parametreleridir<br>{<br>     return (x + y);<br>}</pre><p><strong>Argüman</strong> ise method çağrılırken methoda gönderdiğimiz değişkenlerdir.</p><p>Örnek:</p><pre>int sonuc = Topla(5 , 14);  //5 ve 14 değişkenleri Topla methoduna input olarak gönderilen argümanlardır</pre><h3>Derleyici (Compiler) ve IDE (Integrated Development Environment) Nedir?</h3><p>Yazılımlar genellikle yüksek seviye bir programlama dili (Örneğin C#, Java vs. gibi) ile yazılır. Herhangi bir programlama dili ile yazılmış kodu makine koduna çeviren araca <strong>Derleyici</strong> denilmektedir. Derleyicilere örnek olarak <strong><em>GCC, G++</em></strong><em> </em>verilebilir.</p><p><strong>IDE</strong> ise, içerisinde derleyiciyi de barındıran bunun yanında kod yazmayı kolaylaştıran syntax highlighter, otomatik tamamlama, debug araçları gibi yazılım geliştirmeyi kolaylaştıcı pek çok aracı ihtiva eden tümleşik bir geliştirme aracıdır. IDE’ye örnek olarak<strong><em> Visual Studio, Eclipse, Netbeans</em></strong> verilebilir.</p><p>Oldukça basit, temel birkaç kavramı hızlıca ele aldığım bir yazının daha sonuna geldik. Sizin de eklemek istediğiniz kavramlar varsa yorumlarda lütfen buluşalım. Herkese iyi günler, keyifli kodlamalar :)!</p><p>Bu yazı ilk olarak <a href="http://cozvelioglu.com/basit-olmasina-ragmen-kolayca-unutulabilen-bazi-teknik-kavramlar/">http://cozvelioglu.com/basit-olmasina-ragmen-kolayca-unutulabilen-bazi-teknik-kavramlar/</a> adresinde kendi blogumda yayınlanmıştır.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=78d3608fcc63" width="1" height="1" alt=""><hr><p><a href="https://medium.com/software-development-turkey/basit-olmas%C4%B1na-ra%C4%9Fmen-kolayca-unutulabilen-baz%C4%B1-teknik-kavramlar-78d3608fcc63">Basit Olmasına Rağmen Kolayca Unutulabilen Bazı Teknik Kavramlar</a> was originally published in <a href="https://medium.com/software-development-turkey">SDTR</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[İyi Bir Commit/Check-In Mesajı Nasıl Olmalı?]]></title>
            <link>https://medium.com/software-development-turkey/i%CC%87yi-bir-commit-check-in-mesaj%C4%B1-nas%C4%B1l-olmal%C4%B1-d3cb60e58fb5?source=rss-a3be8d6885b9------2</link>
            <guid isPermaLink="false">https://medium.com/p/d3cb60e58fb5</guid>
            <category><![CDATA[olmalı]]></category>
            <category><![CDATA[check-in]]></category>
            <category><![CDATA[mesajı]]></category>
            <category><![CDATA[nasıl]]></category>
            <category><![CDATA[commit]]></category>
            <dc:creator><![CDATA[Ceyhun Çözvelioğlu]]></dc:creator>
            <pubDate>Tue, 14 May 2019 21:12:08 GMT</pubDate>
            <atom:updated>2021-03-28T15:26:50.735Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TAc8j-rVmn2VAWBoMYxNSg.jpeg" /></figure><p>Versiyon kontrol sistemleri kalabalık ekiplerin, büyük projelerin hatta tek başına yazılım geliştiren yazılımcıların bile olmazsa olmaz bir araç çantası. Versiyonlar arasındaki farkları üstünden ne kadar zaman geçerse geçsin, kodlardaki değişen kısımlara bakmadan bir bakışta anlayabilmenin yolu ise iyi yazılmış commit/check-in mesajlarından geçiyor. Kalabalık ekiplerin çalıştığı büyük projelerde commit veya Visual Studio ile TFS’i entegre olarak kullanan ekipler için diğer adıyla check-in mesajları oldukça büyük önem arz ediyor. Geliştirme yapacağınız ekranın geçmişine göz atarken yalnızca mesaj içeriğinden bir şeyleri anlamak inanılmaz zaman kazandırıyor ve verimi artırıyor. Bunun dışında standartlara bağlı kalarak ilerlenen her şeyde olduğu gibi daha derli toplu bir proje ilerleyişini de beraberinde getiriyor.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*lrSKOS6PBGCXuh90j94sPA.png" /><figcaption>Credit: <a href="https://hikaruzone.wordpress.com/2015/10/06/in-case-of-fire-1-git-commit-2-git-push-3-leave-building/">https://hikaruzone.wordpress.com/2015/10/06/in-case-of-fire-1-git-commit-2-git-push-3-leave-building/</a></figcaption></figure><p>Oldukça ufak ve az sayıdaki bazı kurallara uyarak, çok daha temiz, anlaşılabilir commit/check-in mesajları yazmak mümkün. Sözü fazla uzatmadan, yazılım camiasında kabul görmüş genel geçer kurallara geçelim.</p><h4>Konu satırı 50 karakter ile özet bir bilgi içermeli</h4><p>Konu satırı commit/check-in’inizin dergi kapağı görevini gören kısımdır. Okunabilirlik açısından 50 karakter ile sınırlandırmak kabul görmüş bir konu.</p><p><strong><em>Not</em></strong>: Özetleme konusunda sıkıntı yaşıyorsanız muhtemelen tek seferde çok fazla değişiklik yaptığınız anlamını taşıyor. Bu da versiyon kontrolü için bazı problemli durumlar oluşturması oldukça muhtemel. Bu konuya daha sonra değinmek adına, şimdilik bu kısım için şunu söyleyebiliriz “<strong><em>Yaptığınız değişiklikleri kısa bir özet ile açıklayamıyorsanız, muhtemelen commitiniz/check-ininiz gereğinden fazla yük ile yüklenmiş durumda</em></strong>”</p><h4>Konu satırı büyük harfle başlamalı</h4><p>Oldukça basit bir kural daha. Yazacağınız mesajın ilk harfi büyük harfle başlamalı.</p><h4>Konu satırı nokta ile bitmemeli</h4><p>Türkçe hocalarımız görse eminim içleri kan ağlardı ama üzgünüm, bu konuda fikir birliğine varılmış bir kural olarak karşımıza çıkıyor. Mesajınızın sonuna alışması biraz zor ve tuhaf gelse dahi nokta koymamalısınız.</p><h4>Yazacağınız mesajda emir ifadeleri veya daha genel bir ifadeyle formal bir dil kullanın</h4><p>Bu kural için örnekleri incelememiz yeterince açıklayıcı olacaktır.</p><p><a href="https://github.com/git/git/tree/master/contrib">Git</a>’in kullandığı örnek birkaç commit mesajını inceleyelim</p><ul><li>Remove contrib/examples/* (Doğru)</li><li>Add sample commands for git-shell (Doğru)</li><li>Merge branch ‘jc/bs-t-is-not-a-tab-for-sed’ (Doğru)</li></ul><p>Bu şekilde yazmak, eğer böyle yazmıyorsanız ilk başlarda biraz tuhaf gelecektir.</p><p>Pek çok yazılım geliştirici yaptıklarını geçmiş zaman kipiyle açıklamayı tercih eder. Bu nedenle commit/check-in mesajları genellikle aşağıdakine benzer bir yapıda oluyor</p><ul><li>Xyz bug fixed (Yanlış)</li><li>Login form created (Yanlış)</li></ul><p>Bunun haricinde bazı mesajlar da açıklama yapıyor-muş gibi göründüğü halde aslında üstünden zaman geçtikten sonra neyi düzelttiği/geliştirdiği hakkında en ufak bilgi vermeyen mesajlar olarak görünür</p><ul><li>Some bugs fixed (Yanlış)</li><li>Add new class (Yanlış)</li><li>Added new object for (Yanlış)</li></ul><p>Commit mesajlarının yapısı için oldukça basit bir formül var. Düzgün bir şekilde oluşturulmuş bir mesaj aşağıdaki cümlede altı çizili olan yeri tamamlayabilmelidir.</p><ul><li>If applied, this commit will <strong>your subject line here</strong></li></ul><p>Örneğin;</p><ul><li>If applied, this commit will <strong>remove deprecated methods</strong></li><li>If applied, this commit will <strong>release version 1.0.0</strong></li></ul><p>Bu yapı için geçmiş zaman ifadesi içeren mesajların uymadığını görmek çok kolay. “Eğer uygulanırsa bu commit 1.0.0 versiyonunu yayınlar” gibi yazdığımız commit/check-in mesajlarıyla aslında bir taahhütte bulunuyoruz. Bu yüzden formal bir dil kullanmamız çok daha anlamlı ve kabul görmüş bir kural olarak karşımıza çıkıyor.</p><p>İyi bir commit/check-in mesajının nasıl olacağına dair basit birkaç kuralı ele aldığımız bir yazının daha sonuna geldik. Umarım faydalı olmuştur. Herkese keyifli kodlamalar dilerim :)!</p><p><strong>KAYNAKLAR</strong></p><ol><li><a href="https://chris.beams.io/posts/git-commit/#limit-50">https://chris.beams.io/posts/git-commit/#limit-50</a></li><li><a href="https://www.freshconsulting.com/atomic-commits/">https://www.freshconsulting.com/atomic-commits/</a></li></ol><p>Bu yazı ilk olarak <a href="http://cozvelioglu.com/iyi-bir-commit-check-in-mesaji-nasil-olmali/">http://cozvelioglu.com/iyi-bir-commit-check-in-mesaji-nasil-olmali/</a> blogumda yayınlanmıştır.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d3cb60e58fb5" width="1" height="1" alt=""><hr><p><a href="https://medium.com/software-development-turkey/i%CC%87yi-bir-commit-check-in-mesaj%C4%B1-nas%C4%B1l-olmal%C4%B1-d3cb60e58fb5">İyi Bir Commit/Check-In Mesajı Nasıl Olmalı?</a> was originally published in <a href="https://medium.com/software-development-turkey">SDTR</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Abstract Class ve Interface Arasındaki Farklar Nelerdir?]]></title>
            <link>https://medium.com/software-development-turkey/abstract-class-ve-interface-aras%C4%B1ndaki-farklar-nelerdir-3c0a4f956eba?source=rss-a3be8d6885b9------2</link>
            <guid isPermaLink="false">https://medium.com/p/3c0a4f956eba</guid>
            <category><![CDATA[abstract]]></category>
            <category><![CDATA[nedir]]></category>
            <category><![CDATA[farklar]]></category>
            <category><![CDATA[interfaces]]></category>
            <category><![CDATA[class]]></category>
            <dc:creator><![CDATA[Ceyhun Çözvelioğlu]]></dc:creator>
            <pubDate>Sun, 24 Feb 2019 12:48:17 GMT</pubDate>
            <atom:updated>2021-03-28T15:25:06.212Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tP4StC4LLSR8xmIkdPFcfA.jpeg" /></figure><p>Yazılıma yeni başlayan hemen herkesin zaman zaman karıştırdığı, hangisini ne zaman kullanacağına karar veremediği <strong>Abstract Class</strong> ve <strong>Interface </strong>ikilisini ele almak istedim. İlk bakışta yazdığımız koda oldukça benzer yetenekler kazandırdıkları görünse de aralarındaki farkların üzerinde durarak hangi senaryolarda hangisine karar vermemiz gerektiğini iyice açığa çıkartacağız 🙂</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/414/1*lh1oBr4AU3F1KchdOyiWOQ.png" /><figcaption><em>© agile-code.com</em></figcaption></figure><p>Abstract sınıflara geçmeden önce C# ve tüm Object Oriented dillerin bize sunduğu bir özellik olan abstraction(soyutlama) kavramını ele alalım. Böylece Abstract sınıflara ve Interface’lere neden ihtiyaç duyduğumuzu daha net bir şekilde anlayabiliriz.</p><h3>Abstraction (Soyutlama) Nedir?</h3><p>Abstraction, OOP (Object Oriented Programming-Nesne Tabanlı Programlama) içerisindeki önemli kavramlardan birisidir. C#’taki soyutlama; diğer Object Oriented dillerde olduğu gibi iç detayları gizleyerek sadece işlevleri göstermeye denir. Bu durumu gerçek hayatın içerisinden bir senaryo ile örneklendirelim.</p><p><strong><em>Senaryo</em></strong>: Bir gün canınız sıkıldı ve çocukluğunuzda kalmış tatlı bir aktivite olan lunaparka gidip çarpışan arabaya binmek istediniz. Biletinizi aldınız ve seçtiğiniz arabaya oturup size gelen görevliye bileti teslim ettiniz. Görevli alana baktı ve araçları hareket ettirecek olan elektriği vermek için yeterli sayıda kişinin olduğuna karar verip bir düğmeye bastı. Görevlinin düğmeye basmasıyla çarpışan arabaların hareket etmesi için gerekli olan elektrik akımı verildi ve arabanız çalışır hale geldi. Direksiyonu, gaz pedalını ve freni kullanarak dilediğiniz şekilde aracı kullanmaya başladınız.</p><p>Şimdi gelin bu gerçek hayatın birebir içinden olan senaryodaki soyutlamaları (abstractions) inceleyelim. Böylece yazılım alanında da aslında aynı mantığın kullanıldığını ve soyutlamanın hayatımızı nasıl kolaylaştırdığını daha iyi anlamış olacağız.</p><p><strong><em>Senaryoda Yer Alan Soyutlamalar(Abstractions)</em></strong><em>: </em>İlk soyutlama örneğimiz biletinizi teslim ettiğiniz görevlinin eğlenceyi başlatmak için bastığı küçük kırmızı düğme 🙂 Görevli o kırmızı düğmeye bastığında bizler sadece eğlencenin başlayacağını biliyoruz, görevli de on dakikalık bir seansa daha start vereceğini biliyor yalnızca. Düğmeye basıldığı anda elektrik devresindeki anahtarın kapanıp akımın başlayacağını ne biz ne de görevli aklının ucundan dahi geçirmiyor. İşte bu tam bir soyutlama örneği. Yalnızca input(düğmeye basmak) ve output(eğlencenin başlaması) değerleriyle ilgileniyoruz. Arka tarafta dönen teknik hadiseleri hiç düşünmeden bize sunulmuş bir düğmeyi kullanarak işimizi görüyoruz.</p><p>Eğer hala bir şeyler oturmadıysa kafanızda bir de çarpışan arabamızdaki soyutlamaya bakalım. Siz arabayı kullanırken direksiyonu gitmek istediğiniz yöne çeviriyor, gaz pedalına basarak ilerliyorsunuz. Gaz pedalına bastığınızdaki motorda oluşan tetiklenmeleri, direksiyonu çevirdiğinizde lastiklerin dönmesini sağlayan mekanizmayı hiç düşünmeden yalnızca iki pedal bir direksiyonla aslında arka planında onlarca aksiyon yatan bir işlevi gerçekleştirmiş oluyorsunuz. Input (gaz/fren pedalları, direksiyon) ve output (arabanın gitmesi) değerlerini bilmek size yetiyor.</p><p>Object Oriented programlamada sınıfların soyutlanmasını ise Abstract Class ve Interface ikilisi sağlamaktadır. Abstraction kavramı kafamızda biraz olsun şekillendiğine göre şimdi Abstract Class’ları inceleyebiliriz.</p><h3>Abstract Class</h3><p>Abstract sınıflar sınıf hiyerarşisinde genellikle base class (temel sınıf) tanımlamak için kullanılan ve soyutlama yeteneği kazandıran sınıflardır. Bir sınıfı abstract yapmak için <strong>abstract </strong>keywordünü kullanırız. Abstract sınıflar en az bir tane abstract metod bulundurması bir best practice’tir.</p><pre>abstract class Yazdir</pre><pre>{</pre><pre>     public abstract void KonsolaYazdir();</pre><pre>}</pre><p>Yukarıda Yazdir isimli basitçe bir abstract sınıfı tanımladık ve kendisinden türeyecek metodların override edeceği KonsolaYazdir() abstract metodunu oluşturduk.</p><p>Genel olarak abstract sınıfların özelliklerini bir araya toplarsak;</p><ul><li>Abstract sınıfları genel olarak inheritance (kalıtım) uygularken kullanırız.</li><li><strong>new </strong>anahtar sözcüğü ile nesneleri <strong>oluşturulamaz</strong>.</li><li>İçerisinde değişken ve metod <strong>bulundurabilir</strong>.</li><li>Abstract sınıflardan türetilen sınıfların abstract metodları implement etmesi <strong>zorunludur</strong>. Diğer metodları override etmeden de kullanabilir.</li><li>Constructors (yapıcı metodlar) ve destructors (yıkıcı metodlar) <strong>bulundurabilirler</strong>.</li><li>Static <strong>tanımlanamazlar</strong>. ( Tanımlanmaya çalışılırsa compiler “<em>an abstract class cannot be sealed or static</em>” hatası verir)</li><li>Bir sınıf yalnızca bir abstract sınıfı inheritance yoluyla implement edebilir. Çoklu kalıtım (multiple inheritance) <strong>desteklenmez</strong>.</li><li>Abstract olmayan metodları da <strong>bulundurabilir</strong>.</li><li>Kendisinden inherit alacak sınıflar ile arasında “<strong>is-a</strong>” ilişkisi vardır. (Burası ilk başlarda çok önemsenmeyen ancak hangi senaryoda Abstract hangi senaryoda Interface kullanacağımızı netleştirmede bize oldukça yardımcı olan bir detaydır, hemen aşağıda açıklamasını bulabilirsiniz)</li></ul><p><strong>Is-a İlişkisi Nedir?</strong></p><p>Senaryomuzdan bir örnekle bunun daha iyi anlaşılabileceğini düşünüyorum. (<em>Şimdiye kadar Türkçe kelimeler üzerinden gittiğim için örneğimde de is-a ilişkisi hariç cümlemi Türkçe kuruyorum</em>)</p><pre><em>Çarpışan araba </em><strong><em>is-a</em></strong><em> araba.</em></pre><p>Yani en nihayetinde çarpışan araba da bir arabadır ve arabanın sahip olduğu özellikleri bünyesinde barındırır.</p><p>Şimdi Araba için abstract bir sınıf oluşturup çarpışan arabayı da bu sınıftan inherit alarak oluşturalım.</p><pre>abstract class Araba</pre><pre>{</pre><pre>    //Arabalarin ortak ozelliklerini burada tanimliyoruz</pre><pre>    public string Marka { get; set; }</pre><pre>    public int MaksimumHiz { get; set; }</pre><pre>    public string Tur { get; set; }</pre><pre>//Her araba icin yolculuga baslandi bilgisini farkli bir sekilde</pre><pre>//ekrana yazdirmak icin override  dilecek abstract metodumuzu yaziyoruz</pre><pre>    public abstract void YolculugaBasla();<br>}</pre><pre>class CarpisanAraba : Araba</pre><pre>{</pre><pre>    //Abstract metodumuzu carpisan arabaya ozel bir sekilde override      ediyoruz.</pre><pre>    public override void YolculugaBasla()</pre><pre>    {</pre><pre>        Console.WriteLine(&quot;Carpisan araba ile yolculuga baslandi&quot;);</pre><pre>    }<br>}</pre><p>Araba isminde bir abstract sınıf tanımlayarak CarpisanAraba sınıfını bu abstract base sınıftan türettik. Böylece Araba sınıfında yer alan tüm özellikleri tekrardan yazmak zorunda kalmadan kolayca sahip olurken, YolculugaBasla() metodunu sınıfımıza özel override ettik. Abstract sınıfları inherit alan sınıfların abstract metodları override etmesinin zorunlu olduğunu belirtmiştik. Bu sebeple Visual Studio’da CarpisanAraba sınıfını Araba sınıfından inherit ettiğinizde, YolculugaBasla() metodunu override etmezseniz hata alırsınız.</p><p>Abstract sınıfları genel itibariyle mercek altına aldığımıza göre şimdi bir de Interface’leri inceleyelim. Sonrasında ikisi arasındaki farkları tablo halinde gördüğümüzde hangi senaryoda hangi soyutlama mekanizmasını kullanacağımızı çok daha iyi kestirebilir bir hale geleceğiz.</p><h3>Interface</h3><p>Interface, içerisinde sadece kendisinden türeyecek olan sınıfların içini dolduracağı metod tanımlarının bulunduğu ve soyutlama yapmamıza olanak sağlayan bir yapıdır. Interface’leri tanımlarken <strong>interface </strong>keywordünü kullanırız. Tanımladığımız yapının interface olduğunu belirtmek için isminin önüne I harfini getirmek bir best-practice olacaktır. Böylece kodlama yaparken inherit aldığımız yapının bir class mı yoksa interface mi olduğunu kolaylıkla ayırt edebiliriz. Bu kadar teorik bilgiden sonra basitçe bir interface tanımlayalım.</p><pre>interface ILog</pre><pre>{</pre><pre>    void LogEkle(string kayit);</pre><pre>}</pre><p>Bu interface’ten türeyen tüm sınıflar LogEkle(string kayit) metodunu implement etmek zorundadır. Interface hakkında internette bir arama yaptığınızda genellikle kendisini inherit alan sınıflar için bir kontrat olduğundan bahsedilir. Kontrat kelimesiyle anlatılmak istenen tam olarak budur. Türeyen sınıflar, interface’in içerisinde yer alan tüm metodları implement edeceğine dair bir söz vermekte, sözleşme yapmaktadır. Aksi halde derleyici hata verecek, kodunuz çalışmayacaktır.</p><p>Genel olarak Interface’lerin özelliklerinden bahsetmemiz gerekirse;</p><ul><li><strong>new </strong>keywordü ile nesneleri <strong>oluşturulamaz</strong>.</li><li>Bir sınıfın ne yapması gerektiğini belirtir, nasıl yapması gerektiğini değil.</li><li>Default olarak tüm Interface üyeleri <strong>abstract </strong>ve <strong>public </strong>olarak tanımlanır. Sizin özellikle belirtmeniz gerekmez.</li><li>Bir sınıf birden fazla interface’i inherit <strong>edebilir</strong>, çoklu kalıtım (multiple-inheritance) <strong>desteklenir</strong>.</li><li>İçerisinde yalnızca metodların imzaları yer alır, içi dolu metod bulunduramazlar.</li><li>Kendisinden inherit alacak sınıflar ile arasında “<strong>can-do</strong>” ilişkisi vardır.</li></ul><p><strong>Can-do İlişkisi Nedir?</strong></p><p>Çarpışan araba senaryosundan bir örnekle açıklamak gerekirse,</p><pre><em>Çarpışan araba </em><strong><em>can-do</em></strong><em> hızlanmak</em>. </pre><p>Açıklamaya gerek var mı bilemedim açıkçası ama abstract sınıflarda açıklamışken burada boş bırakmak içime sinmezdi. Çarpışan araba hızlanabilir diyoruz. Çarpışan arabanın bir davranışından bahsediyoruz.</p><p>Interfaceleri tam olarak can-do ilişkileri içeren yapılarda kullanmamız isabetli olacaktır. Senaryomuzdaki çarpışan araba hızlanabilir. Bu çarpışan arabanın yapabileceği bir kabiliyetigöstermektedir. Can-do ilişkisi <strong>davranışları</strong>, <strong>kabiliyetleri </strong>belirtir. Bu kabiliyetin interface içerisinde tanımlanması çok daha doğru olacaktır.</p><h3><strong>Abstract Class ve Interface Arasındaki Farklar</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/661/1*vmQhGSTGAeIIsCX0jEPUqg.jpeg" /><figcaption>Tablonun orjinaline blog sayfamdan; cozvelioglu.com adresinden ulaşabilirsiniz</figcaption></figure><p>Abstract sınıflar ve Interface’ler arasındaki farkları işlediğimiz bu yazıyla birlikte bir yazının daha sonuna geldik. Dilerim aydınlatıcı olmuştur, anlayamadığınız veya gözümden kaçan herhangi bir şey varsa yorumlarda belirtmeniz beni memnun edecektir. Bir sonraki yazıda görüşmek dileğiyle; keyifli kodlamalar, mutlu günler :)!</p><p><strong>KAYNAKLAR</strong></p><ol><li><a href="https://www.geeksforgeeks.org/difference-between-abstract-class-and-interface-in-c-sharp/">https://www.geeksforgeeks.org/difference-between-abstract-class-and-interface-in-c-sharp/</a></li><li><a href="https://www.agile-code.com/blog/difference-between-interfaces-and-abstract-classes-in-microsoft-net/">https://www.agile-code.com/blog/difference-between-interfaces-and-abstract-classes-in-microsoft-net/</a></li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3c0a4f956eba" width="1" height="1" alt=""><hr><p><a href="https://medium.com/software-development-turkey/abstract-class-ve-interface-aras%C4%B1ndaki-farklar-nelerdir-3c0a4f956eba">Abstract Class ve Interface Arasındaki Farklar Nelerdir?</a> was originally published in <a href="https://medium.com/software-development-turkey">SDTR</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Neden/Nasıl Yazmaya Başladım?]]></title>
            <link>https://medium.com/software-development-turkey/neden-nas%C4%B1l-yazmaya-ba%C5%9Flad%C4%B1m-339cab76f401?source=rss-a3be8d6885b9------2</link>
            <guid isPermaLink="false">https://medium.com/p/339cab76f401</guid>
            <category><![CDATA[nasıl]]></category>
            <category><![CDATA[yazmaya]]></category>
            <category><![CDATA[ceyhun]]></category>
            <category><![CDATA[neden]]></category>
            <category><![CDATA[başladım]]></category>
            <dc:creator><![CDATA[Ceyhun Çözvelioğlu]]></dc:creator>
            <pubDate>Sun, 24 Feb 2019 12:22:48 GMT</pubDate>
            <atom:updated>2019-02-24T17:04:36.621Z</atom:updated>
            <content:encoded><![CDATA[<blockquote>“Söz vermiştim kendi kendime: yazı bile yazmayacaktım. Yazı yazmak da hırstan başka ne idi? Burada namuslu insanlar arasında sakin ölümü bekleyecektim. Hırs hiddet neme gerekti? Yapamadım. Koştum tütüncüye, kağıt kalem aldım, oturdum. Ada’nın tenha yollarında gezerken canım sıkılırsa küçük değnekler yontmak için cebimde taşıdığım çakımı çıkardım. Kalemi yonttum. Yonttuktan sonra tuttum öptüm. Yazmasam deli olacaktım.</blockquote><blockquote>– Sait Faik Abasıyanık/Haritada Bir Nokta</blockquote><p>Sait Faik’in dediği gibi oluyormuş aslında her şey.. Bir gün tak ediyormuş insanın canına yazmamak/yazamamak. Benim hikayemse aslında yazmak isteyen herkes ile benzer, benim içinse farklıydı. Bu yüzden, öncelikle neden ve nasıl yazmaya karar verdiğimi yazarak başlamak istedim.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/1*TXsYnQIPlCZGic4Jyw4zRw.jpeg" /></figure><p>Uzun zamandır aklımda olan bir şeydi yazmak, sadece bir türlü ilk kıvılcımı çakamıyor, her gün saatlerce bilgisayar karşısında vakit geçirmeme rağmen sanki yazı yazacağım zaman bambaşka bir şeyle uğraşacakmışım gibi bir düşünceye kapılıyordum sanırım. Bu hissi açıklayabilmek de oldukça güç aslında. ‘<em>Bir gün yazmaya başlayacağım‘</em> ümidiyle bugünü yarına, yarını diğer yarınlara devrederek kendimi kandırıyordum. Birkaç kez <a href="https://medium.com/@ceyhuncozveli">Medium’da</a> kendimce paylaşımlarda bulunmuş fakat devamını bir türlü getirememiştim. Bir şeyler yapmak istiyordum, nedense üstümdeki ölü toprağını atamıyordum. Sonunda bir gün bu harekete geçememe nedenlerimi kendimce sorguladım ve benim gibi yazmak isteyip de bir türlü başlayamayanlara en azından kendilerini sorgulayabilmesi açısından veri seti olabilecek aşağıdaki sebepleri buldum (<em>Sebepleri tek tek nasıl ele aldığımı da yazının ilerleyen kısımlarında bulacaksınız</em>)</p><ol><li><strong>Motivasyonum eksikti</strong>. Motivasyon her iş için kilit rol oynuyor. Özellikle tamamen kuralları sizin belirlediğiniz üretim alanlarında zorunluluğunuz da yoksa konfor alanınızı terk etmek başlarda gerçekten çok zor gelebiliyor.</li><li><strong>Bana sağlayabileceği katkılar hakkında pek düşünmemiştim</strong>. Her şeyi bir kenara bırakırsak sadece yazı yazmanın bana katacağı çok şey vardı aslında.</li><li><strong>Planlama yapmamıştım</strong>. Belgesellere, filmlere, dizilere konu olan o meşhur <em>İlham Perisi</em>‘ni bekliyordum yazmak için. Oturup hiç bu işi plana dökmemiş; kendimce zorunluluklar, kısıtlar belirlememiştim.</li><li><strong>Kendim çalıyor, kendim oynuyordum</strong>. Yazdığım yazıları paylaşmaktan nedense çekiniyor, mükemmelliyetçi davrandığım için kendi yazdıklarımı iki gün sonra beğenmiyor ‘<em>Ben bile beğenmediysem diğer insanlar neden beğensin ki</em>?’ diye düşünüyordum. Daha önce radyo programları yapmış, müzikle uğraşan birisi olarak sahne alıp şarkılar söylemiştim. Hiçbirisinde bir yazıyı yayına alırken çekindiğim kadar çekindiğimi hatırlamıyorum. Sanırım ilk defa böyle bir konuda hata yapmaktan çok korkuyor, insanların meraklı gözlerinden mümkün olduğunca kaçmak istiyordum.</li><li><strong>Uzunca bir süre Medium mu yoksa Self-hosted blog mu karar veremedim</strong>. Bu kararsızlık tam iki ayımı aldı. Sanki binlerce yazı yazmış biriktirmiş de platform seçme lüksüne sahipmişim gibi arkasına sığındığım bahanelerden birisi de bu olmuştu. (<em>İkisinde de paylaşmak sanki yasakmış gibi</em> 🙂)</li></ol><p>Arkasına sığındığım bahaneleri, o zamanlar gayet haklı bulduğum ama şimdi hepsini birer “Vakit hırsızı” olarak gördüğüm sebeplerin paylaşmaya değer gördüğüm beş tanesini sıraladım. Bu sadece yazı yazmak ile ilgili değil, hayatın her alanında bir şeyi çok isteyip de bir türlü başlayamadığımız ne varsa; arkasına sığındığımız sebeplerin hepsi birer hırsız. Ömrümüzden, vaktimizden çalan geri dönüşü olmayan şekilde bizi tüketen şeyler.</p><h3>BU BAHANELERİ YENMEK ADINA NELER YAPTIM?</h3><p>Bir şeyler okurken maddeler halinde yazılmış yazıların hafızamda daha uzun süre kaldığını farkettim. Hem okurken kolay oluyordu, hem de hatırlarken sanki bir harita gibi gözümün önüne geliyordu. Bu yüzden ben de bu tarz soru-cevap başlıkları altında eğer maddelerle açıklamaya uygun bir içerikten bahsedeceksem, maddeler halinde anlatmayı tercih ediyorum. Herkesi motive eden faktörler değişebilir elbette ancak ben yukarıda bahsettiğim bahaneleri yenmek adına kendimce denediğim ve başarılı olduğumu farkettiğim şeyleri sıralamaya başlıyorum;</p><ol><li><strong>Bol bol blog yazıları okudum</strong>. Bir işe başlayacaksam öncelikle; o iş hakkında benden önce birileri neler yapmış, nasıl yapmış bunlara bakmayı tercih ediyorum. Bu beni motive eden bir şey. Blog yazılarını okudukça içimde ‘<em>Ben de bir an önce başlamalıyım artık</em>‘ hissi oluşuyordu. Bana ilham veren belki de yüzlerce yazı okumuştum. Hem yeni şeyler öğreniyor hem de bir taraftan motivasyonuma katkı sağlıyordum.</li><li><strong>Yazma konusundaki hata yapma korkumu yendim</strong>. Çok klişe olacak belki ama sevdiğim ve yerine tam oturacak bir sözü paylaşayım ‘<em>Başlamak için mükemmel olmak zorunda değilsin, fakat mükemmel olmak için başlamak zorundasın!</em>‘. Hata yapma korkusuyla baş etme yönteminin en güzel özetini bu cümlede buluyordum. Elbette hatalar yapacak, basit veya kötü sayılabilecek içerikler üretecektim. Eyleme geçmeden sürekli söylemlerle hareket ettiğim sürece asla kafamdaki o mükemmel yazılarımı yazamayacağımı farkettim. Bizi biz yapan ve tecrübe dediğimiz şeylerin toplamı aslında çoğunlukla hatalarımız ve onlardan aldığımız dersler değil miydi? Öyleyse hata yapmaktan korkmak; hiç bisiklete binmeden, masmavi denizlerde alabildiğine yüzmeden hayatı terk etmek gibi bir şeydi. Emniyetli fakat adına ne kadar yaşam denebilirse…</li><li><strong>Planlama yaptım</strong>. Kendime göre kıstaslar ve asgari limitler belirledim. Örneğin; her hafta bir konu belirleyip onun hakkında minimum bir yazı yazacağım. Yeni öğrendiğim bir şeyi unutmamak adına en kısa sürede yazıya dökeceğim. Hemen yayınlamasam bile taslak olarak elimin altında bekleteceğim. O konuya dair düşüncelerim olgunlaştığında yazıyı tekrar gözden geçirip gerekli düzenlemeleri yaparak yayına alacağım. İşin planlama aşamasının bile motive kaynağı olduğunu fark ettim.</li><li><strong>Yazmanın bana katacağı şeylere daha fazla odaklandım</strong>. Önceleri sadece yazma isteği vardı içimde. Neden, nasıl, ne sıklıkla gibi soruları sormaktan özenle kaçınıyor gibiydim. Bu soruları sordukça ‘<em>Teknik yazılar yazmanın bana ne gibi faydaları olabilir ki?</em>‘ sorusuna geldi sıra. Benim için en önemlisi; öğrendiğim, paylaşmaya ve yazmaya değer gördüğüm şeyleri kendi sözcüklerimle açıkladığım ve unuttuğumda kolayca geri dönüp bakabileceğim harika bir arşive sahip olacaktım.</li></ol><h3>NE TÜR YAZILAR YAZACAĞIM?</h3><p>Bilgisayar Mühendisi olarak yazılarımın büyük bir bölümünü teknik detaylara, yazılım ile alakalı şeylere ayırmayı planladım. Elbette hatıra olarak kalmasını istediğim, paylaşmaya değer gördüğüm farklı kategorilerde yazılar da yazmayı düşünüyorum ve bu yönde de aklımda bolca fikir var. Bu <a href="http://cozvelioglu.com">blogu </a>oluştururken yazılarımda Bilgisayar Mühendisliği disiplini altında yer alan birçok konuya ufaktan dahi olsa temas edebilmek benim en büyük gayem. Örneğin profesyonel hayatta .NET Teknolojileriyle çalışmama rağmen blogda veri yapılarından algoritmalara, veritabanlarından design patternlara geniş bir yelpazede düzenli bir ilerleyiş planlıyorum.</p><h3>SONUÇ OLARAK</h3><p>Hayatımın farklı dönemlerinde zamanlama olarak düzensiz bir şekilde yazılar yazsam da ilk defa bu kadar kararlı kollarımı sıvadım, kahvemi hazırlayıp oturdum klavye başına. Dilerim yazdıklarım bir kişiye dahi olsa faydası dokunacak şeyler olur. Diğer yazılarda görüşmek dileğiyle :)!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=339cab76f401" width="1" height="1" alt=""><hr><p><a href="https://medium.com/software-development-turkey/neden-nas%C4%B1l-yazmaya-ba%C5%9Flad%C4%B1m-339cab76f401">Neden/Nasıl Yazmaya Başladım?</a> was originally published in <a href="https://medium.com/software-development-turkey">SDTR</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[(Kendime Notlar-1) Veri Yapılarına Giriş ve LinkedList Mantığı]]></title>
            <link>https://ceyhuncozvelioglu.medium.com/kendime-notlar-1-veri-yap%C4%B1lar%C4%B1na-giri%C5%9F-ve-linkedlist-mant%C4%B1%C4%9F%C4%B1-5944bcbb8165?source=rss-a3be8d6885b9------2</link>
            <guid isPermaLink="false">https://medium.com/p/5944bcbb8165</guid>
            <category><![CDATA[linked]]></category>
            <category><![CDATA[yapıları]]></category>
            <category><![CDATA[veri]]></category>
            <category><![CDATA[lists]]></category>
            <category><![CDATA[dizi]]></category>
            <dc:creator><![CDATA[Ceyhun Çözvelioğlu]]></dc:creator>
            <pubDate>Fri, 16 Nov 2018 14:13:22 GMT</pubDate>
            <atom:updated>2018-11-16T20:42:39.591Z</atom:updated>
            <content:encoded><![CDATA[<h3>(Kendime Notlar-1) Veri Yapılarına Giriş ve Linked List Mantığı</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*tP-Tiv2yfAUkDLs-KdIdrA.jpeg" /></figure><p>Herkese merhaba,</p><p>Bir süredir Medium’da bir yazı dizisine başlamak aklımdaydı ancak ne yapacağım konusunda çok da bir fikrim yoktu. Yazmak her şeyden önce bana iyi gelen bir şey olduğu için bir şeyler karalamayı uzun süredir oldukça istiyordum. Nihayetinde düşündüm ki Bilgisayar Mühendisliği’nin en temel alanlarından birisi olan Veri Yapıları’na dair (<em>benim de üniversite döneminde büyük bir keyif aldığım ancak ilk başlarda bir o kadar da bana karmaşık gelen bir konu olmuştu</em>) kendimce notlar oluşturmak ve bunları paylaşmak istedim.</p><p>Hem kendimce bir tekrar yapmış olacağım, hem de kendime ve bir şekilde bu yazılara ulaşan insanlara belki ufak da olsa bir katkı sağlayacağım motivasyonuyla “Veri Yapıları” serimi başlatmış bulunuyorum.</p><p><strong>Unutmadan Gelebilecek Eleştirilere Karşı Ufak Bir Not</strong>: Akademisyen veya bilirkişi <strong>değilim</strong>, en büyük amacım kendime bir arşiv oluşturmak, dijital dünyada keyif aldığım bir alana dair izler bırakabilmek.</p><p><strong>LINKED LIST (BAĞLI LİSTE) NEDİR?</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/646/1*rFmVxQG1YRoQWEGvrr8mOQ.png" /><figcaption>İçerisinde integer veri ve bir sonraki düğümü işaret eden pointer barındıran temsili bir Linked List gösterimi</figcaption></figure><p>Linked List içindeki elemanların doğrusal olarak RAM’de tutulduğu özel bir veri saklama yapısıdır. Linked List node altyapısı ile çalışır. Hafızada verilerin doğrusal olarak (<em>Linked List yapısında, dizide olduğu gibi veri sıralı bir şekilde tutulmaz burası karıştırılmamalı</em>) tutulması yönüyle dizilere benzese de aralarında önemli performans ve işlevsellik farkları mevcuttur.</p><p><strong>LINKED LIST vs ARRAY (DİZİ) ARASINDAKI FARKLAR</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/680/1*gII0xw6IvQ6Em3op0w1m6A.png" /><figcaption>Array vs Linked List</figcaption></figure><ol><li>Dizilerde ulaşmak istediğimiz elemana indisini girerek ulaşırız. Linked List’lerde ise ulaşmak istediğimiz elemanlara point eden pointerlar vasıtasıyla ulaşırız.</li><li>Dizilerde eleman ekleme, silme gibi işlemler Linked List’lere göre performans açısından daha maliyetlidir. Örneğin; 1000 elemanlı bir dizimiz tanımlı olsun. Bu dizinin 500.cü elemanını silmek istediğimizde, bu elemandan sonra gelen her eleman bir sıra geri kaydırılacak bu da performans kaybına yol açacaktır. Linked List’te ise bu işlem sadece basit pointer operasyonlarıyla gerçekleştirilir ve kaydırma işlemlerine gerek kalmaz. Bu sayede performanstan kazanç sağlanmaktadır.</li><li>Linked List dinamiktir. Dizi tanımlaması yapılırken en başında veri boyutunu belirtmemiz gerekirken, Linked List’lerde ihtiyaç duyduğumuzda boyutu artırabilir, silme işlemlerimizden sonra Linked List boyutumuzu küçültebiliriz.</li></ol><p>Bu kıyaslamada Linked List’in önemli avantajlarından bahsettik elbette hiçbir şey her şeyiyle mükemmel olmuyor. Bazı noktalarda ise Linked List’in dezavantajları bulunuyor. Array ve Linked List’lerin avantajlı ve dezavantajlı olduğu hususları göz önünde bulundurarak tasarımımızı buna göre seçmemiz çok daha yerinde bir hamle olacaktır.</p><p><strong>LINKED LIST’LERİN DEZAVANTAJLARI</strong></p><ol><li>Linked List’lerde random bir veriye ulaşım dizilere göre maliyetlidir. Dizilerde dilediğimiz elemana indisini girerek ulaşabiliyorken, Linked List’lerde ise pointerlar aracılığı ile liste üzerinde gezinmemiz gerekir. Bu da performans kaybına yol açar. (<em>Yani bir dizide 750. elemana ulaşmak istediğimizde indisi girerek direkt ulaşabilirken, Linked List’lerde bu elemana ulaşmak için listenin en başından 750. elemana kadar gezinmemiz gerekir.</em>)</li><li>Linked List’ler, sadece veriyi değil veri ile birlikte bir sonraki düğüme işaret eden pointerları da tuttuğumuz için dizilere göre hafızada daha fazla yer kaplar.</li></ol><p>Linked List yapısının teoriğine ufak bir giriş yaptık, bir sonraki yazıda bir Linked List yapısı oluşturup içerisine elemanlarımızı gireceğiz.</p><p><em>Atladığım veya yanlış yazdığım bir husus olduysa yorumlarda bunu belirtmeniz beni çok mutlu edecektir.</em></p><p><strong>Kaynaklar</strong>:</p><ol><li><a href="https://www.studytonight.com/data-structures/linked-list-vs-array">https://www.studytonight.com/data-structures/linked-list-vs-array</a></li><li>C ve Java ile Veri Yapılarına Giriş, 2. Baskı - Olcay Taner Yıldız</li><li><a href="http://www.necessaryandsufficient.net/2008/05/differences-between-arrays-and-linked-lists/">http://www.necessaryandsufficient.net/2008/05/differences-between-arrays-and-linked-lists/</a></li><li><a href="https://www.youtube.com/watch?v=lC-yYCOnN8Q">https://www.youtube.com/watch?v=lC-yYCOnN8Q</a> , mycodeschool</li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5944bcbb8165" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Hiçbir Başarı Cezasız Kalmaz: “Alan Turing”]]></title>
            <link>https://ceyhuncozvelioglu.medium.com/hi%C3%A7bir-ba%C5%9Far%C4%B1-cezas%C4%B1z-kalmaz-alan-turing-59533ca6b7e2?source=rss-a3be8d6885b9------2</link>
            <guid isPermaLink="false">https://medium.com/p/59533ca6b7e2</guid>
            <dc:creator><![CDATA[Ceyhun Çözvelioğlu]]></dc:creator>
            <pubDate>Sun, 02 Oct 2016 14:21:17 GMT</pubDate>
            <atom:updated>2016-10-02T14:25:07.476Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/640/1*e-gQHUJ31gTdwKfKIcByJA.jpeg" /><figcaption>Alan Turing</figcaption></figure><p>Üniversite eğitimini sayısal bir bölümde okuyan birçok insanın adını bir şekilde bir yerlerde duyduğu bir ismi mercek altına alacağım bu yazımda. İngiliz matematikçi, kriptolog ve bilgisayar bilimcisi kabul edilen <strong>Alan Turing</strong>.</p><p>6 yaşında okula başlayan ve matematik üzerine doğal bir eğilimi olan Alan Turing kısa sürede öğretmenleri tarafından keşfedilmiş, henüz 16 yaşındayken derslerinde türev/integral gibi konuları öğrenmeden bile ileri düzeyde matematik problemlerini çözer hale gelmiştir. Hatta bilime öylesine meraklı bir çocukluğu olmuştur ki; trenlerin ülkede işlemediği bir gün Southhampton’dan okula 60 milden fazla süren yolu tek başına bisikletle gitmiş ve yarıyolda geceyi bir otelde geçirmiştir.</p><p>Gelelim şimdi Alan Turing’in üniversite sıralarında çok da bahsedilmeyen, üzerinde durulmadan geçilen ama dolaylı da olsa tüm dünya kaderini etkileyen başarısına.</p><p>II. Dünya Savaşı zamanlarına gidiyoruz. Almanlar şifreli haberleşme yapabilmek için Enigma adında bir makine üretmiş ve bu makine sayesinde kendi aralarında gizli bir iletişim kurabilmişlerdir.</p><p>1938 yılında II. Dünya Savaşı’nın başlamasına 1 yıl kala İngiliz İstihbaratı tarafından Almanya’nın askeri şifrelerini çözmesi için görev teklif edilmiş, Alan Turing de bu görevi kabul etmiştir. II. Dünya savaşı başlamadan önce oluşturulan 5 kişilik ekiple birlikte bir parkta oluşturulan binada Almanların kullandığı şifreleri çözmüştür. Ne var ki Alan Turing ve ekibi tarafından çözülen bu şifreleme sistemi savaş zamanında birkaç defa daha zor bir şekilde değiştirilse de Alan Turing kısa bir sürede bu sistemleri de çözmüş savaşın gidişatının değişmesinde büyük rol oynayarak Almanya’yı başarısızlığa uğratmıştır. Tarihçiler, Alan Turing’in çalışmalarının Avrupa’daki savaşı iki yıl kısalttığını ve buna bağlı olarak sayısız yaşam kurtardığını belirtiyorlar.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/482/1*DvQemlpSluMafL2u-FJHHQ.jpeg" /><figcaption>II. Dünya Savaşında Almanların Kullandığı Şifreleme Aleti Enigma</figcaption></figure><p>Buraya yazsam okuyanların bitirmeden terkedeceğini bildiğim sayısız başarısı mevcut bir dahi Alan Turing. Şimdi gelelim onun cezasına. 1952 yılında Turing Machester polisi tarafından tutuklandı ve genç bir erkekle yakalandığı gerekçesiyle mahkemeye çıkartıldı. Toplumsal ahlakı bozmaya yönelik davranışları düzenleyen yasa kapsamında yargılanacaktı. O zamanlar homoseksüellik bir suçtu ve Turing’in ya hormon tedavisi olması gerekiyordu ya da hapis yatması.</p><p>Turing hormon tedavisini seçti çünkü bilimden uzak kalmak istemiyordu. Ancak bu suçlama ve ceza bir çok şeyden onu mahrum etmeye yetmişti. Güvenlik belgeleri elinden alındığından, şifre çözme merkezi GCHQ’a yürüttüğü danışmanlığına son verildi. Ayrıca, bildiği devlet sırlarını açıklaması olasılığına karşı gözetim altında tutuldu.</p><p>Bir gün evinin hizmetçisi olan Bayan Clayton bir akşamüstü Turing’in odasına girdiğinde onun yatağın üstündeki cansız bedeniyle karşılaştı. Turing’in ölüm nedeni aslında açıkça bilinmese de bilinen kısmı siyanür enjekte edilmiş bir elma yediği. Başarılı birçok bilim insanı gibi Alan Turing de henüz 42 yaşında, çok erken bir yaşta ölmüştür.</p><p>Ne diyelim, intihar olduğuna inanmış gibi yapıp normal hayatlarımıza geri dönelim..</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=59533ca6b7e2" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>