﻿
{"id":24762,"date":"2022-04-06T22:07:36","date_gmt":"2022-04-06T22:07:36","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=24762"},"modified":"2022-04-06T22:07:54","modified_gmt":"2022-04-06T22:07:54","slug":"twin-design-patternikiz-tasarim-deseni","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/twin-design-patternikiz-tasarim-deseni\/","title":{"rendered":"Twin Design Pattern(\u0130kiz Tasar\u0131m Deseni)"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde \u00e7oklu kal\u0131t\u0131m\u0131 desteklemeyen C#, Java vs. gibi dillerde \u00e7oklu kal\u0131t\u0131m\u0131 sim\u00fcle etmemizi sa\u011flayan <em>Twin Design Pattern(\u0130kiz Tasar\u0131m Deseni)&#8217;\u0131<\/em> inceliyor olaca\u011f\u0131z.<\/p>\n<p>Twin Pattern, yukar\u0131daki giri\u015f c\u00fcmlesinde de bahsedildi\u011fi \u00fczere \u00e7oklu kal\u0131t\u0131m\u0131 sim\u00fcle edebilmek i\u00e7in standart bir \u00e7\u00f6z\u00fcm sunan bir modeldir. Bu pattern sayesinde \u00e7oklu kal\u0131t\u0131m ile ilgili isim \u00e7ak\u0131\u015fmalar\u0131(name clashes) sorunlar\u0131ndan ka\u00e7\u0131n\u0131labilmekte ve ortaya koydu\u011fu mant\u0131k ile \u00e7oklu kal\u0131t\u0131m\u0131n getirdi\u011fi olas\u0131 bir\u00e7ok sorun \u00f6nlenebilmektedir.<\/p>\n<blockquote><p><em style=\"font-size:12px;color:green;\">\u00c7oklu kal\u0131t\u0131m(multiple inheritance), bir class&#8217;\u0131n birden fazla base class&#8217;\u0131 olmas\u0131 anlam\u0131na gelmektedir. Kimi programc\u0131lar a\u00e7\u0131s\u0131ndan olmazsa olmaz bir \u00f6zellik olarak iddia ediliyor olsa da isim \u00e7at\u0131\u015fmalar\u0131na(name clashes), karma\u015f\u0131kl\u0131\u011fa(complexity) ve t\u00fcm bunlar neticesinde verimsizli\u011fe(inefficiency) yol a\u00e7t\u0131\u011f\u0131 i\u00e7in genel kan\u0131 olarak sorunlara kaynak te\u015fkil etmekte ve bundan dolay\u0131 olumsuz bir nitelik olarak de\u011ferlendirilmektedir. Haliyle bu y\u00fczden C# ve Java gibi dillerde \u00e7oklu kal\u0131t\u0131m dilin do\u011fas\u0131nda engellenmi\u015ftir. B\u00f6ylece zoraki olarak \u00e7oklu kal\u0131t\u0131mdan ar\u0131nd\u0131r\u0131lm\u0131\u015f kod yap\u0131s\u0131 sayesinde yaz\u0131l\u0131m mimarileri do\u011fal olarak daha temiz ve basit hale gelmi\u015f bulunmaktad\u0131r.<\/em><\/p><\/blockquote>\n<p>\u015eimdi gelin, \u00e7oklu kal\u0131t\u0131m\u0131n davran\u0131\u015fsal yap\u0131s\u0131yla Twin pattern&#8217;\u0131 mukayese edebilmek i\u00e7in diyagram \u015femalar\u0131 \u00fczerinden modelleyelim.<\/p>\n<table style=\"font-size:13px;\">\n<thead>\n<tr>\n<th>\u00c7oklu Kal\u0131t\u0131m\u0131n Tipik Yap\u0131s\u0131<\/th>\n<th>Twin Pattern&#8217;\u0131n Yap\u0131s\u0131<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"width:50%;\">\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/04\/Twin-Design-PatternIkiz-Tasarim-Deseni.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/04\/Twin-Design-PatternIkiz-Tasarim-Deseni.png\" alt=\"Twin Design Pattern(\u0130kiz Tasar\u0131m Deseni)\" width=\"300\" height=\"450\" class=\"aligncenter size-full wp-image-24770\" \/><\/a>\n<\/td>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/04\/Twin-Design-PatternIkiz-Tasarim-Deseni-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/04\/Twin-Design-PatternIkiz-Tasarim-Deseni-1.png\" alt=\"Twin Design Pattern(\u0130kiz Tasar\u0131m Deseni)\" width=\"350\" height=\"430\" class=\"aligncenter size-full wp-image-24773\" \/><\/a><\/td>\n<\/tr>\n<tr>\n<td>\nYukar\u0131daki g\u00f6rseli incelerseniz e\u011fer base class rol\u00fcnde olan &#8216;class1&#8217; ve &#8216;class2&#8217; s\u0131n\u0131flar\u0131ndan kal\u0131t\u0131m alan &#8216;class3&#8217; s\u0131n\u0131f\u0131 mevcuttur. &#8216;class1&#8217; s\u0131n\u0131f\u0131 &#8216;m1&#8217;, &#8216;class2&#8217; s\u0131n\u0131f\u0131 &#8216;m2&#8217; ve &#8216;class3&#8217; s\u0131n\u0131f\u0131 &#8216;m3&#8217; memberlar\u0131na sahiptir ve kal\u0131t\u0131m neticesinde &#8216;class3&#8217; s\u0131n\u0131f\u0131nda t\u00fcm memberlar\u0131n aktar\u0131ld\u0131\u011f\u0131 g\u00f6z\u00fckmektedir.\n<\/td>\n<td>Yukar\u0131daki g\u00f6rselde ise &#8216;child1&#8217; ve &#8216;child2&#8217; olmak \u00fczere iki alt s\u0131n\u0131f g\u00f6rmekteyiz. Bu s\u0131n\u0131flar kendi aralar\u0131nda referansla\u015fmaktad\u0131rlar ve \u00fcst s\u0131n\u0131flardaki metotlar\u0131 override edebilmektedirler. B\u00f6ylece &#8216;class1&#8217; ve &#8216;class2&#8217;yi miras alan bu s\u0131n\u0131flar\u0131n kendi aralar\u0131nda haberle\u015fmesi bizlere bir \u00e7oklu kal\u0131t\u0131m senaryosu sa\u011flamaktad\u0131r.<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\" style=\"text-align:left;\">\n\u015e\u00f6yle ki, &#8216;class1&#8217; ile &#8216;class2&#8217;de ki memberlar\u0131n kal\u0131t\u0131msal a\u00e7\u0131dan tekbir s\u0131n\u0131fta toplanmas\u0131n\u0131 istiyorsak bu programatik olarak(C# ve Java i\u00e7in) m\u00fcmk\u00fcn de\u011fil demi\u015ftik. Amma velakin, ilgili s\u0131n\u0131flardan t\u00fcreyen child s\u0131n\u0131flar, o s\u0131n\u0131flar\u0131n memberlar\u0131n\u0131 kal\u0131t\u0131msal olarak miras almaktad\u0131rlar ve ard\u0131ndan kendi aralar\u0131nda haberle\u015ferek bu miraslar\u0131 birbirleriyle payla\u015farak \u00e7oklu kal\u0131t\u0131m<span style=\"color:red;\">(m\u0131\u015f)<\/span> gibi bir davran\u0131\u015f sergilenmesine kap\u0131 aralamaktad\u0131rlar.<\/p>\n<p>Bu durumu a\u015fa\u011f\u0131daki \u00f6rnek kod \u00e7al\u0131\u015fmas\u0131yla daha da net ayd\u0131nlatabiliriz kanaatindeyim;<\/p>\n<p>\u00d6ncelikle kal\u0131t\u0131msal olarak memberlar\u0131na eri\u015fim g\u00f6stermek istedi\u011fimiz base class&#8217;lar\u0131 yaratal\u0131m:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass class1\r\n{\r\n    public void m1()\r\n        =&gt; Console.WriteLine($&quot;{nameof(class1)}.{nameof(class1.m1)} fonksiyonu.&quot;);\r\n}\r\n\r\nclass class2\r\n{\r\n    public void m2()\r\n        =&gt; Console.WriteLine($&quot;{nameof(class2)}.{nameof(class2.m2)} fonksiyonu.&quot;);\r\n}\r\n<\/pre>\n<p>Ard\u0131ndan bu class&#8217;lar\u0131n child&#8217;lar\u0131n\u0131:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass child1 : class1\r\n{\r\n    public child2 child2 { get; set; }\r\n    public void m3()\r\n        =&gt; Console.WriteLine($&quot;{nameof(child1)}.{nameof(child1.m3)} fonksiyonu.&quot;);\r\n}\r\nclass child2 : class2\r\n{\r\n    public child1 child1 { get; set; }\r\n    public void m4()\r\n     =&gt; Console.WriteLine($&quot;{nameof(child2)}.{nameof(child2.m4)} fonksiyonu.&quot;);\r\n}\r\n<\/pre>\n<p>Yukar\u0131daki child s\u0131n\u0131flar\u0131n yap\u0131s\u0131na dikkat ederseniz her ikisi de birbirlerini referans etmektedirler. \u015eimdi bu yap\u0131y\u0131 kullan\u0131rsak:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nchild1 c = new child1();\r\nc.child2 = new child2();\r\nc.m1();\r\nc.child2.m2();\r\nc.m3();\r\nc.child2.m4();\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8216;child1&#8217; s\u0131n\u0131f\u0131 \u00fczerinden hem &#8216;class1&#8217; hem de &#8216;class2&#8217;de ki memberlara eri\u015fim g\u00f6stermi\u015f bulunmaktay\u0131z. Yani sanki &#8216;child1&#8217; her iki s\u0131n\u0131ftan da kal\u0131t\u0131m alm\u0131\u015f gibi bir davran\u0131\u015f sergilemektedir. Tabi bunun yan\u0131nda &#8216;child2&#8217;nin de memberlar\u0131ndan(m4) istifade edebilmektedir. Bu arada yukar\u0131daki kodu derleyip, \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda a\u015fa\u011f\u0131daki gibi bir netice verece\u011fini unutmadan sunal\u0131m.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/04\/Twin-Design-PatternIkiz-Tasarim-Deseni-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/04\/Twin-Design-PatternIkiz-Tasarim-Deseni-2.png\" alt=\"Twin Design Pattern(\u0130kiz Tasar\u0131m Deseni)\" width=\"169\" height=\"94\" class=\"aligncenter size-full wp-image-24786\" \/><\/a>Tabi bu neticenin birebir ayn\u0131s\u0131n\u0131 &#8216;child2&#8217; nesnesini de a\u015fa\u011f\u0131daki gibi kullanarak alabilirdik:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nchild2 c = new child2();\r\nc.child1 = new();\r\nc.child1.m1();\r\nc.m2();\r\nc.child1.m3();\r\nc.m4();\r\n<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Yukar\u0131daki yapt\u0131\u011f\u0131m\u0131z k\u00fc\u00e7\u00fck \u00f6rnek \u00fczerinden dikkat ederseniz e\u011fer Twin nesneler birbirlerine eri\u015febildiklerinden dolay\u0131 client bu nesnelerden sadece birine do\u011frudan di\u011ferine ise o nesne \u00fczerinden dolayl\u0131 bir yoldan eri\u015fim sa\u011flamaktad\u0131r.<\/p>\n<p>Tabi bu pattern&#8217;\u0131n tek s\u0131n\u0131rl\u0131l\u0131\u011f\u0131 Twin nesnelerin, birbirlerine do\u011frudan olan eri\u015fimleri sebebiyle s\u0131k\u0131 bir ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n olmas\u0131d\u0131r. Haa bu ba\u011f\u0131ml\u0131l\u0131k neticesinde birbirlerinin memberlar\u0131n\u0131 da g\u00f6n\u00fcl rahatl\u0131\u011f\u0131yla kullanabildiklerinden dolay\u0131 bu durum g\u00f6z ard\u0131 edilebilmektedir.<\/p>\n<blockquote><p><em style=\"color:gray;\">Twin pattern, kal\u0131t\u0131mdan daha az verimli ve performansl\u0131 olabilir. Ama ihtiyaca binaen kullan\u0131ld\u0131\u011f\u0131 noktalarda bu durum g\u00f6n\u00fcl rahatl\u0131\u011f\u0131yla g\u00f6z ard\u0131 edilebilir.<\/em><\/p><\/blockquote>\n<h4>Ger\u00e7ek Senaryo<\/h4>\n<p>\u015eimdi gelin i\u00e7eri\u011fimizi ger\u00e7ek bir senaryoyla ta\u00e7land\u0131rarak, noktalayal\u0131m.<\/p>\n<div style=\"text-align:center;color:white;font-size:12px;background-color:gray;\"><u style=\"color:yellow;\">SENARYO<\/u><br \/>\nKesme, boyut b\u00fcy\u00fcltme\/k\u00fc\u00e7\u00fcltme, birle\u015ftirme vs. gibi t\u00fcrl\u00fc d\u00f6k\u00fcman i\u015flemleri ger\u00e7ekle\u015ftiren bir uygulama geli\u015ftirdi\u011fimizi d\u00fc\u015f\u00fcnelim. Bu uygulama i\u00e7erisinde &#8216;PDF&#8217; ve &#8216;Excel&#8217; operasyonlar\u0131 ger\u00e7ekle\u015ftirmek i\u00e7in hali haz\u0131rda gelen &#8216;PDFOperation&#8217; ve &#8216;ExcelOperation&#8217; s\u0131n\u0131flar\u0131n\u0131n oldu\u011funu varsayal\u0131m. Bizler ihtiya\u00e7 olarak her iki s\u0131n\u0131ftan da \u00f6zellik ve fonksiyonellikleri alarak, b\u00fcnyesinde toplayan ve b\u00fct\u00fcnsel olarak i\u015flem yapmam\u0131z\u0131 sa\u011flayacak olan bir s\u0131n\u0131fa odaklanaca\u011f\u0131z ve bu ihtiyac\u0131 Twin pattern ile sa\u011fl\u0131yor olaca\u011f\u0131z.<\/div>\n<div style=\"text-align:center;color:white;font-size:12px;\"><u style=\"color:red;\">\u00c7\u00d6Z\u00dcM<\/u><\/div>\n<ul style=\"font-size:11px;\">\n<li><strong><em>Ad\u0131m 1<\/em><\/strong><br \/>\n\u0130lk olarak memberlar\u0131 al\u0131nacak olan &#8216;PDFOperation&#8217; ve &#8216;ExcelOperation&#8217; s\u0131n\u0131flar\u0131n\u0131 sembolik olarak temsil ederek ba\u015flayal\u0131m:<br \/>\n&#8216;PDFOperation&#8217;;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class PDFOperation : IOperation\r\n    {\r\n        public object Convert(object file)\r\n        {\r\n            Console.WriteLine($&quot;{nameof(PDFOperation)}.{nameof(PDFOperation.Convert)} fonksiyonu.&quot;);\r\n            \/\/... Convert operasyonu ...\r\n            return file;\r\n        }\r\n        public object Merge(object&#x5B;] files)\r\n        {\r\n            Console.WriteLine($&quot;{nameof(PDFOperation)}.{nameof(PDFOperation.Merge)} fonksiyonu.&quot;);\r\n            \/\/... Merge operasyonu ...\r\n            return files;\r\n        }\r\n        public object SizeEnlargement(object file)\r\n        {\r\n            Console.WriteLine($&quot;{nameof(PDFOperation)}.{nameof(PDFOperation.SizeEnlargement)} fonksiyonu.&quot;);\r\n            \/\/... SizeEnlargement operasyonu ...\r\n            return file;\r\n        }\r\n        public object SizeReduction(object file)\r\n        {\r\n            Console.WriteLine($&quot;{nameof(PDFOperation)}.{nameof(PDFOperation.SizeReduction)} fonksiyonu.&quot;);\r\n            \/\/... SizeReduction operasyonu ...\r\n            return file;\r\n        }\r\n        public object Splitting(object file)\r\n        {\r\n            Console.WriteLine($&quot;{nameof(PDFOperation)}.{nameof(PDFOperation.Splitting)} fonksiyonu.&quot;);\r\n            \/\/... Splitting operasyonu ...\r\n            return file;\r\n        }\r\n    }\r\n<\/pre>\n<p>&#8216;ExcelOperation&#8217;;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class ExcelOperation : IOperation\r\n    {\r\n        public object Convert(object file)\r\n        {\r\n            Console.WriteLine($&quot;{nameof(ExcelOperation)}.{nameof(ExcelOperation.Convert)} fonksiyonu.&quot;);\r\n            \/\/... Convert operasyonu ...\r\n            return file;\r\n        }\r\n        public object Merge(object&#x5B;] files)\r\n        {\r\n            Console.WriteLine($&quot;{nameof(ExcelOperation)}.{nameof(ExcelOperation.Merge)} fonksiyonu.&quot;);\r\n            \/\/... Merge operasyonu ...\r\n            return files;\r\n        }\r\n        public object SizeEnlargement(object file)\r\n        {\r\n            Console.WriteLine($&quot;{nameof(ExcelOperation)}.{nameof(ExcelOperation.SizeEnlargement)} fonksiyonu.&quot;);\r\n            \/\/... SizeEnlargement operasyonu ...\r\n            return file;\r\n        }\r\n        public object SizeReduction(object file)\r\n        {\r\n            Console.WriteLine($&quot;{nameof(ExcelOperation)}.{nameof(ExcelOperation.SizeReduction)} fonksiyonu.&quot;);\r\n            \/\/... SizeReduction operasyonu ...\r\n            return file;\r\n        }\r\n        public object Splitting(object file)\r\n        {\r\n            Console.WriteLine($&quot;{nameof(ExcelOperation)}.{nameof(ExcelOperation.Splitting)} fonksiyonu.&quot;);\r\n            \/\/... Splitting operasyonu ...\r\n            return file;\r\n        }\r\n    }\r\n<\/pre>\n<p>Tabi normal \u015fartlarda bu s\u0131n\u0131flar kullan\u0131lan k\u00fct\u00fcphane\/dll \u00fczerinden geleceklerdir. Zaten kaynak kodu elimizde olmayan ya da kaynak kodunu bozmak istemedi\u011fimiz s\u0131n\u0131flarda \u00e7oklu kal\u0131t\u0131m senaryolar\u0131n\u0131 uygulayabilmek i\u00e7in Twin pattern kullan\u0131lmaktad\u0131r. Aksi taktirde ilgili s\u0131n\u0131flar\u0131n kaynaklar\u0131 bizdeyse ve eri\u015filebilir bir vaziyetteyse yahut g\u00f6n\u00fcl rahatl\u0131\u011f\u0131yla de\u011fi\u015fiklik yapabiliyorsak direkt olarak ilgili s\u0131n\u0131flarda birbirlerini referans verdirebilir yahut birine di\u011ferinden kal\u0131t\u0131m ald\u0131rarak meseleyi \u00e7\u00f6zebilirdik.\n<\/li>\n<li><strong><em>Ad\u0131m 2<\/em><\/strong><br \/>\nArd\u0131ndan bu s\u0131n\u0131flardan kal\u0131t\u0131m alan ve biryandan da birbirlerini refere eden child s\u0131n\u0131flar\u0131 olu\u015ftural\u0131m:<br \/>\n&#8216;ChildPDFOperation&#8217;;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class ChildPDFOperation : PDFOperation\r\n    {\r\n        public ChildExcelOperation Excel { get; set; }\r\n        public bool SendMail(object file)\r\n        {\r\n            \/\/... SendMail operasyonu ....\r\n            return true;\r\n        }\r\n    }\r\n<\/pre>\n<p>&#8216;ChildExcelOperation&#8217;;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class ChildExcelOperation : ExcelOperation\r\n    {\r\n        public ChildPDFOperation PDF { get; set; }\r\n    }\r\n<\/pre>\n<p>Tabi ki de bu s\u0131n\u0131flar kendi i\u00e7lerinde \u00f6zel memberlar da bar\u0131nd\u0131rabilmektedirler.\n<\/li>\n<li><strong><em>Ad\u0131m 3<\/em><\/strong><br \/>\nVe son olarak child s\u0131n\u0131flardan herhangi birini kullanarak hem PDF hem de Excel operasyonlar\u0131n\u0131 tek nesne \u00fczerinden g\u00f6n\u00fcl rahatl\u0131\u011f\u0131yla y\u00fcr\u00fctelim. <\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nChildPDFOperation pdf = new();\r\npdf.Excel = new();\r\npdf.Convert(null);\r\npdf.Excel.Merge(null);\r\n<\/pre>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/04\/Twin-Design-PatternIkiz-Tasarim-Deseni-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/04\/Twin-Design-PatternIkiz-Tasarim-Deseni-3.png\" alt=\"Twin Design Pattern(\u0130kiz Tasar\u0131m Deseni)\" width=\"264\" height=\"67\" class=\"aligncenter size-full wp-image-24816\" \/><\/a>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere b\u00f6ylece \u00e7oklu kal\u0131t\u0131m senaryosu ba\u015far\u0131yla uygulanm\u0131\u015ft\u0131r.\n<\/li>\n<\/ul>\n<p>Nihai olarak, basit ama ihtiya\u00e7 do\u011frultusunda olduk\u00e7a etkili olan bir pattern&#8217;\u0131 \u00f6rnekler e\u015fli\u011finde incelemi\u015f olduk.<br \/>\nSab\u0131rla e\u015flik etti\u011finiz i\u00e7in te\u015fekk\u00fcr ederim.<\/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<p>Not : Kaynak kodlar\u0131 a\u015fa\u011f\u0131daki Github adresinden edinebilirsiniz.<br \/>\n<a href=\"https:\/\/github.com\/gncyyldz\/TwinDesignPattern\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/gncyyldz\/TwinDesignPattern<\/a><\/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 \u00e7oklu kal\u0131t\u0131m\u0131 desteklemeyen C#, Java vs. gibi dillerde \u00e7oklu kal\u0131t\u0131m\u0131 sim\u00fcle etmemizi sa\u011flayan Twin Design Pattern(\u0130kiz Tasar\u0131m Deseni)&#8217;\u0131 inceliyor olaca\u011f\u0131z. Twin Pattern, yukar\u0131daki giri\u015f c\u00fcmlesinde de bahsedildi\u011fi \u00fczere \u00e7oklu kal\u0131t\u0131m\u0131 sim\u00fcle&#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":24773,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[153],"tags":[4555,4556,750,4553,671,4557,4554,4552],"class_list":["post-24762","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-design-pattern","tag-c-twin","tag-c-twin-design-pattern","tag-design-pattern","tag-ikiz-tasarim-deseni","tag-multiple-inheritance","tag-name-clashes","tag-twin","tag-twin-design-pattern"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24762","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=24762"}],"version-history":[{"count":53,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24762\/revisions"}],"predecessor-version":[{"id":24819,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24762\/revisions\/24819"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/24773"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=24762"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=24762"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=24762"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}