﻿
{"id":4051,"date":"2016-04-17T21:31:01","date_gmt":"2016-04-17T21:31:01","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=4051"},"modified":"2016-04-17T21:31:01","modified_gmt":"2016-04-17T21:31:01","slug":"c-memento-design-patternmemento-tasarim-deseni","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-memento-design-patternmemento-tasarim-deseni\/","title":{"rendered":"C# Memento Design Pattern(Memento Tasar\u0131m Deseni)"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Behavioral Patterns(Davran\u0131\u015fsal Kal\u0131plar) kategorisinde bulunan Memento Design Pattern \u00fczerine i\u00e7erik olu\u015fturaca\u011f\u0131z.<\/p>\n<p>Memento ad\u0131 \u00fczerinde &#8220;hat\u0131ra&#8221;, &#8220;yadigar&#8221; vs.. demektir \ud83d\ude42 Yani anlayaca\u011f\u0131n\u0131z hat\u0131rlay\u0131c\u0131 i\u015flevde bir tasar\u0131m deseni \u00fczerine konu\u015fuyor olaca\u011f\u0131z. Memento Design Pattern, elimizdeki mevcut nesnenin herhangi bir T an\u0131ndaki durumunu kayda alarak, sonradan olu\u015fabilecek de\u011fi\u015fiklikler \u00fczerine tekrardan o kayd\u0131 elde etmemizi sa\u011flayan bir desendir. Burada mevcut nesnenin \u00f6zel bir halinden bahsetmemiz m\u00fcmk\u00fcnd\u00fcr. O hal ilgili tasar\u0131m kal\u0131b\u0131 sayesinde sonradan da elde edilebilecektir.<\/p>\n<p>A\u015fa\u011f\u0131daki UML Diyagram\u0131n\u0131 incelersek e\u011fer;<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/c-memento-design-patternmemento-tasarim-deseni\/c-memento-design-patternmemento-tasarim-deseni\/\" rel=\"attachment wp-att-4052\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4052\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/C-Memento-Design-PatternMemento-Tasar\u0131m-Deseni.png\" alt=\"C# Memento Design Pattern(Memento Tasar\u0131m Deseni)\" width=\"390\" height=\"167\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/C-Memento-Design-PatternMemento-Tasar\u0131m-Deseni.png 390w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/C-Memento-Design-PatternMemento-Tasar\u0131m-Deseni-300x128.png 300w\" sizes=\"auto, (max-width: 390px) 100vw, 390px\" \/><\/a><br \/>\nOriginator, CareTaker ve Memento kavramlar\u0131n\u0131 g\u00f6rece\u011fiz. \u015eimdi diyagram e\u015fli\u011finde bu akt\u00f6rleri a\u00e7\u0131klayal\u0131m.<\/p>\n<ul>\n<li><em><strong>Originator<\/strong><\/em><br \/>\nYarat\u0131c\u0131, mucit, \u00fcretken olarak ifade edebilece\u011fimiz bu nesne kopyas\u0131 saklanacak olan nesneyi ifade etmektedir. Bu nesne, kendi kopyas\u0131n\u0131n olu\u015fturulmas\u0131ndan sorumlu oldu\u011fu gibi geri y\u00fcklenmesinden de sorumludur.<\/li>\n<li><em><strong>Memento<\/strong><\/em><br \/>\nKopyalanacak nesnenin hangi \u00f6zelliklerinin tutulaca\u011f\u0131, bir ba\u015fka deyi\u015fle hangi de\u011ferlerinin i\u015flenece\u011fini belirtti\u011fimiz nesnedir.<\/li>\n<li><em><strong>CareTaker<\/strong><\/em><br \/>\nBak\u0131c\u0131 olarak nitelendirilen bu nesne, Memento referans\u0131n\u0131 bar\u0131nd\u0131rmakta ve yap\u0131lacak t\u00fcm i\u015flemlerin organizasyonunu sa\u011flamaktad\u0131r.<\/li>\n<\/ul>\n<p>\u015eimdi Memento Design Pattern&#8217;i \u00f6rneklendirece\u011fimiz uygulamam\u0131za ge\u00e7elim. \u00d6rne\u011fimizde bir oyunu senaryola\u015ft\u0131raca\u011f\u0131z. Oyunumuz &#8216;g\u00fcya&#8217; SekSek isminde bir oyun olacak ve Level, BolumAdi vs. gibi bilgileri tutacakt\u0131r. Oyun oynand\u0131k\u00e7a ilgili bilgiler de\u011fi\u015fecek, haliyle bizde Memento D. P. uygulayarak de\u011fi\u015fim s\u00fcrecindeki herhangi bir T an\u0131ndaki nesneyi kopyalayarak geri getirece\u011fiz.<\/p>\n<p>\u00d6ncelikle kopyas\u0131 al\u0131nacak Originator nesnemizi olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Seksek\r\n    {\r\n        public int Level { get; set; }\r\n        public string BolumAdi { get; set; }\r\n\r\n        public override string ToString()\r\n        {\r\n            return $&quot;{Level}. level\u0131n {BolumAdi} b\u00f6l\u00fcm\u00fcndeyiz.&quot;;\r\n        }\r\n    }\r\n<\/pre>\n<p>Birazdan bu s\u0131n\u0131f \u00fczerinde g\u00fcncelleme yaparak yeni metodlar ekleyece\u011fiz. \u015eimdilik ekleyece\u011fimiz yeni elemanlarda kullanaca\u011f\u0131m\u0131z Memento ve CareTaker nesnelerini olu\u015ftural\u0131m.<\/p>\n<p>Memento s\u0131n\u0131f\u0131m\u0131z\u0131 olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class SekSekMemento\r\n    {\r\n        public int Level { get; set; }\r\n        public string BolumAdi { get; set; }\r\n    }\r\n<\/pre>\n<p>Kopyalanacak olan SekSek nesnemizin mevcut olan t\u00fcm \u00f6zelliklerini tutaca\u011f\u0131m\u0131z\u0131 belirtmi\u015f olduk. n adet alan\u0131n ister hepsini, istersenizde bir k\u0131sm\u0131n\u0131 Memento nesnesinde belirterek o anki nesnenin bilgilerini tutabilirsiniz.<\/p>\n<p>\u015eimdide CareTaker nesnemizi olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class SekSekCareTaker\r\n    {\r\n        public SekSekMemento Memento { get; set; }\r\n    }\r\n<\/pre>\n<p>Bu noktadan sonra as\u0131l SekSek s\u0131n\u0131f\u0131m\u0131za Memento tasar\u0131m\u0131n\u0131 uygulatt\u0131racak rollerin metodlar\u0131n\u0131 ekleyelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Seksek\r\n    {\r\n        public int Level { get; set; }\r\n        public string BolumAdi { get; set; }\r\n\r\n        public override string ToString()\r\n        {\r\n            return $&quot;{Level}. level\u0131n {BolumAdi} b\u00f6l\u00fcm\u00fcndeyiz.&quot;;\r\n        }\r\n\r\n        \/\/T an\u0131nda nesneyi tutacak olan metod.\r\n        public SekSekMemento Kaydet()\r\n        {\r\n            return new SekSekMemento\r\n            {\r\n                BolumAdi = this.BolumAdi,\r\n                Level = this.Level\r\n            };\r\n        }\r\n\r\n        \/\/T an\u0131ndaki nesneye bizi ula\u015fturacak olan metod.\r\n        public void OncekiniYukle(SekSekMemento Memento)\r\n        {\r\n            this.BolumAdi = Memento.BolumAdi;\r\n            this.Level = Memento.Level;\r\n        }\r\n    }\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, geriye SekSekMemento d\u00f6nen Kaydet metodu ile T an\u0131ndaki nesnemizi yakal\u0131yoruz. Tabi bunu CareTaker nesnesinde Client taraf\u0131nda tutaca\u011f\u0131z. Ayn\u0131 CareTaker nesnesinde tutuyor olaca\u011f\u0131m\u0131z Memento nesnesini OncekiniYukle metodu sayesinde ilgili nesneye entegre ederek, T an\u0131ndaki nesneye(daha do\u011frusu T an\u0131ndaki bilgilere sahip nesneye) eri\u015fmi\u015f olaca\u011f\u0131z.<\/p>\n<p>Ayr\u0131yetten dikkat ederseniz Originator s\u0131n\u0131f\u0131ndan Memento s\u0131n\u0131f\u0131na kar\u015f\u0131 bir ba\u011f\u0131ml\u0131l\u0131k(Dependency) s\u00f6z konusudur.<\/p>\n<p>\u015eimdi yapt\u0131\u011f\u0131m\u0131z i\u015flemleri test edelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Program\r\n    {\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            Seksek oyun = new Seksek();\r\n            oyun.Level = 1;\r\n            oyun.BolumAdi = &quot;Ma\u011fara&quot;;\r\n            Console.WriteLine(oyun.ToString());\r\n\r\n            SekSekCareTaker Taker = new SekSekCareTaker();\r\n            \/\/T an\u0131nda ilgili SekSek nesnesini kopyal\u0131yoruz ve\r\n            \/\/CareTaker nesnesi i\u00e7erisindeki Memento'ya ba\u011fl\u0131yoruz.\r\n            Taker.Memento = oyun.Kaydet();\r\n\r\n            oyun.Level = 2;\r\n            oyun.BolumAdi = &quot;Karayip Adalar\u0131&quot;;\r\n            Console.WriteLine(oyun.ToString());\r\n\r\n            \/\/T an\u0131nda kopyalad\u0131\u011f\u0131m\u0131z nesneye CareTaker \u00fczerinden eri\u015fiyor\r\n            \/\/ve ilgili Originator nesnemize load ediyoruz.\r\n            oyun.OncekiniYukle(Taker.Memento);\r\n\r\n            Console.WriteLine(oyun.ToString());\r\n\r\n            Console.Read();\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki test sonucunda a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc elde etmekteyiz.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/c-memento-design-patternmemento-tasarim-deseni\/c-memento-design-patternmemento-tasarim-deseni-2\/\" rel=\"attachment wp-att-4054\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/C-Memento-Design-PatternMemento-Tasar\u0131m-Deseni-1.png\" alt=\"C# Memento Design Pattern(Memento Tasar\u0131m Deseni)\" width=\"329\" height=\"86\" class=\"aligncenter size-full wp-image-4054\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/C-Memento-Design-PatternMemento-Tasar\u0131m-Deseni-1.png 329w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/C-Memento-Design-PatternMemento-Tasar\u0131m-Deseni-1-300x78.png 300w\" sizes=\"auto, (max-width: 329px) 100vw, 329px\" \/><\/a><\/p>\n<p>Okudu\u011funuz i\u00e7in te\u015fekk\u00fcr ederim&#8230;<\/p>\n<p>Sonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<\/p>\n<p>\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, Behavioral Patterns(Davran\u0131\u015fsal Kal\u0131plar) kategorisinde bulunan Memento Design Pattern \u00fczerine i\u00e7erik olu\u015fturaca\u011f\u0131z. Memento ad\u0131 \u00fczerinde &#8220;hat\u0131ra&#8221;, &#8220;yadigar&#8221; vs.. demektir \ud83d\ude42 Yani anlayaca\u011f\u0131n\u0131z hat\u0131rlay\u0131c\u0131 i\u015flevde bir tasar\u0131m deseni \u00fczerine konu\u015fuyor olaca\u011f\u0131z. Memento Design Pattern, elimizdeki&#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":3223,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[153],"tags":[1052,1081,1053,1080,1077,1078,1079],"class_list":["post-4051","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-design-pattern","tag-behavioral-patterns","tag-caretaker","tag-davranissal-kaliplar","tag-memento","tag-memento-design-pattern","tag-memento-tasarim-deseni","tag-originator"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4051","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=4051"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4051\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3223"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=4051"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=4051"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=4051"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}