[{"data":1,"prerenderedAt":1746},["ShallowReactive",2],{"post-\u002Ftr\u002Fchain-of-responsibility-deseni-nedir":3},{"page":4,"translation":1592,"nav":1606,"related":1725,"random":1736},{"id":5,"title":6,"body":7,"categories":1590,"category":1592,"date":1593,"description":1594,"draft":1595,"extension":1596,"image":1597,"kind":1592,"lang":509,"meta":1598,"navigation":229,"path":1531,"readingTime":233,"seo":1599,"slug":1600,"stem":1601,"tags":1602,"translationKey":1592,"type":1591,"updated":1592,"__hash__":1605},"postsTr\u002Ftr\u002Fchain-of-responsibility-deseni-nedir.md","Chain of Responsibility Deseni Nedir?",{"type":8,"value":9,"toc":1571},"minimark",[10,20,33,36,86,89,94,104,106,110,113,116,123,126,137,143,146,148,152,159,162,165,171,174,176,180,183,496,498,502,573,575,579,599,601,605,630,632,636,641,1071,1075,1409,1411,1415,1419,1426,1430,1448,1452,1455,1457,1461,1466,1489,1494,1522,1527,1567],[11,12,13,14,19],"p",{},"Bu yazı ",[15,16,18],"a",{"href":17},"\u002Ftr\u002Fdesign-patterns-tasarim-desenleri-nedir","Design Patterns\u002FTasarım Desenleri Nedir?"," başlıklı yazı dizisinin bir parçasıdır.",[11,21,22,23,32],{},"Bu içerik ağırlıklı olarak ",[15,24,31],{"href":25,"rel":26,"target":30},"https:\u002F\u002Frefactoring.guru\u002Fdesign-patterns",[27,28,29],"nofollow","noopener","noreferrer","_blank","refactoring.guru"," sitesindeki içeriğin tercümesi ve derlenmesinden oluşturulmuştur.",[11,34,35],{},"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.",[37,38,39,46],"blockquote",{},[11,40,41,42],{},"💡 ",[43,44,45],"strong",{},"Özet (TL;DR):",[47,48,49,56,75],"ul",{},[50,51,52,55],"li",{},[43,53,54],{},"Amaç:"," Bir isteği, işleyicilerden oluşan bir zincir (chain) boyunca iletmek. Her işleyici isteği işleyebilir ya da bir sonraki işleyiciye aktarabilir.",[50,57,58,61,62,66,67,70,71,74],{},[43,59,60],{},"Kilit Yapılar:"," İşleyici Arayüzü (",[63,64,65],"code",{},"Handler","), Temel\u002FSoyut İşleyici (",[63,68,69],{},"AbstractHandler",") ve Somut İşleyiciler (",[63,72,73],{},"ConcreteHandlers",").",[50,76,77,80,81,85],{},[43,78,79],{},"Motto:"," ",[82,83,84],"em",{},"Pass or Process"," (Aktar veya İşle). İsteği gönderen ile karşılayan sınıfları birbirinden tamamen ayırır.",[87,88],"hr",{},[90,91,93],"h2",{"id":92},"chain-of-responsibility-deseninin-amacı","Chain of Responsibility Deseninin Amacı",[11,95,96,99,100,103],{},[43,97,98],{},"Chain of Responsibility"," (Sorumluluk Zinciri), bir isteği bir dizi işleyici (zinciri) boyunca iletmenize izin veren davranışsal (behavioral) bir tasarım desenidir. Özellikle web geliştirmedeki ",[43,101,102],{},"Middleware (Ara Yazılım)"," mimarilerinin temelini oluşturur.",[87,105],{},[90,107,109],{"id":108},"sorun","Sorun",[11,111,112],{},"Çevrim içi sipariş alan bir e-ticaret sistemi üzerinde çalıştığınızı hayal edin. Sisteme girişlerin sınırlı olmasını, sadece doğrulanmış kullanıcıların sipariş verebilmesini istiyorsunuz. Ayrıca yönetici (admin) rolündeki kullanıcıların siparişlere tam erişim yetkisi olmalı.",[11,114,115],{},"Bu kontrollerin sırayla yapılması gerekir. İstek geldiğinde önce kullanıcı doğrulanmalı, başarısızsa işlem hemen kesilmelidir.",[11,117,118],{},[119,120],"img",{"alt":121,"src":122},"Chain of Responsibility çözdüğü sorun","\u002Fimages\u002Fchain-of-responsibility-deseni-nedir\u002Fchain-of-responsibility-cozdugu-sorun.avif",[11,124,125],{},"Zamanla sisteme yeni sıralı kontroller eklemeniz istenir:",[47,127,128,131,134],{},[50,129,130],{},"Siparişe giden ham verilerin temizlenmesi (Sanitization).",[50,132,133],{},"Aynı IP adresinden gelen brute-force şifre kırma denemelerinin filtrelenmesi.",[50,135,136],{},"Önbellekte (Cache) sonuç varsa veritabanına gitmeden isteğin hemen yanıtlanması.",[11,138,139],{},[119,140],{"alt":141,"src":142},"Chain of Responsibility çözdüğü sorun 2","\u002Fimages\u002Fchain-of-responsibility-deseni-nedir\u002Fchain-of-responsibility-cozdugu-sorun-2.avif",[11,144,145],{},"Tüm bu kontrol mantığını tek bir büyük sınıfa yazdığınızda kod şişer, okunması ve bakımı zorlaşır. Bir kontroldeki değişiklik diğerlerini etkiler. Daha da kötüsü, bu kontrollerin bazılarını sistemin başka yerlerinde tekrar kullanmak istediğinizde kod kopyalamak zorunda kalırsınız.",[87,147],{},[90,149,151],{"id":150},"çözüm","Çözüm",[11,153,154,155,158],{},"Sorumluluk Zinciri deseni, her bir kontrol adımını bağımsız ve tek sorumluluğa sahip ",[43,156,157],{},"işleyici (handler)"," sınıflarına dönüştürmeyi önerir. Her işleyici, zincirdeki bir sonraki işleyicinin referansını tutar.",[11,160,161],{},"İstek zincirin başındaki ilk işleyiciye gönderilir. Her işleyici isteği işler ve işleme bittikten sonra isteği zincirdeki bir sonrakine aktarıp aktarmayacağına karar verir.",[11,163,164],{},"Örneğin, kullanıcı girişi hatalıysa istek sonraki filtreleme veya önbellek adımlarına hiç aktarılmadan süreç hemen sonlandırılır.",[11,166,167],{},[119,168],{"alt":169,"src":170},"Chain of Responsibility ne sağlar","\u002Fimages\u002Fchain-of-responsibility-deseni-nedir\u002Fchain-of-responsibility-ne-saglar.avif",[11,172,173],{},"Tüm işleyicilerin aynı ortak arayüzü (interface) uygulaması şarttır. Bu sayede istemci kod, işleyicilerin somut sınıflarından bağımsız olarak çalışma zamanında (runtime) zincirin sırasını değiştirebilir veya araya yeni halkalar ekleyebilir.",[87,175],{},[90,177,179],{"id":178},"gerçek-hayat-senaryosu-destek-masası-support-ticket-escalation","Gerçek Hayat Senaryosu: Destek Masası (Support Ticket Escalation)",[11,181,182],{},"Müşteri destek biletlerinin önem derecesine ve teknik zorluğuna göre sırayla yönlendirilmesi süreci:",[184,185,190],"pre",{"className":186,"code":187,"language":188,"meta":189,"style":189},"language-php shiki shiki-themes github-light github-dark","\u002F\u002F 1. Ortak Arayüz\ninterface HelpDeskHandler {\n    public function setNext(HelpDeskHandler $handler): HelpDeskHandler;\n    public function handle(string $ticketSeverity): void;\n}\n\n\u002F\u002F 2. Temel Sınıf\nabstract class AbstractHelpDeskHandler implements HelpDeskHandler {\n    private ?HelpDeskHandler $nextHandler = null;\n\n    public function setNext(HelpDeskHandler $handler): HelpDeskHandler {\n        $this->nextHandler = $handler;\n        return $handler;\n    }\n\n    public function handle(string $ticketSeverity): void {\n        if ($this->nextHandler) {\n            $this->nextHandler->handle($ticketSeverity);\n        }\n    }\n}\n\n\u002F\u002F 3. Somut İşleyiciler\nclass BotHandler extends AbstractHelpDeskHandler {\n    public function handle(string $ticketSeverity): void {\n        if ($ticketSeverity === \"low\") {\n            echo \"Bot: Sık sorulan sorular yardımıyla talep çözüldü.\\n\";\n        } else {\n            echo \"Bot: Talep karmaşık, teknik ekibe aktarılıyor...\\n\";\n            parent::handle($ticketSeverity);\n        }\n    }\n}\n\nclass TechSupportHandler extends AbstractHelpDeskHandler {\n    public function handle(string $ticketSeverity): void {\n        if ($ticketSeverity === \"medium\") {\n            echo \"Teknik Destek: Hata incelendi ve çözüldü.\\n\";\n        } else {\n            echo \"Teknik Destek: Talep kritik düzeyde, Sistem Yöneticisine aktarılıyor...\\n\";\n            parent::handle($ticketSeverity);\n        }\n    }\n}\n\nclass SysAdminHandler extends AbstractHelpDeskHandler {\n    public function handle(string $ticketSeverity): void {\n        if ($ticketSeverity === \"high\") {\n            echo \"Sistem Yöneticisi: Sunucu bazlı kritik hata çözüldü!\\n\";\n        } else {\n            parent::handle($ticketSeverity);\n        }\n    }\n}\n","php","",[63,191,192,200,206,212,218,224,231,237,243,249,254,260,266,272,278,283,289,295,301,307,312,317,322,328,334,339,345,351,357,363,369,374,379,384,389,395,400,406,412,417,423,428,433,438,443,448,454,459,465,471,476,481,486,491],{"__ignoreMap":189},[193,194,197],"span",{"class":195,"line":196},"line",1,[193,198,199],{},"\u002F\u002F 1. Ortak Arayüz\n",[193,201,203],{"class":195,"line":202},2,[193,204,205],{},"interface HelpDeskHandler {\n",[193,207,209],{"class":195,"line":208},3,[193,210,211],{},"    public function setNext(HelpDeskHandler $handler): HelpDeskHandler;\n",[193,213,215],{"class":195,"line":214},4,[193,216,217],{},"    public function handle(string $ticketSeverity): void;\n",[193,219,221],{"class":195,"line":220},5,[193,222,223],{},"}\n",[193,225,227],{"class":195,"line":226},6,[193,228,230],{"emptyLinePlaceholder":229},true,"\n",[193,232,234],{"class":195,"line":233},7,[193,235,236],{},"\u002F\u002F 2. Temel Sınıf\n",[193,238,240],{"class":195,"line":239},8,[193,241,242],{},"abstract class AbstractHelpDeskHandler implements HelpDeskHandler {\n",[193,244,246],{"class":195,"line":245},9,[193,247,248],{},"    private ?HelpDeskHandler $nextHandler = null;\n",[193,250,252],{"class":195,"line":251},10,[193,253,230],{"emptyLinePlaceholder":229},[193,255,257],{"class":195,"line":256},11,[193,258,259],{},"    public function setNext(HelpDeskHandler $handler): HelpDeskHandler {\n",[193,261,263],{"class":195,"line":262},12,[193,264,265],{},"        $this->nextHandler = $handler;\n",[193,267,269],{"class":195,"line":268},13,[193,270,271],{},"        return $handler;\n",[193,273,275],{"class":195,"line":274},14,[193,276,277],{},"    }\n",[193,279,281],{"class":195,"line":280},15,[193,282,230],{"emptyLinePlaceholder":229},[193,284,286],{"class":195,"line":285},16,[193,287,288],{},"    public function handle(string $ticketSeverity): void {\n",[193,290,292],{"class":195,"line":291},17,[193,293,294],{},"        if ($this->nextHandler) {\n",[193,296,298],{"class":195,"line":297},18,[193,299,300],{},"            $this->nextHandler->handle($ticketSeverity);\n",[193,302,304],{"class":195,"line":303},19,[193,305,306],{},"        }\n",[193,308,310],{"class":195,"line":309},20,[193,311,277],{},[193,313,315],{"class":195,"line":314},21,[193,316,223],{},[193,318,320],{"class":195,"line":319},22,[193,321,230],{"emptyLinePlaceholder":229},[193,323,325],{"class":195,"line":324},23,[193,326,327],{},"\u002F\u002F 3. Somut İşleyiciler\n",[193,329,331],{"class":195,"line":330},24,[193,332,333],{},"class BotHandler extends AbstractHelpDeskHandler {\n",[193,335,337],{"class":195,"line":336},25,[193,338,288],{},[193,340,342],{"class":195,"line":341},26,[193,343,344],{},"        if ($ticketSeverity === \"low\") {\n",[193,346,348],{"class":195,"line":347},27,[193,349,350],{},"            echo \"Bot: Sık sorulan sorular yardımıyla talep çözüldü.\\n\";\n",[193,352,354],{"class":195,"line":353},28,[193,355,356],{},"        } else {\n",[193,358,360],{"class":195,"line":359},29,[193,361,362],{},"            echo \"Bot: Talep karmaşık, teknik ekibe aktarılıyor...\\n\";\n",[193,364,366],{"class":195,"line":365},30,[193,367,368],{},"            parent::handle($ticketSeverity);\n",[193,370,372],{"class":195,"line":371},31,[193,373,306],{},[193,375,377],{"class":195,"line":376},32,[193,378,277],{},[193,380,382],{"class":195,"line":381},33,[193,383,223],{},[193,385,387],{"class":195,"line":386},34,[193,388,230],{"emptyLinePlaceholder":229},[193,390,392],{"class":195,"line":391},35,[193,393,394],{},"class TechSupportHandler extends AbstractHelpDeskHandler {\n",[193,396,398],{"class":195,"line":397},36,[193,399,288],{},[193,401,403],{"class":195,"line":402},37,[193,404,405],{},"        if ($ticketSeverity === \"medium\") {\n",[193,407,409],{"class":195,"line":408},38,[193,410,411],{},"            echo \"Teknik Destek: Hata incelendi ve çözüldü.\\n\";\n",[193,413,415],{"class":195,"line":414},39,[193,416,356],{},[193,418,420],{"class":195,"line":419},40,[193,421,422],{},"            echo \"Teknik Destek: Talep kritik düzeyde, Sistem Yöneticisine aktarılıyor...\\n\";\n",[193,424,426],{"class":195,"line":425},41,[193,427,368],{},[193,429,431],{"class":195,"line":430},42,[193,432,306],{},[193,434,436],{"class":195,"line":435},43,[193,437,277],{},[193,439,441],{"class":195,"line":440},44,[193,442,223],{},[193,444,446],{"class":195,"line":445},45,[193,447,230],{"emptyLinePlaceholder":229},[193,449,451],{"class":195,"line":450},46,[193,452,453],{},"class SysAdminHandler extends AbstractHelpDeskHandler {\n",[193,455,457],{"class":195,"line":456},47,[193,458,288],{},[193,460,462],{"class":195,"line":461},48,[193,463,464],{},"        if ($ticketSeverity === \"high\") {\n",[193,466,468],{"class":195,"line":467},49,[193,469,470],{},"            echo \"Sistem Yöneticisi: Sunucu bazlı kritik hata çözüldü!\\n\";\n",[193,472,474],{"class":195,"line":473},50,[193,475,356],{},[193,477,479],{"class":195,"line":478},51,[193,480,368],{},[193,482,484],{"class":195,"line":483},52,[193,485,306],{},[193,487,489],{"class":195,"line":488},53,[193,490,277],{},[193,492,494],{"class":195,"line":493},54,[193,495,223],{},[87,497],{},[90,499,501],{"id":500},"chain-of-responsibility-vs-decorator-vs-command","Chain of Responsibility vs Decorator vs Command",[503,504,505,522],"table",{},[506,507,508],"thead",{},[509,510,511,516,519],"tr",{},[512,513,515],"th",{"align":514},"left","Desen",[512,517,518],{"align":514},"Amaç",[512,520,521],{"align":514},"İstek Akışını Kesme Yeteneği",[523,524,525,541,557],"tbody",{},[509,526,527,532,535],{},[528,529,530],"td",{"align":514},[43,531,98],{},[528,533,534],{"align":514},"İsteği potansiyel işleyiciler zinciri boyunca iletmek.",[528,536,537,540],{"align":514},[43,538,539],{},"Evet",", herhangi bir halkada akış durdurulabilir.",[509,542,543,548,551],{},[528,544,545],{"align":514},[43,546,547],{},"Decorator",[528,549,550],{"align":514},"Arayüzü bozmadan nesneye dinamik özellikler eklemek.",[528,552,553,556],{"align":514},[43,554,555],{},"Hayır",", sarmalanan tüm decorator'lar sırayla çalışır.",[509,558,559,564,567],{},[528,560,561],{"align":514},[43,562,563],{},"Command",[528,565,566],{"align":514},"Gönderici ve alıcıyı ayırıp işlemi nesneye dönüştürmek.",[528,568,569,572],{"align":514},[43,570,571],{},"Uygulanamaz",", doğrudan tek bir alıcıyı hedefler.",[87,574],{},[90,576,578],{"id":577},"uygulanabilirlik","Uygulanabilirlik",[47,580,581,587,593],{},[50,582,583,586],{},[43,584,585],{},"Bilinmeyen İşleyici Sırası:"," Programın farklı türdeki istekleri çeşitli şekillerde işlemesi gerektiğinde ancak isteklerin türleri ve sıralamaları önceden bilinmediğinde kullanın.",[50,588,589,592],{},[43,590,591],{},"Sıralı Yürütme Gereksinimi:"," Belirli kontrollerin veya işlemlerin tam olarak planlanan sırada yürütülmesi gerektiğinde kullanın.",[50,594,595,598],{},[43,596,597],{},"Dinamik Zincir Değişikliği:"," Zincirdeki işleyicilerin ve sıralarının çalışma zamanında (runtime) dinamik olarak değişmesi gerektiğinde kullanın.",[87,600],{},[90,602,604],{"id":603},"diğer-tasarım-desenleri-ile-i̇lişkisi","Diğer Tasarım Desenleri ile İlişkisi",[47,606,607,616,622],{},[50,608,609,611,612,615],{},[43,610,98],{}," sıklıkla ",[43,613,614],{},"Composite"," deseniyle birlikte kullanılır. Bir yaprak bileşen istek aldığında, onu tüm ana bileşenlerin zincirinden geçirerek nesne ağacının köküne kadar iletebilir.",[50,617,618,619,621],{},"Zincirdeki işleyiciler birer ",[43,620,563],{}," olarak uygulanabilir. Bu sayede istek nesnesi üzerinde farklı işlemler çalıştırılabilir.",[50,623,624,626,627,629],{},[43,625,547],{}," ve ",[43,628,98],{}," benzer sınıf yapılarına sahiptir ancak Decorator nesnenin davranışını genişletirken akışı kesemez, Chain of Responsibility ise akışı tamamen durdurabilir.",[87,631],{},[90,633,635],{"id":634},"chain-of-responsibility-tasarım-deseni-kod-örnekleri","Chain of Responsibility Tasarım Deseni Kod Örnekleri",[637,638,640],"h3",{"id":639},"örnek-php-kodu","Örnek PHP Kodu",[184,642,644],{"className":186,"code":643,"language":188,"meta":189,"style":189},"\u003C?php\n\nnamespace RefactoringGuru\\ChainOfResponsibility\\Conceptual;\n\ninterface Handler\n{\n    public function setNext(Handler $handler): Handler;\n    public function handle(string $request): ?string;\n}\n\nabstract class AbstractHandler implements Handler\n{\n    private ?Handler $nextHandler = null;\n\n    public function setNext(Handler $handler): Handler\n    {\n        $this->nextHandler = $handler;\n        return $handler;\n    }\n\n    public function handle(string $request): ?string\n    {\n        if ($this->nextHandler) {\n            return $this->nextHandler->handle($request);\n        }\n\n        return null;\n    }\n}\n\nclass MonkeyHandler extends AbstractHandler\n{\n    public function handle(string $request): ?string\n    {\n        if ($request === \"Banana\") {\n            return \"Monkey: I'll eat the \" . $request . \".\\n\";\n        }\n        return parent::handle($request);\n    }\n}\n\nclass SquirrelHandler extends AbstractHandler\n{\n    public function handle(string $request): ?string\n    {\n        if ($request === \"Nut\") {\n            return \"Squirrel: I'll eat the \" . $request . \".\\n\";\n        }\n        return parent::handle($request);\n    }\n}\n\nclass DogHandler extends AbstractHandler\n{\n    public function handle(string $request): ?string\n    {\n        if ($request === \"MeatBall\") {\n            return \"Dog: I'll eat the \" . $request . \".\\n\";\n        }\n        return parent::handle($request);\n    }\n}\n\nfunction clientCode(Handler $handler)\n{\n    foreach ([\"Nut\", \"Banana\", \"Cup of coffee\"] as $food) {\n        echo \"Client: Who wants a \" . $food . \"?\\n\";\n        $result = $handler->handle($food);\n        if ($result) {\n            echo \"  \" . $result;\n        } else {\n            echo \"  \" . $food . \" was left untouched.\\n\";\n        }\n    }\n}\n\n$monkey = new MonkeyHandler();\n$squirrel = new SquirrelHandler();\n$dog = new DogHandler();\n\n$monkey->setNext($squirrel)->setNext($dog);\n\necho \"Chain: Monkey > Squirrel > Dog\\n\\n\";\nclientCode($monkey);\necho \"\\n\";\n\necho \"Subchain: Squirrel > Dog\\n\\n\";\nclientCode($squirrel);\n",[63,645,646,651,655,660,664,669,674,679,684,688,692,697,701,706,710,715,720,724,728,732,736,741,745,749,754,758,762,767,771,775,779,784,788,792,796,801,806,810,815,819,823,827,832,836,840,844,849,854,858,862,866,870,874,879,883,888,893,899,905,910,915,920,925,930,936,941,947,953,959,965,971,976,982,987,992,997,1002,1008,1014,1020,1025,1031,1036,1042,1048,1054,1059,1065],{"__ignoreMap":189},[193,647,648],{"class":195,"line":196},[193,649,650],{},"\u003C?php\n",[193,652,653],{"class":195,"line":202},[193,654,230],{"emptyLinePlaceholder":229},[193,656,657],{"class":195,"line":208},[193,658,659],{},"namespace RefactoringGuru\\ChainOfResponsibility\\Conceptual;\n",[193,661,662],{"class":195,"line":214},[193,663,230],{"emptyLinePlaceholder":229},[193,665,666],{"class":195,"line":220},[193,667,668],{},"interface Handler\n",[193,670,671],{"class":195,"line":226},[193,672,673],{},"{\n",[193,675,676],{"class":195,"line":233},[193,677,678],{},"    public function setNext(Handler $handler): Handler;\n",[193,680,681],{"class":195,"line":239},[193,682,683],{},"    public function handle(string $request): ?string;\n",[193,685,686],{"class":195,"line":245},[193,687,223],{},[193,689,690],{"class":195,"line":251},[193,691,230],{"emptyLinePlaceholder":229},[193,693,694],{"class":195,"line":256},[193,695,696],{},"abstract class AbstractHandler implements Handler\n",[193,698,699],{"class":195,"line":262},[193,700,673],{},[193,702,703],{"class":195,"line":268},[193,704,705],{},"    private ?Handler $nextHandler = null;\n",[193,707,708],{"class":195,"line":274},[193,709,230],{"emptyLinePlaceholder":229},[193,711,712],{"class":195,"line":280},[193,713,714],{},"    public function setNext(Handler $handler): Handler\n",[193,716,717],{"class":195,"line":285},[193,718,719],{},"    {\n",[193,721,722],{"class":195,"line":291},[193,723,265],{},[193,725,726],{"class":195,"line":297},[193,727,271],{},[193,729,730],{"class":195,"line":303},[193,731,277],{},[193,733,734],{"class":195,"line":309},[193,735,230],{"emptyLinePlaceholder":229},[193,737,738],{"class":195,"line":314},[193,739,740],{},"    public function handle(string $request): ?string\n",[193,742,743],{"class":195,"line":319},[193,744,719],{},[193,746,747],{"class":195,"line":324},[193,748,294],{},[193,750,751],{"class":195,"line":330},[193,752,753],{},"            return $this->nextHandler->handle($request);\n",[193,755,756],{"class":195,"line":336},[193,757,306],{},[193,759,760],{"class":195,"line":341},[193,761,230],{"emptyLinePlaceholder":229},[193,763,764],{"class":195,"line":347},[193,765,766],{},"        return null;\n",[193,768,769],{"class":195,"line":353},[193,770,277],{},[193,772,773],{"class":195,"line":359},[193,774,223],{},[193,776,777],{"class":195,"line":365},[193,778,230],{"emptyLinePlaceholder":229},[193,780,781],{"class":195,"line":371},[193,782,783],{},"class MonkeyHandler extends AbstractHandler\n",[193,785,786],{"class":195,"line":376},[193,787,673],{},[193,789,790],{"class":195,"line":381},[193,791,740],{},[193,793,794],{"class":195,"line":386},[193,795,719],{},[193,797,798],{"class":195,"line":391},[193,799,800],{},"        if ($request === \"Banana\") {\n",[193,802,803],{"class":195,"line":397},[193,804,805],{},"            return \"Monkey: I'll eat the \" . $request . \".\\n\";\n",[193,807,808],{"class":195,"line":402},[193,809,306],{},[193,811,812],{"class":195,"line":408},[193,813,814],{},"        return parent::handle($request);\n",[193,816,817],{"class":195,"line":414},[193,818,277],{},[193,820,821],{"class":195,"line":419},[193,822,223],{},[193,824,825],{"class":195,"line":425},[193,826,230],{"emptyLinePlaceholder":229},[193,828,829],{"class":195,"line":430},[193,830,831],{},"class SquirrelHandler extends AbstractHandler\n",[193,833,834],{"class":195,"line":435},[193,835,673],{},[193,837,838],{"class":195,"line":440},[193,839,740],{},[193,841,842],{"class":195,"line":445},[193,843,719],{},[193,845,846],{"class":195,"line":450},[193,847,848],{},"        if ($request === \"Nut\") {\n",[193,850,851],{"class":195,"line":456},[193,852,853],{},"            return \"Squirrel: I'll eat the \" . $request . \".\\n\";\n",[193,855,856],{"class":195,"line":461},[193,857,306],{},[193,859,860],{"class":195,"line":467},[193,861,814],{},[193,863,864],{"class":195,"line":473},[193,865,277],{},[193,867,868],{"class":195,"line":478},[193,869,223],{},[193,871,872],{"class":195,"line":483},[193,873,230],{"emptyLinePlaceholder":229},[193,875,876],{"class":195,"line":488},[193,877,878],{},"class DogHandler extends AbstractHandler\n",[193,880,881],{"class":195,"line":493},[193,882,673],{},[193,884,886],{"class":195,"line":885},55,[193,887,740],{},[193,889,891],{"class":195,"line":890},56,[193,892,719],{},[193,894,896],{"class":195,"line":895},57,[193,897,898],{},"        if ($request === \"MeatBall\") {\n",[193,900,902],{"class":195,"line":901},58,[193,903,904],{},"            return \"Dog: I'll eat the \" . $request . \".\\n\";\n",[193,906,908],{"class":195,"line":907},59,[193,909,306],{},[193,911,913],{"class":195,"line":912},60,[193,914,814],{},[193,916,918],{"class":195,"line":917},61,[193,919,277],{},[193,921,923],{"class":195,"line":922},62,[193,924,223],{},[193,926,928],{"class":195,"line":927},63,[193,929,230],{"emptyLinePlaceholder":229},[193,931,933],{"class":195,"line":932},64,[193,934,935],{},"function clientCode(Handler $handler)\n",[193,937,939],{"class":195,"line":938},65,[193,940,673],{},[193,942,944],{"class":195,"line":943},66,[193,945,946],{},"    foreach ([\"Nut\", \"Banana\", \"Cup of coffee\"] as $food) {\n",[193,948,950],{"class":195,"line":949},67,[193,951,952],{},"        echo \"Client: Who wants a \" . $food . \"?\\n\";\n",[193,954,956],{"class":195,"line":955},68,[193,957,958],{},"        $result = $handler->handle($food);\n",[193,960,962],{"class":195,"line":961},69,[193,963,964],{},"        if ($result) {\n",[193,966,968],{"class":195,"line":967},70,[193,969,970],{},"            echo \"  \" . $result;\n",[193,972,974],{"class":195,"line":973},71,[193,975,356],{},[193,977,979],{"class":195,"line":978},72,[193,980,981],{},"            echo \"  \" . $food . \" was left untouched.\\n\";\n",[193,983,985],{"class":195,"line":984},73,[193,986,306],{},[193,988,990],{"class":195,"line":989},74,[193,991,277],{},[193,993,995],{"class":195,"line":994},75,[193,996,223],{},[193,998,1000],{"class":195,"line":999},76,[193,1001,230],{"emptyLinePlaceholder":229},[193,1003,1005],{"class":195,"line":1004},77,[193,1006,1007],{},"$monkey = new MonkeyHandler();\n",[193,1009,1011],{"class":195,"line":1010},78,[193,1012,1013],{},"$squirrel = new SquirrelHandler();\n",[193,1015,1017],{"class":195,"line":1016},79,[193,1018,1019],{},"$dog = new DogHandler();\n",[193,1021,1023],{"class":195,"line":1022},80,[193,1024,230],{"emptyLinePlaceholder":229},[193,1026,1028],{"class":195,"line":1027},81,[193,1029,1030],{},"$monkey->setNext($squirrel)->setNext($dog);\n",[193,1032,1034],{"class":195,"line":1033},82,[193,1035,230],{"emptyLinePlaceholder":229},[193,1037,1039],{"class":195,"line":1038},83,[193,1040,1041],{},"echo \"Chain: Monkey > Squirrel > Dog\\n\\n\";\n",[193,1043,1045],{"class":195,"line":1044},84,[193,1046,1047],{},"clientCode($monkey);\n",[193,1049,1051],{"class":195,"line":1050},85,[193,1052,1053],{},"echo \"\\n\";\n",[193,1055,1057],{"class":195,"line":1056},86,[193,1058,230],{"emptyLinePlaceholder":229},[193,1060,1062],{"class":195,"line":1061},87,[193,1063,1064],{},"echo \"Subchain: Squirrel > Dog\\n\\n\";\n",[193,1066,1068],{"class":195,"line":1067},88,[193,1069,1070],{},"clientCode($squirrel);\n",[637,1072,1074],{"id":1073},"örnek-python-kodu","Örnek Python Kodu",[184,1076,1080],{"className":1077,"code":1078,"language":1079,"meta":189,"style":189},"language-python shiki shiki-themes github-light github-dark","from __future__ import annotations\nfrom abc import ABC, abstractmethod\nfrom typing import Any, Optional\n\nclass Handler(ABC):\n    @abstractmethod\n    def set_next(self, handler: Handler) -> Handler:\n        pass\n\n    @abstractmethod\n    def handle(self, request: Any) -> Optional[str]:\n        pass\n\n\nclass AbstractHandler(Handler):\n    _next_handler: Handler = None\n\n    def set_next(self, handler: Handler) -> Handler:\n        self._next_handler = handler\n        return handler\n\n    def handle(self, request: Any) -> Optional[str]:\n        if self._next_handler:\n            return self._next_handler.handle(request)\n        return None\n\n\nclass MonkeyHandler(AbstractHandler):\n    def handle(self, request: Any) -> Optional[str]:\n        if request == \"Banana\":\n            return f\"Monkey: I'll eat the {request}\"\n        return super().handle(request)\n\n\nclass SquirrelHandler(AbstractHandler):\n    def handle(self, request: Any) -> Optional[str]:\n        if request == \"Nut\":\n            return f\"Squirrel: I'll eat the {request}\"\n        return super().handle(request)\n\n\nclass DogHandler(AbstractHandler):\n    def handle(self, request: Any) -> Optional[str]:\n        if request == \"MeatBall\":\n            return f\"Dog: I'll eat the {request}\"\n        return super().handle(request)\n\n\ndef client_code(handler: Handler) -> None:\n    for food in [\"Nut\", \"Banana\", \"Cup of coffee\"]:\n        print(f\"\\nClient: Who wants a {food}?\")\n        result = handler.handle(food)\n        if result:\n            print(f\"  {result}\", end=\"\")\n        else:\n            print(f\"  {food} was left untouched.\", end=\"\")\n\n\nif __name__ == \"__main__\":\n    monkey = MonkeyHandler()\n    squirrel = SquirrelHandler()\n    dog = DogHandler()\n\n    monkey.set_next(squirrel).set_next(dog)\n\n    print(\"Chain: Monkey > Squirrel > Dog\")\n    client_code(monkey)\n    print(\"\\n\")\n\n    print(\"Subchain: Squirrel > Dog\")\n    client_code(squirrel)\n","python",[63,1081,1082,1087,1092,1097,1101,1106,1111,1116,1121,1125,1129,1134,1138,1142,1146,1151,1156,1160,1164,1169,1174,1178,1182,1187,1192,1197,1201,1205,1210,1214,1219,1224,1229,1233,1237,1242,1246,1251,1256,1260,1264,1268,1273,1277,1282,1287,1291,1295,1299,1304,1309,1314,1319,1324,1329,1334,1339,1343,1347,1352,1357,1362,1367,1371,1376,1380,1385,1390,1395,1399,1404],{"__ignoreMap":189},[193,1083,1084],{"class":195,"line":196},[193,1085,1086],{},"from __future__ import annotations\n",[193,1088,1089],{"class":195,"line":202},[193,1090,1091],{},"from abc import ABC, abstractmethod\n",[193,1093,1094],{"class":195,"line":208},[193,1095,1096],{},"from typing import Any, Optional\n",[193,1098,1099],{"class":195,"line":214},[193,1100,230],{"emptyLinePlaceholder":229},[193,1102,1103],{"class":195,"line":220},[193,1104,1105],{},"class Handler(ABC):\n",[193,1107,1108],{"class":195,"line":226},[193,1109,1110],{},"    @abstractmethod\n",[193,1112,1113],{"class":195,"line":233},[193,1114,1115],{},"    def set_next(self, handler: Handler) -> Handler:\n",[193,1117,1118],{"class":195,"line":239},[193,1119,1120],{},"        pass\n",[193,1122,1123],{"class":195,"line":245},[193,1124,230],{"emptyLinePlaceholder":229},[193,1126,1127],{"class":195,"line":251},[193,1128,1110],{},[193,1130,1131],{"class":195,"line":256},[193,1132,1133],{},"    def handle(self, request: Any) -> Optional[str]:\n",[193,1135,1136],{"class":195,"line":262},[193,1137,1120],{},[193,1139,1140],{"class":195,"line":268},[193,1141,230],{"emptyLinePlaceholder":229},[193,1143,1144],{"class":195,"line":274},[193,1145,230],{"emptyLinePlaceholder":229},[193,1147,1148],{"class":195,"line":280},[193,1149,1150],{},"class AbstractHandler(Handler):\n",[193,1152,1153],{"class":195,"line":285},[193,1154,1155],{},"    _next_handler: Handler = None\n",[193,1157,1158],{"class":195,"line":291},[193,1159,230],{"emptyLinePlaceholder":229},[193,1161,1162],{"class":195,"line":297},[193,1163,1115],{},[193,1165,1166],{"class":195,"line":303},[193,1167,1168],{},"        self._next_handler = handler\n",[193,1170,1171],{"class":195,"line":309},[193,1172,1173],{},"        return handler\n",[193,1175,1176],{"class":195,"line":314},[193,1177,230],{"emptyLinePlaceholder":229},[193,1179,1180],{"class":195,"line":319},[193,1181,1133],{},[193,1183,1184],{"class":195,"line":324},[193,1185,1186],{},"        if self._next_handler:\n",[193,1188,1189],{"class":195,"line":330},[193,1190,1191],{},"            return self._next_handler.handle(request)\n",[193,1193,1194],{"class":195,"line":336},[193,1195,1196],{},"        return None\n",[193,1198,1199],{"class":195,"line":341},[193,1200,230],{"emptyLinePlaceholder":229},[193,1202,1203],{"class":195,"line":347},[193,1204,230],{"emptyLinePlaceholder":229},[193,1206,1207],{"class":195,"line":353},[193,1208,1209],{},"class MonkeyHandler(AbstractHandler):\n",[193,1211,1212],{"class":195,"line":359},[193,1213,1133],{},[193,1215,1216],{"class":195,"line":365},[193,1217,1218],{},"        if request == \"Banana\":\n",[193,1220,1221],{"class":195,"line":371},[193,1222,1223],{},"            return f\"Monkey: I'll eat the {request}\"\n",[193,1225,1226],{"class":195,"line":376},[193,1227,1228],{},"        return super().handle(request)\n",[193,1230,1231],{"class":195,"line":381},[193,1232,230],{"emptyLinePlaceholder":229},[193,1234,1235],{"class":195,"line":386},[193,1236,230],{"emptyLinePlaceholder":229},[193,1238,1239],{"class":195,"line":391},[193,1240,1241],{},"class SquirrelHandler(AbstractHandler):\n",[193,1243,1244],{"class":195,"line":397},[193,1245,1133],{},[193,1247,1248],{"class":195,"line":402},[193,1249,1250],{},"        if request == \"Nut\":\n",[193,1252,1253],{"class":195,"line":408},[193,1254,1255],{},"            return f\"Squirrel: I'll eat the {request}\"\n",[193,1257,1258],{"class":195,"line":414},[193,1259,1228],{},[193,1261,1262],{"class":195,"line":419},[193,1263,230],{"emptyLinePlaceholder":229},[193,1265,1266],{"class":195,"line":425},[193,1267,230],{"emptyLinePlaceholder":229},[193,1269,1270],{"class":195,"line":430},[193,1271,1272],{},"class DogHandler(AbstractHandler):\n",[193,1274,1275],{"class":195,"line":435},[193,1276,1133],{},[193,1278,1279],{"class":195,"line":440},[193,1280,1281],{},"        if request == \"MeatBall\":\n",[193,1283,1284],{"class":195,"line":445},[193,1285,1286],{},"            return f\"Dog: I'll eat the {request}\"\n",[193,1288,1289],{"class":195,"line":450},[193,1290,1228],{},[193,1292,1293],{"class":195,"line":456},[193,1294,230],{"emptyLinePlaceholder":229},[193,1296,1297],{"class":195,"line":461},[193,1298,230],{"emptyLinePlaceholder":229},[193,1300,1301],{"class":195,"line":467},[193,1302,1303],{},"def client_code(handler: Handler) -> None:\n",[193,1305,1306],{"class":195,"line":473},[193,1307,1308],{},"    for food in [\"Nut\", \"Banana\", \"Cup of coffee\"]:\n",[193,1310,1311],{"class":195,"line":478},[193,1312,1313],{},"        print(f\"\\nClient: Who wants a {food}?\")\n",[193,1315,1316],{"class":195,"line":483},[193,1317,1318],{},"        result = handler.handle(food)\n",[193,1320,1321],{"class":195,"line":488},[193,1322,1323],{},"        if result:\n",[193,1325,1326],{"class":195,"line":493},[193,1327,1328],{},"            print(f\"  {result}\", end=\"\")\n",[193,1330,1331],{"class":195,"line":885},[193,1332,1333],{},"        else:\n",[193,1335,1336],{"class":195,"line":890},[193,1337,1338],{},"            print(f\"  {food} was left untouched.\", end=\"\")\n",[193,1340,1341],{"class":195,"line":895},[193,1342,230],{"emptyLinePlaceholder":229},[193,1344,1345],{"class":195,"line":901},[193,1346,230],{"emptyLinePlaceholder":229},[193,1348,1349],{"class":195,"line":907},[193,1350,1351],{},"if __name__ == \"__main__\":\n",[193,1353,1354],{"class":195,"line":912},[193,1355,1356],{},"    monkey = MonkeyHandler()\n",[193,1358,1359],{"class":195,"line":917},[193,1360,1361],{},"    squirrel = SquirrelHandler()\n",[193,1363,1364],{"class":195,"line":922},[193,1365,1366],{},"    dog = DogHandler()\n",[193,1368,1369],{"class":195,"line":927},[193,1370,230],{"emptyLinePlaceholder":229},[193,1372,1373],{"class":195,"line":932},[193,1374,1375],{},"    monkey.set_next(squirrel).set_next(dog)\n",[193,1377,1378],{"class":195,"line":938},[193,1379,230],{"emptyLinePlaceholder":229},[193,1381,1382],{"class":195,"line":943},[193,1383,1384],{},"    print(\"Chain: Monkey > Squirrel > Dog\")\n",[193,1386,1387],{"class":195,"line":949},[193,1388,1389],{},"    client_code(monkey)\n",[193,1391,1392],{"class":195,"line":955},[193,1393,1394],{},"    print(\"\\n\")\n",[193,1396,1397],{"class":195,"line":961},[193,1398,230],{"emptyLinePlaceholder":229},[193,1400,1401],{"class":195,"line":967},[193,1402,1403],{},"    print(\"Subchain: Squirrel > Dog\")\n",[193,1405,1406],{"class":195,"line":973},[193,1407,1408],{},"    client_code(squirrel)\n",[87,1410],{},[90,1412,1414],{"id":1413},"sıkça-sorulan-sorular-faq","Sıkça Sorulan Sorular (FAQ)",[637,1416,1418],{"id":1417},"zincirin-sonuna-ulaşan-ve-hiçbir-işleyici-tarafından-işlenmeyen-istekler-için-ne-yapılmalıdır","Zincirin sonuna ulaşan ve hiçbir işleyici tarafından işlenmeyen istekler için ne yapılmalıdır?",[11,1420,1421,1422,1425],{},"İstek zincirin son halkasına ulaştığında ve hiçbir işleyici tarafından kabul edilmediğinde sessizce kaybolabilir (null döner). Bunu önlemek için zincirin en sonuna bir ",[43,1423,1424],{},"Default Handler \u002F Fallback Handler"," eklenmelidir. Bu son halka, işlenemeyen istekler için hata fırlatabilir veya varsayılan bir işlem yürütebilir.",[637,1427,1429],{"id":1428},"modern-web-frameworklerindeki-http-middleware-yapıları-ile-bu-desenin-ilişkisi-nedir","Modern web framework'lerindeki HTTP Middleware yapıları ile bu desenin ilişkisi nedir?",[11,1431,1432,1433,1436,1437,1436,1440,1443,1444,1447],{},"Middleware'ler Sorumluluk Zinciri deseninin en popüler pratik uygulamasıdır. Gelen bir HTTP isteği sırayla ",[63,1434,1435],{},"AuthMiddleware"," -> ",[63,1438,1439],{},"CORSMiddleware",[63,1441,1442],{},"SanitizeMiddleware"," zincirinden geçer. Her bir middleware isteği doğrulayabilir, değiştirebilir veya hata durumunda bir sonraki middleware'i çağırmayarak zinciri sonlandırabilir (",[63,1445,1446],{},"response"," döndürür).",[637,1449,1451],{"id":1450},"zincir-içinde-döngüsel-infinite-loop-bağımlılıklar-nasıl-engellenir","Zincir içinde döngüsel (infinite loop) bağımlılıklar nasıl engellenir?",[11,1453,1454],{},"Eğer A işleyicisi B'yi, B işleyicisi de A'yı bir sonraki halka olarak tanımlarsa istekler sonsuz döngüye girer. Bunu engellemek için zincir kurulurken döngüsel bağımlılık kontrolleri yapılmalı veya zincir yapısının doğrusal\u002Ftek yönlü (directed acyclic graph) olması kod seviyesinde garanti edilmelidir.",[87,1456],{},[90,1458,1460],{"id":1459},"diğer-tasarım-kalıplarıdesign-patterns","Diğer Tasarım Kalıpları\u002FDesign Patterns",[11,1462,1463],{},[43,1464,1465],{},"Oluşumsal Kalıplar (Creational Patterns)",[11,1467,1468,1472,1473,1472,1477,1472,1481,1472,1485],{},[15,1469,1471],{"href":1470},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-factory-method-nedir","Factory Method",",\n",[15,1474,1476],{"href":1475},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-abstract-factory-nedir","Abstract Factory",[15,1478,1480],{"href":1479},"\u002Ftr\u002Fbuilder-tasarim-deseni-nedir","Builder",[15,1482,1484],{"href":1483},"\u002Ftr\u002Fprototype-tasarim-deseni-nedir","Prototype",[15,1486,1488],{"href":1487},"\u002Ftr\u002Fsingleton-tasarim-deseni-nedir","Singleton",[11,1490,1491],{},[43,1492,1493],{},"Yapısal Kalıplar (Structural Patterns)",[11,1495,1496,1472,1500,1472,1504,1472,1507,1472,1510,1472,1514,1472,1518],{},[15,1497,1499],{"href":1498},"\u002Ftr\u002Fadapter-tasarim-deseni-nedir","Adapter",[15,1501,1503],{"href":1502},"\u002Ftr\u002Fbridge-tasarim-deseni-nedir","Bridge",[15,1505,614],{"href":1506},"\u002Ftr\u002Fcomposite-tasarim-deseni-nedir",[15,1508,547],{"href":1509},"\u002Ftr\u002Fdecorator-tasarim-deseni-nedir",[15,1511,1513],{"href":1512},"\u002Ftr\u002Ffacade-tasarim-deseni-nedir","Facade",[15,1515,1517],{"href":1516},"\u002Ftr\u002Fflyweight-tasarim-deseni-nedir","Flyweight",[15,1519,1521],{"href":1520},"\u002Ftr\u002Fproxy-tasarim-deseni-nedir","Proxy",[11,1523,1524],{},[43,1525,1526],{},"Davranışsal Kalıplar (Behavioral Patterns)",[11,1528,1529,1472,1532,1472,1535,1472,1539,1472,1543,1472,1547,1472,1551,1472,1555,1472,1559,1472,1563],{},[15,1530,98],{"href":1531},"\u002Ftr\u002Fchain-of-responsibility-deseni-nedir",[15,1533,563],{"href":1534},"\u002Ftr\u002Fcommand-tasarim-deseni-nedir",[15,1536,1538],{"href":1537},"\u002Ftr\u002Fiterator-tasarim-deseni-nedir","Iterator",[15,1540,1542],{"href":1541},"\u002Ftr\u002Fmediator-tasarim-deseni-nedir","Mediator",[15,1544,1546],{"href":1545},"\u002Ftr\u002Fmemento-tasarim-deseni-nedir","Memento",[15,1548,1550],{"href":1549},"\u002Ftr\u002Fobserver-tasarim-deseni-nedir","Observer",[15,1552,1554],{"href":1553},"\u002Ftr\u002Fstate-tasarim-deseni-nedir","State",[15,1556,1558],{"href":1557},"\u002Ftr\u002Fstrategy-tasarim-deseni-nedir","Strategy",[15,1560,1562],{"href":1561},"\u002Ftr\u002Ftemplate-method-tasarim-deseni-nedir","Template Method",[15,1564,1566],{"href":1565},"\u002Ftr\u002Fvisitor-tasarim-deseni-nedir","Visitor",[1568,1569,1570],"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":189,"searchDepth":202,"depth":202,"links":1572},[1573,1574,1575,1576,1577,1578,1579,1580,1584,1589],{"id":92,"depth":202,"text":93},{"id":108,"depth":202,"text":109},{"id":150,"depth":202,"text":151},{"id":178,"depth":202,"text":179},{"id":500,"depth":202,"text":501},{"id":577,"depth":202,"text":578},{"id":603,"depth":202,"text":604},{"id":634,"depth":202,"text":635,"children":1581},[1582,1583],{"id":639,"depth":208,"text":640},{"id":1073,"depth":208,"text":1074},{"id":1413,"depth":202,"text":1414,"children":1585},[1586,1587,1588],{"id":1417,"depth":208,"text":1418},{"id":1428,"depth":208,"text":1429},{"id":1450,"depth":208,"text":1451},{"id":1459,"depth":202,"text":1460},[1591],"technical",null,"2021-10-01","Chain of Responsibility (Sorumluluk Zinciri) tasarım kalıbını, HTTP middleware mantığını, destek masası senaryolarını ve PHP\u002FPython örneklerini öğrenin.",false,"md","\u002Fimages\u002Fposts\u002F2021\u002F10\u002Fchain-of-responsibility-deseni.avif",{},{"title":6,"description":1594},"chain-of-responsibility-deseni-nedir","tr\u002Fchain-of-responsibility-deseni-nedir",[1603,1604],"design-pattern","ipucu","aS3fJjmKBJ0kkRiMAaBsAD-C76PTNoXEgwuTs7nWRT0",{"prev":1607,"next":1610,"others":1612,"lucky":1722,"readingTime":233},{"path":1608,"title":1609},"\u002Ftr\u002Fopenlitespeed-ve-litespeed-enterprisei-reverse-proxy-olarak-kullanmak","OpenLiteSpeed ve LiteSpeed Enterprise Sunucularını Reverse Proxy Olarak Kullanmak",{"path":1534,"title":1611},"Command Tasarım Deseni Nedir?",[1613,1615,1618,1621,1624,1627,1630,1632,1635,1638,1640,1643,1646,1649,1652,1654,1657,1660,1662,1665,1668,1671,1674,1677,1680,1682,1685,1688,1690,1693,1696,1698,1701,1703,1706,1708,1710,1713,1716,1719],{"path":1561,"title":1614},"Template Method Tasarım Deseni Nedir?",{"path":1616,"title":1617},"\u002Ftr\u002Fes14-nedir-ecmascript-2023-nedir","ES14 nedir? ECMAScript 2023 nedir?",{"path":1619,"title":1620},"\u002Ftr\u002Fes17-nedir-ecmascript-2026-nedir","ES17 nedir? ECMAScript 2026 nedir?",{"path":1622,"title":1623},"\u002Ftr\u002Fes10-nedir-ecmascript-2019-nedir","ES10 Nedir? ECMAScript 2019 Nedir?",{"path":1625,"title":1626},"\u002Ftr\u002Fes13-nedir-ecmascript-2022-nedir","ES13 nedir? ECMAScript 2022 nedir?",{"path":1628,"title":1629},"\u002Ftr\u002Fgo-veri-tipleri-string-integer-float-complex-boolean-ve-array","Go Veri Tipleri - String, Integer, Float, Complex, Boolean ve Array",{"path":1512,"title":1631},"Facade Tasarım Deseni Nedir?",{"path":1633,"title":1634},"\u002Ftr\u002Fwsl-2-kurulumu-6-kolay-adim","WSL 2 Kurulumu - 6 kolay adım",{"path":1636,"title":1637},"\u002Ftr\u002Flinuxda-golang-kurulumu","Linux'ta Golang Kurulumu",{"path":1520,"title":1639},"Proxy Tasarım Deseni Nedir?",{"path":1641,"title":1642},"\u002Ftr\u002Fes6-nedir-ecmascript-2015-nedir","ES6 Nedir? ECMAScript 2015 Nedir?",{"path":1644,"title":1645},"\u002Ftr\u002Fes15-nedir-ecmascript-2024-nedir","ES15 nedir? ECMAScript 2024 nedir?",{"path":1647,"title":1648},"\u002Ftr\u002Fvite-nedir","Vite Nedir? Modern Web Geliştirme ve Paketleme Aracı",{"path":1650,"title":1651},"\u002Ftr\u002Fapi-gateway-nedir","API Gateway Nedir? Ne İşe Yarar?",{"path":1537,"title":1653},"Iterator Tasarım Deseni Nedir?",{"path":1655,"title":1656},"\u002Ftr\u002Ftailwind-css-just-in-time-modu","Tailwind CSS Just-in-Time (JIT) Modu Nedir?",{"path":1658,"title":1659},"\u002Ftr\u002Fmerhaba-phalcon-framework","Merhaba Phalcon Framework",{"path":1502,"title":1661},"Bridge Tasarım Deseni Nedir?",{"path":1663,"title":1664},"\u002Ftr\u002Fes11-nedir-ecmascript-2020-nedir","ES11 Nedir? ECMAScript 2020 Nedir?",{"path":1666,"title":1667},"\u002Ftr\u002Fgo-ile-websockets-websocket-upgrader-nedir","Go ile WebSockets: Upgrader Nedir?",{"path":1669,"title":1670},"\u002Ftr\u002Fecmascript-nedir-ecmascript-ne-degildir-bilinmesi-gerekenler","ECMAScript Nedir? Bilinmesi Gerekenler...",{"path":1672,"title":1673},"\u002Ftr\u002Ftailwind-css-nerede-kullanilir-tailwind-css-nerede-kullanilmaz","Tailwind CSS Nerede Kullanılır? Tailwind CSS Nerede Kullanılmaz?",{"path":1675,"title":1676},"\u002Ftr\u002Fwindows-10-golang-kurulumu","Windows 10 ve 11'de Golang Kurulumu ve GOPATH Yapılandırması",{"path":1678,"title":1679},"\u002Ftr\u002Fwebpack-nedir","Webpack Nedir? Modern JavaScript Paketleyici Ekosistemi",{"path":1475,"title":1681},"Abstract Factory Tasarım Deseni Nedir?",{"path":1683,"title":1684},"\u002Ftr\u002Fgoda-iota-nedir-iota-ne-zaman-ve-nerede-kullanilir","Go'da iota Nedir? iota Ne Zaman ve Nerede Kullanılır?",{"path":1686,"title":1687},"\u002Ftr\u002Fubuntu-20-04-uzerinde-cyberpanel-kurulumu","Ubuntu 20.04 üzerinde CyberPanel kurulumu",{"path":1479,"title":1689},"Builder Tasarım Deseni Nedir?",{"path":1691,"title":1692},"\u002Ftr\u002Fphp-8-0-yenilikler","Merhaba PHP 8: Modern PHP 8.x Çağı",{"path":1694,"title":1695},"\u002Ftr\u002Fes8-nedir-ecmascript-2017-nedir","ES8 Nedir? ECMAScript 2017 Nedir?",{"path":1509,"title":1697},"Decorator Tasarım Deseni Nedir?",{"path":1699,"title":1700},"\u002Ftr\u002Fgarbage-collection-ve-golang","Garbage Collection ve Go (Golang)",{"path":1549,"title":1702},"Observer Tasarım Deseni Nedir?",{"path":1704,"title":1705},"\u002Ftr\u002Fdocker-ve-portainer-kurulumu","Docker ve Portainer Kurulumu",{"path":1516,"title":1707},"Flyweight Tasarım Deseni Nedir?",{"path":1565,"title":1709},"Visitor Tasarım Deseni Nedir?",{"path":1711,"title":1712},"\u002Ftr\u002Fes9-nedir-ecmascript-2018-nedir","ES9 Nedir? ECMAScript 2018 Nedir?",{"path":1714,"title":1715},"\u002Ftr\u002Faws-ec2-uzerinde-docker-ve-full-stack-web-performansi","AWS EC2 Üzerinde Docker ve Full Stack Web Performansı",{"path":1717,"title":1718},"\u002Ftr\u002Fearly-return-erken-donus-nedir","Early Return \u002F Erken Dönüş nedir?",{"path":1720,"title":1721},"\u002Ftr\u002Fes5-nedir","ES5 Nedir? JavaScript Geliştiricileri İçin Kılavuz",{"path":1723,"title":1724},"\u002Ftr\u002Fdocker-ile-redis-kurulumu","Docker ile Redis Kurulumu",[1726,1728,1730,1733],{"path":1565,"title":1709,"date":1727},"2021-10-09",{"path":1561,"title":1614,"date":1729},"2021-10-08",{"path":1557,"title":1731,"date":1732},"Strategy Tasarım Deseni Nedir?","2021-10-07",{"path":1553,"title":1734,"date":1735},"State Tasarım Deseni Nedir?","2021-10-06",[1737,1740,1744],{"path":1470,"title":1738,"date":1739},"Factory Method Tasarım Deseni Nedir?","2021-07-24",{"path":1741,"title":1742,"date":1743},"\u002Ftr\u002Fgo-programlama-dilinin-ozellikleri","Go Programlama Dilinin Özellikleri","2021-09-28",{"path":1475,"title":1681,"date":1745},"2021-07-27",1782142006417]