﻿
{"id":22808,"date":"2021-09-13T17:27:10","date_gmt":"2021-09-13T17:27:10","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=22808"},"modified":"2021-09-13T17:27:10","modified_gmt":"2021-09-13T17:27:10","slug":"c-state-design-patternstate-tasarim-deseni","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-state-design-patternstate-tasarim-deseni\/","title":{"rendered":"C# State Design Pattern(State Tasar\u0131m Deseni)"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde Davran\u0131\u015fsal Tasar\u0131m Kal\u0131plar\u0131ndan(Behavioral Patterns) olan State Tasar\u0131m Desenini(State Design Pattern) tam teferruatl\u0131 inceliyor olaca\u011f\u0131z. <em>State pattern nedir? Genellikle hangi tarz senaryolarda ne ama\u00e7la kullan\u0131lmaktad\u0131r? Hangi tasar\u0131m desenleriyle benzerlik g\u00f6stermektedir?<\/em> vs. gibi sorular e\u015fli\u011finde konumuzu irdeleyecek ve hem teorik hem de pratik \u00f6rnekler \u00fczerinden peki\u015ftirmelerimizi ger\u00e7ekle\u015ftirip i\u00e7eri\u011fimizi zenginle\u015ftirece\u011fiz. O halde fazla vakit kaybetmeksizin buyrun ba\u015flayal\u0131m \ud83d\ude42<\/p>\n<h3>State Design Pattern Nedir?<\/h3>\n<p>State Design Pattern, bir nesnenin o anki durumuna ba\u011fl\u0131 olarak \u00e7al\u0131\u015fma zaman\u0131nda(runtime) davran\u0131\u015f\u0131n\u0131 tamamen de\u011fi\u015ftirmesini sa\u011flayan bir tasar\u0131m desenidir. Bu desen sayesinde herhangi bir davran\u0131\u015f\u0131 herhangi bir duruma ba\u011f\u0131ml\u0131 hale getirip y\u00f6netilebilir k\u0131vama getirebilmekteyiz. Bunu daha net anlayabilmek i\u00e7in \u015f\u00f6yle bir \u00f6rnek \u00fczerinden metafor yapabiliriz: Misal, televizyon kumandas\u0131ndaki a\u00e7\u0131l\u0131\u015f ve kapan\u0131\u015f tu\u015funun ayn\u0131 tu\u015f olmas\u0131na ra\u011fmen televizyonun a\u00e7\u0131k yahut kapal\u0131 olmas\u0131 durumlar\u0131na g\u00f6re farkl\u0131 davran\u0131\u015flar sergilemesini d\u00fc\u015f\u00fcnebiliriz. Bu tu\u015fa bas\u0131ld\u0131\u011f\u0131nda televizyon a\u00e7\u0131ksa e\u011fer kapat\u0131lacak yok e\u011fer kapal\u0131ysa a\u00e7\u0131lacakt\u0131r. Haliyle buradaki a\u00e7\u0131lma yahut kapat\u0131lma davran\u0131\u015flar\u0131 televizyonun a\u00e7\u0131k ya da kapal\u0131 olma durumlar\u0131na ba\u011f\u0131ml\u0131l\u0131k sergilemektedirler.<\/p>\n<p>Bir ba\u015fka \u00f6rnek vermemiz gerekirse e\u011fer \u015fu gen\u00e7li\u011fimizde kulland\u0131\u011f\u0131m\u0131z MP3 \u00e7alarlard\u0131r? Hani tek bir oynatma tu\u015fu olan ve o tu\u015fu o anda m\u00fczi\u011fin \u00e7al\u0131p \u00e7almamas\u0131 durumuna g\u00f6re m\u00fczi\u011fi ya ba\u015flatan ya da durduran&#8230; Heh i\u015fte, o tu\u015ftaki m\u00fczi\u011fi ba\u015flatma ya da durdurma davran\u0131\u015flar\u0131 MP3&#8217;te ki m\u00fczi\u011fin \u00e7alma ya da \u00e7almama durumlar\u0131na ba\u011f\u0131ml\u0131l\u0131k g\u00f6stermekte de\u011fil midir? \u00d6yledir dimi&#8230;<\/p>\n<p>Konuyu teoride daha da zenginle\u015ftirebilmek i\u00e7in g\u00fcnl\u00fck hayattan bir misal daha vermek istiyorum. Bu misal de her ay d\u00fczenli bir \u015fekilde ko\u015farak u\u011frad\u0131\u011f\u0131m\u0131z ATM&#8217;lerdeki kart durumudur. ATM, o anda aktif bir kart tak\u0131l\u0131 de\u011filse kart alabilmekte yok e\u011fer kart tak\u0131l\u0131 de\u011filse ba\u015fka bir kart alamamaktad\u0131r. \u0130\u015fte burada da ATM&#8217;ye kart\u0131n tak\u0131l\u0131 olup olmama durumlar\u0131na istinaden kart alabilme ya da alamama davran\u0131\u015flar\u0131 ba\u011f\u0131ml\u0131l\u0131k g\u00f6stergesidir.<\/p>\n<p>Uzun laf\u0131n k\u0131sas\u0131, bir nesnenin herhangi bir anda uygulama i\u00e7erisinde s\u0131n\u0131rl\u0131 say\u0131da farkl\u0131 durumlar\u0131 olabilmektedir. Bu durumlar yukar\u0131da verilen \u00f6rneklerde oldu\u011fu gibi; bir televizyonun a\u00e7\u0131k ya da kapal\u0131 olmas\u0131, bir MP3&#8217;\u00fcn m\u00fczik \u00e7al\u0131yor ya da \u00e7alm\u0131yor olmas\u0131 ya da ATM&#8217;ye bir kart\u0131n tak\u0131l\u0131 olup olmamas\u0131 gibi o uygulaman\u0131n da verdi\u011fi hizmete ve i\u015flevselli\u011fine g\u00f6re \u00f6zel durumlar olabilir. Ve bu durumlar herhangi bir t an\u0131nda de\u011fi\u015fkenlik g\u00f6sterdi\u011fi taktirde(ki g\u00f6sterebilir) de\u011fi\u015fiklik g\u00f6sterilen duruma ba\u011fl\u0131 olarak uygulama davran\u0131\u015f\u0131 de\u011fi\u015ftirmek istenebilir.<\/p>\n<p>\u0130\u015fte bu iste\u011fi tekrar kullan\u0131labilirlik ve okunabilirlik a\u00e7\u0131s\u0131ndan en verimli \u015fekilde State Design Pattern ile ger\u00e7ekle\u015ftirebiliriz.<\/p>\n<h3>Neden State Design Pattern Kullan\u0131lmal\u0131d\u0131r?<\/h3>\n<p>Yaz\u0131l\u0131mlardaki durumlara g\u00f6re davran\u0131\u015f de\u011fi\u015fiklikleri genellikle <code>if-else<\/code> ya da <code>switch case<\/code> gibi kontrol bloklar\u0131 e\u015fli\u011finde ger\u00e7ekle\u015ftirilmektedir. Evet, bu h\u0131zl\u0131 ve kolay bir \u00e7\u00f6z\u00fcmd\u00fcr lakin uzun vadede gelen ihtiya\u00e7lar do\u011frultusunda ne kadar kullan\u0131\u015fs\u0131z ve ba\u011flay\u0131c\u0131 bir y\u00f6ntem oldu\u011fu g\u00f6r\u00fclebilmektedir. Nihayetinde kontrol bloklar\u0131 kod i\u00e7erisinde \u00f6ng\u00f6r\u00fclebilir ko\u015fullar sunmakta lakin irticalen geli\u015fen ihtiya\u00e7lar do\u011frultusunda tekrar kodun geli\u015ftirilmesini gerektirerek koda ba\u011f\u0131ml\u0131 bir yakla\u015f\u0131m gerektirmektedirler. Bu konuyu yaz\u0131m\u0131z\u0131n sonraki sat\u0131rlar\u0131nda \u00f6rneklendirmeyle daha da a\u00e7\u0131yor olaca\u011f\u0131z. \u015eimdilik State Design Pattern&#8217;\u0131, kodu yo\u011fun <code>if-else<\/code>\/<code>switch case<\/code> yap\u0131lar\u0131na bo\u011fmaks\u0131z\u0131n davran\u0131\u015flar\u0131 y\u00f6netebilmek ve yeni durumlarla birlikte olabilecek davran\u0131\u015flar\u0131\/ihtiya\u00e7lar\u0131 h\u0131zl\u0131ca ak\u0131\u015fa\/algoritmaya\/i\u015flevlere ekleyip yeri geldi\u011finde de \u00e7\u0131karabilmek i\u00e7in kullan\u0131lan bir stratejik tasar\u0131m oldu\u011funu bilmemiz yeterlidir.<\/p>\n<p>Buna yukar\u0131da bahsetti\u011fimiz MP3 \u00f6rne\u011fini kod \u00fczerinden \u00f6rnek olarak <code>if-else<\/code> ya da <code>switch case<\/code> yap\u0131lar\u0131 ile vermemiz gayet a\u00e7\u0131klay\u0131c\u0131 olaca\u011f\u0131 kanaatindeyim. MP3 \u00f6rne\u011finin durumlar\u0131na istinaden davran\u0131\u015f detaylar\u0131 neydi hat\u0131rlayal\u0131m&#8230;<\/p>\n<div style=\"text-align:center;\">\n<span style=\"font-size:11px;\"><em>&#8230;tek bir oynatma tu\u015fu olan ve o tu\u015fu o anda m\u00fczi\u011fin \u00e7al\u0131p \u00e7almamas\u0131 durumuna g\u00f6re m\u00fczi\u011fi ya ba\u015flatan ya da durduran&#8230;<\/em><\/span>\n<\/div>\n<p>Bu senaryonun koda aktar\u0131lm\u0131\u015f hali izafi olarak a\u015fa\u011f\u0131daki gibi olacakt\u0131r;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static string mp3State = &quot;Playing&quot;;\r\n        public static void PlayButton()\r\n        {\r\n            if (mp3State == &quot;Playing&quot;)\r\n            {\r\n                Console.WriteLine(&quot;M\u00fczik durduruldu!&quot;);\r\n                mp3State = &quot;Stoping&quot;;\r\n            }\r\n            else if (mp3State == &quot;Stoping&quot;)\r\n            {\r\n                Console.WriteLine(&quot;M\u00fczik ba\u015flat\u0131l\u0131yor!&quot;);\r\n                mp3State = &quot;Playing&quot;;\r\n            }\r\n        }\r\n<\/pre>\n<p><em style=\"font-size:13px;\">Ya hoca <code>if-else<\/code> ile ne g\u00fczel hallediyoruz i\u015fte ne gerek var kurcalamaya!<\/em> dedi\u011finizi duyar gibiyim \ud83d\ude42 K\u0131smen hakl\u0131s\u0131n\u0131z. Lakin yukar\u0131larda bahsetti\u011fim gibi burada condition&#8217;lar artt\u0131k\u00e7a <code>if-else<\/code> kontrol\u00fcndeki y\u00f6netilebilirlik bir yerden sonra arap sa\u00e7\u0131ndan hallice olmaya ba\u015flamaktad\u0131r \ud83d\ude42 Misal elimizdeki MP3&#8217;\u00fc daha da geli\u015ftirdi\u011fimizi varsayal\u0131m ve o tu\u015f \u00fczerinde durumlar\u0131 bir nebze daha artt\u0131ral\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static string mp3State = &quot;Playing&quot;;\r\n        public static void PlayButton()\r\n        {\r\n            if (mp3State == &quot;Playing&quot;)\r\n            {\r\n                Console.WriteLine(&quot;M\u00fczik durduruldu!&quot;);\r\n                mp3State = &quot;Stoping&quot;;\r\n            }\r\n            else if (mp3State == &quot;Stoping&quot;)\r\n            {\r\n                Console.WriteLine(&quot;M\u00fczik de\u011fi\u015ftiriliyor!&quot;);\r\n                mp3State = &quot;Changing&quot;;\r\n            }\r\n            else if(mp3State == &quot;Changing&quot;)\r\n            {\r\n                Console.WriteLine(&quot;M\u00fczik \u00e7al\u0131n\u0131yor!&quot;);\r\n                mp3State = &quot;Playing&quot;;\r\n            }\r\n        }\r\n<\/pre>\n<p>Dikkat ederseniz bu seferde MP3&#8217;\u00fcn tu\u015funa bas\u0131ld\u0131\u011f\u0131nda &#8216;Stoping&#8217; durumuna istinaden m\u00fczik de\u011fi\u015ftirme ve ard\u0131ndan &#8216;Changing&#8217; durumunda m\u00fczi\u011fi \u00e7ald\u0131rma\/ba\u015flatma durumu eklenmi\u015ftir. Dikkat ederseniz art\u0131k buradaki kod haddinden fazla \u015fi\u015fmekte ve daha komplike aksiyonlarda yap\u0131lacak operasyonlar neticesinde y\u00f6netilebilirlik neredeyse s\u0131f\u0131ra do\u011fru meyletmektedir. Bu \u00f6rne\u011fi ayr\u0131yeten sizler <code>switch case<\/code> kombinasyonuyla da deneyip g\u00f6zlemleyebilir ve hatta daha fazla durum kar\u015f\u0131l\u0131\u011f\u0131nda ne gibi bir zorlan\u0131\u015f\u0131n s\u00f6z konusu oldu\u011funu inceleyebilirsiniz.<\/p>\n<p>Ben deniz <code>if-else<\/code> ve <code>switch case<\/code> bloklar\u0131yla geli\u015ftirilen yap\u0131lanmalar\u0131n ne kadar komplike durumlara meydan verdi\u011fini g\u00f6sterebilmek i\u00e7in bu sefer de <code>switch case<\/code> ile farkl\u0131 bir \u00f6rnek ger\u00e7ekle\u015ftiriyor olaca\u011f\u0131m. Bu \u00f6rne\u011fimizde bir belge uygulamas\u0131 \u00fczerinden seyrediyor olacak. Bir belgenin(document) &#8216;Taslak&#8217;, &#8216;Denetleme&#8217; ve &#8216;Yay\u0131nlanma&#8217; olmak \u00fczere \u00fc\u00e7 durumu mevcuttur. Bu belge uygulamas\u0131n\u0131n her bir durumda farkl\u0131 davran\u0131\u015f sergilemesi s\u00f6z konusu olacakt\u0131r.<\/p>\n<ul>\n<li><em style=\"color:orange;\">Taslak<\/em> durumunda belge denetlenir.<\/li>\n<li><em style=\"color:orange;\">Denetleme<\/em> durumunda belge yay\u0131nlan\u0131r.<\/li>\n<li><em style=\"color:orange;\">Yay\u0131nlanma<\/em> durumunda ise herhangi bir i\u015flem ger\u00e7ekle\u015ftirilmez.<\/li>\n<\/ul>\n<p>Hadi gelin bu senaryoyu da koda aktaral\u0131m&#8230;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Document\r\n    {\r\n        string state;\r\n        void Publish()\r\n        {\r\n            switch (state)\r\n            {\r\n                case &quot;draft&quot;:\r\n                    \/\/...belge denetleniyor...\r\n                    state = &quot;moderation&quot;;\r\n                    break;\r\n                case &quot;moderation&quot;:\r\n                    \/\/...belge yay\u0131nlan\u0131yor...\r\n                    state = &quot;published&quot;;\r\n                    break;\r\n                case &quot;published&quot;:\r\n                    \/\/...i\u015flem yok...\r\n                    break;\r\n            }\r\n        }\r\n    }\r\n<\/pre>\n<p>\u0130\u015fte b\u00f6yle&#8230;. Yukar\u0131daki gibi ko\u015fullara dayal\u0131 bir durum kontrol\u00fcn\u00fcn en b\u00fcy\u00fck zay\u0131fl\u0131\u011f\u0131 belge s\u0131n\u0131f\u0131na daha fazla durum ve bu durumlara ba\u011fl\u0131 davran\u0131\u015flar eklemeye ba\u015flad\u0131\u011f\u0131m\u0131zda kendini g\u00f6sterecektir. Zaten bunu \u00f6nceki \u00f6rne\u011fimizde de g\u00f6rm\u00fc\u015ft\u00fck&#8230; \u00d6yle de\u011fil mi?<\/p>\n<p>Yani anlayaca\u011f\u0131n\u0131z bu \u015fekilde <code>if-else<\/code> ya da <code>switch case<\/code> yap\u0131lanmas\u0131 durumlara g\u00f6re korkun\u00e7 ko\u015fullar i\u00e7erecektir ve bu tarz bir kodun bak\u0131m\u0131 olduk\u00e7a zor ve maliyetli olacakt\u0131r. Uygulama geli\u015ftik\u00e7e bu problemler daha da b\u00fcy\u00fcyecek ve t\u00fcm olas\u0131 durumlar\u0131 ve davran\u0131\u015flar\u0131 tasar\u0131m a\u015famas\u0131nda tahmin etmek olduk\u00e7a zor olaca\u011f\u0131 i\u00e7in bu zorluklar ka\u00e7\u0131n\u0131lmaz olarak bizi bekliyor olacakt\u0131r.<\/p>\n<p>Velhas\u0131l, bizler art\u0131k bu ve buna benzer senaryolarda <code>if-else<\/code> ya da <code>switch case<\/code> kal\u0131plar\u0131na dan\u0131\u015fmaktansa daha tasar\u0131msal mant\u0131\u011fa yatk\u0131n olan geli\u015ftirilebilir bir stratejiyi benimsiyor olaca\u011f\u0131z. \u0130\u015fte bu strateji State Design Pattern&#8217;\u0131n ta kendisidir&#8230;<\/p>\n<h3>State Design Pattern Stratejisi<\/h3>\n<p>State Design Pattern, bir nesnenin t\u00fcm olas\u0131 durumlar\u0131 i\u00e7in yeni s\u0131n\u0131flar olu\u015fturmam\u0131z\u0131 ve duruma \u00f6zg\u00fc bir \u015fekilde t\u00fcm davran\u0131\u015flar\u0131 bu s\u0131n\u0131flara \u00e7\u0131karmam\u0131z\u0131(yani davran\u0131\u015flar\u0131 bu s\u0131n\u0131flarda in\u015fa etmenizi) \u00f6nerir. Tabi ki de t\u00fcm davran\u0131\u015flar\u0131 kendi ba\u015f\u0131na uygulamak yerine, context ad\u0131nda bir nesne \u00fczerinden ger\u00e7ekle\u015ftirerek s\u00fcreci daha da efektif hale getirir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni.png\" alt=\"C# State Design Pattern(State Tasar\u0131m Deseni)\" width=\"591\" height=\"215\" class=\"aligncenter size-full wp-image-22845\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni.png 591w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-300x109.png 300w\" sizes=\"auto, (max-width: 591px) 100vw, 591px\" \/><\/a><br \/>\nYukar\u0131daki UML diyagram\u0131na g\u00f6z atarsan\u0131z e\u011fer State Design Pattern&#8217;\u0131n genel stratejisini g\u00f6rebilirsiniz. Dikkat ederseniz bu stratejide <code style=\"color:green;font-size:14px;\">Context<\/code>, <code style=\"color:green;font-size:14px;\">State<\/code> ve <code style=\"color:green;font-size:14px;\">Concrete State<\/code> olmak \u00fczere \u00fc\u00e7 akt\u00f6r mevcuttur. Bu akt\u00f6rlerin kimler oldu\u011funu a\u00e7\u0131klamam\u0131z gerekirse e\u011fer;<\/p>\n<ul>\n<li><em style=\"color:green;\">Context<\/em><br \/>\nState Design Pattern&#8217;\u0131 kullanacak client&#8217;lar taraf\u0131ndan kullan\u0131lacak olan s\u0131n\u0131ft\u0131r. Duruma \u00f6zel t\u00fcm \u00e7al\u0131\u015fmalar\u0131 ve davran\u0131\u015flar\u0131 delege eder. Context s\u0131n\u0131f\u0131, <code style=\"color:green;font-size:14px;\">Concrete State<\/code> nesneleri ile <code style=\"color:green;font-size:14px;\">State<\/code> aray\u00fcz\u00fcn\u00fcn referans\u0131 arac\u0131l\u0131\u011f\u0131yla ileti\u015fim kurmaktad\u0131r. Dolay\u0131s\u0131yla mevcut duruma g\u00f6re davran\u0131\u015f\u0131 sa\u011flayan <code style=\"color:green;font-size:14px;\">Concrete State<\/code> nesnesini tuttu\u011fundan dolay\u0131 client&#8217;lar state nesnelerine do\u011frudan eri\u015femezler.\n<\/li>\n<li><em style=\"color:green;\">State<\/em><br \/>\nSenaryoya uygun t\u00fcm durumlara \u00f6zg\u00fc davran\u0131\u015flar\u0131n tan\u0131mland\u0131\u011f\u0131 aray\u00fczd\u00fcr. Abstract class ya da interface olarak tasarlan\u0131r. T\u00fcm <code style=\"color:green;font-size:14px;\">Concrete State<\/code> s\u0131n\u0131flar\u0131 i\u00e7in temel(base) oldu\u011fu i\u00e7in implemente edilir. De\u011fi\u015ftirilebilir i\u015flevselli\u011fe eri\u015febilmek i\u00e7in <code style=\"color:green;font-size:14px;\">Context<\/code> nesnesi taraf\u0131ndan kullan\u0131l\u0131r.\n<\/li>\n<li><em style=\"color:green;\">Concrete State<\/em><br \/>\n<code style=\"color:green;font-size:14px;\">State<\/code> aray\u00fcz\u00fcn\u00fc uygulayan somut nesnelerdir. <code style=\"color:green;font-size:14px;\">Context<\/code> nesnesi taraf\u0131ndan kullan\u0131lacak olan ger\u00e7ek i\u015flevsellikleri sa\u011flar. Her Concrete State s\u0131n\u0131f\u0131 esas\u0131nda bir durumu ifade edecek \u015fekilde olu\u015fturulur ve o durumu uygulanabilen davran\u0131\u015f\u0131 sa\u011flar. Ayr\u0131ca o anki durumun de\u011fi\u015fmesine neden olan talimatlar\u0131 da i\u00e7erebilir. Concrete State nesneleri, <code style=\"color:green;font-size:14px;\">Context<\/code> nesnesine referans vererek ula\u015fabilir. Burada \u00f6nemli olan hem <code style=\"color:green;font-size:14px;\">Context<\/code>&#8216;in hem de <code style=\"color:green;font-size:14px;\">Concrete State<\/code>&#8216;in Context&#8217;in sonraki durumunu ayarlayabiliyor olmas\u0131d\u0131r.\n<\/li>\n<\/ul>\n<p>\u015eimdi ilgili pattern&#8217;\u0131n stratejisini teorik olarak izah ettikten sonra s\u0131ra birka\u00e7 senaryo e\u015fli\u011finde pratiksel olarak \u00f6rneklendirmeye gelmi\u015ftir.<\/p>\n<h6 style=\"color:red;text-align:center;\">1. Senaryo<\/h6>\n<div style=\"background-color:gray;color:yellow;text-align:center;font-size:11px;line-height: 1.5;\">\nBu senaryomuz bir ATM&#8217;den para \u00e7ekme senaryosudur. Genel i\u015flevsellik a\u015fa\u011f\u0131daki gibi olacakt\u0131r;<br \/>\nKullan\u0131c\u0131 ATM&#8217;ye hesap kart\u0131n\u0131 takacak ve ard\u0131ndan pin de\u011ferini girerek belirtti\u011fi mebla\u011fda paray\u0131 \u00e7ekmek isteyecektir.<br \/>\nTabi bu s\u00fcre\u00e7 a\u015fa\u011f\u0131daki durumlara istinaden ger\u00e7ekle\u015ftirilecektir;<\/p>\n<ul style=\"text-align:left;\">\n<li>E\u011fer ATM&#8217;de bir kart tak\u0131l\u0131 de\u011filse herhangi bir i\u015flem yap\u0131lmayacak ve ilk olarak kullan\u0131c\u0131dan kart\u0131n tak\u0131lmas\u0131 istenecektir. Kart\u0131n tak\u0131l\u0131 olmad\u0131\u011f\u0131 bu durumu <span style=\"color:blue;\">(NoCard)<\/span> s\u0131n\u0131f\u0131 ile temsil edece\u011fiz.<\/li>\n<li>Kart tak\u0131ld\u0131\u011f\u0131 taktirde durum <span style=\"color:blue;\">(HasCard)<\/span>&#8216;a ge\u00e7ecektir.<\/li>\n<li>Kart tak\u0131l\u0131yken;\n<ul>\n<li>Kullan\u0131c\u0131 kart\u0131 \u00e7\u0131kar\u0131rsa tekrardan mevcut durum <span style=\"color:blue;\">(NoCard)<\/span>&#8216;a ge\u00e7ecektir.<\/li>\n<li>Kullan\u0131c\u0131 ba\u015fka bir kart takmaya \u00e7al\u0131\u015f\u0131rsa ayn\u0131 anda birden fazla kart tak\u0131lamayaca\u011f\u0131na dair kullan\u0131c\u0131 uyar\u0131lacakt\u0131r.<\/li>\n<li>Kullan\u0131c\u0131 pin giriyorsa do\u011frulu\u011fu kontrol edilecektir. E\u011fer do\u011fruysa durum <span style=\"color:blue;\">(HasPin)<\/span>&#8216;e \u00e7ekilecek yok e\u011fer de\u011filse pinin ge\u00e7ersiz oldu\u011fu s\u00f6ylenerek kart \u00e7\u0131kar\u0131lacak ve durum <span style=\"color:blue;\">(NoCard)<\/span>&#8216;a \u00e7ekilecektir.<\/li>\n<li>E\u011fer pin girilmeksizin direkt para \u00e7ekme talebinde bulunulursa \u00f6nce pin girilmesi gerekti\u011fi bildirilecektir.<\/li>\n<\/ul>\n<\/li>\n<li>Girilen pin do\u011fruysa e\u011fer;\n<ul>\n<li>Kullan\u0131c\u0131 tekrardan pin girmeye \u00e7al\u0131\u015f\u0131yorsa e\u011fer zaten mevcut bir pin de\u011ferinin var oldu\u011fu bildirilecektir.<\/li>\n<li>E\u011fer kullan\u0131c\u0131 para \u00e7ekme talebinde bulunursa ATM&#8217;de ki paraya g\u00f6re \u00e7ekim i\u015flemi ger\u00e7ekle\u015ftirilecektir. \u00c7ekilmek istenen para ATM&#8217;nin o anki bakiyesi taraf\u0131ndan kar\u015f\u0131lanabiliyorsa \u00e7ekilebilecek yok e\u011fer kar\u015f\u0131lanm\u0131yorsa(yani ATM&#8217;de ki paradan fazla ise) duruma dair uygun uyar\u0131 verilecektir. Her iki durumda da mevcut durum <span style=\"color:blue;\">(NoCard)<\/span>&#8216;a \u00e7ekilecek ve kart \u00e7\u0131kar\u0131larak kullan\u0131c\u0131ya teslim edilecektir.<\/li>\n<\/ul>\n<\/li>\n<li>E\u011fer ATM&#8217;de ki para s\u0131f\u0131rland\u0131ysa yahut s\u0131f\u0131r\u0131n alt\u0131na d\u00fc\u015ft\u00fcyse durum <span style=\"color:blue;\">(NoCash)<\/span>&#8216;e \u00e7ekilecek ve t\u00fcm i\u015flemlerde kullan\u0131c\u0131ya ATM&#8217;de para olmad\u0131\u011f\u0131na dair bilgi verilecektir.<\/li>\n<\/ul>\n<\/div>\n<table style=\"font-size:11px;line-height: 1.5;width:70%;\">\n<thead>\n<tr>\n<th colspan=\"2\">UYGULAMADAK\u0130 T\u00dcM DURUMLAR<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align:left;\"><strong>NoCard<\/strong><\/td>\n<td style=\"text-align:left;\">ATM&#8217;ye kart\u0131n tak\u0131l\u0131 olmad\u0131\u011f\u0131 durumu ifade eder.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\"><strong>HasCard<\/strong><\/td>\n<td style=\"text-align:left;\">ATM&#8217;ye kart\u0131n tak\u0131l\u0131 oldu\u011fu durumu ifade eder.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\"><strong>HasPin<\/strong><\/td>\n<td style=\"text-align:left;\">Kullan\u0131c\u0131 taraf\u0131ndan do\u011frulanm\u0131\u015f pin de\u011ferinin girildi\u011fi durumu ifade eder.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\"><strong>NoCash<\/strong><\/td>\n<td style=\"text-align:left;\">ATM&#8217;de hi\u00e7 para kalmad\u0131\u011f\u0131 durumu ifade eder.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h6 style=\"color:red;text-align:center;\">1. Senaryo \u00c7\u00f6z\u00fcm<\/h6>\n<p>Senaryomuza g\u00f6z atarsan\u0131z e\u011fer bu tarz bir \u00e7al\u0131\u015fman\u0131n <code>if-else<\/code>\/<code>switch case<\/code> yap\u0131lanmalar\u0131yla in\u015fa edilebilmesi i\u00e7in ciddi bir ko\u015ful patlamas\u0131n\u0131n ya\u015fanabilece\u011finin san\u0131r\u0131m hepiniz fark\u0131ndas\u0131n\u0131z&#8230; Lakin \u015fimdi uygulayaca\u011f\u0131m\u0131z State Design Pattern ile bu ve buna benzer duruma ba\u011fl\u0131 farkl\u0131 davran\u0131\u015flar\u0131n sergilendi\u011fi t\u00fcm \u00e7al\u0131\u015fmalar\u0131 nas\u0131l rahatl\u0131kla yapabildi\u011fimizi hep beraber g\u00f6zlemleyece\u011fiz.<\/p>\n<p>\u015eimdi \u00e7\u00f6z\u00fcme ilk olarak uygulamadaki durumlara \u00f6zg\u00fc davran\u0131\u015flar\u0131 temsil edecek olan <code style=\"color:green;font-size:14px;\">State<\/code> nesnesini olu\u015fturarak ba\u015flayal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/ State\r\n    abstract class ATMState\r\n    {\r\n        public abstract void InsertCard(ATMMachine context);\r\n        public abstract void EjectCard(ATMMachine context);\r\n        public abstract void InsertPin(int pin, ATMMachine context);\r\n        public abstract void RequestCash(int cashToWithdraw, ATMMachine context);\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funa g\u00f6z atarsan\u0131z e\u011fer &#8216;ATMState&#8217; isimli abstract class tan\u0131mlanm\u0131\u015ft\u0131r ve i\u00e7erisinde belirli davran\u0131\u015flar\u0131 sergileyece\u011fimiz operasyonlar mevcuttur. Bu operasyonlar\u0131 k\u0131saca izah etmemiz gerekirse e\u011fer;<\/p>\n<ul>\n<li><strong><em>InsertCard<\/em><\/strong> : ATM&#8217;ye kart\u0131n tak\u0131lmas\u0131 davran\u0131\u015f\u0131n\u0131 ger\u00e7ekle\u015ftirir.<\/li>\n<li><strong><em>EjectCard<\/em><\/strong> : ATM&#8217;den kart\u0131n \u00e7\u0131kar\u0131lmas\u0131 davran\u0131\u015f\u0131n\u0131 ger\u00e7ekle\u015ftirir.<\/li>\n<li><strong><em>InsertPin<\/em><\/strong> : Pin girilmesi davran\u0131\u015f\u0131n\u0131 ger\u00e7ekle\u015ftirir.<\/li>\n<li><strong><em>RequestCash<\/em><\/strong> : Pe\u015fin para talep etme davran\u0131\u015f\u0131 ger\u00e7ekle\u015ftirir.<\/li>\n<\/ul>\n<p>Ayr\u0131ca her bir metot &#8216;ATMMachine&#8217; t\u00fcr\u00fcnden context parametresi almaktad\u0131r. \u0130\u015fte bu parametredeki nesne bizim uygulad\u0131\u011f\u0131m\u0131z stratejideki <code style=\"color:green;font-size:14px;\">Context<\/code> nesnesinin ta kendisidir. Birazdan bu nesnenin i\u00e7eri\u011fini de olu\u015fturdu\u011fumuzda g\u00f6receksiniz ki, bu &#8216;ATMState&#8217; nesnesinin referans\u0131 \u00fczerinden <code style=\"color:green;font-size:14px;\">Concrete State<\/code> nesnelerine eri\u015fim sa\u011flay\u0131p i\u015flemleri ger\u00e7ekle\u015ftirecektir.<\/p>\n<p>Haliyle \u015fimdi <code style=\"color:green;font-size:14px;\">Context<\/code> s\u0131n\u0131f\u0131m\u0131za kar\u015f\u0131l\u0131k gelen &#8216;ATMMachine&#8217; s\u0131n\u0131f\u0131n\u0131 olu\u015fturmam\u0131z yerinde olacakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Context\r\n    class ATMMachine\r\n    {\r\n        ATMState state = new NoCard();\r\n        public ATMState State { set =&gt; state = value; }\r\n        \/\/\/ &lt;summary&gt;\r\n        \/\/\/ CashInMachine : ATM'de ki pe\u015fin paray\u0131 ifade eder.\r\n        \/\/\/ &lt;\/summary&gt;\r\n        public int CashInMachine { get; set; } = 2000;\r\n        \/\/\/ &lt;summary&gt;\r\n        \/\/\/ CorrectPinEntered : Pin'in girilip girilmedi\u011fini kontrol eder.\r\n        \/\/\/ &lt;\/summary&gt;\r\n        public bool CorrectPinEntered { get; set; } = false;\r\n        public void InsertCard()\r\n            =&gt; state.InsertCard(this);\r\n        public void EjectCard()\r\n            =&gt; state.EjectCard(this);\r\n        public void InsertPin(int pin)\r\n            =&gt; state.InsertPin(pin, this);\r\n        public void RequestCash(int cashToWithdraw)\r\n            =&gt; state.RequestCash(cashToWithdraw, this);\r\n    }\r\n<\/pre>\n<p>Evet, yukar\u0131da olu\u015fturulan &#8216;ATMMachine&#8217; s\u0131n\u0131f\u0131 bizim <code style=\"color:green;font-size:14px;\">Context<\/code> s\u0131n\u0131f\u0131m\u0131zd\u0131r. Dikkat ederseniz bu s\u0131n\u0131f i\u00e7erisinde 4. sat\u0131rda bir &#8216;ATMState&#8217; referans\u0131 mevcut ve ilk olarak default durumun &#8216;NoCard&#8217; \u015feklinde ayarland\u0131\u011f\u0131n\u0131 g\u00f6r\u00fcyoruz. Bu referans yukar\u0131da ki paragraflarda da bahsetmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131m gibi <code style=\"color:green;font-size:14px;\">Context<\/code>&#8216;in <code style=\"color:green;font-size:14px;\">Concrete State<\/code> nesneleriyle ileti\u015fim kuraca\u011f\u0131 bir arac\u0131 olacakt\u0131r. Ayr\u0131ca 13 ile 21. sat\u0131r aral\u0131\u011f\u0131ndaki metotlara nazar eylerseniz e\u011fer bu metotlar ilgili ATM&#8217;nin davran\u0131\u015flar\u0131n\u0131 tetikleyecek olan operatif fonksiyonlard\u0131r. Ama burada \u00f6nemli bir noktaya dikkatinizi \u00e7ekerim ki, bu metotlar <code style=\"color:green;font-size:14px;\">State<\/code> nesnesindekilerle birebir ayn\u0131 isimde olsalar da i\u015flevsel a\u00e7\u0131dan k\u00fclliyen farkl\u0131d\u0131rlar. Misal &#8216;ATMMachine&#8217;de ki &#8216;InserCard&#8217; metodu kullan\u0131c\u0131n\u0131n ATM&#8217;de ki davran\u0131\u015f\u0131n\u0131 temsil ederken, bu metodun tetikledi\u011fi &#8216;ATMState&#8217; i\u00e7erisindeki &#8216;InsertCard&#8217; metodu ise o anki duruma istinaden ger\u00e7ekle\u015ftirilen yaz\u0131l\u0131m\u0131n(ATM&#8217;nin) davran\u0131\u015f\u0131n\u0131 temsil etmektedir. Bu fark \u00f6nemli! Tabi bu fark\u0131 daha iyi ortaya koyabilmek i\u00e7in &#8216;ATMMachine&#8217;de ki bu metotlar\u0131 farkl\u0131 \u015fekilde de isimlendirebilirdik \ud83d\ude42<\/p>\n<p>Ayr\u0131ca 9. sat\u0131rdaki &#8216;CashInMachine&#8217; property&#8217;sinin ATM&#8217;de ki bakiyeye kar\u015f\u0131l\u0131k geldi\u011fine ve 13. sat\u0131rdaki &#8216;CorrectPinEntered&#8217; property&#8217;sinin kullan\u0131c\u0131 taraf\u0131ndan girilen pin&#8217;in do\u011frulan\u0131p do\u011frulanmad\u0131\u011f\u0131n\u0131 tuttu\u011funa dair alanlar oldu\u011funu bilmenizde fayda var.<\/p>\n<p>T\u00fcm bu in\u015falardan sonra s\u0131rada durum nesnelerini yani <code style=\"color:green;font-size:14px;\">Concrete State<\/code>&#8216;leri olu\u015fturmak vard\u0131r.<br \/>\n&#8216;NoCard&#8217;;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Concrete State\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ Kart\u0131n tak\u0131l\u0131 olmad\u0131\u011f\u0131 durumu ifade eden s\u0131n\u0131ft\u0131r.\r\n    \/\/\/ &lt;\/summary&gt;\r\n    class NoCard : ATMState\r\n    {\r\n        public override void EjectCard(ATMMachine context)\r\n            =&gt; Console.WriteLine(&quot;L\u00fctfen \u00f6nce kart\u0131 tak\u0131n\u0131z.&quot;);\r\n        public override void InsertCard(ATMMachine context)\r\n        {\r\n            Console.WriteLine(&quot;L\u00fctfen pin giriniz.&quot;);\r\n            context.State = new HasCard();\r\n        }\r\n        public override void InsertPin(int pin, ATMMachine context)\r\n            =&gt; Console.WriteLine(&quot;L\u00fctfen \u00f6nce kart\u0131 tak\u0131n\u0131z.&quot;);\r\n        public override void RequestCash(int cashToWithdraw, ATMMachine context)\r\n            =&gt; Console.WriteLine(&quot;L\u00fctfen \u00f6nce kart\u0131 tak\u0131n\u0131z.&quot;);\r\n    }\r\n<\/pre>\n<p>ATM&#8217;de kart\u0131n olmad\u0131\u011f\u0131 durumu ifade eden &#8216;NoCard&#8217; s\u0131n\u0131f\u0131 kart olmad\u0131\u011f\u0131ndan dolay\u0131 &#8216;EjectCard&#8217;, &#8216;InsertPin&#8217; ve &#8216;RequestCash&#8217; metotlar\u0131nda \u00f6nce kart\u0131n tak\u0131lmas\u0131 gerekti\u011fine dair mesaj vermekte ve do\u011fal olarak sadece &#8216;InsertCard&#8217; metoduyla i\u015flem ger\u00e7ekle\u015ftirerek kart tak\u0131ld\u0131ktan sonra pin giriniz mesaj\u0131n\u0131 vererek durumu <code style=\"color:green;font-size:14px;\">Context<\/code> \u00fczerinden &#8216;HasCard&#8217;a \u00e7ekmektedir.<\/p>\n<p>&#8216;HasCard&#8217;;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Concrete State\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ Kart\u0131n tak\u0131l\u0131 oldu\u011fu s\u0131n\u0131f\u0131 ifade eden s\u0131n\u0131ft\u0131r.\r\n    \/\/\/ &lt;\/summary&gt;\r\n    class HasCard : ATMState\r\n    {\r\n        public override void EjectCard(ATMMachine context)\r\n        {\r\n            Console.WriteLine(&quot;Kart \u00e7\u0131kar\u0131lm\u0131\u015ft\u0131r.&quot;);\r\n            context.State = new NoCard();\r\n        }\r\n        public override void InsertCard(ATMMachine context)\r\n            =&gt; Console.WriteLine(&quot;Ayn\u0131 anda birden fazla kart takamazs\u0131n\u0131z!&quot;);\r\n        public override void InsertPin(int pin, ATMMachine context)\r\n        {\r\n            if (pin == 123)\r\n            {\r\n                Console.WriteLine(&quot;Pin do\u011fruland\u0131!&quot;);\r\n                context.CorrectPinEntered = true;\r\n                context.State = new HasPin();\r\n            }\r\n            else\r\n            {\r\n                Console.WriteLine(&quot;Ge\u00e7ersiz pin girildi!&quot;);\r\n                context.CorrectPinEntered = false;\r\n                Console.WriteLine(&quot;Kart \u00e7\u0131kar\u0131lm\u0131\u015ft\u0131r.&quot;);\r\n                context.State = new NoCard();\r\n            }\r\n        }\r\n        public override void RequestCash(int cashToWithdraw, ATMMachine context)\r\n            =&gt; Console.WriteLine(&quot;L\u00fctfen \u00f6nce pini giriniz.&quot;);\r\n    }\r\n<\/pre>\n<p>ATM&#8217;de kart\u0131n tak\u0131l\u0131 oldu\u011fu durumu ifade eden &#8216;HasCard&#8217; s\u0131n\u0131f\u0131 kart oldu\u011fu i\u00e7in &#8216;EjectCard&#8217; ve &#8216;InsertPin&#8217; metotlar\u0131nda s\u0131ras\u0131yla kart \u00e7\u0131karma ve pin do\u011frulama i\u015flemlerini ger\u00e7ekle\u015ftirmektedir. &#8216;EjectCard&#8217; operasyonu ile kart \u00e7\u0131kar\u0131ld\u0131\u011f\u0131nda durumu &#8216;NoCard&#8217;a \u00e7ekmektedir. &#8216;InsertPin&#8217; operasyonunda ise pinin do\u011frulanmas\u0131 e\u015fli\u011finde <code style=\"color:green;font-size:14px;\">Context<\/code> s\u0131n\u0131f\u0131ndaki &#8216;CorrectPinEntered&#8217; property&#8217;sine &#8216;true&#8217; de\u011feri verilerek ba\u015far\u0131l\u0131 bir pin de\u011feri girildi\u011fi bildirilmekte ve durum &#8216;HasPin&#8217;e \u00e7ekilmektedir. Yok e\u011fer pin do\u011frulanm\u0131yorsa ilgili property&#8217;e &#8216;false&#8217; de\u011feri verilmekte ve durum &#8216;NoCard&#8217;a \u00e7ekilerek kart \u00e7\u0131kar\u0131lmaktad\u0131r. &#8216;RequestCash&#8217; metodunda ise daha bu durumda ATM&#8217;den para \u00e7ekme i\u015flemi olmayaca\u011f\u0131na g\u00f6re pin girilmesi gerekti\u011fine dair kullan\u0131c\u0131 uyar\u0131lmaktad\u0131r.<\/p>\n<p>&#8216;HasPin&#8217;;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Concrete State\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ Pin'in oldu\u011fu durumu ifade eden s\u0131n\u0131ft\u0131r.\r\n    \/\/\/ &lt;\/summary&gt;\r\n    class HasPin : ATMState\r\n    {\r\n        public override void EjectCard(ATMMachine context)\r\n        {\r\n            Console.WriteLine(&quot;Kart \u00e7\u0131kar\u0131lm\u0131\u015ft\u0131r.&quot;);\r\n            context.State = new NoCard();\r\n        }\r\n        public override void InsertCard(ATMMachine context)\r\n            =&gt; Console.WriteLine(&quot;Ayn\u0131 anda birden fazla kart takamazs\u0131n\u0131z!&quot;);\r\n        public override void InsertPin(int pin, ATMMachine context)\r\n            =&gt; Console.WriteLine(&quot;Do\u011frulanm\u0131\u015f bir pin zaten girilmi\u015ftir.&quot;);\r\n        public override void RequestCash(int cashToWithdraw, ATMMachine context)\r\n        {\r\n            if (cashToWithdraw &gt; context.CashInMachine)\r\n            {\r\n                Console.WriteLine(&quot;\u00c7ekmek istenen tutar adil bedeli a\u015fmaktad\u0131r.&quot;);\r\n                Console.WriteLine(&quot;Kart \u00e7\u0131kar\u0131lm\u0131\u015ft\u0131r.&quot;);\r\n                context.State = new NoCard();\r\n            }\r\n            else\r\n            {\r\n                Console.WriteLine($&quot;{cashToWithdraw} tutar\u0131nda para \u00e7ekilmi\u015ftir.&quot;);\r\n                context.CashInMachine -= cashToWithdraw; \/\/ATM'de ki para g\u00fcncelleniyor.\r\n                Console.WriteLine(&quot;Kart \u00e7\u0131kar\u0131lm\u0131\u015ft\u0131r.&quot;);\r\n                context.State = new NoCard();\r\n                Console.WriteLine($&quot;ATM'de kalan para : {context.CashInMachine}&quot;);\r\n\r\n                if (context.CashInMachine &lt;= 0)\r\n                    context.State = new NoCash();\r\n            }\r\n        }\r\n    }\r\n<\/pre>\n<p>Ba\u015far\u0131l\u0131 bir pin de\u011ferinin girildi\u011fini ifade eden &#8216;HasPin&#8217; s\u0131n\u0131f\u0131 i\u00e7erisinde &#8216;EjectCard&#8217;, &#8216;InsertCard&#8217; ve &#8216;InsertPin&#8217; metotlar\u0131nda olmas\u0131 gereken i\u015flemleri ger\u00e7ekle\u015ftirip, gerekli mesajlarla kullan\u0131c\u0131y\u0131 uyarmaktayken, esas son a\u015fama olan &#8216;RequestCash&#8217; metodunda ise para \u00e7ekim i\u015flemini ger\u00e7ekle\u015ftirmektedir. Burada 17 ile 34. sat\u0131r aral\u0131\u011f\u0131na g\u00f6z at\u0131l\u0131rsa e\u011fer kullan\u0131c\u0131 taraf\u0131ndan \u00e7ekilmek istenen para(cashToWithdraw) ATM&#8217;de ki paradan(CashInMachine) fazla ise kullan\u0131c\u0131 uyar\u0131lmakta ve kart \u00e7\u0131kar\u0131larak durum &#8216;NoCard&#8217;a \u00e7ekilmektedir. Yok e\u011fer fazla de\u011filse ATM&#8217;de ki para, \u00e7ekilmek istenen miktar kadar d\u00fc\u015f\u00fcr\u00fclerek g\u00fcncellenmekte ve gerekli mesajlar verildikten sonra kart \u00e7\u0131kar\u0131larak durum yine &#8216;NoCard&#8217;a \u00e7ekilmektedir.<\/p>\n<p>32. sat\u0131rda ise ATM&#8217;nin mevcut bakiyesi 0 veya 0&#8217;\u0131n alt\u0131nda ise o anki durum &#8216;NoCash&#8217;e \u00e7ekilerek art\u0131k ATM&#8217;de para kalmad\u0131\u011f\u0131 ifade edilmektedir.<\/p>\n<p>&#8216;NoCash&#8217;;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Concrete State\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ ATM'de paran\u0131n 0'a e\u015fit veya k\u00fc\u00e7\u00fck oldu\u011fu durumlar\u0131 ifade eder.\r\n    \/\/\/ &lt;\/summary&gt;\r\n    class NoCash : ATMState\r\n    {\r\n        public override void EjectCard(ATMMachine context)\r\n         =&gt; Console.WriteLine(&quot;Para yok para :)&quot;);\r\n        public override void InsertCard(ATMMachine context)\r\n            =&gt; Console.WriteLine(&quot;Para yok para :)&quot;);\r\n        public override void InsertPin(int pinEntered, ATMMachine context)\r\n            =&gt; Console.WriteLine(&quot;Para yok para :)&quot;);\r\n        public override void RequestCash(int cashToWithdraw, ATMMachine context)\r\n            =&gt; Console.WriteLine(&quot;Para yok para :)&quot;);\r\n    }\r\n<\/pre>\n<p>ATM&#8217;de hi\u00e7 paran\u0131n kalmad\u0131\u011f\u0131 bir durumu ifade eden &#8216;NoCash&#8217; s\u0131n\u0131f\u0131 i\u00e7erisindeki t\u00fcm aksiyonlarda paran\u0131n olmad\u0131\u011f\u0131na dair gerekli mesaj\u0131 vermekte ve ba\u015fka hi\u00e7bir i\u015flem ger\u00e7ekle\u015ftirmemektedir.<\/p>\n<p>Dikkat ederseniz t\u00fcm <code style=\"color:green;font-size:14px;\">Concrete State<\/code> nesneleri &#8216;ATMState&#8217; s\u0131n\u0131f\u0131ndan t\u00fcremektedir. Haliyle <code style=\"color:green;font-size:14px;\">Context<\/code> s\u0131n\u0131f\u0131 bu referans \u00fczerinden <code style=\"color:green;font-size:14px;\">Concrete State<\/code>&#8216;lere eri\u015febilmekte ve i\u015flem ger\u00e7ekle\u015ftirebilmektedir.<\/p>\n<p>Art\u0131k bu in\u015fadan sonra tek yap\u0131lmas\u0131 gereken <code style=\"color:green;font-size:14px;\">Context<\/code> s\u0131n\u0131f\u0131 \u00fczerinden ATM&#8217;yi kullanmakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            ATMMachine atm = new ATMMachine();\r\n            #region ATM'ye kart tak\u0131p geri \u00e7\u0131karma\r\n            atm.InsertCard();\r\n            atm.EjectCard();\r\n            Console.WriteLine(&quot;*********&quot;);\r\n            #endregion\r\n            #region Do\u011frulanm\u0131\u015f pin ile para \u00e7ekme ve \u00fczerine tekrar para \u00e7ekme talebinde bulunma\r\n            atm.InsertCard();\r\n            atm.InsertPin(123);\r\n            atm.RequestCash(1500);\r\n            atm.RequestCash(100);\r\n            Console.WriteLine(&quot;*********&quot;);\r\n            \/\/ATM'de kalan bakiye 500\r\n            #endregion\r\n            #region Para \u00e7ekme\r\n            atm.InsertCard();\r\n            atm.InsertPin(123);\r\n            atm.RequestCash(100);\r\n            Console.WriteLine(&quot;*********&quot;);\r\n            \/\/ATM'de kalan bakiye 400\r\n            #endregion\r\n            #region Para \u00e7ekme\r\n            atm.InsertCard();\r\n            atm.InsertPin(123);\r\n            atm.RequestCash(300);\r\n            Console.WriteLine(&quot;*********&quot;);\r\n            \/\/ATM'de kalan bakiye 100\r\n            #endregion\r\n            #region Para \u00e7ekme\r\n            atm.InsertCard();\r\n            atm.InsertPin(123);\r\n            atm.RequestCash(100);\r\n            Console.WriteLine(&quot;*********&quot;);\r\n            \/\/ATM'de kalan bakiye 0\r\n            #endregion\r\n            #region Para olmayan ATM'den para \u00e7ekme talebi\r\n            atm.InsertCard();\r\n            atm.InsertPin(123);\r\n            atm.RequestCash(100);\r\n            \/\/T\u00fcm i\u015flemlerde para yok uyar\u0131s\u0131!\r\n            #endregion\r\n        }\r\n<\/pre>\n<p>Yukar\u0131daki kodu derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda a\u015fa\u011f\u0131daki sonucu almaktay\u0131z.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-1.png\" alt=\"C# State Design Pattern(State Tasar\u0131m Deseni)\" width=\"258\" height=\"499\" class=\"aligncenter size-full wp-image-22893\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-1.png 258w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-1-155x300.png 155w\" sizes=\"auto, (max-width: 258px) 100vw, 258px\" \/><\/a><\/p>\n<p>Evet, i\u015fte g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere birden fazla condition&#8217;\u0131n yo\u011fun bir \u015fekilde uygulanmas\u0131 gereken kompleks bir durumun State Design Pattern ile ger\u00e7ekle\u015ftirilmesi bu kadar basit \ud83d\ude42 Tamam kabul ediyorum ki her bir duruma kar\u015f\u0131l\u0131k bir nesne \u00fcretmek ve bu nesneleri kontrol etmek bazen uzun uzad\u0131ya yersiz bir i\u015flem gibi gelebilir lakin emin olun ki bu tarz bir yakla\u015f\u0131m geli\u015fmekte olan ve \u00f6ng\u00f6r\u00fclemez ihtiya\u00e7lara sahip olan durumlarda hayat kurtar\u0131c\u0131 olabilmektedir. Nihayetinde b\u00f6yle bir operasyonda \u00e7\u00f6z\u00fcm olarak bunca s\u0131n\u0131f olu\u015fturmaktansa <code>if-else<\/code> ya da <code>switch case<\/code> kontrolleri ile h\u0131zl\u0131 bir \u00e7\u00f6z\u00fcm getirebilirdik lakin g\u00fcnler belki aylar sonra yeni bir ihtiyaca istinaden ilgili kodu tekrar geli\u015ftirmemiz gerekti\u011fi taktirde o kodu biz yazm\u0131\u015f olsak dahi \u00f6nce ne yapt\u0131\u011f\u0131m\u0131z\u0131 tekrar hat\u0131rlamak ve hatta anlamak icap edecek ve ard\u0131ndan yeni ihtiyac\u0131 o kodun i\u00e7erisine hassasiyetle i\u015flememiz gerekecekti. Amma velakin bu \u015fekilde tasar\u0131m uygulamam\u0131z durumunda yeni ihtiyaca uygun bir davran\u0131\u015f modeli olu\u015fturmam\u0131z ve o model \u00fczerinden ilgili durumu tarif etmemiz yeterli olacakt\u0131r. Sadece tek yap\u0131lmas\u0131 gereken ilgili modeli <code style=\"color:green;font-size:14px;\">State<\/code> nesnesinden t\u00fcretmektir.<\/p>\n<p>Ayr\u0131ca burada her bir durum nesnesini tekrar tekrar \u00fcretmenin yersiz oldu\u011fu kanaatinde olabilirsiniz. Evet, ben bu senaryoda ayn\u0131 durumlar\u0131 ifade eden nesneleri dahi yeniden <code style=\"color:red;font-size:13px;\">new<\/code> operat\u00f6r\u00fc ile olu\u015fturmu\u015f bulunmaktay\u0131m. Bu yap\u0131y\u0131 nesne \u00fcretimi a\u00e7\u0131s\u0131ndan daha az maliyetli bir \u015fekilde geli\u015ftirmek istiyorsan\u0131z 2. sayfadaki \u00f6rne\u011fi inceleyebilirsiniz.<\/p>\n<p>Velhas\u0131l, bizler art\u0131k 2. senaryo ile pratik \u00fczerinden konuyu daha da peki\u015ftirmek i\u00e7in yolumuza devam edelim.<\/p>\n<h6 style=\"color:red;text-align:center;\">2. Senaryo<\/h6>\n<div style=\"background-color:gray;color:yellow;text-align:center;font-size:11px;line-height: 1.5;\">\nBu senaryoda ise basit bir m\u00fczik \u00e7alar uygulamas\u0131 geli\u015ftirece\u011fiz. Tek d\u00fc\u011fmesi olan bir m\u00fczik \u00e7alar d\u00fc\u015f\u00fcnelim. Bu d\u00fc\u011fmeye bas\u0131ld\u0131\u011f\u0131 taktirde m\u00fczik \u00e7al\u0131yorsa duracak yok e\u011fer duruyorsa \u00e7almaya devam edecektir.\n<\/div>\n<table style=\"font-size:11px;line-height: 1.5;width:70%;\">\n<thead>\n<tr>\n<th colspan=\"2\">UYGULAMADAK\u0130 T\u00dcM DURUMLAR<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align:left;\"><strong>PlayMusic<\/strong><\/td>\n<td style=\"text-align:left;\">M\u00fczi\u011fin \u00e7ald\u0131\u011f\u0131 durumu ifade eder.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\"><strong>StopMusic<\/strong><\/td>\n<td style=\"text-align:left;\">M\u00fczi\u011fin durdu\u011fu durumu ifade eder.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h6 style=\"color:red;text-align:center;\">2. Senaryo \u00c7\u00f6z\u00fcm<\/h6>\n<p>Bu seferki senaryonun \u00e7\u00f6z\u00fcm\u00fcnde daha temiz bir in\u015fa ger\u00e7ekle\u015ftirece\u011fiz. (Esas\u0131nda bir \u00f6nceki ATM senaryosunun 2. sayfadaki temiz tasar\u0131m\u0131na benzer bir in\u015fa ger\u00e7ekle\u015ftirece\u011fiz.)<\/p>\n<p>\u015eimdi ilk olarak <code style=\"color:green;font-size:14px;\">State<\/code> aray\u00fcz\u00fcn\u00fc olu\u015fturarak uygulamadaki durumlara \u00f6zg\u00fc davran\u0131\u015flar\u0131 temsil edelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/State\r\n    abstract class MusicPlayerState\r\n    {\r\n        public abstract void PlayMusic();\r\n        public abstract void StopMusic();\r\n    }\r\n<\/pre>\n<p>Ard\u0131ndan <code style=\"color:green;font-size:14px;\">Context<\/code> s\u0131n\u0131f\u0131m\u0131z\u0131 a\u015fa\u011f\u0131daki gibi geli\u015ftirelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Context\r\n    class MusicPlayer\r\n    {\r\n        MusicPlayerState state;\r\n        MusicPlayerState play;\r\n        MusicPlayerState stop;\r\n        public MusicPlayer()\r\n        {\r\n            play = new Play(this);\r\n            stop = new Stop(this);\r\n            state = play;\r\n        }\r\n\r\n        public void SetPlay()\r\n            =&gt; state = play;\r\n        public void SetStop()\r\n            =&gt; state = stop;\r\n\r\n        public void Play()\r\n            =&gt; state.PlayMusic();\r\n        public void Stop()\r\n            =&gt; state.StopMusic();\r\n    }\r\n<\/pre>\n<p><code style=\"color:green;font-size:14px;\">Context<\/code> s\u0131n\u0131f\u0131na g\u00f6z atarsan\u0131z e\u011fer constructor&#8217;\u0131nda <code style=\"color:green;font-size:14px;\">Concrete State<\/code> nesnelerini olu\u015fturmakta ve bunlar\u0131 ilgili referanslarda tutmaktad\u0131r. Ayriyetten durum de\u011fi\u015fikli\u011finde kullan\u0131lacak &#8216;SetPlay&#8217; ve &#8216;SetStop&#8217; metotlar\u0131n\u0131 bar\u0131nd\u0131rmaktad\u0131r. Bunlar\u0131n d\u0131\u015f\u0131nda m\u00fczik \u00e7alar\u0131n d\u00fc\u011fmesine bas\u0131ld\u0131\u011f\u0131nda davran\u0131\u015fsal olarak &#8216;Play&#8217; ve &#8216;Stop&#8217; fonksiyonlar\u0131 bar\u0131nd\u0131rmakta ve bu fonksiyonlar i\u00e7erisinde o anki duruma istinaden gerekli durum davran\u0131\u015flar\u0131 tetiklenmektedir.<\/p>\n<p>\u015eimdi s\u0131ra <code style=\"color:green;font-size:14px;\">Concrete State<\/code> s\u0131n\u0131flar\u0131n\u0131 olu\u015fturmaya gelmi\u015ftir.<br \/>\n&#8216;Play&#8217;;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Concrete State\r\n    class Play : MusicPlayerState\r\n    {\r\n        MusicPlayer _context;\r\n        public Play(MusicPlayer context)\r\n            =&gt; _context = context;\r\n\r\n        public override void PlayMusic()\r\n            =&gt; Console.WriteLine(&quot;Zaten m\u00fczik \u00e7almaktad\u0131r!&quot;);\r\n        public override void StopMusic()\r\n        {\r\n            Console.WriteLine(&quot;M\u00fczik durdurulmu\u015ftur.&quot;);\r\n            _context.SetStop();\r\n        }\r\n    }\r\n<\/pre>\n<p>&#8216;Stop&#8217;;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Concrete State\r\n    class Stop : MusicPlayerState\r\n    {\r\n        MusicPlayer _context;\r\n        public Stop(MusicPlayer context)\r\n            =&gt; _context = context;\r\n\r\n        public override void PlayMusic()\r\n        {\r\n            Console.WriteLine(&quot;M\u00fczik ba\u015flat\u0131lm\u0131\u015ft\u0131r.&quot;);\r\n            _context.SetPlay();\r\n        }\r\n        public override void StopMusic()\r\n            =&gt; Console.WriteLine(&quot;Zaten m\u00fczik durmaktad\u0131r!&quot;);\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki <code style=\"color:green;font-size:14px;\">Concrete State<\/code> s\u0131n\u0131flar\u0131na g\u00f6z atarsan\u0131z e\u011fer duruma g\u00f6re beklenen davran\u0131\u015flar\u0131 sergilemektedirler. Art\u0131k tasar\u0131m\u0131 ba\u015far\u0131yla tamamlanm\u0131\u015f olan bu yap\u0131lanmay\u0131 a\u015fa\u011f\u0131daki gibi kullanabiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            MusicPlayer musicPlayer = new MusicPlayer();\r\n            musicPlayer.Play();\r\n            musicPlayer.Stop();\r\n            Console.WriteLine(&quot;*******&quot;);\r\n            musicPlayer.Stop();\r\n            musicPlayer.Play();\r\n            Console.WriteLine(&quot;*******&quot;);\r\n            musicPlayer.Stop();\r\n            Console.WriteLine(&quot;*******&quot;);\r\n            musicPlayer.Play();\r\n            musicPlayer.Stop();\r\n        }\r\n<\/pre>\n<p>Yukar\u0131daki in\u015fay\u0131 derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda a\u015fa\u011f\u0131daki \u00e7\u0131kt\u0131y\u0131 verecektir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-8.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-8.png\" alt=\"C# State Design Pattern(State Tasar\u0131m Deseni)\" width=\"194\" height=\"162\" class=\"aligncenter size-full wp-image-22924\" \/><\/a><br \/>\n\u0130\u015fte bu kadar \ud83d\ude42<\/p>\n<h3>State Design Pattern&#8217;\u0131n Di\u011fer Kal\u0131plarla \u0130li\u015fkisi<\/h3>\n<table>\n<tbody>\n<tr>\n<td style=\"text-align:left;\"><strong><a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-strategy-design-patternstrateji-tasarim-deseni\/\" rel=\"noopener\" target=\"_blank\">Strategy Design Pattern<\/a><\/strong><\/td>\n<td style=\"text-align:left;\">State Design Pattern, Strategy Design Pattern&#8217;\u0131n bir uzant\u0131s\u0131 olarak d\u00fc\u015f\u00fcn\u00fclebilir. Her ikisi de baz\u0131 i\u015fleri yard\u0131mc\u0131 nesnelere devrederek ba\u011flam\u0131n davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirirler. Strategy, bu nesneleri tamamen ba\u011f\u0131ms\u0131z ve birbirinden habersiz hale getirir. State ise <code style=\"color:green;font-size:14px;\">Concrete State<\/code>&#8216;ler aras\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar\u0131 k\u0131s\u0131tlamaz ve ba\u011flam\u0131n durumunu istedikleri gibi de\u011fi\u015ftirmelerine izin verir. Yani State D.P.&#8217;de durumlar birbirlerinin fark\u0131ndad\u0131r ve bir durumdan di\u011ferine ge\u00e7i\u015fler sa\u011flanabilir. Oysa Strategy&#8217;de ise davran\u0131\u015flar neredeyse birbirlerini hi\u00e7 bilmezler!<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\"><strong>Chain of Responsibility Design Pattern<\/strong><\/td>\n<td style=\"text-align:left;\">Chain of Responsibility D.P.&#8217;da durumlar aras\u0131nda s\u0131ral\u0131 bir ge\u00e7i\u015f s\u00f6z konusudur. Lakin State tasar\u0131m\u0131nda durum de\u011fi\u015fikliklerinin s\u0131ral\u0131 olmas\u0131 zorunlu de\u011fildir. Misal, State&#8217;de birinci durumdan \u00fc\u00e7\u00fcnc\u00fc duruma ge\u00e7ilebilir lakin Chain of Responsibility&#8217;de birinci durumdan direkt olarak \u00fc\u00e7\u00fcnc\u00fc duruma ge\u00e7ilemez!<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Uygulanabilirlik<\/h3>\n<p>Mevcut durumuna ba\u011fl\u0131 olarak farkl\u0131 davranan bir nesne varsa ve bu durumlar\u0131n say\u0131lar\u0131 g\u00f6receli olarak fazlaysa ve duruma \u00f6zg\u00fc kod ve davran\u0131\u015f s\u0131k s\u0131k de\u011fi\u015fiyorsa State Design Pattern kullan\u0131labilir.<\/p>\n<h3>Lehte ve Aleyhte Durumlar<\/h3>\n<table>\n<thead>\n<tr>\n<th>\u2713<\/th>\n<th>\uab55<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong><a href=\"https:\/\/www.gencayyildiz.com\/blog\/tek-sorumluluk-prensibisingle-responsibility-principle-srp\/\" rel=\"noopener\" target=\"_blank\">Tek Sorumluluk Prensibi(Single Responsibility Principle \u2013 SRP)<\/a><\/strong><br \/>\nBelirli durumlarla ilgili davran\u0131\u015fsal kodlar\u0131 ayr\u0131 s\u0131n\u0131flarda d\u00fczenlemeyi \u00f6neririr. B\u00f6ylece tek sorumluluk prensibini desteklemi\u015f olur.\n<\/td>\n<td>Bir durum kontrol yap\u0131lanmas\u0131 yaln\u0131zca birka\u00e7 durumdan meydana geliyorsa ve durumlar\u0131 nadiren de\u011fi\u015fiyorsa kal\u0131b\u0131 uygulamak a\u015f\u0131r\u0131 olabilir.<\/td>\n<\/tr>\n<tr>\n<td><strong><a href=\"https:\/\/www.gencayyildiz.com\/blog\/acik-kapali-prensibiopen-closed-principle-ocp\/\" rel=\"noopener\" target=\"_blank\">A\u00e7\u0131k Kapal\u0131 Prensibi(Open Closed Principle \u2013 OCP)<\/a><\/strong><br \/>\nDurumlara istinaden mevcut davran\u0131\u015f s\u0131n\u0131flar\u0131n\u0131 ve <code style=\"color:green;font-size:14px;\">Context<\/code> s\u0131n\u0131f\u0131n\u0131 de\u011fi\u015ftirmeden uygulamaya yeni durumlar\u0131n eklenmesini\/tan\u0131t\u0131lmas\u0131n\u0131 sa\u011flar. B\u00f6ylece geli\u015fime a\u00e7\u0131k lakin de\u011fi\u015fime kapal\u0131 bir tasar\u0131m meydana gelmi\u015f olur.\n<\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Nihai olarak;<br \/>\nState Design Pattern, davran\u0131\u015fsal tasar\u0131m kal\u0131plar\u0131 i\u00e7erisindeki en kritik pattern&#8217;lardan birisidir diyebiliriz. Nihayetinde bir yaz\u0131l\u0131m\u0131n geli\u015fim s\u00fcrecindeki ya\u015fanabilecek sanc\u0131lar\u0131 ba\u015ftan minimize edebilmek ve y\u00f6netilebilirlik a\u00e7\u0131s\u0131ndan do\u011fru temelleri atabilmek i\u00e7in kullan\u0131m\u0131na dair d\u00fc\u015f\u00fcn\u00fclmesi ve ihtiyac\u0131 g\u00f6r\u00fcld\u00fc\u011f\u00fc noktada kesinlikle devreye sokulup getirilerinden faydalan\u0131lmas\u0131 gereken bir stratejidir. Amma velakin unutulmamal\u0131d\u0131r ki State Design Pattern&#8217;\u0131n kullan\u0131labilece\u011fi ideal durum say\u0131s\u0131 be\u015f(5) adettir. Yani olu\u015fturulacak <code style=\"color:green;font-size:14px;\">Concrete State<\/code> say\u0131s\u0131 5&#8217;i ge\u00e7ti\u011fi taktirde s\u0131n\u0131f patlamas\u0131 olabilmektedir. Ayr\u0131ca bu tasar\u0131mda <code style=\"color:green;font-size:14px;\">State<\/code> nesnelerinin genellikle Singleton olarak tasarlanmas\u0131 performans ve maliyet a\u00e7\u0131s\u0131ndan daha avantajl\u0131d\u0131r. Keza bunu 1. senaryoya alternatif olarak sundu\u011fumuz 2. sayfadaki \u00f6rne\u011fimizde ve 2. senaryonun ta kendisinde g\u00f6rebilirsiniz.<\/p>\n<p>Ha bu arada her makalede olmasa da bu i\u00e7eri\u011fimizi bir s\u00fcrpriz ile noktalamay\u0131 istiyorum. O da bu i\u00e7eri\u011fin 3. sayfas\u0131nda konuya dair zenginle\u015ftirme maksatl\u0131 farkl\u0131 bir \u00f6rne\u011fi daha sizlere sunmu\u015f olmamd\u0131r \ud83d\ude09<\/p>\n<p>Okuyup, 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><!--nextpage--><\/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            ATMMachine atm = new ATMMachine();\r\n            #region ATM'ye kart tak\u0131p geri \u00e7\u0131karma\r\n            atm.InsertCard();\r\n            atm.EjectCard();\r\n            Console.WriteLine(&quot;*********&quot;);\r\n            #endregion\r\n            #region Do\u011frulanm\u0131\u015f pin ile para \u00e7ekme ve \u00fczerine tekrar para \u00e7ekme talebinde bulunma\r\n            atm.InsertCard();\r\n            atm.InsertPin(123);\r\n            atm.RequestCash(1500);\r\n            atm.RequestCash(100);\r\n            Console.WriteLine(&quot;*********&quot;);\r\n            \/\/ATM'de kalan bakiye 500\r\n            #endregion\r\n            #region Para \u00e7ekme\r\n            atm.InsertCard();\r\n            atm.InsertPin(123);\r\n            atm.RequestCash(100);\r\n            Console.WriteLine(&quot;*********&quot;);\r\n            \/\/ATM'de kalan bakiye 400\r\n            #endregion\r\n            #region Para \u00e7ekme\r\n            atm.InsertCard();\r\n            atm.InsertPin(123);\r\n            atm.RequestCash(300);\r\n            Console.WriteLine(&quot;*********&quot;);\r\n            \/\/ATM'de kalan bakiye 100\r\n            #endregion\r\n            #region Para \u00e7ekme\r\n            atm.InsertCard();\r\n            atm.InsertPin(123);\r\n            atm.RequestCash(100);\r\n            Console.WriteLine(&quot;*********&quot;);\r\n            \/\/ATM'de kalan bakiye 0\r\n            #endregion\r\n            #region Para olmayan ATM'den para \u00e7ekme talebi\r\n            atm.InsertCard();\r\n            atm.InsertPin(123);\r\n            atm.RequestCash(100);\r\n            Console.WriteLine(&quot;*********&quot;);\r\n            \/\/T\u00fcm i\u015flemlerde para yok uyar\u0131s\u0131!\r\n            #endregion\r\n        }\r\n    }\r\n\r\n    abstract class ATMState\r\n    {\r\n        public abstract void InsertCard();\r\n        public abstract void EjectCard();\r\n        public abstract void InsertPin(int pin);\r\n        public abstract void RequestCash(int cashToWithdraw);\r\n    }\r\n\r\n    class ATMMachine\r\n    {\r\n        ATMState noCard;\r\n        ATMState hasCard;\r\n        ATMState hasPin;\r\n        ATMState noCash;\r\n\r\n        ATMState state;\r\n        public ATMMachine()\r\n        {\r\n            noCard = new NoCard(this);\r\n            hasCard = new HasCard(this);\r\n            hasPin = new HasPin(this);\r\n            noCash = new NoCash(this);\r\n            state = noCard;\r\n        }\r\n        public ATMState State { set =&gt; state = value; }\r\n\r\n        public void SetNoCard()\r\n            =&gt; state = noCard;\r\n        public void SetHasCard()\r\n            =&gt; state = hasCard;\r\n        public void SetHasPin()\r\n            =&gt; state = hasPin;\r\n        public void SetNoCash()\r\n            =&gt; state = noCash;\r\n\r\n        public int CashInMachine { get; set; } = 2000;\r\n        public bool CorrectPinEntered { get; set; } = false;\r\n        public void InsertCard()\r\n            =&gt; state.InsertCard();\r\n        public void EjectCard()\r\n            =&gt; state.EjectCard();\r\n        public void InsertPin(int pin)\r\n            =&gt; state.InsertPin(pin);\r\n        public void RequestCash(int cashToWithdraw)\r\n            =&gt; state.RequestCash(cashToWithdraw);\r\n    }\r\n\r\n    class NoCard : ATMState\r\n    {\r\n        ATMMachine _context;\r\n        public NoCard(ATMMachine context)\r\n            =&gt; _context = context;\r\n\r\n        public override void EjectCard()\r\n            =&gt; Console.WriteLine(&quot;L\u00fctfen \u00f6nce kart\u0131 tak\u0131n\u0131z.&quot;);\r\n        public override void InsertCard()\r\n        {\r\n            Console.WriteLine(&quot;L\u00fctfen pin giriniz.&quot;);\r\n            _context.SetHasCard();\r\n        }\r\n        public override void InsertPin(int pin)\r\n            =&gt; Console.WriteLine(&quot;L\u00fctfen \u00f6nce kart\u0131 tak\u0131n\u0131z.&quot;);\r\n        public override void RequestCash(int cashToWithdraw)\r\n            =&gt; Console.WriteLine(&quot;L\u00fctfen \u00f6nce kart\u0131 tak\u0131n\u0131z.&quot;);\r\n    }\r\n\r\n    class HasCard : ATMState\r\n    {\r\n        ATMMachine _context;\r\n        public HasCard(ATMMachine context)\r\n            =&gt; _context = context;\r\n\r\n        public override void EjectCard()\r\n        {\r\n            Console.WriteLine(&quot;Kart \u00e7\u0131kar\u0131lm\u0131\u015ft\u0131r.&quot;);\r\n            _context.SetNoCard();\r\n        }\r\n        public override void InsertCard()\r\n            =&gt; Console.WriteLine(&quot;Ayn\u0131 anda birden fazla kart takamazs\u0131n\u0131z!&quot;);\r\n        public override void InsertPin(int pin)\r\n        {\r\n            if (pin == 123)\r\n            {\r\n                Console.WriteLine(&quot;Pin do\u011fruland\u0131!&quot;);\r\n                _context.CorrectPinEntered = true;\r\n                _context.SetHasPin();\r\n            }\r\n            else\r\n            {\r\n                Console.WriteLine(&quot;Ge\u00e7ersiz pin girildi!&quot;);\r\n                _context.CorrectPinEntered = false;\r\n                Console.WriteLine(&quot;Kart \u00e7\u0131kar\u0131lm\u0131\u015ft\u0131r.&quot;);\r\n                _context.SetNoCard();\r\n            }\r\n        }\r\n        public override void RequestCash(int cashToWithdraw)\r\n            =&gt; Console.WriteLine(&quot;L\u00fctfen \u00f6nce pini giriniz.&quot;);\r\n    }\r\n\r\n    class HasPin : ATMState\r\n    {\r\n        ATMMachine _context;\r\n        public HasPin(ATMMachine context)\r\n            =&gt; _context = context;\r\n\r\n        public override void EjectCard()\r\n        {\r\n            Console.WriteLine(&quot;Kart \u00e7\u0131kar\u0131lm\u0131\u015ft\u0131r.&quot;);\r\n            _context.SetNoCard();\r\n        }\r\n        public override void InsertCard()\r\n            =&gt; Console.WriteLine(&quot;Ayn\u0131 anda birden fazla kart takamazs\u0131n\u0131z!&quot;);\r\n        public override void InsertPin(int pin)\r\n            =&gt; Console.WriteLine(&quot;Do\u011frulanm\u0131\u015f bir pin zaten girilmi\u015ftir.&quot;);\r\n        public override void RequestCash(int cashToWithdraw)\r\n        {\r\n            if (cashToWithdraw &gt; _context.CashInMachine)\r\n            {\r\n                Console.WriteLine(&quot;\u00c7ekmek istenen tutar adil bedeli a\u015fmaktad\u0131r.&quot;);\r\n                Console.WriteLine(&quot;Kart \u00e7\u0131kar\u0131lm\u0131\u015ft\u0131r.&quot;);\r\n                _context.SetNoCard();\r\n            }\r\n            else\r\n            {\r\n                Console.WriteLine($&quot;{cashToWithdraw} tutar\u0131nda para \u00e7ekilmi\u015ftir.&quot;);\r\n                _context.CashInMachine -= cashToWithdraw; \/\/ATM'de ki para g\u00fcncelleniyor.\r\n                Console.WriteLine(&quot;Kart \u00e7\u0131kar\u0131lm\u0131\u015ft\u0131r.&quot;);\r\n                _context.SetNoCard();\r\n                Console.WriteLine($&quot;ATM'de kalan para : {_context.CashInMachine}&quot;);\r\n\r\n                if (_context.CashInMachine &lt;= 0)\r\n                    _context.SetNoCash();\r\n            }\r\n        }\r\n    }\r\n\r\n    class NoCash : ATMState\r\n    {\r\n        ATMMachine _context;\r\n        public NoCash(ATMMachine context)\r\n            =&gt; _context = context;\r\n\r\n        public override void EjectCard()\r\n         =&gt; Console.WriteLine(&quot;Para yok para :)&quot;);\r\n        public override void InsertCard()\r\n            =&gt; Console.WriteLine(&quot;Para yok para :)&quot;);\r\n        public override void InsertPin(int pinEntered)\r\n            =&gt; Console.WriteLine(&quot;Para yok para :)&quot;);\r\n        public override void RequestCash(int cashToWithdraw)\r\n            =&gt; Console.WriteLine(&quot;Para yok para :)&quot;);\r\n    }\r\n<\/pre>\n<p>Yukar\u0131da bir \u00f6nceki sayfadaki 1. senaryonun konusu olan ATM senaryosunun farkl\u0131 bir varyasyonu \u00f6rneklendirilmi\u015ftir. Burada \u00f6nceki tasar\u0131mla arada iki temel fark mevcuttur. Bu farklardan birincisi, her durum de\u011fi\u015fiminde yeni bir <code style=\"color:green;font-size:14px;\">Concrete State<\/code> nesnesi olu\u015fturmaktansa bu nesneleri tek seferli\u011fine <code style=\"color:green;font-size:14px;\">Context<\/code> s\u0131n\u0131f\u0131nda olu\u015fturuyoruz ve ilgili s\u0131n\u0131f\u0131n constructor&#8217;\u0131n da instance&#8217;lar\u0131n\u0131 tan\u0131ml\u0131yoruz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-4.png\" alt=\"C# State Design Pattern(State Tasar\u0131m Deseni)\" width=\"249\" height=\"270\" class=\"aligncenter size-full wp-image-22907\" \/><\/a><br \/>\nDurum de\u011fi\u015fimlerini <code style=\"color:green;font-size:14px;\">Context<\/code>&#8216;te \u00fcretilen <code style=\"color:green;font-size:14px;\">Concrete State<\/code> nesneleri \u00fczerinden sa\u011flayabilmek i\u00e7in <code style=\"color:green;font-size:14px;\">Context<\/code> i\u00e7erisinde her bir duruma \u00f6zel set metotlar\u0131 olu\u015fturuyoruz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-5.png\" alt=\"C# State Design Pattern(State Tasar\u0131m Deseni)\" width=\"192\" height=\"287\" class=\"aligncenter size-full wp-image-22911\" \/><\/a><br \/>\nVe <code style=\"color:green;font-size:14px;\">Concrete State<\/code> nesnelerinde bu metotlar arac\u0131l\u0131\u011f\u0131yla durum de\u011fi\u015fimini ger\u00e7ekle\u015ftiriyoruz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-6.png\" alt=\"C# State Design Pattern(State Tasar\u0131m Deseni)\" width=\"306\" height=\"245\" class=\"aligncenter size-full wp-image-22913\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-6.png 306w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-6-300x240.png 300w\" sizes=\"auto, (max-width: 306px) 100vw, 306px\" \/><\/a><br \/>\n\u0130kinci fark ise, <code style=\"color:green;font-size:14px;\">State<\/code>&#8216;te ki metotlar <code style=\"color:green;font-size:14px;\">Context<\/code> nesnesini parametre olarak almamakta,<\/p>\n<table>\n<thead>\n<tr>\n<th>\u00d6nceki<\/th>\n<th>Sonraki<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-2.png\" alt=\"C# State Design Pattern(State Tasar\u0131m Deseni)\" width=\"519\" height=\"162\" class=\"aligncenter size-full wp-image-22904\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-2.png 519w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-2-300x94.png 300w\" sizes=\"auto, (max-width: 519px) 100vw, 519px\" \/><\/a><\/td>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-3.png\" alt=\"C# State Design Pattern(State Tasar\u0131m Deseni)\" width=\"386\" height=\"163\" class=\"aligncenter size-full wp-image-22905\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-3.png 386w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-3-300x127.png 300w\" sizes=\"auto, (max-width: 386px) 100vw, 386px\" \/><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>ilgili nesneyi <code style=\"color:green;font-size:14px;\">Concrete State<\/code> nesnelerine <code style=\"color:green;font-size:14px;\">Context<\/code> s\u0131n\u0131f\u0131nda \u00fcretilirken constructor&#8217;lar\u0131 \u00fczerinden verilmektedir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-7.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-7.png\" alt=\"C# State Design Pattern(State Tasar\u0131m Deseni)\" width=\"242\" height=\"269\" class=\"aligncenter size-full wp-image-22915\" \/><\/a><br \/>\nB\u00f6ylece her bir metotta yo\u011fun parametre tan\u0131m\u0131 olmaks\u0131z\u0131n tek bir tan\u0131m ve kullan\u0131m \u00fczerinden bu <code style=\"color:green;font-size:14px;\">Context<\/code> s\u0131n\u0131f\u0131 <code style=\"color:green;font-size:14px;\">Concrete State<\/code>&#8216;lere eri\u015fim sa\u011flayabilmektedir.<\/p>\n<p>Evet, bu bir \u00f6ncekine nazaran daha do\u011fru bir tasar\u0131msal kodlamad\u0131r \ud83d\ude42<\/p>\n<p><!--nextpage--><\/p>\n<h6 style=\"color:red;text-align:center;\">Ekstra Senaryo<\/h6>\n<div style=\"background-color:gray;color:yellow;text-align:center;font-size:11px;line-height: 1.5;\">\nBu senaryoda bir e-ticaret sitesindeki sipari\u015f s\u00fcreci sim\u00fcle edilecektir.<br \/>\nSenaryomuzun genel izahati \u015f\u00f6yledir. Kullan\u0131c\u0131n\u0131n e-ticaret \u00fczerinden yapt\u0131\u011f\u0131 sipari\u015fe dair a\u015fa\u011f\u0131daki a\u015famalar s\u0131ras\u0131yla ger\u00e7ekle\u015fecektir;<\/p>\n<ul style=\"text-align:left;\">\n<li>Sipari\u015f olu\u015fturulmadan \u00f6nceki durum <span style=\"color:blue;\">(NoOrder)<\/span> olarak nitelendirilecektir.<\/li>\n<li>Sipari\u015fin olu\u015fturulmas\u0131. Bu durum <span style=\"color:blue;\">(Suspended)<\/span> olarak nitelendirilecektir.<\/li>\n<li>Olu\u015fturulan sipari\u015fin stok bilgilerinin g\u00fcncellenmesi. Bu durum ise <span style=\"color:blue;\">(StockReserved)<\/span> olarak nitelendirilecektir.\n<ul>\n<li>Sipari\u015fteki \u00fcr\u00fcnlerin adetleri e\u011fer mevcut stok miktar\u0131n\u0131 ge\u00e7iyorsa sipari\u015f iptal edilecek ve <span style=\"color:blue;\">(OrderCanceled)<\/span> durumuna \u00e7ekilecektir. \u0130ptal edilen sipari\u015fin \u00fcr\u00fcn adetleri g\u00fcncellenip tekrar denenebilecektir.<\/li>\n<li>Yok e\u011fer stok miktar\u0131 sipari\u015fteki \u00fcr\u00fcn adedini kar\u015f\u0131l\u0131yorsa stok bilgileri g\u00fcncellenecek ve <span style=\"color:blue;\">(StockReserved)<\/span> durumuna ge\u00e7ilecektir.<\/li>\n<\/ul>\n<\/li>\n<li>Stok bilgileri g\u00fcncellenen sipari\u015fin \u00f6deme i\u015flemi ger\u00e7ekle\u015ftirilecektir. Bu durum ise <span style=\"color:blue;\">(OrderCompleted)<\/span> olarak nitelendirilecektir.\n<ul>\n<li>\u00d6deme s\u00fcreci ba\u015far\u0131yla sonu\u00e7lan\u0131yorsa <span style=\"color:blue;\">(OrderCompleted)<\/span> durumuna ge\u00e7ilecektir.<\/li>\n<li>Aksi taktirde sipari\u015f ba\u015far\u0131s\u0131z olaca\u011f\u0131 i\u00e7in <span style=\"color:blue;\">(OrderFailed)<\/span> durumuna \u00e7ekilecektir.<\/li>\n<\/ul>\n<\/li>\n<li>Ve son olarak \u00f6deme ger\u00e7ekle\u015ftirildi\u011finde ise sipari\u015f onaylanacak ve nakliye i\u015flemleri devreye sokulacakt\u0131r. Bu durum ise <span style=\"color:blue;\">(OrderCompleted)<\/span> olarak nitelendirilecektir.<\/li>\n<\/ul>\n<\/div>\n<table style=\"font-size:11px;line-height: 1.5;width:70%;\">\n<thead>\n<tr>\n<th colspan=\"2\">UYGULAMADAK\u0130 T\u00dcM DURUMLAR<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align:left;\"><strong>NoOrder<\/strong><\/td>\n<td style=\"text-align:left;\">Sipari\u015fin olu\u015fturulmad\u0131\u011f\u0131n\u0131 ifade eder.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\"><strong>Suspended<\/strong><\/td>\n<td style=\"text-align:left;\">Sipari\u015fin olu\u015fturuldu\u011funu ifade eder.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\"><strong>StockReserved<\/strong><\/td>\n<td style=\"text-align:left;\">Stok bilgilerinin g\u00fcncellendi\u011fini ifade eder.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\"><strong>OrderCompleted<\/strong><\/td>\n<td style=\"text-align:left;\">Sipari\u015fin ba\u015far\u0131yla sonu\u00e7land\u0131\u011f\u0131n\u0131 ifade eder.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\"><strong>OrderFailed<\/strong><\/td>\n<td style=\"text-align:left;\">Sipari\u015fin ba\u015far\u0131s\u0131z sonu\u00e7land\u0131\u011f\u0131n\u0131 ifade eder.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\"><strong>OrderCanceled<\/strong><\/td>\n<td style=\"text-align:left;\">Sipari\u015fin iptal edildi\u011fini ifade eder.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h6 style=\"color:red;text-align:center;\">Ekstra Senaryo \u00c7\u00f6z\u00fcm<\/h6>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/State\r\n    abstract class OrderState\r\n    {\r\n        public abstract void OrderCreate();\r\n        public abstract void StockReserve(int quantity);\r\n        public abstract void Payment(int totalPrice);\r\n    }\r\n    \/\/Context\r\n    class OrderMachine\r\n    {\r\n        OrderState state;\r\n        OrderState noOrder;\r\n        OrderState suspend;\r\n        OrderState stockReserve;\r\n        OrderState payment;\r\n        OrderState orderCompleted;\r\n        OrderState orderFailed;\r\n        OrderState orderCanceled;\r\n        public OrderMachine()\r\n        {\r\n            noOrder = new NoOrder(this);\r\n            suspend = new Suspended(this);\r\n            stockReserve = new StockReserved(this);\r\n            orderCompleted = new OrderCompleted(this);\r\n            orderFailed = new OrderFailed(this);\r\n            orderCanceled = new OrderCanceled(this);\r\n\r\n            state = noOrder;\r\n        }\r\n\r\n        public int Stock { get; set; } = 1000;\r\n\r\n        public void SetNoOrder()\r\n            =&gt; state = noOrder;\r\n        public void SetSuspended()\r\n            =&gt; state = suspend;\r\n        public void SetStockReserved()\r\n            =&gt; state = stockReserve;\r\n        public void SetOrderCompleted()\r\n            =&gt; state = orderCompleted;\r\n        public void SetOrderFailed()\r\n            =&gt; state = orderFailed;\r\n        public void SetOrderCanceled()\r\n            =&gt; state = orderCanceled;\r\n\r\n        public void OrderCreate()\r\n            =&gt; state.OrderCreate();\r\n        public void StockReserve(int quantit)\r\n            =&gt; state.StockReserve(quantit);\r\n        public void Payment(int totalPrice)\r\n            =&gt; state.Payment(totalPrice);\r\n    }\r\n    \/\/Concrete State\r\n    class NoOrder : OrderState\r\n    {\r\n        OrderMachine _context;\r\n        public NoOrder(OrderMachine context)\r\n            =&gt; this._context = context;\r\n\r\n        public override void OrderCreate()\r\n        {\r\n            Console.WriteLine(&quot;Sipari\u015f olu\u015fturuldu.&quot;);\r\n            _context.SetSuspended();\r\n        }\r\n        public override void Payment(int totalPrice)\r\n            =&gt; Console.WriteLine(&quot;Si\u015farip olu\u015fturmadan \u00f6deme yap\u0131lamaz!&quot;);\r\n        public override void StockReserve(int quantit)\r\n            =&gt; Console.WriteLine(&quot;Sipari\u015f olu\u015fturmadan stok g\u00fcncellenemez!&quot;);\r\n    }\r\n    \/\/Concrete State\r\n    class Suspended : OrderState\r\n    {\r\n        OrderMachine _context;\r\n        public Suspended(OrderMachine context)\r\n            =&gt; this._context = context;\r\n\r\n        public override void OrderCreate()\r\n            =&gt; Console.WriteLine(&quot;Sipari\u015f zaten olu\u015fturuldu...&quot;);\r\n        public override void Payment(int totalPrice)\r\n            =&gt; Console.WriteLine(&quot;Stok g\u00fcncellenmeden \u00f6deme yap\u0131lamaz!&quot;);\r\n        public override void StockReserve(int quantit)\r\n        {\r\n            if (quantit &gt; _context.Stock)\r\n            {\r\n                Console.WriteLine(&quot;Sipari\u015f edilmek istenen \u00fcr\u00fcn miktar\u0131, stok miktar\u0131ndan fazlad\u0131r!&quot;);\r\n                _context.SetOrderCanceled();\r\n                Console.WriteLine(&quot;Sipari\u015f iptal edilmi\u015ftir.&quot;);\r\n            }\r\n            else\r\n            {\r\n                Console.WriteLine(&quot;Sipari\u015f edilen \u00fcr\u00fcn miktar\u0131 kadar stok ba\u015far\u0131yla g\u00fcncellenmi\u015ftir.&quot;);\r\n                _context.SetStockReserved();\r\n                Console.WriteLine($&quot;Kalan stok miktar\u0131 : {_context.Stock - quantit}&quot;);\r\n            }\r\n        }\r\n    }\r\n    \/\/Concrete State\r\n    class StockReserved : OrderState\r\n    {\r\n        OrderMachine _context;\r\n        public StockReserved(OrderMachine context)\r\n            =&gt; this._context = context;\r\n\r\n        public override void OrderCreate()\r\n            =&gt; Console.WriteLine(&quot;Sipari\u015f zaten olu\u015fturuldu...&quot;);\r\n        public override void Payment(int totalPrice)\r\n        {\r\n            if (totalPrice &lt; 1500)\r\n            {\r\n                Console.WriteLine(&quot;\u00d6deme ba\u015far\u0131yla ger\u00e7ekle\u015ftirildi...&quot;);\r\n                _context.SetOrderCompleted();\r\n            }\r\n            else\r\n            {\r\n                Console.WriteLine(&quot;Yetersiz bakiye!&quot;);\r\n                _context.SetOrderFailed();\r\n            }\r\n        }\r\n        public override void StockReserve(int quantit)\r\n            =&gt; Console.WriteLine(&quot;Stok bilgisi zaten g\u00fcncelle\u015ftirildi...&quot;);\r\n    }\r\n    \/\/Concrete State\r\n    class OrderCompleted : OrderState\r\n    {\r\n        OrderMachine _context;\r\n        public OrderCompleted(OrderMachine context)\r\n            =&gt; this._context = context;\r\n\r\n        public override void OrderCreate()\r\n            =&gt; Console.WriteLine(&quot;Sipari\u015f zaten ba\u015far\u0131yla tamamland\u0131...&quot;);\r\n        public override void Payment(int totalPrice)\r\n            =&gt; Console.WriteLine(&quot;Sipari\u015f zaten ba\u015far\u0131yla tamamland\u0131...&quot;);\r\n        public override void StockReserve(int quantit)\r\n            =&gt; Console.WriteLine(&quot;Sipari\u015f zaten ba\u015far\u0131yla tamamland\u0131...&quot;);\r\n    }\r\n    \/\/Concrete State\r\n    class OrderFailed : OrderState\r\n    {\r\n        OrderMachine _context;\r\n        public OrderFailed(OrderMachine context)\r\n            =&gt; this._context = context;\r\n\r\n        public override void OrderCreate()\r\n            =&gt; Console.WriteLine(&quot;Sipari\u015f ba\u015far\u0131s\u0131z sonu\u00e7land\u0131...&quot;);\r\n        public override void Payment(int totalPrice)\r\n            =&gt; Console.WriteLine(&quot;Sipari\u015f ba\u015far\u0131s\u0131z sonu\u00e7land\u0131...&quot;);\r\n        public override void StockReserve(int quantit)\r\n            =&gt; Console.WriteLine(&quot;Sipari\u015f ba\u015far\u0131s\u0131z sonu\u00e7land\u0131...&quot;);\r\n    }\r\n    \/\/Concrete State\r\n    class OrderCanceled : OrderState\r\n    {\r\n        OrderMachine _context;\r\n        public OrderCanceled(OrderMachine context)\r\n            =&gt; this._context = context;\r\n\r\n        public override void OrderCreate()\r\n            =&gt; Console.WriteLine(&quot;Sipari\u015f iptal edildi... Sipari\u015f edilen \u00fcr\u00fcn adedini g\u00fcncelleyiniz!&quot;);\r\n        public override void Payment(int totalPrice)\r\n            =&gt; Console.WriteLine(&quot;Sipari\u015f iptal edildi... Sipari\u015f edilen \u00fcr\u00fcn adedini g\u00fcncelleyiniz.&quot;);\r\n        public override void StockReserve(int quantit)\r\n        {\r\n            if (quantit &gt; _context.Stock)\r\n            {\r\n                Console.WriteLine(&quot;Sipari\u015f edilmek istenen \u00fcr\u00fcn miktar\u0131, stok miktar\u0131ndan fazlad\u0131r!&quot;);\r\n                _context.SetOrderCanceled();\r\n                Console.WriteLine(&quot;Sipari\u015f iptal edilmi\u015ftir.&quot;);\r\n            }\r\n            else\r\n            {\r\n                Console.WriteLine(&quot;Sipari\u015f edilen \u00fcr\u00fcn miktar\u0131 kadar stok ba\u015far\u0131yla g\u00fcncellenmi\u015ftir.&quot;);\r\n                _context.SetStockReserved();\r\n                Console.WriteLine($&quot;Kalan stok miktar\u0131 : {_context.Stock - quantit}&quot;);\r\n            }\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131da State Design Pattern mant\u0131\u011f\u0131nda gerekli tasar\u0131m olu\u015fturulmu\u015ftur. \u015eimdi olu\u015fturulan bu tasar\u0131m\u0131 net bir \u015fekilde test edebilmek i\u00e7in a\u015fa\u011f\u0131daki \u00fc\u00e7 farkl\u0131 \u015fekilde kullan\u0131m\u0131 ele al\u0131p sonu\u00e7lar\u0131n\u0131 g\u00f6zlemlemekte fayda vard\u0131r.<\/p>\n<table>\n<tbody>\n<tr>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-9.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-9.png\" alt=\"C# State Design Pattern(State Tasar\u0131m Deseni)\" width=\"352\" height=\"225\" class=\"aligncenter size-full wp-image-22947\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-9.png 352w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-9-300x192.png 300w\" sizes=\"auto, (max-width: 352px) 100vw, 352px\" \/><\/a><\/td>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-11.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-11.png\" alt=\"C# State Design Pattern(State Tasar\u0131m Deseni)\" width=\"344\" height=\"261\" class=\"aligncenter size-full wp-image-22949\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-11.png 344w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-11-300x228.png 300w\" sizes=\"auto, (max-width: 344px) 100vw, 344px\" \/><\/a><\/td>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-13.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-13.png\" alt=\"C# State Design Pattern(State Tasar\u0131m Deseni)\" width=\"349\" height=\"258\" class=\"aligncenter size-full wp-image-22951\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-13.png 349w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-13-300x222.png 300w\" sizes=\"auto, (max-width: 349px) 100vw, 349px\" \/><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-10.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-10.png\" alt=\"C# State Design Pattern(State Tasar\u0131m Deseni)\" width=\"523\" height=\"180\" class=\"aligncenter size-full wp-image-22948\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-10.png 523w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-10-300x103.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-10-520x180.png 520w\" sizes=\"auto, (max-width: 523px) 100vw, 523px\" \/><\/a><\/td>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-12.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-12.png\" alt=\"C# State Design Pattern(State Tasar\u0131m Deseni)\" width=\"529\" height=\"227\" class=\"aligncenter size-full wp-image-22950\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-12.png 529w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-12-300x129.png 300w\" sizes=\"auto, (max-width: 529px) 100vw, 529px\" \/><\/a><\/td>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-14.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-14.png\" alt=\"C# State Design Pattern(State Tasar\u0131m Deseni)\" width=\"528\" height=\"227\" class=\"aligncenter size-full wp-image-22952\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-14.png 528w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/C-State-Design-PatternState-Tasarim-Deseni-14-300x129.png 300w\" sizes=\"auto, (max-width: 528px) 100vw, 528px\" \/><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u0130yi \u00e7al\u0131\u015fmalar \ud83d\ude42<\/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 Davran\u0131\u015fsal Tasar\u0131m Kal\u0131plar\u0131ndan(Behavioral Patterns) olan State Tasar\u0131m Desenini(State Design Pattern) tam teferruatl\u0131 inceliyor olaca\u011f\u0131z. State pattern nedir? Genellikle hangi tarz senaryolarda ne ama\u00e7la kullan\u0131lmaktad\u0131r? Hangi tasar\u0131m desenleriyle benzerlik g\u00f6stermektedir? vs. gibi&#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":22845,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2739,153],"tags":[1052,4390,750,4391,4392],"class_list":["post-22808","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core","category-design-pattern","tag-behavioral-patterns","tag-davranissal-tasarim-kaliplari","tag-design-pattern","tag-state-design-pattern","tag-state-tasarim-deseni"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/22808","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=22808"}],"version-history":[{"count":129,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/22808\/revisions"}],"predecessor-version":[{"id":22955,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/22808\/revisions\/22955"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/22845"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=22808"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=22808"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=22808"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}