{"id":747,"date":"2016-08-28T16:55:34","date_gmt":"2016-08-28T13:55:34","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=747"},"modified":"2016-08-28T16:55:34","modified_gmt":"2016-08-28T13:55:34","slug":"kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\/","title":{"rendered":"Kodlama Yaparken Dikkat Edilmesi Gereken Baz\u0131 Performans ve Optimizasyon Teknikleri"},"content":{"rendered":"<p>Merhaba arkada\u015flar.<\/p>\n<p>Bu makale konumda sizlerle kodlama yaparken dikkat edilmesi gereken baz\u0131 performans ve optimizasyon tekniklerinden bahsedip, bunlar\u0131 nas\u0131l ele almam\u0131z gerekti\u011fini ve best practice&#8217;lerine de\u011finece\u011fiz. Sizlerde biliyorsunuz ki s\u00fcrd\u00fcr\u00fclebilir bir uygulama geli\u015ftirebilmek, hem biz yaz\u0131l\u0131mc\u0131lar a\u00e7\u0131s\u0131ndan (ileride gelecek olan yeni fonksiyonlar ve bak\u0131m i\u015flemleri) hem de business kurallar\u0131 gere\u011fi (m\u00fc\u015fteri memnuniyeti vb.) olmazsa olmaz bir ihtiya\u00e7t\u0131r.<\/p>\n<p>Bunun aksine giden bir yolda ise geli\u015ftirmi\u015f veya geli\u015ftiriyor oldu\u011fumuz uygulama, bir s\u00fcre h\u0131zla geli\u015fen performans ihtiya\u00e7lar\u0131n\u0131n kar\u015f\u0131s\u0131nda ise ayakta duramaz bir hale gelmeye mahkum olacakt\u0131r. Bu sebeple kodlama yaparken zamanla yar\u0131\u015fman\u0131n yan\u0131 s\u0131ra, performans ihtiya\u00e7lar\u0131n\u0131 da g\u00f6z ard\u0131 etmemeliyiz.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/08\/performance-optimization.png\"><img decoding=\"async\" class=\"size-full wp-image-749 aligncenter lazyload\" data-src=\"\/wp-content\/uploads\/2016\/08\/performance-optimization.png\" alt=\"performance-optimization\" width=\"382\" height=\"157\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/08\/performance-optimization.png 382w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/08\/performance-optimization-300x123.png 300w\" data-sizes=\"(max-width: 382px) 100vw, 382px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 382px; --smush-placeholder-aspect-ratio: 382\/157;\" \/><\/a><\/p>\n<p>Bir \u00e7ok yaz\u0131l\u0131mc\u0131\u00a0proje\u00a0y\u00f6neticileri veya product owner&#8217;lar taraf\u0131ndan kendilerine verilen fonksiyonlar\u0131 geli\u015ftirmeye odaklanmaktad\u0131r. Kendilerini bu fonksiyonlar\u0131 geli\u015ftirmeye odaklamalar\u0131 g\u00fczel fakat genellikle as\u0131l dikkat edilmesi gereken fonksiyonel olmayan (non-functional requirements) \u00f6zellikler es ge\u00e7ilmektedir. \u00dcniversitelerin <em>Yaz\u0131l\u0131m M\u00fchendisli\u011fi<\/em> derslerinden hat\u0131rlarsan\u0131z, <strong>Functional<\/strong> ve <strong>Non-functional<\/strong> requirement&#8217;lar bulunmaktayd\u0131.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/08\/nfr-non-functional-cart-before-horse.png\"><img decoding=\"async\" class=\"wp-image-753 aligncenter lazyload\" data-src=\"\/wp-content\/uploads\/2016\/08\/nfr-non-functional-cart-before-horse.png\" alt=\"nfr-non-functional-cart-before-horse\" width=\"696\" height=\"492\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/08\/nfr-non-functional-cart-before-horse.png 1753w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/08\/nfr-non-functional-cart-before-horse-300x212.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/08\/nfr-non-functional-cart-before-horse-1024x724.png 1024w\" data-sizes=\"(max-width: 696px) 100vw, 696px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 696px; --smush-placeholder-aspect-ratio: 696\/492;\" \/><\/a><\/p>\n<p>Bu resim kadar daha g\u00fczel nas\u0131l anlat\u0131labilir bilemedim. :) Non-functional\u00a0ihtiya\u00e7lar da genellikle:<\/p>\n<ul>\n<li>Aray\u00fczler<\/li>\n<li>Kullan\u0131c\u0131 odakl\u0131l\u0131\u011f\u0131<\/li>\n<li>G\u00fcvenlik<\/li>\n<li>Kalite<\/li>\n<li>Performans<\/li>\n<li>G\u00fcvence<\/li>\n<\/ul>\n<p>gibi soyut niteliklerini belirleyen\u00a0gereksinimlere dikkat edilmektedir. \u0130\u015fte tam bu noktada bizleri bir \u00e7ok yaz\u0131l\u0131mc\u0131dan\u00a0ay\u0131racak olan\u00a0nokta ise <strong>functional<\/strong> \u00f6zellikleri geli\u015ftirirken, <strong>non-functional<\/strong> ihtiya\u00e7lar\u0131da g\u00f6z ard\u0131 etmememiz olacakt\u0131r.<\/p>\n<p>Dilerseniz \u015fimdi kendi\u00a0tecr\u00fcbelerimden de edinip, farkl\u0131 kaynaklardan da elde etti\u011fim baz\u0131 best practice&#8217;lere bir bakal\u0131m.<\/p>\n<h4>1) Bir method sadece\u00a0bir sorumlulu\u011fu yerine getirmelidir<\/h4>\n<p>Bu maddede asl\u0131nda dikkat etmemiz gereken as\u0131l nokta,\u00a0method \u00f6z\u00fcnde <em><a href=\"https:\/\/gokhan-gokalp.com\/solid-nedir-ve-single-responsibility-principle-srp\/\" target=\"_blank\">Single Responsibility<\/a><\/em> prensibine \u00f6zen g\u00f6stermektir. Bu sayede bize kazand\u0131raca\u011f\u0131 baz\u0131 avantajlar ise:<\/p>\n<ul>\n<li>Method&#8217;un\u00a0complexity seviyesini azaltmak<\/li>\n<li>Hatalar\u0131 azalt\u0131p, tekrar kullan\u0131labilirli\u011fi sa\u011flamak<\/li>\n<li>Okunabilirli\u011fi ve geni\u015fletilebilirli\u011fi sa\u011flamak<\/li>\n<li>Daha\u00a0tutarl\u0131 testler yaz\u0131labilir hale getirmek<\/li>\n<\/ul>\n<p>gibi maddeler olacakt\u0131r. \u015eimdi bir \u00f6rnek \u00fczerinden giderek mevcut olan\u0131 ve olmas\u0131 gerekene bir bakal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true \">public bool ChangePassword(int userId, string oldPassword, string newPassword)\r\n{\r\n    using (TestContext context = new TestContext())\r\n    {\r\n        var user = context.User.FirstOrDefault(u =&gt; u.Id == userId);\r\n\r\n        if (user != null &amp;&amp; user.Password == oldPassword &amp;&amp; newPassword.Length &gt;= 6)\r\n        {\r\n            user.Password = newPassword;\r\n            user.LastUpdatedDate = DateTime.Now;\r\n\r\n            context.SaveChanges();\r\n\r\n            SmtpClient client = new SmtpClient\r\n            {\r\n                Host = \"smtp.gmail.com\",\r\n                Port = 587,\r\n                EnableSsl = true,\r\n                Credentials = new System.Net.NetworkCredential(\"id\", \"password\")\r\n            };\r\n\r\n            MailMessage mailMessage = new MailMessage(\"blabla@blabla.com\", \"blabla2@blabla.com\", \"Your password changed!\", \"bla bla bla...\");\r\n            client.Send(mailMessage);\r\n\r\n            return true;\r\n        }\r\n\r\n        return false;\r\n    }\r\n}<\/pre>\n<p>Tamamen \u00f6rnek ama\u00e7l\u0131 olan \u015fifre de\u011fi\u015ftirmeye yarayan bir method d\u00fc\u015f\u00fcnelim. \u0130\u00e7erisine bakt\u0131\u011f\u0131m\u0131zda ise context \u00fczerinden user&#8217;\u0131 \u00e7ekip, ilgili kontrollerden ge\u00e7irdikten sonra \u015fifre de\u011fi\u015ftirme i\u015flemini ger\u00e7ekle\u015ftiriyor ve hemen ard\u0131ndan \u015fifre de\u011fi\u015fikli\u011fi \u00fczerine bir mail g\u00f6nderiyor. G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi buradaki method complexity&#8217;si artm\u0131\u015f ve en \u00f6nemlisi mail g\u00f6nderim k\u0131sm\u0131n\u0131n tekrar kullan\u0131labilirli\u011fi k\u0131s\u0131tlanm\u0131\u015f durumdad\u0131r.<\/p>\n<p>Optimal bir \u015fekilde refactor etmek gerekirse:<\/p>\n<pre class=\"lang:c# decode:true\">public ActionResult UserSetting()\r\n{\r\n    if (ChangePassword(0, \"oldPassword\", \"newPassword\"))\r\n    {\r\n        SendMail();\r\n    }\r\n}\r\n\r\npublic bool ChangePassword(int userId, string oldPassword, string newPassword)\r\n{\r\n    var user = _userEngine.GetById(userId);\r\n\r\n    \/\/ Buradaki kontroller e\u011fer business gere\u011fi \u00e7o\u011fal\u0131cak ise, private bir sub method olarak da b\u00f6l\u00fcnebilirdi.\r\n    if (user != null &amp;&amp; user.Password == oldPassword &amp;&amp; newPassword.Length &gt;= 6)\r\n    {\r\n        user.Password = newPassword;\r\n        user.LastUpdatedDate = DateTime.Now;\r\n\r\n        context.SaveChanges();\r\n\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\npublic void SendEmail()\r\n{\r\n    SmtpClient client = new SmtpClient\r\n    {\r\n        Host = \"smtp.gmail.com\",\r\n        Port = 587,\r\n        EnableSsl = true,\r\n        Credentials = new System.Net.NetworkCredential(\"id\", \"password\")\r\n    };\r\n\r\n    MailMessage mailMessage = new MailMessage(\"blabla@blabla.com\", \"blabla2@blabla.com\", \"Your password changed!\", \"bla bla bla...\");\r\n    client.Send(mailMessage);\r\n}<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi her method sadece ilgili sorumlulu\u011funu yerine getirmektedir. SendEmail method&#8217;uda art\u0131k tekrar kullan\u0131labilir bir hale gelmi\u015ftir.<\/p>\n<h4>2)\u00a0Method&#8217;lar inline olarak \u00e7ok fazla parametre almamal\u0131d\u0131r<\/h4>\n<p>\u0130sminden de anla\u015f\u0131labildi\u011fi gibi bir method \u00e7ok fazla parametre almamal\u0131d\u0131r. \u00d6rne\u011fin:<\/p>\n<pre class=\"lang:c# decode:true\">public bool RegisterUser(string name, string surname, string email, string password, DateTime birthDate,\r\n    string country, string city, string address)\r\n{\r\n\r\n}<\/pre>\n<p>Bu tarz kullan\u0131mlarda farkl\u0131 bir business karar\u0131 gere\u011fi de\u011fi\u015fmesi gereken veya ekstradan eklenmesi gereken bir parametre daha gerekebilir. \u0130\u015fte bu durumda bu method&#8217;u kullanan her yerde bu de\u011fi\u015fimleri yapmak zorunda kalabiliriz ve parametre s\u0131ralar\u0131n\u0131n kaymas\u0131 gibi problemleri de g\u00f6ze almal\u0131y\u0131z. Bunlara ek olarak da okunabilirli\u011fi azalt\u0131yor.\u00a0\u00c7\u00f6z\u00fcm\u00fc ise bu parametreleri bir obje i\u00e7erisinde\u00a0<strong>encapsulate<\/strong> etmektir.<\/p>\n<pre class=\"lang:c# decode:true \">public bool RegisterUser(RegisterUserParameters registerUserParameters)\r\n{\r\n\r\n}<\/pre>\n<p>E\u011fer ideal parametre say\u0131s\u0131n\u0131 merak ediyorsan\u0131z &#8220;<em>Clean Code: A Handbook of Agile Software Craftsmanship<\/em>&#8221; kitab\u0131nda ge\u00e7en \u00e7ok g\u00fczel bir dizeyi size g\u00f6stermek isterim:<\/p>\n<blockquote><p>The ideal number of arguments for a function is zero (niladic). Next comes one (monadic), followed closely by two (dyadic). Three arguments (triadic) should be avoided where possible. More than three (polyadic) requires very special justification\u2014and then shouldn\u2019t be used anyway.<\/p><\/blockquote>\n<h4>3)\u00a0Sat\u0131rlar \u00e7ok fazla uzun olmamal\u0131d\u0131r<\/h4>\n<p>Kod yazarken uzun uzaya giden sat\u0131rlar, belli bir s\u00fcre sonunda tek hamlede okunabilirli\u011fi\u00a0y\u00fcksek \u00f6l\u00e7\u00fcde\u00a0azaltmaktad\u0131r. Buda ilgili kodu anlamam\u0131z\u0131 veya baz\u0131 kontrol etmemiz gereken durumlar\u0131 g\u00f6zden ka\u00e7\u0131rmam\u0131za sebebiyet verebilir. \u00c7\u00f6z\u00fcm olarak ilgili kodun belirli par\u00e7alar\u0131n\u0131, sub method&#8217;lar halinde\u00a0mant\u0131kl\u0131 bir \u015fekilde b\u00f6lmektir. Farkl\u0131 kaynaklarda tavsiye edilen sat\u0131r uzunluklar\u0131 200&#8217;d\u00fcr.<\/p>\n<h4>4)\u00a0Exception&#8217;lar es ge\u00e7ilmemelidir<\/h4>\n<p>Kodlaman\u0131n\u00a0herhangi bir par\u00e7as\u0131nda catch blo\u011fu i\u00e7erisinde es ge\u00e7ilen exception&#8217;lar, ilerleyen s\u00fcre\u00e7lerde farkl\u0131 hata ve problemlere sebebiyet verecektir. Ayn\u0131 zamanda da iyi bir best practice de\u011fildir. Bu tarz durumlarda olu\u015fan exception&#8217;\u0131 loglamak,\u00a0iyi bir y\u00f6ntem olacakt\u0131r.<\/p>\n<pre class=\"lang:c# decode:true\">public void Foo()\r\n{\r\n    try\r\n    {\r\n        \/\/ TODO...\r\n    }\r\n    catch (System.Exception ex)\r\n    {\r\n    }\r\n}\r\n\r\n\/\/Olmas\u0131 gereken\r\npublic void Foo()\r\n{\r\n    try\r\n    {\r\n        \/\/ TODO...\r\n    }\r\n    catch (System.Exception ex)\r\n    {\r\n        _logger.Log(ex);\r\n    }\r\n}<\/pre>\n<h4>5)\u00a0Switch-Case clause&#8217;lar\u0131 \u00e7ok fazla sat\u0131r i\u00e7ermemelidir<\/h4>\n<p>Switch-Case clause&#8217;lar\u0131 i\u00e7erisindeki fazla sat\u0131rlar, okunabilirli\u011fi ciddi \u00f6l\u00e7\u00fcde azaltmaktad\u0131r. Bu anlamda olabildi\u011fince k\u0131sa\u00a0statement&#8217;lar kullan\u0131lmaya \u00e7al\u0131\u015f\u0131lmal\u0131d\u0131r.<\/p>\n<pre class=\"lang:default decode:true\">switch (variable)\r\n{\r\n    case 0:\r\n        DoSomething();\r\n        DoSomething2();\r\n        DoSomething3();\r\n        DoSomething4();\r\n        DoSomething5();\r\n        break;\r\n    case 1:\r\n        break;\r\n    ...\r\n}\r\n\r\n\/\/ Olmas\u0131 gereken\r\nswitch (variable)\r\n{\r\n    case 0:\r\n        Do();\r\n        break;\r\n    case 1:\r\n        break;\r\n    ...\r\n}\r\n\r\n\r\npublic void Do()\r\n{\r\n    DoSomething();\r\n    DoSomething2();\r\n    DoSomething3();\r\n    DoSomething4();\r\n    DoSomething5();\r\n}<\/pre>\n<p>Burada method \u00e7a\u011f\u0131r\u0131m\u0131n\u0131n\u00a0haricinde sat\u0131rlarca farkl\u0131 kodlar da yer alabilirdi.\u00a0Okunabilirlik i\u00e7in olabildi\u011fince case clause&#8217;u i\u00e7erisindeki statement&#8217;lar\u0131 k\u0131saltmaya \u00e7al\u0131\u015ft\u0131k.<\/p>\n<h4>6) Boolean\u00a0statement&#8217;leri ters kontrol edilmemelidir<\/h4>\n<p>Boolean kontrollerini beklenenin aksine kontrol etmek\u00a0ve ters ifadeler ile kontrol etmek hem coding standartlar\u0131na uygun de\u011fildir hem de kompleks ve maliyetli bir i\u015ftir.<\/p>\n<pre class=\"lang:c# decode:true \">if(!(variable == 2))\r\n{\r\n    ...\r\n}\r\n\r\n\/\/ Olmas\u0131 gereken\r\nif(variable != 2)\r\n{\r\n    ...\r\n}<\/pre>\n<h4>7) TODO\u00a0tag&#8217;lar\u0131 kontrol edilmeli ve method&#8217;lara summary eklenmelidir<\/h4>\n<p>E\u011fer herhangi bir method bo\u015f ise ve daha sonra implemente edilecekse, TODO tag&#8217;\u0131 eklenmelidir. Bu sayede TODO tag&#8217;lar\u0131na g\u00f6re filtrelendi\u011finde\u00a0g\u00f6z\u00fcn\u00fczden ka\u00e7an implemente edilmemi\u015f kod par\u00e7ac\u0131\u011f\u0131 kalmayacakt\u0131r. Bunun yan\u0131 s\u0131ra method&#8217;lara eklemi\u015f oldu\u011funuz summary&#8217;ler sayesinde, hem siz hemde di\u011fer ekip\u00a0arkada\u015flar\u0131n\u0131z kod&#8217;a hen\u00fcz bakmadan summary ile kod hakk\u0131nda bir fikir sahibi olabilirler.<\/p>\n<pre class=\"lang:c# decode:true\">private void DoSomething()\r\n{\r\n    \r\n}\r\n\r\n\/\/ Olmas\u0131 gereken\r\n\/\/\/ &lt;summary&gt;\r\n\/\/\/ Bu method blabla yapar\r\n\/\/\/ &lt;\/summary&gt;\r\nprivate void DoSomething()\r\n{\r\n    \/\/TODO: blabla bitti\u011finde blabla'y\u0131 buraya implemente et...\r\n}<\/pre>\n<h4>8)\u00a0Switch-Case statement&#8217;\u0131ndaki bo\u015f DEFAULT clause&#8217;u silinmelidir<\/h4>\n<p>Switch-Case kullan\u0131ld\u0131\u011f\u0131nda otomatik olarak gelen DEFAULT clause&#8217;u kullan\u0131l\u0131yorsa, o halde olmas\u0131 gereken uygun action kullan\u0131lmal\u0131d\u0131r. E\u011fer hi\u00e7 bir \u015fey kullan\u0131lmay\u0131p bo\u015f olarak es ge\u00e7iliyorsa, kullanman\u0131n da bir anlam\u0131\u00a0olmayaca\u011f\u0131ndan dolay\u0131 coding standartlar\u0131na g\u00f6re silinmelidir.<\/p>\n<pre class=\"lang:c# decode:true \">switch (variable)\r\n{\r\n    case 0:\r\n    \/\/...\r\n        break;\r\n    case 1:\r\n    \/\/...\r\n        break;\r\n    default:\r\n        break;\r\n}\r\n\r\n\/\/ Olmas\u0131 gereken\r\nswitch (variable)\r\n{\r\n    case 0:\r\n    \/\/...\r\n        break;\r\n    case 1:\r\n    \/\/...\r\n        break;\r\n    default:\r\n    throw new NotSupportedException();\r\n}<\/pre>\n<h4>9) Enum tan\u0131mlarken null\u00a0olarak s\u0131f\u0131r\u0131nc\u0131\u00a0de\u011fer\u00a0tan\u0131mlanmal\u0131d\u0131r<\/h4>\n<p>Coding\u00a0standartlar\u0131nda tutarl\u0131l\u0131\u011f\u0131 sa\u011flayabilmek ad\u0131na Enum&#8217;lar tan\u0131mlan\u0131rken, s\u0131f\u0131r\u0131nc\u0131 de\u011fer None olarak tan\u0131mlanmal\u0131d\u0131r.<\/p>\n<pre class=\"lang:c# decode:true\">enum MemberType\r\n{\r\n    Standard = 1,\r\n    Gold = 2\r\n}\r\n\r\n\/\/ Olmas\u0131 gereken\r\nenum MemberType\r\n{\r\n    None = 0,\r\n    Standrt = 1,\r\n    Gold = 2\r\n}<\/pre>\n<h4>10)\u00a0Constructor arac\u0131l\u0131\u011f\u0131 ile inject edilen field&#8217;lar, read-only olmal\u0131d\u0131r<\/h4>\n<p>Constructor arac\u0131l\u0131\u011f\u0131 ile inject etti\u011fimiz field&#8217;lar\u0131 read-only olarak tan\u0131mlamazsak, farkl\u0131 method&#8217;lar i\u00e7erisinden de ilgili field&#8217;a de\u011fer atanmaya \u00e7al\u0131\u015f\u0131labilir, kar\u0131\u015f\u0131kl\u0131klara sebebiyet verebilir. Bunlar\u0131n \u00f6n\u00fcne ge\u00e7ebilmek i\u00e7in ise read-only olarak i\u015faretlenmelidir.<\/p>\n<pre class=\"lang:c# decode:true \">class User\r\n{\r\n    int _userId;\r\n\r\n    public User(int userId)\r\n    {\r\n        _userId = userId;\r\n    }\r\n}\r\n\r\n\/\/Olmas\u0131 gereken\r\nclass User\r\n{\r\n    readonly int _userId;\r\n\r\n    public User(int userId)\r\n    {\r\n        _userId = userId;\r\n    }\r\n}<\/pre>\n<h4>11)\u00a0Interface tan\u0131mlan\u0131rken ba\u015f\u0131na &#8220;I&#8221; prefix&#8217;i getirilmelidir<\/h4>\n<p>Coding standartlar\u0131na g\u00f6re interface&#8217;ler tan\u0131mlan\u0131rken ba\u015flar\u0131na &#8220;I&#8221; prefix&#8217;i eklenmelidir. \u00d6rne\u011fin:<\/p>\n<pre class=\"lang:c# decode:true \">interface IUserRepository\r\n{\r\n    \/\/...\r\n}<\/pre>\n<h4>12)\u00a0String birle\u015ftirme i\u015flemlerinde &#8220;+&#8221;\u00a0\u00f6perat\u00f6r\u00fc\u00a0kullan\u0131m\u0131na dikkat edilmelidir<\/h4>\n<p>String birle\u015ftirme i\u015flemlerinde sadece bir ka\u00e7 string&#8217;i birle\u015ftiriyor isek \u00e7ok fazla problem olmayacakt\u0131r. Fakat bu i\u015flemi daha fazla string ile ger\u00e7ekle\u015ftiriyor isek memory performans\u0131 a\u00e7\u0131s\u0131ndan <strong>StringBuilder<\/strong> veya <strong>String.Concat<\/strong> gibi i\u015flemler uygulanmal\u0131d\u0131r.<\/p>\n<pre class=\"lang:c# decode:true\">public void Foo()\r\n{\r\n    string blabla = \"aaa\" + \"bbb\" + \"ccc\" + \"ddd\" + \"eee\" + \"ggg\";\r\n}\r\n\r\n\/\/Olmas\u0131 gereken\r\npublic void Foo()\r\n{\r\n    string blabla = String.Concat(\"aaa\", \"bbb\", \"ccc\", \"ddd\", \"eee\", \"ggg\");\r\n}<\/pre>\n<h4>13)\u00a0System type name&#8217;ler yerine\u00a0Predefined type name&#8217;ler kullan\u0131lmal\u0131d\u0131r<\/h4>\n<p>Int16, Single, UInt64 gibi system type name&#8217;ler yerine, Predefined type name&#8217;ler kullan\u0131lmal\u0131d\u0131r. \u00d6rne\u011fin:<\/p>\n<pre class=\"lang:c# decode:true \">String name;\r\nInt32 userId;\r\nBoolean isActive;\r\n\r\n\/\/Olmas\u0131 gereken\r\nstring name;\r\nint userId;\r\nbool isActive;<\/pre>\n<p>Bu sayede .Net Framework taraf\u0131nda daha\u00a0tutarl\u0131 bir okuma ger\u00e7ekle\u015ftirecektir.<\/p>\n<h4>14)\u00a0External kaynaklara eri\u015fecek bir class\u00a0varsa IDisposable pattern&#8217;ini implemente\u00a0edilmelidir<\/h4>\n<p>IO i\u015flemleri, web servisler, sql gibi external kaynaklara ihtiya\u00e7 duydu\u011funuz durumlar oldu\u011funda, memory performans\u0131\u00a0i\u00e7in\u00a0<strong>IDisposable<\/strong> pattern&#8217;ini implemente edin.<\/p>\n<pre class=\"lang:c# decode:true\">public void Dispose()\r\n{\r\n    Dispose(true);\r\n    GC.SuppressFinalize(this);\r\n}\r\n\r\nprotected virtual void Dispose(bool disposing)\r\n{\r\n    if (disposing)\r\n    {\r\n        \/\/Managed objeler burada y\u00f6netilecek\r\n    }\r\n    \/\/Unmanaged objeler ise burada y\u00f6netilecek\r\n    \/\/B\u00fcy\u00fck field'lar null'a \u00e7ekilecek vb.\r\n}\r\n\r\n~Base()\r\n{\r\n    Dispose(false);\r\n}<\/pre>\n<h4>15)\u00a0Kodlama yaparken kodlar i\u00e7erisinde magic string\/numbers kullan\u0131lmamal\u0131d\u0131r<\/h4>\n<p>\u0130lgili kod par\u00e7ac\u0131klar\u0131\u00a0i\u00e7erisinde kullan\u0131lan magic string\/number&#8217;lar tekrar\u00a0kullan\u0131labilirli\u011fi engellemekle kalmay\u0131p, ilgili de\u011fer de\u011fi\u015fti\u011finde ise her nerede kullan\u0131ld\u0131ysa tek tek bulunup g\u00fcncellenmesi gerekmektedir. Coding standartlar\u0131 do\u011frultusunda bu tarz\u00a0de\u011fi\u015fkenler global ve const olarak tan\u0131mlanmal\u0131d\u0131r.<\/p>\n<pre class=\"lang:c# decode:true\">public void Foo(int interval)\r\n{\r\n    int a = 3 * interval;\r\n    int b = a \/ 5;\r\n}\r\n\r\n\/\/Olmas\u0131 gereken\r\npublic class Blabla\r\n{\r\n    private const int SomeVariable = 3;\r\n    private const int DifferentVariable = 5;\r\n\r\n    public void Foo(int interval)\r\n    {\r\n        int a = SomeVariable * interval;\r\n        int b = a \/ DifferentVariable;\r\n    }\r\n}<\/pre>\n<h4>16)\u00a0Unmanaged kaynaklar i\u00e7in using statement&#8217;\u0131 kullan\u0131lmal\u0131d\u0131r<\/h4>\n<p>Bildi\u011fimiz gibi .Net Framework i\u00e7erisindeki Garbage collector hi\u00e7bir referans taraf\u0131ndan g\u00f6sterilmeyen managed nesneleri bellekten kald\u0131rmaktad\u0131r. Ancak Garbage collector unmanaged kodlar \u00fczerinde tam kontrole sahip de\u011fildir. Kullan\u0131lm\u0131yor olsalar bile bellekten serbest b\u0131rakamaz. \u0130\u015fte bu noktada biz yaz\u0131l\u0131mc\u0131lar taraf\u0131ndan Dispose edilmesi gerekmektedir. Bu tarz unmanaged kaynaklara eri\u015fen objeler genelde IDisposable aray\u00fcz\u00fcn\u00fc implemente etmektedir. Bu nesneleri dispose edebilmenin en iyi yolu ise, using statement&#8217;\u0131 i\u00e7erisinde kullanmakt\u0131r.<\/p>\n<pre class=\"lang:c# decode:true\">using(SqlConnection sqlConnection = new SqlConnection(\"ConnectionString\"))\r\n{\r\n    using(SqlCommand command = new SqlCommand(\"\", sqlConnection))\r\n    {\r\n        \/\/...\r\n    }\r\n}<\/pre>\n<h4>17)\u00a0Catch blo\u011funda exception tekrardan f\u0131rlat\u0131l\u0131rken sadece throw kullan\u0131lmal\u0131d\u0131r<\/h4>\n<p>Catch blo\u011fu i\u00e7erisinde ilgili exception&#8217;\u0131 loglad\u0131ktan sonra tekrardan geriye f\u0131rlatma ihtiyac\u0131 duyulursa, bunu sadece throw keyword&#8217;\u00fc kullan\u0131larak ger\u00e7ekle\u015ftirilmelidir. Aksi durumda olu\u015fan orjinal exception&#8217;\u0131n stack trace&#8217;i kaybolacakt\u0131r.<\/p>\n<pre class=\"lang:c# decode:true \">catch(Exception ex)\r\n{\r\n  _logger.Log(ex);\r\n  throw ex;\r\n}\r\n\r\n\/\/Olmas\u0131 gereken\r\ncatch(Exception ex)\r\n{\r\n  _logger.Log(ex);\r\n  throw;\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>Sizlerle \u00f6nemli olarak ele ald\u0131\u011f\u0131m ve al\u0131nan, code review&#8217;ler s\u0131ras\u0131nda da dikkat etti\u011fim, farkl\u0131 kaynaklardan da derledi\u011fim best practice&#8217;leri payla\u015fmaya \u00e7al\u0131\u015ft\u0131m. Umar\u0131m herkes i\u00e7in faydal\u0131 bir makale olur.<\/p>\n<p>Takipte kal\u0131n.<\/p>\n<p>Kaynaklar:<\/p>\n<blockquote><p>http:\/\/www.dofactory.com\/reference\/csharp-coding-standards<br \/>\nhttp:\/\/www.codeproject.com\/Articles\/8971\/C-Coding-Standards-and-Best-Programming-Practiceshttp:\/\/se.inf.ethz.ch\/old\/teaching\/ss2007\/251-0290-00\/project\/CSharpCodingStandards.pdf<br \/>\nhttp:\/\/www.c-sharpcorner.com\/article\/coding-standard-best-practices-in-c-sharp\/<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Merhaba arkada\u015flar. Bu makale konumda sizlerle kodlama yaparken dikkat edilmesi gereken baz\u0131 performans ve optimizasyon tekniklerinden bahsedip, bunlar\u0131 nas\u0131l ele almam\u0131z gerekti\u011fini ve best practice&#8217;lerine de\u011finece\u011fiz. Sizlerde biliyorsunuz ki s\u00fcrd\u00fcr\u00fclebilir bir uygulama geli\u015ftirebilmek, hem biz yaz\u0131l\u0131mc\u0131lar a\u00e7\u0131s\u0131ndan (ileride gelecek olan yeni fonksiyonlar ve bak\u0131m i\u015flemleri)&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">Kodlama Yaparken Dikkat Edilmesi Gereken Baz\u0131 Performans ve Optimizasyon Teknikleri<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,68,231],"tags":[234,235,244,238,233,239,240,242,243,247,246,245,241,236,232,249,248,237],"class_list":["post-747","post","type-post","status-publish","format-standard","hentry","category-net","category-architectural","category-refactoring","tag-c-sharp-kod-standartlari","tag-c-best-practice","tag-c-enum-kullanimi","tag-c-idisposable-kullanimi","tag-c-kod-standartlari","tag-c-loglama","tag-c-managed-kod-nedir","tag-c-performans-optimizasyonu","tag-c-readonly-kullanimi","tag-c-single-responsibility","tag-c-solid","tag-c-solid-nedir","tag-c-unmanaged-kod-nedir","tag-c-using-kullanimi","tag-code-review","tag-fonksiyonel-olmayan-ozellikler","tag-fonksiyonel-ozellikler","tag-idisposable-kullanimi","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":false,"content":false,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Kodlama Yaparken Dikkat Edilmesi Gereken Baz\u0131 Performans ve Optimizasyon Teknikleri - G\u00f6khan G\u00f6kalp<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gokhan-gokalp.com\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kodlama Yaparken Dikkat Edilmesi Gereken Baz\u0131 Performans ve Optimizasyon Teknikleri - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2016-08-28T13:55:34+00:00\" \/>\n<meta name=\"author\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"Kodlama Yaparken Dikkat Edilmesi Gereken Baz\u0131 Performans ve Optimizasyon Teknikleri\",\"datePublished\":\"2016-08-28T13:55:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\\\/\"},\"wordCount\":1586,\"commentCount\":18,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"keywords\":[\"c sharp kod standartlar\u0131\",\"C# best practice\",\"c# enum kullan\u0131m\u0131\",\"c# IDisposable kullan\u0131m\u0131\",\"c# kod standartlar\u0131\",\"C# loglama\",\"c# managed kod nedir\",\"c# performans optimizasyonu\",\"c# readonly kullan\u0131m\u0131\",\"c# single responsibility\",\"c# solid\",\"c# solid nedir\",\"c# unmanaged kod nedir\",\"c# using kullan\u0131m\u0131\",\"code review\",\"fonksiyonel olmayan \u00f6zellikler\",\"fonksiyonel \u00f6zellikler\",\"IDisposable kullan\u0131m\u0131\"],\"articleSection\":[\".NET\",\"Architectural\",\"Refactoring\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\\\/\",\"name\":\"Kodlama Yaparken Dikkat Edilmesi Gereken Baz\u0131 Performans ve Optimizasyon Teknikleri - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"datePublished\":\"2016-08-28T13:55:34+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kodlama Yaparken Dikkat Edilmesi Gereken Baz\u0131 Performans ve Optimizasyon Teknikleri\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"description\":\"C# &amp; Python lover\",\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gokhan-gokalp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"pronouns\":\"he\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Kodlama Yaparken Dikkat Edilmesi Gereken Baz\u0131 Performans ve Optimizasyon Teknikleri - G\u00f6khan G\u00f6kalp","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gokhan-gokalp.com\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\/","og_locale":"tr_TR","og_type":"article","og_title":"Kodlama Yaparken Dikkat Edilmesi Gereken Baz\u0131 Performans ve Optimizasyon Teknikleri - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2016-08-28T13:55:34+00:00","author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"10 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"Kodlama Yaparken Dikkat Edilmesi Gereken Baz\u0131 Performans ve Optimizasyon Teknikleri","datePublished":"2016-08-28T13:55:34+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\/"},"wordCount":1586,"commentCount":18,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"keywords":["c sharp kod standartlar\u0131","C# best practice","c# enum kullan\u0131m\u0131","c# IDisposable kullan\u0131m\u0131","c# kod standartlar\u0131","C# loglama","c# managed kod nedir","c# performans optimizasyonu","c# readonly kullan\u0131m\u0131","c# single responsibility","c# solid","c# solid nedir","c# unmanaged kod nedir","c# using kullan\u0131m\u0131","code review","fonksiyonel olmayan \u00f6zellikler","fonksiyonel \u00f6zellikler","IDisposable kullan\u0131m\u0131"],"articleSection":[".NET","Architectural","Refactoring"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\/","url":"https:\/\/gokhan-gokalp.com\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\/","name":"Kodlama Yaparken Dikkat Edilmesi Gereken Baz\u0131 Performans ve Optimizasyon Teknikleri - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"datePublished":"2016-08-28T13:55:34+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/kodlama-yaparken-dikkat-edilmesi-gereken-bazi-performans-ve-optimizasyon-teknikleri\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"Kodlama Yaparken Dikkat Edilmesi Gereken Baz\u0131 Performans ve Optimizasyon Teknikleri"}]},{"@type":"WebSite","@id":"https:\/\/gokhan-gokalp.com\/#website","url":"https:\/\/gokhan-gokalp.com\/","name":"G\u00f6khan G\u00f6kalp","description":"C# &amp; Python lover","publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gokhan-gokalp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe","name":"G\u00f6khan G\u00f6kalp","pronouns":"he","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659"},"sameAs":["https:\/\/gokhan-gokalp.com"],"url":"https:\/\/gokhan-gokalp.com\/tr\/author\/gok-gokalp\/"}]}},"_links":{"self":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/747","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/comments?post=747"}],"version-history":[{"count":21,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/747\/revisions"}],"predecessor-version":[{"id":771,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/747\/revisions\/771"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=747"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=747"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=747"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}