﻿
{"id":16170,"date":"2020-06-09T20:04:35","date_gmt":"2020-06-09T20:04:35","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=16170"},"modified":"2020-06-09T20:04:35","modified_gmt":"2020-06-09T20:04:35","slug":"c-object-pooling-design-patternobject-pooling-tasarim-deseni","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-object-pooling-design-patternobject-pooling-tasarim-deseni\/","title":{"rendered":"C# Object Pooling Design Pattern(Object Pooling Tasar\u0131m Deseni)"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde OOP temelli geli\u015ftirilen uygulamalarda, yakla\u015f\u0131m\u0131n esas\u0131n\u0131 te\u015fkil eden nesne(object) kavram\u0131n\u0131n yap\u0131sal durumundan yola \u00e7\u0131karak, tekrarl\u0131 kullan\u0131lan nesnelerin \u00fcretim esnas\u0131ndaki maliyetlerine dair \u00e7\u00f6z\u00fcm ama\u00e7l\u0131 geli\u015ftirilmi\u015f Object Pooling Design Pattern \u00fczerine konu\u015fuyor olaca\u011f\u0131z.<\/p>\n<p><em>Nedir bu Object Pooling Design Pattern?<\/em> diye sorarsan\u0131z e\u011fer tekrarl\u0131 kullan\u0131lan nesnelerin \u00fcretim ve imha s\u00fcre\u00e7lerinde meydana gelen maliyetlerin minimize edilmesi i\u00e7in \u00fcretilen nesnenin bir kaynakta\/alanda\/havuzda tutulmas\u0131 \u00fczerine geli\u015ftirilmi\u015f tasar\u0131m desenidir diyebiliriz.<\/p>\n<p>Olay\u0131 biraz daha pratiksel ba\u011flamda ele alabilmek i\u00e7in yer yer terminolojik ve programatik bir semantik \u00e7izgiden temasta bulunmam\u0131zda fayda olaca\u011f\u0131 kanaatindeyim. Dolay\u0131s\u0131yla konuyu C# penceresinden inceledi\u011fimiz vakit \u015f\u00f6yle bir d\u00fc\u015f\u00fcnceyle de\u011ferlendirmede bulunabiliriz;<\/p>\n<p>Biliyorsunuz ki herhangi bir T class\u0131ndan bir nesneye ihtiya\u00e7 oldu\u011fu vakit bunun compilerdan <strong style=\"color: red;\"><em>new<\/em><\/strong> operat\u00f6r\u00fc arac\u0131l\u0131\u011f\u0131yla talep edilmesi yeterli olacakt\u0131r.<\/p>\n<p>\u00d6rne\u011fin;<\/p>\n<div style=\"text-align: center;\"><em style=\"color: blue;\">T t = <strong style=\"color: red;\">new<\/strong> T()<\/em><\/div>\n<p>\u0130\u015fte buradaki i\u015flem neticesinde bir T nesnesi olu\u015fturulmakta lakin bu i\u015flev olduk\u00e7a maliyetli bir s\u00fcre\u00e7 neticesinde ger\u00e7ekle\u015ftirilmektedir. new operat\u00f6r\u00fc ger\u00e7ekten \u00e7ok maliyet bir operasyonel a\u011f\u0131rl\u0131\u011fa sahiptir. O y\u00fczden bol keseden kullan\u0131lmamas\u0131 gerekmekte ve i\u015fte tamda bu sebepten dolay\u0131 tekrarl\u0131 kullan\u0131lan\/kullan\u0131lacak olan nesnelerde new ile yeniden ve yeniden \u00fcretimden ka\u00e7\u0131n\u0131lmas\u0131 gerekmektedir. Ayr\u0131ca bir nesnenin maliyetinin sadece \u00fcretiminden ibaret olaca\u011f\u0131n\u0131 d\u00fc\u015f\u00fcnmekte eksik bir kanaat olacakt\u0131r. Bazen nesneler \u00fcretildikleri gibi imha edilirlerken de y\u00fcksek maliyet gerektirebilmektedirler.<\/p>\n<p>\u015e\u00f6yle ki&#8230;<\/p>\n<p>A\u015fa\u011f\u0131daki &#8216;ExampleObject&#8217; isimli s\u0131n\u0131f\u0131 ele al\u0131rsak e\u011fer;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class ExampleObject\r\n    {\r\n        int count;\r\n        public ExampleObject(int l)\r\n        {\r\n            \/\/Constructor\r\n            while (count &lt; l) count++;\r\n        }\r\n        ~ExampleObject()\r\n        {\r\n            \/\/Destructor\r\n            while (count &gt; 0) count--;\r\n        }\r\n    }\r\n<\/pre>\n<p>g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere ilgili s\u0131n\u0131ftan ihtiya\u00e7 do\u011frultusunda yap\u0131lacak olan nesne talebi ve ihtiya\u00e7 sonras\u0131 imha s\u00fcre\u00e7lerinde maliyetli i\u015flemler s\u00f6z konusudur. \u015eimdi d\u00fc\u015f\u00fcn\u00fcrsek e\u011fer bu s\u0131n\u0131ftan<\/p>\n<div style=\"text-align: center;\"><em style=\"color: blue;\">ExampleObject obj = <strong style=\"color: red;\">new<\/strong> ExampleObject(100)<\/em><\/div>\n<p>\u015feklinde her nesne \u00fcretiminde bir \u00fcretimsel maliyet ortaya \u00e7\u0131kacakt\u0131r ve ihtiya\u00e7 do\u011frultusunda olu\u015fturulacak olan bu nesnelerde bu maliyet g\u00f6z ard\u0131 edilmek mecburiyetinde kal\u0131nacakt\u0131r. \u0130\u015fte bunun gibi nesneleri s\u00fcrekli new ile yarat\u0131p destroy etmekten ziyade bu nesnelerin bir kere olu\u015fturulmas\u0131 ve ard\u0131ndan bir havuzda saklanmas\u0131, sonra ihtiya\u00e7 halinde nesneyi tekrardan yaratmak yerine havuzdan alarak kullan\u0131lmas\u0131 ve kullan\u0131m bitince tekrardan havuza b\u0131rak\u0131lmas\u0131 en do\u011frusu olacakt\u0131r&#8230; Haliyle bu stratejik yap\u0131lanmaya da Object Pooling denmektedir \ud83d\ude42<\/p>\n<p><strong>Neden Object Pooling stratejisi kullan\u0131lmal\u0131d\u0131r?<\/strong><\/p>\n<p>Maliyetli nesnelerin \u00fcretimi s\u00fcre\u00e7lerinde &#8216;creation time&#8217;\u0131 m\u00fcmk\u00fcn mertebe minimize ederek zamandan kazan\u00e7 elde etmek ve b\u00fct\u00fcnsel a\u00e7\u0131dan yaz\u0131l\u0131m\u0131n dinamizmini destekleyerek performans\u0131 artt\u0131rmak i\u00e7in Object Pooling kullan\u0131lmal\u0131d\u0131r. Tabi ki de new operat\u00f6r\u00fcndeki y\u00fcksek maliyete bizler bu strateji ile ge\u00e7ici \u00e7\u00f6z\u00fcm sunmu\u015f olacak, esas\u0131nda ger\u00e7ek sorumlulu\u011fun dil geli\u015ftiricileri taraf\u0131ndan \u00fcstlenilmesi gerekecektir.<\/p>\n<p><strong>Peki, Object Pooling&#8217;in <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-prototype-design-pattern-prototip-tasarim-deseni\/\" target=\"_blank\" rel=\"noopener noreferrer\">Prototype Design Pattern<\/a>&#8216;dan fark\u0131 nedir?<\/strong><\/p>\n<p>\u0130\u00e7eri\u011fimizde s\u00fcrekli new operat\u00f6r\u00fcn\u00fcn maliyetine vurgu yapm\u0131\u015f bulunmaktay\u0131z. Lakin esas maliyetin yukar\u0131larda \u00f6rne\u011fi verilen ve constructor&#8217;\u0131nda ekstra i\u015f y\u00fck\u00fc bar\u0131nd\u0131ran nesneler \u00fczerinde new ile yap\u0131lan \u00fcretimler neticesinde oldu\u011fununda fark\u0131nda olundu\u011funun kanaatindeyim. Velhas\u0131l kelam, Prototype deseninde constructor \u00fczerinde i\u015f y\u00fck\u00fc a\u015f\u0131r\u0131 derecede fazla olan ve bunun yan\u0131nda birde parametreli yap\u0131c\u0131 ile developer a\u00e7\u0131s\u0131ndan da maliyeti katlayan nesnelere ihtiya\u00e7 do\u011frultusunda \u00fcretimsel a\u011f\u0131rl\u0131\u011f\u0131 ortadan kald\u0131rmak i\u00e7in \u00f6nceden \u00fcretilmi\u015f olan bir nesnenin klonlanmas\u0131 ve neticede klonlanm\u0131\u015f bu nesne \u00fczerinde yap\u0131c\u0131 maliyetinin ortadan kald\u0131r\u0131lmas\u0131 ama\u00e7lanmaktad\u0131r. Object Pooling deseninde ise olu\u015fturulmas\u0131 maliyetli olan nesnelerin bir kereye mahsus \u00fcretilip sonraki ihtiya\u00e7larda yine ayn\u0131 nesnenin kullan\u0131lmas\u0131na imkan tan\u0131nmas\u0131 esas al\u0131nmakta ve yeniden kullan\u0131labilirli\u011fe odaklan\u0131lmaktad\u0131r. Nihai olarak; prototype tasar\u0131m\u0131 bir nesne daha \u00fcretirken, object pooling tasar\u0131m\u0131nda nesne \u00fcretilmeksizinn var olan nesne kullan\u0131lm\u0131\u015f olacakt\u0131r.<\/p>\n<h4>Object Pooling \u00d6rneklendirmesi<\/h4>\n<p>Basit bir object pooling tasar\u0131m\u0131 i\u00e7in a\u015fa\u011f\u0131daki \u00f6rne\u011fi inceleyebilirsiniz;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class ObjectPool&lt;T&gt;\r\n    {\r\n        private readonly ConcurrentBag&lt;T&gt; _objects;\r\n        private readonly Func&lt;T&gt; _objectGenerator;\r\n        public ObjectPool(Func&lt;T&gt; objectGenerator)\r\n        {\r\n            _objectGenerator = objectGenerator ?? throw new ArgumentException(nameof(objectGenerator));\r\n            _objects = new ConcurrentBag&lt;T&gt;();\r\n        }\r\n\r\n        public T Get() =&gt; _objects.TryTake(out T item) ? item : _objectGenerator();\r\n        public void Return(T item) =&gt; _objects.Add(item);\r\n    }\r\n<\/pre>\n<p>Bir object pooling tasar\u0131m\u0131nda; olu\u015fturulan object havuzunun(<a href=\"https:\/\/www.gencayyildiz.com\/blog\/thread-safe-concurrentqueue-concurrentdictionary-concurrentbag-concurrentstack-ve-blockingcollection-koleksiyonlari-ve-kullanim-durumlari\/\" target=\"_blank\" rel=\"noopener noreferrer\">ConcurrentBag<\/a>) yan\u0131nda, havuzdan nesne almam\u0131z\u0131(Get) ve al\u0131nan nesneyi daha sonraki ihtiya\u00e7lar do\u011frultusunda tekrar kullan\u0131labilmesi i\u00e7in havuza geri g\u00f6ndermemizi(Return) sa\u011flayan niteliklerin bulunmas\u0131 gerekmektedir. Tabi burada konuya dair internet ve di\u011fer kaynaklarda Get metodunu <em>Acquire<\/em> yahut <em>Acquire Object<\/em>, Return metodunu ise <em>Release<\/em> yahut <em>Release Object<\/em> \u015feklinde farkl\u0131 terminolojik kar\u015f\u0131l\u0131klar\u0131yla g\u00f6rebilece\u011finizi bildirmekte fayda var.<\/p>\n<p>Bizler \u00f6rne\u011fi tatbik etmeye geri d\u00f6ner ve yukar\u0131da tasarlanan &#8216;ObjectPool&#8217; s\u0131n\u0131f\u0131n\u0131 a\u015fa\u011f\u0131daki &#8216;ExampleObject&#8217; nesnesi ile \u00f6rneklendirirsek e\u011fer;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class ExampleObject\r\n    {\r\n        public ExampleObject(int id)\r\n        {\r\n            _id = id;\r\n            Console.WriteLine($&quot;{nameof(ExampleObject)} nesnesi olu\u015fturulmu\u015ftur. Id : {_id}&quot;);\r\n        }\r\n\r\n        public void Write() =&gt; Console.WriteLine($&quot;Id : {_id}&quot;);\r\n        int _id;\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            ObjectPool&lt;ExampleObject&gt; objectPool = new ObjectPool&lt;ExampleObject&gt;(() =&gt; new ExampleObject(1));\r\n            ExampleObject object1 = objectPool.Get();\r\n            object1.Write();\r\n            objectPool.Return(object1);\r\n\r\n            ExampleObject object2 = objectPool.Get();\r\n            object2.Write();\r\n            objectPool.Return(object2);\r\n        }\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8216;ObjectPool&#8217; s\u0131n\u0131f\u0131 \u00fczerinden olu\u015fturulan &#8216;objectPool&#8217; nesnesine(yani havuza) bir adet &#8216;ExampleObject&#8217; nesnesi verilmekte ve bu nesneye ihtiya\u00e7 duyuldu\u011fu taktirde &#8216;Get&#8217; fonksiyonuyla havuzdan elde edilerek kullan\u0131lmakta, ihtiya\u00e7 neticesinde &#8216;Return&#8217; fonksiyonuyla havuza geri b\u0131rak\u0131larak sonraki ihtiya\u00e7lar i\u00e7in elde tutulmaktad\u0131r.<\/p>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/06\/C-Object-Pooling-Design-PatternObject-Pooling-Tasar\u0131m-Deseni.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16219\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/06\/C-Object-Pooling-Design-PatternObject-Pooling-Tasar\u0131m-Deseni.jpg\" alt=\"C# Object Pooling Design Pattern(Object Pooling Tasar\u0131m Deseni)\" width=\"364\" height=\"59\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/06\/C-Object-Pooling-Design-PatternObject-Pooling-Tasar\u0131m-Deseni.jpg 364w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/06\/C-Object-Pooling-Design-PatternObject-Pooling-Tasar\u0131m-Deseni-300x49.jpg 300w\" sizes=\"auto, (max-width: 364px) 100vw, 364px\" \/><\/a><\/p>\n<blockquote><p><strong>Object Pooling; StringBuilder ve DbContext gibi nesnelerde s\u0131kl\u0131kla tercih edilen bir stratejidir.<\/strong><\/p><\/blockquote>\n<h4><span style=\"color: blue;\">Microsoft.Extensions.ObjectPool<\/span> K\u00fct\u00fcphanesiyle Object Pooling<\/h4>\n<p>Object pooling deseni yukar\u0131daki gibi custom bir \u015fekilde geli\u015ftirilebilece\u011fi gibi ayr\u0131ca Microsoft taraf\u0131ndan hali haz\u0131rda sunulan <em>Microsoft.Extensions.ObjectPool<\/em> k\u00fct\u00fcphanesindeki classlar e\u015fli\u011finde de geli\u015ftirilebilir.<\/p>\n<p>Bunun i\u00e7in ilk olarak bir object pool yaratabilmek ve hacmini belirleyebilmek i\u00e7in provider kullan\u0131lmas\u0131 gerekmektedir. Burada default olarak tasarlanm\u0131\u015f &#8216;<em>DefaultObjectPoolProvider<\/em>&#8216; nesnesi tercih edilebilir. Bu provider t\u00fcr\u00fc sayesinde olu\u015fturulacak olan pool hacmi <code><strong>Environment.ProcessorCount<\/strong><\/code> de\u011ferinin iki kat\u0131 olarak gelmektedir. Ayr\u0131ca nesnelerin yarat\u0131l\u0131\u015f modellemesinin ve kullan\u0131ld\u0131ktan sonra havuza iade edilmesinin davran\u0131\u015f\u0131n\u0131 belirleyen policy\/politika belirlenmesi gerekmektedir. Bunun i\u00e7inde default tasarlanm\u0131\u015f &#8216;<em>DefaultPooledObjectPolicy<\/em>&#8216; nesnesi kullan\u0131labilir. Tabi ki de burada ilgili default s\u0131n\u0131flardan t\u00fcreyen t\u00fcrler olu\u015fturarak ihtiyac\u0131n\u0131za d\u00f6n\u00fck custom yap\u0131lanmalar geli\u015ftirebilir ve kullanabilirsiniz.<\/p>\n<p>\u015e\u00f6yle ki;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class ExampleObject\r\n    {\r\n        public ExampleObject()\r\n        {\r\n            Console.WriteLine($&quot;{nameof(ExampleObject)} nesnesi olu\u015fturulmu\u015ftur. Id : {_id}&quot;);\r\n        }\r\n        public ExampleObject(int id)\r\n        {\r\n            _id = id;\r\n            Console.WriteLine($&quot;{nameof(ExampleObject)} nesnesi olu\u015fturulmu\u015ftur. Id : {_id}&quot;);\r\n        }\r\n\r\n        public void Write() =&gt; Console.WriteLine($&quot;Id : {_id}&quot;);\r\n        int _id;\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            DefaultObjectPoolProvider objectPoolProvider = new DefaultObjectPoolProvider();\r\n            ObjectPool&lt;ExampleObject&gt; objectPool = objectPoolProvider.Create(new DefaultPooledObjectPolicy&lt;ExampleObject&gt;());\/\/Constructor parametresiz olmal\u0131.\r\n            ExampleObject object1 = objectPool.Get();\r\n            object1.Write();\r\n            objectPool.Return(object1);\r\n\r\n            ExampleObject object2 = objectPool.Get();\r\n            object2.Write();\r\n            objectPool.Return(object2);\r\n        }\r\n<\/pre>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/06\/C-Object-Pooling-Design-PatternObject-Pooling-Tasar\u0131m-Deseni-1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16231\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/06\/C-Object-Pooling-Design-PatternObject-Pooling-Tasar\u0131m-Deseni-1.jpg\" alt=\"C# Object Pooling Design Pattern(Object Pooling Tasar\u0131m Deseni)\" width=\"366\" height=\"55\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/06\/C-Object-Pooling-Design-PatternObject-Pooling-Tasar\u0131m-Deseni-1.jpg 366w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/06\/C-Object-Pooling-Design-PatternObject-Pooling-Tasar\u0131m-Deseni-1-300x45.jpg 300w\" sizes=\"auto, (max-width: 366px) 100vw, 366px\" \/><\/a><\/p>\n<h3>Asp.NET Core &#8211; Dependency Injection \u0130le Object Pooling Kullan\u0131m\u0131<\/h3>\n<p>Asp.NET Core uygulamalar\u0131nda Object Pooling tasar\u0131m\u0131 Dependency Injection ile a\u015fa\u011f\u0131daki gibi kullan\u0131labilmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Startup\r\n    {\r\n        .\r\n        .\r\n        .\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            .\r\n            .\r\n            .\r\n            services.AddSingleton&lt;ObjectPoolProvider, DefaultObjectPoolProvider&gt;();\r\n            services.AddSingleton(p =&gt;\r\n            {\r\n                var pool = p.GetService&lt;ObjectPoolProvider&gt;();\r\n                return pool.Create&lt;ExampleObject&gt;();\r\n            });\r\n            .\r\n            .\r\n            .\r\n        }\r\n        .\r\n        .\r\n        .\r\n    }\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere, 11. sat\u0131rda &#8216;ObjectPoolProvider&#8217; talebine kar\u015f\u0131l\u0131k &#8216;DefaultObjectPoolProvider&#8217; nesnesi bildirilmekte ve 12. sat\u0131rda bir \u00f6nceki sat\u0131rda dependency injection servisine eklenen &#8216;ObjectPoolProvider&#8217; nesnesi servisten talep edilerek elde edilen pool provider&#8217;\u0131 \u00fczerinden &#8216;ExampleObject&#8217; nesnesi bar\u0131nd\u0131ran bir &#8216;<em>ObjectPool&lt;ExampleObject&gt;<\/em>&#8216; t\u00fcr\u00fcnden pool(havuz) olu\u015fturulup servise tekrardan eklenmektedir. Haliyle controller s\u0131n\u0131flar\u0131nda a\u015fa\u011f\u0131daki gibi &#8216;<em>ObjectPool&lt;ExampleObject&gt;<\/em>&#8216; t\u00fcr\u00fcnden istek yap\u0131lmas\u0131 ilgili havuzun elde edilip kullan\u0131labilmesi i\u00e7in yeterli olacakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class HomeController : Controller\r\n    {\r\n        private readonly ObjectPool&lt;ExampleObject&gt; _pool;\r\n        public HomeController(ObjectPool&lt;ExampleObject&gt; pool)\r\n        {\r\n            _pool = pool;\r\n        }\r\n\r\n        public IActionResult Page1()\r\n        {\r\n            var e = _pool.Get();\r\n            e.Id = 125;\r\n            e.Write();\r\n            _pool.Return(e);\r\n            return NotFound();\r\n        }\r\n\r\n        public IActionResult Page2()\r\n        {\r\n            var e = _pool.Get();\r\n            e.Write();\r\n            _pool.Return(e);\r\n            return NotFound();\r\n        }\r\n    }\r\n<\/pre>\n<p>\u0130\u015fte bu kadar&#8230;<\/p>\n<p>Nihai olarak Object Pooling&#8217;in, \u00fcretimi ve imhas\u0131 olduk\u00e7a masrafl\u0131 olan bir s\u0131n\u0131f\u0131n \u00fcretilen nesnesini ihtiya\u00e7 do\u011frultusunda birden fazla yerde kullanabilmek ve b\u00f6ylece maliyeti minimize edebilmek i\u00e7in tercih edilen ve ilgili nesnenin tek elden y\u00f6netilebilmesi i\u00e7in singleton olarak tasarlanan bir tasar\u0131m deseni oldu\u011funu g\u00f6rm\u00fc\u015f, incelemi\u015f ve irdelemi\u015f olduk \ud83d\ude42<\/p>\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 OOP temelli geli\u015ftirilen uygulamalarda, yakla\u015f\u0131m\u0131n esas\u0131n\u0131 te\u015fkil eden nesne(object) kavram\u0131n\u0131n yap\u0131sal durumundan yola \u00e7\u0131karak, tekrarl\u0131 kullan\u0131lan nesnelerin \u00fcretim esnas\u0131ndaki maliyetlerine dair \u00e7\u00f6z\u00fcm ama\u00e7l\u0131 geli\u015ftirilmi\u015f Object Pooling Design Pattern \u00fczerine konu\u015fuyor olaca\u011f\u0131z.&#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":16241,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[153],"tags":[3561,3562,3565,3566,3559,3560,3563,3564],"class_list":["post-16170","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-design-pattern","tag-acquire","tag-acquire-object","tag-defaultobjectpoolprovider","tag-defaultpooledobjectpolicy","tag-object-pooling-design-pattern","tag-object-pooling-tasarim-deseni","tag-release","tag-release-object"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/16170","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=16170"}],"version-history":[{"count":70,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/16170\/revisions"}],"predecessor-version":[{"id":16244,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/16170\/revisions\/16244"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/16241"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=16170"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=16170"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=16170"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}