﻿
{"id":23317,"date":"2021-10-16T16:39:19","date_gmt":"2021-10-16T16:39:19","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=23317"},"modified":"2021-10-16T16:39:19","modified_gmt":"2021-10-16T16:39:19","slug":"marker-interface-patternisaretleyici-arayuz-tasarimi","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/marker-interface-patternisaretleyici-arayuz-tasarimi\/","title":{"rendered":"Marker Interface Pattern(\u0130\u015faretleyici Aray\u00fcz Tasar\u0131m\u0131)"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde nesneler hakk\u0131nda ek bilgi sa\u011flayacak olan <em>Marker Interface Pattern(\u0130\u015faretleyici Aray\u00fcz Tasar\u0131m\u0131)<\/em>&#8216;\u0131 inceliyor olaca\u011f\u0131z.<\/p>\n<p>Marker Interface Pattern; kod yazma s\u00fcre\u00e7lerinde derleyicinin nesneler hakk\u0131nda ek bilgilere sahip olabilmesini ve b\u00f6ylece ilgili nesnenin kullan\u0131laca\u011f\u0131 noktalar\u0131 derleme s\u00fcrecinde kurallar e\u015fli\u011finde belirleyerek, kodu runtime&#8217;da olas\u0131 hatalardan ar\u0131nd\u0131rmam\u0131z\u0131 sa\u011flayan bir pattern&#8217;d\u0131r.<\/p>\n<p>\u00d6z\u00fcnde, belirli g\u00f6revlere istinaden belirli aray\u00fczlerle ya da class&#8217;larla i\u015faretlenmi\u015f nesneleri devreye sokabilmemizi sa\u011flar ve b\u00f6ylece bu i\u015faretlenmi\u015f nesnelerin d\u0131\u015f\u0131nda o g\u00f6revlerde farkl\u0131 t\u00fcrlerde nesnelerin kullan\u0131lmas\u0131na m\u00fcsaade etmeyerek kodu daha kontroll\u00fc hale getirebilme imkan\u0131 tan\u0131yaran bir stratejik manevra olu\u015fturur.<br \/>\n<div id=\"attachment_23323\" style=\"width: 451px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/Marker-Interface-PatternIsaretleyici-Arayuz-Tasarimi.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-23323\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/Marker-Interface-PatternIsaretleyici-Arayuz-Tasarimi.png\" alt=\"Marker Interface Pattern(\u0130\u015faretleyici Aray\u00fcz Tasar\u0131m\u0131)\" width=\"441\" height=\"286\" class=\"size-full wp-image-23323\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/Marker-Interface-PatternIsaretleyici-Arayuz-Tasarimi.png 441w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/Marker-Interface-PatternIsaretleyici-Arayuz-Tasarimi-300x195.png 300w\" sizes=\"auto, (max-width: 441px) 100vw, 441px\" \/><\/a><p id=\"caption-attachment-23323\" class=\"wp-caption-text\"><span style=\"font-size:11px;\">Bu g\u00f6rsel Marker Interface Pattern&#8217;\u0131n davran\u0131\u015f\u0131n\u0131 en a\u00e7\u0131k \u015fekilde yans\u0131tmaktad\u0131r. Dikkat ederseniz e\u011fer, ye\u015fil b\u00fcy\u00fck halkadan sadece ye\u015fil renkteki objelerin ge\u00e7ebilece\u011fi ve di\u011ferlerine izin verilmeyece\u011fi ifade edilmi\u015ftir. \u0130\u015fte bu mant\u0131\u011f\u0131 yaz\u0131l\u0131mda da objelerimiz i\u00e7in uygulamaya Marker Interface Pattern denmektedir.<\/span><\/p><\/div><\/p>\n<p>Konuya dair bir \u00f6rnek vermemiz gerekirse e\u011fer; bir\u00e7ok entity&#8217;den meydana gelen bir veritaban\u0131ndaki silinebilir tablolar\u0131(ya da nesneleri) di\u011ferlerine nazaran ifade edebilmek  i\u00e7in Marker Interface Pattern kullan\u0131labilir. Bunun i\u00e7in yap\u0131lmas\u0131 gereken a\u015fa\u011f\u0131daki gibi i\u015faretleyici mahiyette bir aray\u00fcz\u00fcn olu\u015fturulmas\u0131d\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public interface IErasable { }\r\n<\/pre>\n<p>Bu aray\u00fcz sadece belirli bir i\u015flem i\u00e7in se\u00e7ilmi\u015f olan nesneleri i\u015faretlemek yani o i\u015fleme \u00f6zel olarak kullan\u0131labilir olduklar\u0131n\u0131 ifade etmek i\u00e7in tasarlanmaktad\u0131r. Dolay\u0131s\u0131yla bu tarz i\u015faretleyici mahiyetteki aray\u00fczlerin i\u00e7erisi genellikle bo\u015f olarak tan\u0131mlanmaktad\u0131r.<\/p>\n<p>\u015eimdi yap\u0131lmas\u0131 gereken veritaban\u0131ndan silinebilir olan entity&#8217;leri ilgili &#8216;IErasable&#8217; aray\u00fcz\u00fcyle i\u015faretlemektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Entity1 : IErasable { ... }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Entity2 : IErasable { ... }\r\n<\/pre>\n<p>Yukar\u0131daki &#8216;Entity1&#8217; ve &#8216;Entity2&#8217; nesneleri veritaban\u0131ndan silinebilirli\u011fi ifade ederken,<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Entity3 { ... }\r\n<\/pre>\n<p>&#8216;Entity3&#8217; nesnesi &#8216;IErasable&#8217; ile i\u015faretlenmedi\u011fi i\u00e7in bu t\u00fcrdeki veriler veritaban\u0131ndan silinemezler!<\/p>\n<p>Dolay\u0131s\u0131yla yukar\u0131daki \u00fc\u00e7 s\u0131n\u0131fa da g\u00f6zle bak\u0131ld\u0131\u011f\u0131nda hangisinin silinebilir olup olmad\u0131\u011f\u0131 rahatl\u0131kla g\u00f6r\u00fclebilmektedir ve bunun yan\u0131nda i\u015f mant\u0131\u011f\u0131 a\u00e7\u0131s\u0131ndan da bu kural koyularak runtime&#8217;da olas\u0131 hatalar ortadan kald\u0131r\u0131lmaktad\u0131r. Tabi ki de bu nesneleri kullanan bir mimari tasarlan\u0131rken &#8216;IErasable&#8217; aray\u00fcz\u00fcne g\u00f6re bir constraint&#8217;in olu\u015fturulmas\u0131 bir i\u015f kural\u0131 gere\u011fidir.<\/p>\n<p>Bir ba\u015fka \u00f6rnek vermemiz gerekirse e\u011fer yukar\u0131dakine benzer olarak entity&#8217;lerin tan\u0131mlanmas\u0131d\u0131r. Bir uygulamada onlarca s\u0131n\u0131f tasar\u0131m\u0131 mevcut olabilir. Bu s\u0131n\u0131flardan hangilerinin bir entity oldu\u011funu ifade edebilmek i\u00e7in Marker Interface Pattern&#8217;\u0131 kullanabiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public interface IEntity { }\r\n<\/pre>\n<p>Yukar\u0131daki gibi tasarlanm\u0131\u015f olan bir i\u015faretleyici aray\u00fcz ile uygulamadaki t\u00fcm entity s\u0131n\u0131flar\u0131n\u0131 a\u015fa\u011f\u0131daki gibi i\u015faretleyebiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Employee : IEntity { ... }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Product : IEntity { ... }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Order : IEntity { ... }\r\n<\/pre>\n<p>B\u00f6ylece bu uygulamada hangi s\u0131n\u0131flar\u0131n bir entity olarak kullan\u0131ld\u0131\u011f\u0131n\u0131 rahatl\u0131kla g\u00f6rebilmekteyiz. Tabi bunun d\u0131\u015f\u0131nda genellikle kullanmay\u0131 tercih etti\u011fimiz <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-repository-design-patternrepository-tasarim-deseni\/\" rel=\"noopener\" target=\"_blank\">Repository<\/a> pattern&#8217;\u0131n\u0131 tasarlarken in\u015fa edilen generic yap\u0131da yanl\u0131\u015fl\u0131kla entity olmayan bir s\u0131n\u0131f\u0131n kullan\u0131lmas\u0131n\u0131 da constraint&#8217;ler sayesinde a\u015fa\u011f\u0131daki gibi rahatl\u0131kla engelleyebilmekteyiz. <\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public interface IRepository&lt;T&gt; where T : class, IEntity\r\n    {\r\n        IQueryable&lt;T&gt; Get();\r\n        IQueryable&lt;T&gt; Get&lt;A&gt;() where A : class, IEntity;\r\n        IQueryable&lt;T&gt; GetWhere(Expression&lt;Func&lt;T, bool&gt;&gt; metot);\r\n        IQueryable&lt;A&gt; GetWhere&lt;A&gt;(Expression&lt;Func&lt;A, bool&gt;&gt; metot) where A : class, IEntity;\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki \u00f6rnek kod blo\u011funda g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi ilgili Repository tasar\u0131m\u0131nda generic olarak tan\u0131mlanan <code>T<\/code> ve <code>A<\/code> parametrelerine &#8216;IEntity&#8217; t\u00fcr\u00fcnden bir nesnenin gelebilece\u011fi bildirilmi\u015f ve di\u011ferleri reddedilerek derleyici hatas\u0131 verilmi\u015ftir.<\/p>\n<p>Son olarak konuyu daha da net anlamland\u0131rabilmek i\u00e7in bir \u015firketteki personellerin g\u00fcvenilirlik durumlar\u0131n\u0131 Marker pattern ile ifade eden a\u015fa\u011f\u0131daki misali sunal\u0131m. \u015e\u00f6yle ki;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public interface ISafe { }\r\n<\/pre>\n<p>\u015feklinde bir i\u015faretleyici tan\u0131mlayarak,<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class AdministrativePersonel : ISafe { }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Person { }\r\n<\/pre>\n<p>yukar\u0131da g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi t\u00fcm personellerden ziyade(Person) sadece idari personel olan &#8216;AdministrativePersonel&#8217; nesnelerini &#8216;ISafe&#8217; ile i\u015faretlendirerek g\u00fcvenilir olduklar\u0131n\u0131 ifade edebiliriz.<\/p>\n<blockquote><p><em style=\"color:purple;\">Marker(\u0130\u015faretleyici) Interface Pattern&#8217;\u0131n di\u011fer bir ad\u0131 da etiketleyici mahiyetinde Tagging Interface Pattern&#8217;d\u0131r.<\/em><\/p><\/blockquote>\n<h5>Annotations&#8217;lar<\/h5>\n<p>Marker pattern&#8217;\u0131 uygularken annotations&#8217;lar\u0131 da kullanabiliriz. \u00d6zellikle C# programlama dilinde annotations&#8217;lar <a href=\"https:\/\/www.gencayyildiz.com\/blog\/cta-oznitelikattribute-olusturma\/\" rel=\"noopener\" target=\"_blank\">Attribute<\/a> olarak kullan\u0131lmaktad\u0131rlar. Misal olarak yukar\u0131daki \u00f6rneklerden ilki olan veritaban\u0131ndaki silinebilir tablolar\u0131(ya da nesneleri) attribute&#8217;lar ile ifade edebilmek i\u00e7in a\u015fa\u011f\u0131daki gibi \u00e7al\u0131\u015fmam\u0131z yeterlidir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;AttributeUsage(AttributeTargets.Class)]\r\n    public class ErasableAttribute : Attribute { }\r\n<\/pre>\n<p>\u0130lk olarak i\u015faretleme maksatl\u0131 bir attribute olu\u015fturulmaktad\u0131r. \u015eimdi bu attribute ile entity s\u0131n\u0131flar\u0131n\u0131 a\u015fa\u011f\u0131daki gibi i\u015faretleyerek hangisinin silinebilir \u00f6zellikte oldu\u011funu ifade edelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;Erasable]\r\n    public class Entity1 { ... }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;Erasable]\r\n    public class Entity2 { ... }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Entity3 { ... }\r\n<\/pre>\n<p>Evet, g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere <code>[Erasable]<\/code> ile i\u015faretlenen s\u0131n\u0131flar bizler i\u00e7in zahiren silinebilir entity&#8217;lere kar\u015f\u0131l\u0131k gelmektedir. <em><strong>Peki zahiren silinebilir olan bu s\u0131n\u0131flar\u0131n programatik a\u00e7\u0131dan silinebilir olup olmad\u0131\u011f\u0131n\u0131 nereden anlayaca\u011f\u0131z?<\/strong><\/em> diye sordu\u011funuzu duyar gibiyim&#8230; Nihayetinde interface ile yap\u0131lan \u00e7al\u0131\u015fmalarda polimorfizm&#8217;den faydalanabilmekte ya da s\u0131n\u0131f tasar\u0131mlar\u0131nda belli ba\u015fl\u0131 constraint&#8217;ler uygulayarak rahatl\u0131kla ilgili nesnenin i\u015faretlenip i\u015faretlenmedi\u011fi ayr\u0131m\u0131n\u0131 sa\u011flayarak, anlayabilmekteydik. Amma velakin s\u00f6z konusu yap\u0131lar attribute&#8217;lar ise reflection&#8217;a girerek hareket etmemiz gerekmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static bool IsErasable&lt;T&gt;(T instance) where T : class\r\n            =&gt; typeof(T).CustomAttributes\r\n                   .Any(attribute =&gt; attribute.AttributeType == typeof(ErasableAttribute));\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz gelen parametrenin t\u00fcr\u00fcne generic olarak b\u00fcr\u00fcnen <code>T<\/code> parametresinin bir <code>ErasableAttribute<\/code> t\u00fcr\u00fcnden attribute ile i\u015faretlenip i\u015faretlenmedi\u011fi sorgulanmakta ve geriye bool t\u00fcr\u00fcnden de\u011fer d\u00f6nd\u00fcr\u00fclmektedir. Bu kontrol\u00fc benzer mant\u0131kla a\u015fa\u011f\u0131daki gibi de ger\u00e7ekle\u015ftirebilirsiniz;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static bool IsErasable&lt;T&gt;(T instance) where T : class\r\n            =&gt; typeof(T).IsDefined(typeof(ErasableAttribute), true);\r\n<\/pre>\n<p>Velhas\u0131l bu tarz bir reflection kontrol\u00fc ile ilgili s\u0131n\u0131f\u0131n i\u015faretli olup olmad\u0131\u011f\u0131n\u0131 \u00f6\u011frendikten sonra gerisi i\u015f kurallar\u0131 gere\u011fi gerekli kontroller e\u015fli\u011finde tasarlanabilir ve uymayan bir s\u0131n\u0131f s\u00f6z konusuysa hata f\u0131rlatma gibi bir refleks g\u00f6sterilerek program\u0131n ak\u0131\u015f\u0131 de\u011fi\u015ftirilebilir. Art\u0131k buras\u0131 size kalm\u0131\u015f \ud83d\ude42<\/p>\n<p>Nihayetinde;<\/p>\n<blockquote><p><em style=\"color:green;\">Marker pattern&#8217;\u0131 derleme zaman\u0131nda uygulamak istiyorsak interface&#8217;i, yok runtime&#8217;da uygulamak istiyorsak e\u011fer attribute&#8217;lar\u0131 tercih etmemiz gerekmektedir.<\/em><\/p><\/blockquote>\n<p><strong>Performans a\u00e7\u0131s\u0131ndan :<\/strong><br \/>\nMarker attribute&#8217;lar\u0131 reflection kullan\u0131laca\u011f\u0131ndan dolay\u0131 Marker interface&#8217;lere nazaran daha yava\u015f olacakt\u0131rlar. Bundan dolay\u0131 <code style=\"color:red;\">instance is type<\/code> kontrol\u00fc reflection kullanan <code style=\"color:red;\">type.IsDefined(typeof(...Attribute...)<\/code> kontrol\u00fcne nazaran daha performansl\u0131d\u0131r.<\/p>\n<h5>Uygulama Domain&#8217;inde \u0130\u015faretlenmi\u015f Nesneleri Reflection \u0130le Yakalamak<\/h5>\n<p>K\u00e2h marker interface olsun, k\u00e2h marker attribute olsun uygulama domaini genelinde i\u015faretlenmi\u015f s\u0131n\u0131flar\u0131 yakalayabilmek ve elde edebilmek i\u00e7in a\u015fa\u011f\u0131daki algoritmalar\u0131 kullanabilirsiniz.<\/p>\n<p>Attribute i\u00e7in :<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            AppDomain.CurrentDomain.GetAssemblies()\r\n                      .SelectMany(s =&gt; s.GetTypes())\r\n                      .Where(t =&gt; t.CustomAttributes.Any(attribute =&gt; attribute.AttributeType == typeof(...Attribute...) &amp;&amp; t.IsClass))\r\n                      .ToList();\r\n<\/pre>\n<p>Interface i\u00e7in :<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            AppDomain.CurrentDomain.GetAssemblies()\r\n                      .SelectMany(s =&gt; s.GetTypes())\r\n                      .Where(t =&gt; typeof(...Interface...).IsAssignableFrom(t) &amp;&amp; t.IsClass))\r\n                      .ToList();\r\n<\/pre>\n<p>Nihayetinde \u00f6zellikle Asp.NET Core gibi modern mimarilerde geli\u015ftirilmekte olan bir\u00e7ok library art\u0131k belli interface&#8217;lerle i\u015faretlenmi\u015f s\u0131n\u0131flar\u0131 tek bir tan\u0131mlamayla domain alt\u0131nda aray\u0131p bulmakta ve i\u015flemlerini ger\u00e7ekle\u015ftirmektedir. <span style=\"font-size:12px;\">(bknz : <a href=\"https:\/\/www.gencayyildiz.com\/blog\/cqrs-pattern-nedir-mediatr-kutuphanesi-ile-nasil-uygulanir\/\" rel=\"noopener\" target=\"_blank\">MediatR<\/a>, <a href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-coreda-automapper-kullanimi\/\" rel=\"noopener\" target=\"_blank\">AutoMapper<\/a>, <a href=\"https:\/\/www.gencayyildiz.com\/blog\/net-core-fluentvalidation-ile-validasyon-kontrolu\/\" rel=\"noopener\" target=\"_blank\">Fluent Validation<\/a> vs.)<\/span> O y\u00fczden bu y\u00f6ntemler k\u00fct\u00fcphane geli\u015ftirenler i\u00e7in olduk\u00e7a kritik arz edebilir.<\/p>\n<p><strong>Son Dedikodular<\/strong><br \/>\nMarker interface, \u00f6z\u00fcnde normal bir interface\/aray\u00fcz de\u011fildir. \u00c7\u00fcnk\u00fc interface\/aray\u00fcz teriminin <em>-bir interface, o interface&#8217;i uygulayan t\u00fcm s\u0131n\u0131flara i\u00e7indeki imzalar\u0131 uygulatan kontratt\u0131r\/imzad\u0131r-<\/em> \u015feklinde olan a\u00e7\u0131klamas\u0131ndan yola \u00e7\u0131karsak e\u011fer interface&#8217;in uyguland\u0131\u011f\u0131 s\u0131n\u0131f\u0131n <em>&#8216;Ne&#8217;<\/em> oldu\u011funu, o interface&#8217;i uygulayan s\u0131n\u0131f\u0131n ise &#8216;Nas\u0131l&#8217; oldu\u011funu ifade etti\u011fini g\u00f6r\u00fcr\u00fcz. \u0130\u015fte bu mant\u0131kla Marker interface&#8217;e bakt\u0131\u011f\u0131m\u0131zda bunun normal bir interface&#8217;den ziyade sadece i\u015faretleme s\u00fcrecinde amaca hizmet eden ama \u00f6z\u00fcnde varl\u0131k sebebinden \u00e7ok farkl\u0131 kullan\u0131lan bir yap\u0131 oldu\u011funu g\u00f6rmekteyiz.<\/p>\n<p>Yani bir interface, implementer(uygulay\u0131c\u0131) ile consumer(t\u00fcketici) aras\u0131ndaki s\u00f6zle\u015fmeye kar\u015f\u0131l\u0131k gelirken Market interface bamba\u015fka bir anlama gelir. \u0130\u015faretler. Sadece bir nitelik kazand\u0131r\u0131r&#8230;<\/p>\n<blockquote><p><em style=\"color:gray;\">Kimi uzmanlar Marker Interface Pattern&#8217;\u0131n bir Design Pattern olmad\u0131\u011f\u0131 g\u00f6r\u00fc\u015f\u00fcndedir!<\/em><\/p><\/blockquote>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu i\u00e7eri\u011fimizde nesneler hakk\u0131nda ek bilgi sa\u011flayacak olan Marker Interface Pattern(\u0130\u015faretleyici Aray\u00fcz Tasar\u0131m\u0131)&#8216;\u0131 inceliyor olaca\u011f\u0131z. Marker Interface Pattern; kod yazma s\u00fcre\u00e7lerinde derleyicinin nesneler hakk\u0131nda ek bilgilere sahip olabilmesini ve b\u00f6ylece ilgili nesnenin kullan\u0131laca\u011f\u0131&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":23323,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2739,153],"tags":[750,4416,4417,4418,4415,4419],"class_list":["post-23317","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core","category-design-pattern","tag-design-pattern","tag-isaretleyici-arayuz-tasarimi","tag-marker-design-pattern","tag-marker-interface-design-pattern","tag-marker-interface-pattern","tag-tagging-interface-pattern"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/23317","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=23317"}],"version-history":[{"count":41,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/23317\/revisions"}],"predecessor-version":[{"id":23363,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/23317\/revisions\/23363"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/23323"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=23317"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=23317"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=23317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}