[{"data":1,"prerenderedAt":1693},["ShallowReactive",2],{"post-\u002Ftr\u002Fstate-tasarim-deseni-nedir":3},{"page":4,"translation":1540,"nav":1554,"related":1672,"random":1681},{"id":5,"title":6,"body":7,"categories":1538,"category":1540,"date":1541,"description":1542,"draft":1543,"extension":1544,"image":1545,"kind":1540,"lang":235,"meta":1546,"navigation":394,"path":1508,"readingTime":427,"seo":1547,"slug":1548,"stem":1549,"tags":1550,"translationKey":1540,"type":1539,"updated":1540,"__hash__":1553},"postsTr\u002Ftr\u002Fstate-tasarim-deseni-nedir.md","State Tasarım Deseni Nedir?",{"type":8,"value":9,"toc":1524},"minimark",[10,52,61,74,77,80,85,91,93,97,106,113,119,122,145,165,170,175,185,188,191,193,197,200,203,208,213,216,223,228,291,293,297,302,305,316,319,324,327,329,333,363,365,369,373,982,986,1408,1410,1414,1419,1442,1447,1475,1480,1520],[11,12,13,21],"blockquote",{},[14,15,16,17],"p",{},"💡 ",[18,19,20],"strong",{},"Özet (TL;DR):",[22,23,24,31,46],"ul",{},[25,26,27,30],"li",{},[18,28,29],{},"Amacı:"," Bir nesnenin iç durumu (state) değiştiğinde davranışını da dinamik olarak değiştirmesini sağlayan davranışsal (behavioral) bir tasarım desenidir.",[25,32,33,36,37,41,42,45],{},[18,34,35],{},"Çözdüğü Sorun:"," Çok sayıda duruma ve karmaşık geçiş mantığına sahip olan sınıflardaki devasa ",[38,39,40],"code",{},"if-else"," veya ",[38,43,44],{},"switch-case"," bloklarını ortadan kaldırır.",[25,47,48,51],{},[18,49,50],{},"Yöntem:"," Her durumu ayrı bir sınıf olarak modeller ve bağlam (Context) nesnesinin davranışını aktif olan durum sınıfına delege eder.",[14,53,54,55,60],{},"Bu yazı ",[56,57,59],"a",{"href":58},"\u002Ftr\u002Fdesign-patterns-tasarim-desenleri-nedir","Design Patterns\u002FTasarım Desenleri nedir?"," başlıklı yazı dizisinin bir parçasıdır.",[14,62,63,64,73],{},"Bu içerik ağırlıklı olarak ",[56,65,72],{"href":66,"rel":67,"target":71},"https:\u002F\u002Frefactoring.guru\u002Fdesign-patterns",[68,69,70],"nofollow","noopener","noreferrer","_blank","refactoring.guru"," sitesindeki içeriğin tercümesi ve derlenmesinden oluşturulmuştur.",[14,75,76],{},"Tüm tasarım desenleri ya da diğer adıyla tasarım kalıplarına yönelik ayrıntılı içeriklere yazının sonundaki bağlantılardan ulaşabilirsiniz.",[78,79],"hr",{},[81,82,84],"h2",{"id":83},"state-tasarım-deseninin-amacı","State Tasarım Deseninin Amacı",[14,86,87,90],{},[18,88,89],{},"State",", bir nesnenin iç durumu değiştiğinde davranışını da değiştirmesini sağlayan davranışsal bir tasarım desenidir. Bu desen uygulandığında nesne, sanki çalışma zamanında kendi sınıfını (class) değiştirmiş gibi görünür.",[78,92],{},[81,94,96],{"id":95},"sorun","Sorun",[14,98,99,100,105],{},"State deseni ",[56,101,104],{"href":102,"rel":103,"target":71},"https:\u002F\u002Ftr.wikipedia.org\u002Fwiki\u002FSonlu_durum_makinesi",[68,69,70],"sonlu durum makineleri"," (finite state machines) konsepti ile yakından ilişkilidir.",[14,107,108],{},[109,110],"img",{"alt":111,"src":112},"","\u002Fimages\u002Fstate-tasarim-deseni-nedir\u002Fsonlu-durum-makinesi.avif",[14,114,115],{},[116,117,118],"em",{},"Sonlu Durum Makinesi",[14,120,121],{},"Ana fikir şudur: Herhangi bir zamanda, bir programın olabileceği sınırlı sayıda durum vardır. Herhangi bir benzersiz durumda program farklı şekilde hareket eder ve program durumu birinden diğerine anlık olarak geçiş yapabilir. Ancak mevcut duruma bağlı olarak, sistem bir başka duruma geçebilir veya geçemez. Bu geçiş kuralları (transitions) önceden belirlidir ve sonlu sayıdadır.",[14,123,124,125,128,129,132,133,136,137,140,141,144],{},"Bu yaklaşımı nesnelere de uygulayabilirsiniz. Bir ",[38,126,127],{},"Document"," sınıfınız olduğunu düşünün. Bir doküman şu 3 durumdan birinde olabilir: ",[38,130,131],{},"Draft"," (Taslak), ",[38,134,135],{},"Moderation"," (Moderasyonda) ve ",[38,138,139],{},"Published"," (Yayımlanmış). Dokümanın ",[38,142,143],{},"publish"," (yayınla) metodu her durumda farklı çalışır:",[22,146,147,153,159],{},[25,148,149,152],{},[18,150,151],{},"Taslak"," durumundayken yayınlanırsa, moderasyon durumuna geçer.",[25,154,155,158],{},[18,156,157],{},"Moderasyon"," durumundayken dokümanı herkese açık hale getirir; ancak bunu sadece isteği gönderen kullanıcı bir yöneticiyse yapabilir.",[25,160,161,164],{},[18,162,163],{},"Yayımlanmış"," bir doküman için durumda herhangi bir değişiklik olmaz.",[14,166,167],{},[109,168],{"alt":111,"src":169},"\u002Fimages\u002Fstate-tasarim-deseni-nedir\u002Fstate-tasarim-deseni-nedir.avif",[14,171,172],{},[116,173,174],{},"Bir doküman nesnesi için mümkün olan durumlar ve geçişler",[14,176,177,178,41,181,184],{},"Durum makineleri (state machines) genel olarak, mevcut duruma göre uygun davranışı seçen koşullu ifadelerle (",[38,179,180],{},"if",[38,182,183],{},"switch"," gibi) uygulanır. Genelde bu durum, nesnenin bazı değişkenlerinin değerlerinden oluşur. Sonlu durum makinelerini daha önce duymadıysanız bile muhtemelen en az bir defa koşullu ifadelere dayalı bir durum yapısı kurmuşsunuzdur.",[14,186,187],{},"Koşullu ifadelere dayalı bir durum makinesinin en zayıf noktası, sisteme yeni durumlar ve duruma bağlı davranışlar eklemek istediğinizde ortaya çıkar. Çoğu metot, mevcut duruma göre doğru davranışı seçen devasa koşul ifadeleri içerecektir. Geçiş mantığında yapılacak en ufak bir değişiklik, tüm metotlardaki koşullu ifadelerin güncellenmesini gerektireceğinden bu tarz kodları yönetmek ve test etmek oldukça zordur.",[14,189,190],{},"Proje geliştikçe sorun daha da büyür. Bütün olası durumları ve geçişleri tasarım aşamasında planlamak hiç kolay değildir. Böyle olunca da başlangıçta çok yalın gözüken bir durum makinesi kodu, zamanla şişerek karmaşık ve spagetti bir yapıya dönüşebilir.",[78,192],{},[81,194,196],{"id":195},"çözüm","Çözüm",[14,198,199],{},"State deseni, bir nesnenin tüm olası durumları için ayrı birer sınıf oluşturmanızı ve bu duruma özel davranışların hepsini bu sınıfların içerisine aktarmanızı önerir.",[14,201,202],{},"Bağlam (Context) adı verilen orijinal nesne, tüm davranışları kendisi uygulamak yerine, aktif durumu temsil eden durum nesnesinin referansını saklar ve durumla alakalı tüm işleri o nesneye delege eder.",[14,204,205],{},[109,206],{"alt":111,"src":207},"\u002Fimages\u002Fstate-tasarim-deseni-nedir\u002Fstate-deseni-ornegi.avif",[14,209,210],{},[116,211,212],{},"Doküman nesnesinin işi durum nesnesine delege etmesi",[14,214,215],{},"Bağlamın bir başka duruma geçiş yapması için, aktif durum nesnesi yeni durumu temsil eden başka bir nesne ile değiştirilir. Bunun mümkün olması için tüm durum sınıflarının aynı arayüzü (interface) esas alması şarttır. Böylece bağlam nesnesi, durum nesneleri ile bu ortak arayüz üzerinden iletişim kurabilir.",[14,217,218,219,222],{},"Bu yapı ",[18,220,221],{},"Strategy"," desenine benzer görünebilir; ancak aralarında çok temel bir fark vardır: State deseninde durum nesneleri birbirlerinden haberdar olabilir ve bir durumdan diğerine geçişi (transition) kendileri tetikleyebilir.",[224,225,227],"h3",{"id":226},"state-ve-strategy-desenleri-arasındaki-fark","State ve Strategy Desenleri Arasındaki Fark",[229,230,231,248],"table",{},[232,233,234],"thead",{},[235,236,237,242,245],"tr",{},[238,239,241],"th",{"align":240},"left","Özellik",[238,243,244],{"align":240},"State Deseni",[238,246,247],{"align":240},"Strategy Deseni",[249,250,251,265,278],"tbody",{},[235,252,253,259,262],{},[254,255,256],"td",{"align":240},[18,257,258],{},"Temel Amaç",[254,260,261],{"align":240},"Nesnenin durumuna göre davranışını çalışma zamanında değiştirmek.",[254,263,264],{"align":240},"Bir işi yapmanın farklı yöntemlerini veya algoritmalarını sunmak.",[235,266,267,272,275],{},[254,268,269],{"align":240},[18,270,271],{},"Geçiş Yönetimi",[254,273,274],{"align":240},"Durum sınıfları sonraki durumu tetikleyebilir ve bağlamın durumunu değiştirebilir.",[254,276,277],{"align":240},"Algoritmalar birbirinden bağımsızdır; bağlama dışarıdan enjekte edilir.",[235,279,280,285,288],{},[254,281,282],{"align":240},[18,283,284],{},"İletişim",[254,286,287],{"align":240},"Durum nesneleri arasında geçiş ilişkisi (flow) vardır.",[254,289,290],{"align":240},"Strateji nesneleri birbirinden tamamen bihaberdir.",[78,292],{},[81,294,296],{"id":295},"uygulanabilirlik","Uygulanabilirlik",[14,298,299],{},[18,300,301],{},"Mevcut durumuna bağlı olarak farklı hareket etmesi gereken nesneleriniz varsa, olası durum sayıları çok fazlaysa ve bu durumlara özel kodlar sık değişiyorsa State desenini kullanabilirsiniz.",[14,303,304],{},"Bu desen, duruma özel tüm kodları ayrı sınıflara almanızı önerir. Böylece, diğerlerinden bağımsız olarak yeni durumlar ekleyebilir veya mevcut durumları değiştirebilirsiniz. Bu da kodun bakım maliyetini önemli ölçüde düşürür.",[14,306,307],{},[18,308,309,310,312,313,315],{},"Sınıfın belirli alanlarının değerlerine göre hareketlerini değiştirmek için kullanılan, aşırı miktarda koşullu ifadelere (",[38,311,40],{}," \u002F ",[38,314,183],{},") sahip kirli sınıfları temizlemek için bu deseni kullanabilirsiniz.",[14,317,318],{},"State deseni, bu koşullu ifadeleri ilgili durum sınıflarına dönüştürmenizi sağlar. Bunu yaparken ana sınıfınızda durum yönetimi için kullandığınız geçici alanları ve yardımcı metotları temizleyebilirsiniz.",[14,320,321],{},[18,322,323],{},"Koşullu ifadeler esaslı bir durum makinesinde, benzer durumlar ve geçişler için tekrarlanan çok fazla kodunuz varsa bu deseni kullanabilirsiniz.",[14,325,326],{},"State deseni, durum sınıfları için bir hiyerarşi oluşturmanızı ve ortak kodları temel bir soyut sınıf (abstract class) içine alarak kod tekrarlarını azaltmanızı sağlar.",[78,328],{},[81,330,332],{"id":331},"diğer-tasarım-desenleri-ile-i̇lişkisi","Diğer Tasarım Desenleri ile İlişkisi",[22,334,335,350],{},[25,336,337,340,341,340,343,345,346,349],{},[18,338,339],{},"Bridge",", ",[18,342,89],{},[18,344,221],{}," (ve bir dereceye kadar ",[18,347,348],{},"Adapter",") çok benzer yapılara sahiptir. Aslında bu desenlerin hepsi kompozisyon (composition), yani işi başka nesnelere delege etme esasına dayanır. Fakat her biri farklı bir soruna çözüm üretir.",[25,351,352,340,354,356,357,359,360,362],{},[18,353,89],{},[18,355,221],{}," deseninin bir uzantısı olarak düşünülebilir. Her iki desen de kompozisyon esaslıdır: İkisi de işin bir bölümünü yardımcı nesnelere delege ederek bağlamın davranışını değiştirir. ",[116,358,221],{},", nesneleri birbirinden tamamen bağımsız ve bihaber hale getirir. Öte yandan ",[116,361,89],{},", durumlar arasında bağımlılık olmasını sınırlamaz ve istedikleri zaman bağlam nesnesinin durumunu değiştirmelerine olanak tanır.",[78,364],{},[81,366,368],{"id":367},"state-deseni-kod-örnekleri","State Deseni Kod Örnekleri",[224,370,372],{"id":371},"örnek-php-kodu","Örnek PHP Kodu",[374,375,379],"pre",{"className":376,"code":377,"language":378,"meta":111,"style":111},"language-php shiki shiki-themes github-light github-dark","\u003C?php\n\nnamespace RefactoringGuru\\State\\Conceptual;\n\n\u002F**\n * The Context defines the interface of interest to clients. It also maintains a\n * reference to an instance of a State subclass, which represents the current\n * state of the Context.\n *\u002F\nclass Context\n{\n    \u002F**\n     * @var State A reference to the current state of the Context.\n     *\u002F\n    private $state;\n\n    public function __construct(State $state)\n    {\n        $this->transitionTo($state);\n    }\n\n    \u002F**\n     * The Context allows changing the State object at runtime.\n     *\u002F\n    public function transitionTo(State $state): void\n    {\n        echo \"Context: Transition to \" . get_class($state) . \".\\n\";\n        $this->state = $state;\n        $this->state->setContext($this);\n    }\n\n    \u002F**\n     * The Context delegates part of its behavior to the current State object.\n     *\u002F\n    public function request1(): void\n    {\n        $this->state->handle1();\n    }\n\n    public function request2(): void\n    {\n        $this->state->handle2();\n    }\n}\n\n\u002F**\n * The base State class declares methods that all Concrete State should\n * implement and also provides a backreference to the Context object, associated\n * with the State. This backreference can be used by States to transition the\n * Context to another State.\n *\u002F\nabstract class State\n{\n    \u002F**\n     * @var Context\n     *\u002F\n    protected $context;\n\n    public function setContext(Context $context)\n    {\n        $this->context = $context;\n    }\n\n    abstract public function handle1(): void;\n\n    abstract public function handle2(): void;\n}\n\n\u002F**\n * Concrete States implement various behaviors, associated with a state of the\n * Context.\n *\u002F\nclass ConcreteStateA extends State\n{\n    public function handle1(): void\n    {\n        echo \"ConcreteStateA handles request1.\\n\";\n        echo \"ConcreteStateA wants to change the state of the context.\\n\";\n        $this->context->transitionTo(new ConcreteStateB());\n    }\n\n    public function handle2(): void\n    {\n        echo \"ConcreteStateA handles request2.\\n\";\n    }\n}\n\nclass ConcreteStateB extends State\n{\n    public function handle1(): void\n    {\n        echo \"ConcreteStateB handles request1.\\n\";\n    }\n\n    public function handle2(): void\n    {\n        echo \"ConcreteStateB handles request2.\\n\";\n        echo \"ConcreteStateB wants to change the state of the context.\\n\";\n        $this->context->transitionTo(new ConcreteStateA());\n    }\n}\n\n\u002F**\n * The client code.\n *\u002F\n$context = new Context(new ConcreteStateA());\n$context->request1();\n$context->request2();\n","php",[38,380,381,389,396,402,407,413,419,425,431,437,443,449,455,461,467,473,478,484,490,496,502,507,512,518,523,529,534,540,546,552,557,562,567,573,578,584,589,595,600,605,611,616,622,627,633,638,643,649,655,661,667,672,678,683,688,694,699,705,710,716,721,727,732,737,743,748,754,759,764,769,775,781,786,792,797,803,808,814,820,826,831,836,842,847,853,858,863,868,874,879,884,889,895,900,905,910,915,921,927,933,938,943,948,953,959,964,970,976],{"__ignoreMap":111},[382,383,386],"span",{"class":384,"line":385},"line",1,[382,387,388],{},"\u003C?php\n",[382,390,392],{"class":384,"line":391},2,[382,393,395],{"emptyLinePlaceholder":394},true,"\n",[382,397,399],{"class":384,"line":398},3,[382,400,401],{},"namespace RefactoringGuru\\State\\Conceptual;\n",[382,403,405],{"class":384,"line":404},4,[382,406,395],{"emptyLinePlaceholder":394},[382,408,410],{"class":384,"line":409},5,[382,411,412],{},"\u002F**\n",[382,414,416],{"class":384,"line":415},6,[382,417,418],{}," * The Context defines the interface of interest to clients. It also maintains a\n",[382,420,422],{"class":384,"line":421},7,[382,423,424],{}," * reference to an instance of a State subclass, which represents the current\n",[382,426,428],{"class":384,"line":427},8,[382,429,430],{}," * state of the Context.\n",[382,432,434],{"class":384,"line":433},9,[382,435,436],{}," *\u002F\n",[382,438,440],{"class":384,"line":439},10,[382,441,442],{},"class Context\n",[382,444,446],{"class":384,"line":445},11,[382,447,448],{},"{\n",[382,450,452],{"class":384,"line":451},12,[382,453,454],{},"    \u002F**\n",[382,456,458],{"class":384,"line":457},13,[382,459,460],{},"     * @var State A reference to the current state of the Context.\n",[382,462,464],{"class":384,"line":463},14,[382,465,466],{},"     *\u002F\n",[382,468,470],{"class":384,"line":469},15,[382,471,472],{},"    private $state;\n",[382,474,476],{"class":384,"line":475},16,[382,477,395],{"emptyLinePlaceholder":394},[382,479,481],{"class":384,"line":480},17,[382,482,483],{},"    public function __construct(State $state)\n",[382,485,487],{"class":384,"line":486},18,[382,488,489],{},"    {\n",[382,491,493],{"class":384,"line":492},19,[382,494,495],{},"        $this->transitionTo($state);\n",[382,497,499],{"class":384,"line":498},20,[382,500,501],{},"    }\n",[382,503,505],{"class":384,"line":504},21,[382,506,395],{"emptyLinePlaceholder":394},[382,508,510],{"class":384,"line":509},22,[382,511,454],{},[382,513,515],{"class":384,"line":514},23,[382,516,517],{},"     * The Context allows changing the State object at runtime.\n",[382,519,521],{"class":384,"line":520},24,[382,522,466],{},[382,524,526],{"class":384,"line":525},25,[382,527,528],{},"    public function transitionTo(State $state): void\n",[382,530,532],{"class":384,"line":531},26,[382,533,489],{},[382,535,537],{"class":384,"line":536},27,[382,538,539],{},"        echo \"Context: Transition to \" . get_class($state) . \".\\n\";\n",[382,541,543],{"class":384,"line":542},28,[382,544,545],{},"        $this->state = $state;\n",[382,547,549],{"class":384,"line":548},29,[382,550,551],{},"        $this->state->setContext($this);\n",[382,553,555],{"class":384,"line":554},30,[382,556,501],{},[382,558,560],{"class":384,"line":559},31,[382,561,395],{"emptyLinePlaceholder":394},[382,563,565],{"class":384,"line":564},32,[382,566,454],{},[382,568,570],{"class":384,"line":569},33,[382,571,572],{},"     * The Context delegates part of its behavior to the current State object.\n",[382,574,576],{"class":384,"line":575},34,[382,577,466],{},[382,579,581],{"class":384,"line":580},35,[382,582,583],{},"    public function request1(): void\n",[382,585,587],{"class":384,"line":586},36,[382,588,489],{},[382,590,592],{"class":384,"line":591},37,[382,593,594],{},"        $this->state->handle1();\n",[382,596,598],{"class":384,"line":597},38,[382,599,501],{},[382,601,603],{"class":384,"line":602},39,[382,604,395],{"emptyLinePlaceholder":394},[382,606,608],{"class":384,"line":607},40,[382,609,610],{},"    public function request2(): void\n",[382,612,614],{"class":384,"line":613},41,[382,615,489],{},[382,617,619],{"class":384,"line":618},42,[382,620,621],{},"        $this->state->handle2();\n",[382,623,625],{"class":384,"line":624},43,[382,626,501],{},[382,628,630],{"class":384,"line":629},44,[382,631,632],{},"}\n",[382,634,636],{"class":384,"line":635},45,[382,637,395],{"emptyLinePlaceholder":394},[382,639,641],{"class":384,"line":640},46,[382,642,412],{},[382,644,646],{"class":384,"line":645},47,[382,647,648],{}," * The base State class declares methods that all Concrete State should\n",[382,650,652],{"class":384,"line":651},48,[382,653,654],{}," * implement and also provides a backreference to the Context object, associated\n",[382,656,658],{"class":384,"line":657},49,[382,659,660],{}," * with the State. This backreference can be used by States to transition the\n",[382,662,664],{"class":384,"line":663},50,[382,665,666],{}," * Context to another State.\n",[382,668,670],{"class":384,"line":669},51,[382,671,436],{},[382,673,675],{"class":384,"line":674},52,[382,676,677],{},"abstract class State\n",[382,679,681],{"class":384,"line":680},53,[382,682,448],{},[382,684,686],{"class":384,"line":685},54,[382,687,454],{},[382,689,691],{"class":384,"line":690},55,[382,692,693],{},"     * @var Context\n",[382,695,697],{"class":384,"line":696},56,[382,698,466],{},[382,700,702],{"class":384,"line":701},57,[382,703,704],{},"    protected $context;\n",[382,706,708],{"class":384,"line":707},58,[382,709,395],{"emptyLinePlaceholder":394},[382,711,713],{"class":384,"line":712},59,[382,714,715],{},"    public function setContext(Context $context)\n",[382,717,719],{"class":384,"line":718},60,[382,720,489],{},[382,722,724],{"class":384,"line":723},61,[382,725,726],{},"        $this->context = $context;\n",[382,728,730],{"class":384,"line":729},62,[382,731,501],{},[382,733,735],{"class":384,"line":734},63,[382,736,395],{"emptyLinePlaceholder":394},[382,738,740],{"class":384,"line":739},64,[382,741,742],{},"    abstract public function handle1(): void;\n",[382,744,746],{"class":384,"line":745},65,[382,747,395],{"emptyLinePlaceholder":394},[382,749,751],{"class":384,"line":750},66,[382,752,753],{},"    abstract public function handle2(): void;\n",[382,755,757],{"class":384,"line":756},67,[382,758,632],{},[382,760,762],{"class":384,"line":761},68,[382,763,395],{"emptyLinePlaceholder":394},[382,765,767],{"class":384,"line":766},69,[382,768,412],{},[382,770,772],{"class":384,"line":771},70,[382,773,774],{}," * Concrete States implement various behaviors, associated with a state of the\n",[382,776,778],{"class":384,"line":777},71,[382,779,780],{}," * Context.\n",[382,782,784],{"class":384,"line":783},72,[382,785,436],{},[382,787,789],{"class":384,"line":788},73,[382,790,791],{},"class ConcreteStateA extends State\n",[382,793,795],{"class":384,"line":794},74,[382,796,448],{},[382,798,800],{"class":384,"line":799},75,[382,801,802],{},"    public function handle1(): void\n",[382,804,806],{"class":384,"line":805},76,[382,807,489],{},[382,809,811],{"class":384,"line":810},77,[382,812,813],{},"        echo \"ConcreteStateA handles request1.\\n\";\n",[382,815,817],{"class":384,"line":816},78,[382,818,819],{},"        echo \"ConcreteStateA wants to change the state of the context.\\n\";\n",[382,821,823],{"class":384,"line":822},79,[382,824,825],{},"        $this->context->transitionTo(new ConcreteStateB());\n",[382,827,829],{"class":384,"line":828},80,[382,830,501],{},[382,832,834],{"class":384,"line":833},81,[382,835,395],{"emptyLinePlaceholder":394},[382,837,839],{"class":384,"line":838},82,[382,840,841],{},"    public function handle2(): void\n",[382,843,845],{"class":384,"line":844},83,[382,846,489],{},[382,848,850],{"class":384,"line":849},84,[382,851,852],{},"        echo \"ConcreteStateA handles request2.\\n\";\n",[382,854,856],{"class":384,"line":855},85,[382,857,501],{},[382,859,861],{"class":384,"line":860},86,[382,862,632],{},[382,864,866],{"class":384,"line":865},87,[382,867,395],{"emptyLinePlaceholder":394},[382,869,871],{"class":384,"line":870},88,[382,872,873],{},"class ConcreteStateB extends State\n",[382,875,877],{"class":384,"line":876},89,[382,878,448],{},[382,880,882],{"class":384,"line":881},90,[382,883,802],{},[382,885,887],{"class":384,"line":886},91,[382,888,489],{},[382,890,892],{"class":384,"line":891},92,[382,893,894],{},"        echo \"ConcreteStateB handles request1.\\n\";\n",[382,896,898],{"class":384,"line":897},93,[382,899,501],{},[382,901,903],{"class":384,"line":902},94,[382,904,395],{"emptyLinePlaceholder":394},[382,906,908],{"class":384,"line":907},95,[382,909,841],{},[382,911,913],{"class":384,"line":912},96,[382,914,489],{},[382,916,918],{"class":384,"line":917},97,[382,919,920],{},"        echo \"ConcreteStateB handles request2.\\n\";\n",[382,922,924],{"class":384,"line":923},98,[382,925,926],{},"        echo \"ConcreteStateB wants to change the state of the context.\\n\";\n",[382,928,930],{"class":384,"line":929},99,[382,931,932],{},"        $this->context->transitionTo(new ConcreteStateA());\n",[382,934,936],{"class":384,"line":935},100,[382,937,501],{},[382,939,941],{"class":384,"line":940},101,[382,942,632],{},[382,944,946],{"class":384,"line":945},102,[382,947,395],{"emptyLinePlaceholder":394},[382,949,951],{"class":384,"line":950},103,[382,952,412],{},[382,954,956],{"class":384,"line":955},104,[382,957,958],{}," * The client code.\n",[382,960,962],{"class":384,"line":961},105,[382,963,436],{},[382,965,967],{"class":384,"line":966},106,[382,968,969],{},"$context = new Context(new ConcreteStateA());\n",[382,971,973],{"class":384,"line":972},107,[382,974,975],{},"$context->request1();\n",[382,977,979],{"class":384,"line":978},108,[382,980,981],{},"$context->request2();\n",[224,983,985],{"id":984},"örnek-python-kodu","Örnek Python Kodu",[374,987,991],{"className":988,"code":989,"language":990,"meta":111,"style":111},"language-python shiki shiki-themes github-light github-dark","from __future__ import annotations\nfrom abc import ABC, abstractmethod\n\nclass Context:\n    \"\"\"\n    The Context defines the interface of interest to clients. It also maintains\n    a reference to an instance of a State subclass, which represents the current\n    state of the Context.\n    \"\"\"\n\n    _state = None\n    \"\"\"\n    A reference to the current state of the Context.\n    \"\"\"\n\n    def __init__(self, state: State) -> None:\n        self.transition_to(state)\n\n    def transition_to(self, state: State):\n        \"\"\"\n        The Context allows changing the State object at runtime.\n        \"\"\"\n\n        print(f\"Context: Transition to {type(state).__name__}\")\n        self._state = state\n        self._state.context = self\n\n    \"\"\"\n    The Context delegates part of its behavior to the current State object.\n    \"\"\"\n\n    def request1(self):\n        self._state.handle1()\n\n    def request2(self):\n        self._state.handle2()\n\nclass State(ABC):\n    \"\"\"\n    The base State class declares methods that all Concrete State should\n    implement and also provides a backreference to the Context object,\n    associated with the State. This backreference can be used by States to\n    transition the Context to another State.\n    \"\"\"\n\n    @property\n    def context(self) -> Context:\n        return self._context\n\n    @context.setter\n    def context(self, context: Context) -> None:\n        self._context = context\n\n    @abstractmethod\n    def handle1(self) -> None:\n        pass\n\n    @abstractmethod\n    def handle2(self) -> None:\n        pass\n\n\"\"\"\nConcrete States implement various behaviors, associated with a state of the\nContext.\n\"\"\"\n\nclass ConcreteStateA(State):\n    def handle1(self) -> None:\n        print(\"ConcreteStateA handles request1.\")\n        print(\"ConcreteStateA wants to change the state of the context.\")\n        self.context.transition_to(ConcreteStateB())\n\n    def handle2(self) -> None:\n        print(\"ConcreteStateA handles request2.\")\n\nclass ConcreteStateB(State):\n    def handle1(self) -> None:\n        print(\"ConcreteStateB handles request1.\")\n\n    def handle2(self) -> None:\n        print(\"ConcreteStateB handles request2.\")\n        print(\"ConcreteStateB wants to change the state of the context.\")\n        self.context.transition_to(ConcreteStateA())\n\nif __name__ == \"__main__\":\n    # The client code.\n\n    context = Context(ConcreteStateA())\n    context.request1()\n    context.request2()\n","python",[38,992,993,998,1003,1007,1012,1017,1022,1027,1032,1036,1040,1045,1049,1054,1058,1062,1067,1072,1076,1081,1086,1091,1095,1099,1104,1109,1114,1118,1122,1127,1131,1135,1140,1145,1149,1154,1159,1163,1168,1172,1177,1182,1187,1192,1196,1200,1205,1210,1215,1219,1224,1229,1234,1238,1243,1248,1253,1257,1261,1266,1270,1274,1279,1284,1289,1293,1297,1302,1306,1311,1316,1321,1325,1329,1334,1338,1343,1347,1352,1356,1360,1365,1370,1375,1379,1384,1389,1393,1398,1403],{"__ignoreMap":111},[382,994,995],{"class":384,"line":385},[382,996,997],{},"from __future__ import annotations\n",[382,999,1000],{"class":384,"line":391},[382,1001,1002],{},"from abc import ABC, abstractmethod\n",[382,1004,1005],{"class":384,"line":398},[382,1006,395],{"emptyLinePlaceholder":394},[382,1008,1009],{"class":384,"line":404},[382,1010,1011],{},"class Context:\n",[382,1013,1014],{"class":384,"line":409},[382,1015,1016],{},"    \"\"\"\n",[382,1018,1019],{"class":384,"line":415},[382,1020,1021],{},"    The Context defines the interface of interest to clients. It also maintains\n",[382,1023,1024],{"class":384,"line":421},[382,1025,1026],{},"    a reference to an instance of a State subclass, which represents the current\n",[382,1028,1029],{"class":384,"line":427},[382,1030,1031],{},"    state of the Context.\n",[382,1033,1034],{"class":384,"line":433},[382,1035,1016],{},[382,1037,1038],{"class":384,"line":439},[382,1039,395],{"emptyLinePlaceholder":394},[382,1041,1042],{"class":384,"line":445},[382,1043,1044],{},"    _state = None\n",[382,1046,1047],{"class":384,"line":451},[382,1048,1016],{},[382,1050,1051],{"class":384,"line":457},[382,1052,1053],{},"    A reference to the current state of the Context.\n",[382,1055,1056],{"class":384,"line":463},[382,1057,1016],{},[382,1059,1060],{"class":384,"line":469},[382,1061,395],{"emptyLinePlaceholder":394},[382,1063,1064],{"class":384,"line":475},[382,1065,1066],{},"    def __init__(self, state: State) -> None:\n",[382,1068,1069],{"class":384,"line":480},[382,1070,1071],{},"        self.transition_to(state)\n",[382,1073,1074],{"class":384,"line":486},[382,1075,395],{"emptyLinePlaceholder":394},[382,1077,1078],{"class":384,"line":492},[382,1079,1080],{},"    def transition_to(self, state: State):\n",[382,1082,1083],{"class":384,"line":498},[382,1084,1085],{},"        \"\"\"\n",[382,1087,1088],{"class":384,"line":504},[382,1089,1090],{},"        The Context allows changing the State object at runtime.\n",[382,1092,1093],{"class":384,"line":509},[382,1094,1085],{},[382,1096,1097],{"class":384,"line":514},[382,1098,395],{"emptyLinePlaceholder":394},[382,1100,1101],{"class":384,"line":520},[382,1102,1103],{},"        print(f\"Context: Transition to {type(state).__name__}\")\n",[382,1105,1106],{"class":384,"line":525},[382,1107,1108],{},"        self._state = state\n",[382,1110,1111],{"class":384,"line":531},[382,1112,1113],{},"        self._state.context = self\n",[382,1115,1116],{"class":384,"line":536},[382,1117,395],{"emptyLinePlaceholder":394},[382,1119,1120],{"class":384,"line":542},[382,1121,1016],{},[382,1123,1124],{"class":384,"line":548},[382,1125,1126],{},"    The Context delegates part of its behavior to the current State object.\n",[382,1128,1129],{"class":384,"line":554},[382,1130,1016],{},[382,1132,1133],{"class":384,"line":559},[382,1134,395],{"emptyLinePlaceholder":394},[382,1136,1137],{"class":384,"line":564},[382,1138,1139],{},"    def request1(self):\n",[382,1141,1142],{"class":384,"line":569},[382,1143,1144],{},"        self._state.handle1()\n",[382,1146,1147],{"class":384,"line":575},[382,1148,395],{"emptyLinePlaceholder":394},[382,1150,1151],{"class":384,"line":580},[382,1152,1153],{},"    def request2(self):\n",[382,1155,1156],{"class":384,"line":586},[382,1157,1158],{},"        self._state.handle2()\n",[382,1160,1161],{"class":384,"line":591},[382,1162,395],{"emptyLinePlaceholder":394},[382,1164,1165],{"class":384,"line":597},[382,1166,1167],{},"class State(ABC):\n",[382,1169,1170],{"class":384,"line":602},[382,1171,1016],{},[382,1173,1174],{"class":384,"line":607},[382,1175,1176],{},"    The base State class declares methods that all Concrete State should\n",[382,1178,1179],{"class":384,"line":613},[382,1180,1181],{},"    implement and also provides a backreference to the Context object,\n",[382,1183,1184],{"class":384,"line":618},[382,1185,1186],{},"    associated with the State. This backreference can be used by States to\n",[382,1188,1189],{"class":384,"line":624},[382,1190,1191],{},"    transition the Context to another State.\n",[382,1193,1194],{"class":384,"line":629},[382,1195,1016],{},[382,1197,1198],{"class":384,"line":635},[382,1199,395],{"emptyLinePlaceholder":394},[382,1201,1202],{"class":384,"line":640},[382,1203,1204],{},"    @property\n",[382,1206,1207],{"class":384,"line":645},[382,1208,1209],{},"    def context(self) -> Context:\n",[382,1211,1212],{"class":384,"line":651},[382,1213,1214],{},"        return self._context\n",[382,1216,1217],{"class":384,"line":657},[382,1218,395],{"emptyLinePlaceholder":394},[382,1220,1221],{"class":384,"line":663},[382,1222,1223],{},"    @context.setter\n",[382,1225,1226],{"class":384,"line":669},[382,1227,1228],{},"    def context(self, context: Context) -> None:\n",[382,1230,1231],{"class":384,"line":674},[382,1232,1233],{},"        self._context = context\n",[382,1235,1236],{"class":384,"line":680},[382,1237,395],{"emptyLinePlaceholder":394},[382,1239,1240],{"class":384,"line":685},[382,1241,1242],{},"    @abstractmethod\n",[382,1244,1245],{"class":384,"line":690},[382,1246,1247],{},"    def handle1(self) -> None:\n",[382,1249,1250],{"class":384,"line":696},[382,1251,1252],{},"        pass\n",[382,1254,1255],{"class":384,"line":701},[382,1256,395],{"emptyLinePlaceholder":394},[382,1258,1259],{"class":384,"line":707},[382,1260,1242],{},[382,1262,1263],{"class":384,"line":712},[382,1264,1265],{},"    def handle2(self) -> None:\n",[382,1267,1268],{"class":384,"line":718},[382,1269,1252],{},[382,1271,1272],{"class":384,"line":723},[382,1273,395],{"emptyLinePlaceholder":394},[382,1275,1276],{"class":384,"line":729},[382,1277,1278],{},"\"\"\"\n",[382,1280,1281],{"class":384,"line":734},[382,1282,1283],{},"Concrete States implement various behaviors, associated with a state of the\n",[382,1285,1286],{"class":384,"line":739},[382,1287,1288],{},"Context.\n",[382,1290,1291],{"class":384,"line":745},[382,1292,1278],{},[382,1294,1295],{"class":384,"line":750},[382,1296,395],{"emptyLinePlaceholder":394},[382,1298,1299],{"class":384,"line":756},[382,1300,1301],{},"class ConcreteStateA(State):\n",[382,1303,1304],{"class":384,"line":761},[382,1305,1247],{},[382,1307,1308],{"class":384,"line":766},[382,1309,1310],{},"        print(\"ConcreteStateA handles request1.\")\n",[382,1312,1313],{"class":384,"line":771},[382,1314,1315],{},"        print(\"ConcreteStateA wants to change the state of the context.\")\n",[382,1317,1318],{"class":384,"line":777},[382,1319,1320],{},"        self.context.transition_to(ConcreteStateB())\n",[382,1322,1323],{"class":384,"line":783},[382,1324,395],{"emptyLinePlaceholder":394},[382,1326,1327],{"class":384,"line":788},[382,1328,1265],{},[382,1330,1331],{"class":384,"line":794},[382,1332,1333],{},"        print(\"ConcreteStateA handles request2.\")\n",[382,1335,1336],{"class":384,"line":799},[382,1337,395],{"emptyLinePlaceholder":394},[382,1339,1340],{"class":384,"line":805},[382,1341,1342],{},"class ConcreteStateB(State):\n",[382,1344,1345],{"class":384,"line":810},[382,1346,1247],{},[382,1348,1349],{"class":384,"line":816},[382,1350,1351],{},"        print(\"ConcreteStateB handles request1.\")\n",[382,1353,1354],{"class":384,"line":822},[382,1355,395],{"emptyLinePlaceholder":394},[382,1357,1358],{"class":384,"line":828},[382,1359,1265],{},[382,1361,1362],{"class":384,"line":833},[382,1363,1364],{},"        print(\"ConcreteStateB handles request2.\")\n",[382,1366,1367],{"class":384,"line":838},[382,1368,1369],{},"        print(\"ConcreteStateB wants to change the state of the context.\")\n",[382,1371,1372],{"class":384,"line":844},[382,1373,1374],{},"        self.context.transition_to(ConcreteStateA())\n",[382,1376,1377],{"class":384,"line":849},[382,1378,395],{"emptyLinePlaceholder":394},[382,1380,1381],{"class":384,"line":855},[382,1382,1383],{},"if __name__ == \"__main__\":\n",[382,1385,1386],{"class":384,"line":860},[382,1387,1388],{},"    # The client code.\n",[382,1390,1391],{"class":384,"line":865},[382,1392,395],{"emptyLinePlaceholder":394},[382,1394,1395],{"class":384,"line":870},[382,1396,1397],{},"    context = Context(ConcreteStateA())\n",[382,1399,1400],{"class":384,"line":876},[382,1401,1402],{},"    context.request1()\n",[382,1404,1405],{"class":384,"line":881},[382,1406,1407],{},"    context.request2()\n",[78,1409],{},[81,1411,1413],{"id":1412},"diğer-tasarım-kalıplarıdesign-patterns","Diğer Tasarım Kalıpları\u002FDesign Patterns",[14,1415,1416],{},[18,1417,1418],{},"Oluşumsal Kalıplar (Creational Patterns)",[14,1420,1421,1425,1426,1425,1430,1425,1434,1425,1438],{},[56,1422,1424],{"href":1423},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-factory-method-nedir","Factory Method",",\n",[56,1427,1429],{"href":1428},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-abstract-factory-nedir","Abstract Factory",[56,1431,1433],{"href":1432},"\u002Ftr\u002Fbuilder-tasarim-deseni-nedir","Builder",[56,1435,1437],{"href":1436},"\u002Ftr\u002Fprototype-tasarim-deseni-nedir","Prototype",[56,1439,1441],{"href":1440},"\u002Ftr\u002Fsingleton-tasarim-deseni-nedir","Singleton",[14,1443,1444],{},[18,1445,1446],{},"Yapısal Kalıplar (Structural Patterns)",[14,1448,1449,1425,1452,1425,1455,1425,1459,1425,1463,1425,1467,1425,1471],{},[56,1450,348],{"href":1451},"\u002Ftr\u002Fadapter-tasarim-deseni-nedir",[56,1453,339],{"href":1454},"\u002Ftr\u002Fbridge-tasarim-deseni-nedir",[56,1456,1458],{"href":1457},"\u002Ftr\u002Fcomposite-tasarim-deseni-nedir","Composite",[56,1460,1462],{"href":1461},"\u002Ftr\u002Fdecorator-tasarim-deseni-nedir","Decorator",[56,1464,1466],{"href":1465},"\u002Ftr\u002Ffacade-tasarim-deseni-nedir","Facade",[56,1468,1470],{"href":1469},"\u002Ftr\u002Fflyweight-tasarim-deseni-nedir","Flyweight",[56,1472,1474],{"href":1473},"\u002Ftr\u002Fproxy-tasarim-deseni-nedir","Proxy",[14,1476,1477],{},[18,1478,1479],{},"Davranışsal Kalıplar (Behavioral Patterns)",[14,1481,1482,1425,1486,1425,1490,1425,1494,1425,1498,1425,1502,1425,1506,1425,1509,1425,1512,1425,1516],{},[56,1483,1485],{"href":1484},"\u002Ftr\u002Fchain-of-responsibility-deseni-nedir","Chain of Responsibility",[56,1487,1489],{"href":1488},"\u002Ftr\u002Fcommand-tasarim-deseni-nedir","Command",[56,1491,1493],{"href":1492},"\u002Ftr\u002Fiterator-tasarim-deseni-nedir","Iterator",[56,1495,1497],{"href":1496},"\u002Ftr\u002Fmediator-tasarim-deseni-nedir","Mediator",[56,1499,1501],{"href":1500},"\u002Ftr\u002Fmemento-tasarim-deseni-nedir","Memento",[56,1503,1505],{"href":1504},"\u002Ftr\u002Fobserver-tasarim-deseni-nedir","Observer",[56,1507,89],{"href":1508},"\u002Ftr\u002Fstate-tasarim-deseni-nedir",[56,1510,221],{"href":1511},"\u002Ftr\u002Fstrategy-tasarim-deseni-nedir",[56,1513,1515],{"href":1514},"\u002Ftr\u002Ftemplate-method-tasarim-deseni-nedir","Template Method",[56,1517,1519],{"href":1518},"\u002Ftr\u002Fvisitor-tasarim-deseni-nedir","Visitor",[1521,1522,1523],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":111,"searchDepth":391,"depth":391,"links":1525},[1526,1527,1528,1531,1532,1533,1537],{"id":83,"depth":391,"text":84},{"id":95,"depth":391,"text":96},{"id":195,"depth":391,"text":196,"children":1529},[1530],{"id":226,"depth":398,"text":227},{"id":295,"depth":391,"text":296},{"id":331,"depth":391,"text":332},{"id":367,"depth":391,"text":368,"children":1534},[1535,1536],{"id":371,"depth":398,"text":372},{"id":984,"depth":398,"text":985},{"id":1412,"depth":391,"text":1413},[1539],"technical",null,"2021-10-06","Bu yazı Design Patterns\u002FTasarım Desenleri nedir? başlıklı yazı dizisinin bir parçasıdır.",false,"md","\u002Fimages\u002Fposts\u002F2021\u002F10\u002Fstate-tasarim-deseni.avif",{},{"title":6,"description":1542},"state-tasarim-deseni-nedir","tr\u002Fstate-tasarim-deseni-nedir",[1551,1552],"design-pattern","ipucu","lfJIUEs8YolRZ1tGLCivjxEfBdPi1fThr-D6Lh0kXBQ",{"prev":1555,"next":1557,"others":1559,"lucky":1669,"readingTime":427},{"path":1511,"title":1556},"Strategy Tasarım Deseni Nedir?",{"path":1504,"title":1558},"Observer Tasarım Deseni Nedir?",[1560,1562,1565,1567,1569,1571,1574,1577,1580,1583,1586,1589,1592,1595,1598,1601,1603,1606,1608,1611,1614,1617,1620,1623,1626,1629,1632,1635,1638,1640,1643,1646,1648,1651,1654,1657,1659,1661,1664,1667],{"path":1428,"title":1561},"Abstract Factory Tasarım Deseni Nedir?",{"path":1563,"title":1564},"\u002Ftr\u002Fwsl-2-kurulumu-6-kolay-adim","WSL 2 Kurulumu - 6 kolay adım",{"path":1492,"title":1566},"Iterator Tasarım Deseni Nedir?",{"path":1469,"title":1568},"Flyweight Tasarım Deseni Nedir?",{"path":1488,"title":1570},"Command Tasarım Deseni Nedir?",{"path":1572,"title":1573},"\u002Ftr\u002Fgo-programlama-dilinin-ozellikleri","Go Programlama Dilinin Özellikleri",{"path":1575,"title":1576},"\u002Ftr\u002Fgo-slice-veri-tipi","Go Veri Tipleri: Slice",{"path":1578,"title":1579},"\u002Ftr\u002Fheadless-wordpress-hakkinda-her-sey","Headless WordPress Hakkında Her Şey",{"path":1581,"title":1582},"\u002Ftr\u002Fself-hosted-api-gateway-nasil-kurulur-kapsamli-rehber","Self-Hosted API Gateway Nasıl Kurulur? Kapsamlı Rehber",{"path":1584,"title":1585},"\u002Ftr\u002Fgo-veri-tipleri-struct","Go Veri Tipleri: Struct",{"path":1587,"title":1588},"\u002Ftr\u002Fubuntu-guncellemesi-sonrasi-cyberpanele-ulasilamama-sorunlarini-giderme","Ubuntu Güncellemesi Sonrası CyberPanel'e Ulaşılamama Sorunlarını Giderme",{"path":1590,"title":1591},"\u002Ftr\u002Fwindows-10-golang-kurulumu","Windows 10 ve 11'de Golang Kurulumu ve GOPATH Yapılandırması",{"path":1593,"title":1594},"\u002Ftr\u002Faws-ec2-uzerinde-docker-ve-full-stack-web-performansi","AWS EC2 Üzerinde Docker ve Full Stack Web Performansı",{"path":1596,"title":1597},"\u002Ftr\u002Frestapi-ve-hateoas-kavrami","RestApi ve HATEOAS Kavramı",{"path":1599,"title":1600},"\u002Ftr\u002Fnext-js-on-bellegi-nasil-yenilenir-on-demand-cache-regeneration","Next.js Önbelleği Nasıl Yenilenir? \"On-Demand Cache Regeneration\"",{"path":1440,"title":1602},"Singleton Tasarım Deseni Nedir?",{"path":1604,"title":1605},"\u002Ftr\u002Fecmascript-nedir-ecmascript-ne-degildir-bilinmesi-gerekenler","ECMAScript Nedir? Bilinmesi Gerekenler...",{"path":1518,"title":1607},"Visitor Tasarım Deseni Nedir?",{"path":1609,"title":1610},"\u002Ftr\u002Frest-api-kimlik-dogrulama-nasil-yapilir","REST API Kimlik Doğrulama Nasıl Yapılır?",{"path":1612,"title":1613},"\u002Ftr\u002Ftricolor-garbage-collection-algoritmasi-nedir","Tricolor Garbage Collection Algoritması Nedir?",{"path":1615,"title":1616},"\u002Ftr\u002Fes6-nedir-ecmascript-2015-nedir","ES6 Nedir? ECMAScript 2015 Nedir?",{"path":1618,"title":1619},"\u002Ftr\u002Fmerhaba-gluster","Merhaba Gluster: Dağıtık Dosya Sistemi Nedir?",{"path":1621,"title":1622},"\u002Ftr\u002Fes8-nedir-ecmascript-2017-nedir","ES8 Nedir? ECMAScript 2017 Nedir?",{"path":1624,"title":1625},"\u002Ftr\u002Fearly-return-erken-donus-nedir","Early Return \u002F Erken Dönüş nedir?",{"path":1627,"title":1628},"\u002Ftr\u002Fmerhaba-tailwind-css","Merhaba Tailwind CSS",{"path":1630,"title":1631},"\u002Ftr\u002Fgo-ile-websockets-websocket-upgrader-nedir","Go ile WebSockets: Upgrader Nedir?",{"path":1633,"title":1634},"\u002Ftr\u002Frest-api-dokumantasyonu-nasil-yapilir","REST Api Dokümantasyonu Nasıl Oluşturulur?",{"path":1636,"title":1637},"\u002Ftr\u002Fes5-nedir","ES5 Nedir? JavaScript Geliştiricileri İçin Kılavuz",{"path":1473,"title":1639},"Proxy Tasarım Deseni Nedir?",{"path":1641,"title":1642},"\u002Ftr\u002Fdocker-ile-redis-kurulumu","Docker ile Redis Kurulumu",{"path":1644,"title":1645},"\u002Ftr\u002Ffactory-method-ve-abstract-factory-farki-nedir","Factory Method ve Abstract Factory Farkı Nedir?",{"path":1461,"title":1647},"Decorator Tasarım Deseni Nedir?",{"path":1649,"title":1650},"\u002Ftr\u002Fes7-nedir-ecmascript-2016-nedir","ES7 Nedir? ECMAScript 2016 Nedir?",{"path":1652,"title":1653},"\u002Ftr\u002Fmerhaba-phalcon-framework","Merhaba Phalcon Framework",{"path":1655,"title":1656},"\u002Ftr\u002Fes9-nedir-ecmascript-2018-nedir","ES9 Nedir? ECMAScript 2018 Nedir?",{"path":1496,"title":1658},"Mediator Tasarım Deseni Nedir?",{"path":1423,"title":1660},"Factory Method Tasarım Deseni Nedir?",{"path":1662,"title":1663},"\u002Ftr\u002Fgo-veri-tipleri-map","Go Veri Tipleri - Map",{"path":1665,"title":1666},"\u002Ftr\u002Fjwt-guvenli-mi-guvenlik-acigi-olusturmayin","JWT Güvenli Derken Güvenlik Açığı Oluşturmayın",{"path":1514,"title":1668},"Template Method Tasarım Deseni Nedir?",{"path":1670,"title":1671},"\u002Ftr\u002Fwordpress-yonetici-sifresini-wp-cli-kullanarak-sifirlama","WordPress Yönetici Şifresini WP-CLI Kullanarak Sıfırlama",[1673,1675,1677,1679],{"path":1518,"title":1607,"date":1674},"2021-10-09",{"path":1514,"title":1668,"date":1676},"2021-10-08",{"path":1511,"title":1556,"date":1678},"2021-10-07",{"path":1504,"title":1558,"date":1680},"2021-10-05",[1682,1686,1690],{"path":1683,"title":1684,"date":1685},"\u002Ftr\u002Fphp-ve-makine-ogrenimi-php-ml-kutuphanesi","PHP ve Makine Öğrenimi: PHP-ML Kütüphanesi ile Pratik Çözümler","2026-06-20",{"path":1687,"title":1688,"date":1689},"\u002Ftr\u002Fgarbage-collection-ve-golang","Garbage Collection ve Go (Golang)","2021-10-01",{"path":1500,"title":1691,"date":1692},"Memento Tasarım Deseni Nedir?","2021-10-04",1782142003911]