[{"data":1,"prerenderedAt":1448},["ShallowReactive",2],{"post-\u002Ftr\u002Fstrategy-tasarim-deseni-nedir":3},{"page":4,"translation":1299,"nav":1313,"related":1429,"random":1439},{"id":5,"title":6,"body":7,"categories":1297,"category":1299,"date":1300,"description":1301,"draft":1302,"extension":1303,"image":1304,"kind":1299,"lang":478,"meta":1305,"navigation":224,"path":1266,"readingTime":234,"seo":1306,"slug":1307,"stem":1308,"tags":1309,"translationKey":1299,"type":1298,"updated":1299,"__hash__":1312},"postsTr\u002Ftr\u002Fstrategy-tasarim-deseni-nedir.md","Strategy Tasarım Deseni Nedir?",{"type":8,"value":9,"toc":1278},"minimark",[10,20,33,36,86,89,94,99,101,105,108,111,114,117,124,127,130,133,135,139,145,148,151,157,164,171,173,177,184,465,467,471,533,535,539,573,575,579,614,616,620,625,899,903,1129,1131,1135,1139,1142,1146,1153,1157,1164,1166,1170,1175,1198,1203,1230,1235,1274],[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,67],"ul",{},[50,51,52,55],"li",{},[43,53,54],{},"Amaç:"," Bir algoritma ailesi tanımlayıp her birini ayrı sınıfa koyarak çalışma zamanında birbirlerinin yerine kullanılabilmelerini sağlar.",[50,57,58,61,62,66],{},[43,59,60],{},"Tasarım İlkesi:"," ",[63,64,65],"em",{},"Composition over Inheritance"," (Kalıtım yerine Kompozisyon) prensibine dayanır. Davranışlar alt sınıflarla değil, nesne kompozisyonu ile dinamik olarak değiştirilir.",[50,68,69,72,73,77,78,81,82,85],{},[43,70,71],{},"Kilit Yapılar:"," Bağlam (",[74,75,76],"code",{},"Context","), Strateji Arayüzü (",[74,79,80],{},"Strategy",") ve Somut Stratejiler (",[74,83,84],{},"ConcreteStrategy",").",[87,88],"hr",{},[90,91,93],"h2",{"id":92},"strategy-tasarım-deseninin-amacı","Strategy Tasarım Deseninin Amacı",[11,95,96,98],{},[43,97,80],{}," (Strateji), bir algoritma ailesi oluşturup her birini farklı bir sınıfa yerleştirerek nesnelerini birbiri arasında değişebilir (interchangeable) hale getirmeyi sağlayan davranışsal (behavioral) bir tasarım desenidir.",[87,100],{},[90,102,104],{"id":103},"sorun","Sorun",[11,106,107],{},"Gezginler için bir navigasyon uygulaması oluşturmaya karar verdiniz. Uygulamayı herhangi bir şehirde, güzel bir harita üzerinde, kullanıcıların yönlerini hızlıca belirlemelerini sağlayacak şekilde inşa ettiniz.",[11,109,110],{},"Uygulama için en çok istenen özelliklerden biri de otomatik rota oluşturabilmesi oldu. Bunun için kullanıcı varmak istediği adresi girmeli ve o adrese gitmek için en hızlı rotayı görebilmeli.",[11,112,113],{},"Uygulamanın ilk sürümü, yalnızca yollar üzerinde rotalar oluşturabiliyordu. Arabayla seyahat edenler sevinçten havalara uçtu. Ama görünüşe göre, herkes tatilde araba kullanmayı tercih etmiyor. Bir sonraki güncelleme ile yürüyüş rotaları oluşturmak için bir seçenek eklediniz. Hemen ardından insanların güzergahlarında toplu taşımayı kullanmalarına izin veren bir seçenek daha eklediniz.",[11,115,116],{},"Ancak, bu sadece başlangıçtı. Daha sonra bisikletçiler için rota oluşturmayı eklemeyi planladınız. Hatta daha sonra, şehrin tüm turistik mekanları arasında rota oluşturmak için başka bir seçenek eklemeyi düşündünüz.",[11,118,119],{},[120,121],"img",{"alt":122,"src":123},"Strategy tasarım deseni nedir","\u002Fimages\u002Fstrategy-tasarim-deseni-nedir\u002Fstrategy-tasarim-deseni-ornek-cozum.avif",[11,125,126],{},"Uygulama ticari olarak başarılı olsa da teknik kısım birçok baş ağrısına neden oldu. Eklenen her yeni rota algoritması ile ana navigasyon kodunun büyüklüğü iki katına çıktı. Bir yerden sonra bu canavarla baş etmek zor olmaya başladı.",[11,128,129],{},"Algoritmalardan birinde yapılacak en küçük bir değişiklik (basit bir bug düzeltmesi gibi), tüm sınıfı etkileyerek halihazırda çalışan diğer kodlarda bir hata oluşturma riskini artırdı.",[11,131,132],{},"Ayrıca, ekip çalışması verimsiz hale geldi. Yeni bir özelliğin eklenmesi, diğer geliştiriciler tarafından üretilen kodlarla çelişecek şekilde aynı büyük sınıf üzerinde çalışılmasını gerektirdiğinden sürekli birleştirme çatışmaları (merge conflict) yaşanmaya başladı.",[87,134],{},[90,136,138],{"id":137},"çözüm","Çözüm",[11,140,141,144],{},[43,142,143],{},"Strategy deseni",", spesifik bir işi birçok farklı yolla yapan bir sınıfı alıp, bütün bu alternatif algoritmaları \"Strateji\" (Strategy) adı verilen ayrı sınıflara taşımayı önerir.",[11,146,147],{},"Bu modelde, \"Bağlam\" (Context) adını vereceğimiz orijinal sınıf, doğrudan bu stratejilerden birini kendi içinde çalıştırmak yerine seçilen stratejinin referansını bir değişken olarak saklar. Bağlam, işi doğrudan kendisi yapmak yerine seçilen strateji nesnesine delege eder.",[11,149,150],{},"Yapılacak iş için uygun algoritmayı seçmek bağlamın sorumluluğu değildir. İstemci kod bağlama tercih ettiği stratejiyi gönderir. Aslına bakarsanız bağlam nesnesinin stratejilerin ne yaptığı ile ilgili bir fikri yoktur. Tüm stratejilerle ortak bir arayüz üzerinden tek bir metot ile etkileşime girer ve algoritmanın içeriğini sadece seçilen strateji bilir.",[11,152,153],{},[120,154],{"alt":155,"src":156},"strateji tasarım deseni örnekleri","\u002Fimages\u002Fstrategy-tasarim-deseni-nedir\u002Fstrategy-tasarim-deseni-ornegi.avif",[11,158,159,160,163],{},"Navigasyon uygulamamızda, her rota algoritması sadece ",[74,161,162],{},"buildRoute(起点, 终点)"," metodunu içeren bağımsız bir sınıfa dönüştürülebilir.",[11,165,166,167,170],{},"Aynı parametreler ile çağrılsalar bile her rota sınıfı başka bir rota döndürebilir. Ana navigasyon uygulaması hangi algoritmanın seçildiği ile ilgilenmez, onun tek görevi döndürülen rotayı harita üzerinde çizmektir. Bağlam sınıfı, aktif rota stratejisini değiştirmek için bir setter metoduna (",[74,168,169],{},"setStrategy",") sahiptir, böylece çalışma zamanında kullanıcının seçimine göre rota oluşturma davranışı dinamik olarak değiştirilebilir.",[87,172],{},[90,174,176],{"id":175},"gerçek-hayat-senaryosu-ödeme-sistemi-entegrasyonu","Gerçek Hayat Senaryosu: Ödeme Sistemi Entegrasyonu",[11,178,179,180,183],{},"E-ticaret sistemlerinde en yaygın kullanılan Strategy kalıbı ",[43,181,182],{},"Ödeme Yöntemleri"," entegrasyonudur:",[185,186,191],"pre",{"className":187,"code":188,"language":189,"meta":190,"style":190},"language-php shiki shiki-themes github-light github-dark","\u002F\u002F 1. Strateji Arayüzü (Strategy Interface)\ninterface PaymentStrategy {\n    public function pay(int $amount): void;\n}\n\n\u002F\u002F 2. Somut Stratejiler (Concrete Strategies)\nclass CreditCardPayment implements PaymentStrategy {\n    private string $cardNumber;\n\n    public function __construct(string $cardNumber) {\n        $this->cardNumber = $cardNumber;\n    }\n\n    public function pay(int $amount): void {\n        echo \"Kredi kartı ($this->cardNumber) ile $amount TL ödeme yapıldı.\\n\";\n    }\n}\n\nclass PayPalPayment implements PaymentStrategy {\n    private string $email;\n\n    public function __construct(string $email) {\n        $this->email = $email;\n    }\n\n    public function pay(int $amount): void {\n        echo \"PayPal ($this->email) ile $amount TL ödeme yapıldı.\\n\";\n    }\n}\n\n\u002F\u002F 3. Bağlam Sınıfı (Context)\nclass ShoppingCart {\n    private int $totalAmount = 0;\n    private PaymentStrategy $paymentStrategy;\n\n    public function setPaymentStrategy(PaymentStrategy $strategy): void {\n        $this->paymentStrategy = $strategy;\n    }\n\n    public function addAmount(int $amount): void {\n        $this->totalAmount += $amount;\n    }\n\n    public function checkout(): void {\n        \u002F\u002F Ödeme işlemini seçili stratejiye delege et\n        $this->paymentStrategy->pay($this->totalAmount);\n    }\n}\n","php","",[74,192,193,201,207,213,219,226,232,238,244,249,255,261,267,272,278,284,289,294,299,305,311,316,322,328,333,338,343,349,354,359,364,370,376,382,388,393,399,405,410,415,421,427,432,437,443,449,455,460],{"__ignoreMap":190},[194,195,198],"span",{"class":196,"line":197},"line",1,[194,199,200],{},"\u002F\u002F 1. Strateji Arayüzü (Strategy Interface)\n",[194,202,204],{"class":196,"line":203},2,[194,205,206],{},"interface PaymentStrategy {\n",[194,208,210],{"class":196,"line":209},3,[194,211,212],{},"    public function pay(int $amount): void;\n",[194,214,216],{"class":196,"line":215},4,[194,217,218],{},"}\n",[194,220,222],{"class":196,"line":221},5,[194,223,225],{"emptyLinePlaceholder":224},true,"\n",[194,227,229],{"class":196,"line":228},6,[194,230,231],{},"\u002F\u002F 2. Somut Stratejiler (Concrete Strategies)\n",[194,233,235],{"class":196,"line":234},7,[194,236,237],{},"class CreditCardPayment implements PaymentStrategy {\n",[194,239,241],{"class":196,"line":240},8,[194,242,243],{},"    private string $cardNumber;\n",[194,245,247],{"class":196,"line":246},9,[194,248,225],{"emptyLinePlaceholder":224},[194,250,252],{"class":196,"line":251},10,[194,253,254],{},"    public function __construct(string $cardNumber) {\n",[194,256,258],{"class":196,"line":257},11,[194,259,260],{},"        $this->cardNumber = $cardNumber;\n",[194,262,264],{"class":196,"line":263},12,[194,265,266],{},"    }\n",[194,268,270],{"class":196,"line":269},13,[194,271,225],{"emptyLinePlaceholder":224},[194,273,275],{"class":196,"line":274},14,[194,276,277],{},"    public function pay(int $amount): void {\n",[194,279,281],{"class":196,"line":280},15,[194,282,283],{},"        echo \"Kredi kartı ($this->cardNumber) ile $amount TL ödeme yapıldı.\\n\";\n",[194,285,287],{"class":196,"line":286},16,[194,288,266],{},[194,290,292],{"class":196,"line":291},17,[194,293,218],{},[194,295,297],{"class":196,"line":296},18,[194,298,225],{"emptyLinePlaceholder":224},[194,300,302],{"class":196,"line":301},19,[194,303,304],{},"class PayPalPayment implements PaymentStrategy {\n",[194,306,308],{"class":196,"line":307},20,[194,309,310],{},"    private string $email;\n",[194,312,314],{"class":196,"line":313},21,[194,315,225],{"emptyLinePlaceholder":224},[194,317,319],{"class":196,"line":318},22,[194,320,321],{},"    public function __construct(string $email) {\n",[194,323,325],{"class":196,"line":324},23,[194,326,327],{},"        $this->email = $email;\n",[194,329,331],{"class":196,"line":330},24,[194,332,266],{},[194,334,336],{"class":196,"line":335},25,[194,337,225],{"emptyLinePlaceholder":224},[194,339,341],{"class":196,"line":340},26,[194,342,277],{},[194,344,346],{"class":196,"line":345},27,[194,347,348],{},"        echo \"PayPal ($this->email) ile $amount TL ödeme yapıldı.\\n\";\n",[194,350,352],{"class":196,"line":351},28,[194,353,266],{},[194,355,357],{"class":196,"line":356},29,[194,358,218],{},[194,360,362],{"class":196,"line":361},30,[194,363,225],{"emptyLinePlaceholder":224},[194,365,367],{"class":196,"line":366},31,[194,368,369],{},"\u002F\u002F 3. Bağlam Sınıfı (Context)\n",[194,371,373],{"class":196,"line":372},32,[194,374,375],{},"class ShoppingCart {\n",[194,377,379],{"class":196,"line":378},33,[194,380,381],{},"    private int $totalAmount = 0;\n",[194,383,385],{"class":196,"line":384},34,[194,386,387],{},"    private PaymentStrategy $paymentStrategy;\n",[194,389,391],{"class":196,"line":390},35,[194,392,225],{"emptyLinePlaceholder":224},[194,394,396],{"class":196,"line":395},36,[194,397,398],{},"    public function setPaymentStrategy(PaymentStrategy $strategy): void {\n",[194,400,402],{"class":196,"line":401},37,[194,403,404],{},"        $this->paymentStrategy = $strategy;\n",[194,406,408],{"class":196,"line":407},38,[194,409,266],{},[194,411,413],{"class":196,"line":412},39,[194,414,225],{"emptyLinePlaceholder":224},[194,416,418],{"class":196,"line":417},40,[194,419,420],{},"    public function addAmount(int $amount): void {\n",[194,422,424],{"class":196,"line":423},41,[194,425,426],{},"        $this->totalAmount += $amount;\n",[194,428,430],{"class":196,"line":429},42,[194,431,266],{},[194,433,435],{"class":196,"line":434},43,[194,436,225],{"emptyLinePlaceholder":224},[194,438,440],{"class":196,"line":439},44,[194,441,442],{},"    public function checkout(): void {\n",[194,444,446],{"class":196,"line":445},45,[194,447,448],{},"        \u002F\u002F Ödeme işlemini seçili stratejiye delege et\n",[194,450,452],{"class":196,"line":451},46,[194,453,454],{},"        $this->paymentStrategy->pay($this->totalAmount);\n",[194,456,458],{"class":196,"line":457},47,[194,459,266],{},[194,461,463],{"class":196,"line":462},48,[194,464,218],{},[87,466],{},[90,468,470],{"id":469},"strategy-vs-state","Strategy vs State",[472,473,474,490],"table",{},[475,476,477],"thead",{},[478,479,480,485,487],"tr",{},[481,482,484],"th",{"align":483},"left","Kriter",[481,486,80],{"align":483},[481,488,489],{"align":483},"State",[491,492,493,507,520],"tbody",{},[478,494,495,501,504],{},[496,497,498],"td",{"align":483},[43,499,500],{},"Bağımsızlık",[496,502,503],{"align":483},"Stratejiler birbirinden tamamen bağımsızdır ve birbirlerinden haberdar değildir.",[496,505,506],{"align":483},"Durumlar (States) genellikle birbirine bağımlıdır ve durum geçişlerini kendileri tetikleyebilir.",[478,508,509,514,517],{},[496,510,511],{"align":483},[43,512,513],{},"Dışarıdan Müdahale",[496,515,516],{"align":483},"Uygun strateji genellikle istemci tarafından seçilir ve Context'e dışarıdan enjekte edilir.",[496,518,519],{"align":483},"Durum geçişleri Context içindeki olaylara göre otomatik olarak gerçekleşebilir.",[478,521,522,527,530],{},[496,523,524],{"align":483},[43,525,526],{},"Amaç",[496,528,529],{"align":483},"Aynı işi yapmanın farklı yollarını (algoritmaları) sunmak.",[496,531,532],{"align":483},"Nesnenin iç durumuna göre davranışını tamamen değiştirmek.",[87,534],{},[90,536,538],{"id":537},"uygulanabilirlik","Uygulanabilirlik",[47,540,541,547,553,559],{},[50,542,543,546],{},[43,544,545],{},"Çalışma Zamanında Algoritma Değiştirme:"," Bir nesne içinde bir algoritmanın farklı türevlerini kullanmak ve çalışma esnasında dinamik olarak birinden diğerine geçebilmek istediğinizde kullanın.",[50,548,549,552],{},[43,550,551],{},"Benzer Sınıfların Sadeleştirilmesi:"," Yalnızca bazı davranışları yürütme biçimleri bakımından farklılık gösteren çok sayıda benzer sınıfınız olduğunda, bu davranışları ayrı sınıflara çıkarıp kod tekrarını azaltmak için kullanın.",[50,554,555,558],{},[43,556,557],{},"İş Mantığından Algoritmayı Soyutlama:"," Bir sınıfın iş mantığı için kritik olmayan detayları ve bağımlılıkları ana sınıftan yalıtmak istediğinizde kullanın.",[50,560,561,564,565,568,569,572],{},[43,562,563],{},"Büyük Koşullu İfadelerin Temizlenmesi:"," Sınıfınız aynı algoritmanın farklı varyasyonları arasında geçiş yapan devasa ",[74,566,567],{},"if-else"," veya ",[74,570,571],{},"switch"," bloklarına sahip olduğunda kullanın.",[87,574],{},[90,576,578],{"id":577},"diğer-tasarım-desenleri-ile-i̇lişkisi","Diğer Tasarım Desenleri ile İlişkisi",[47,580,581,596,605],{},[50,582,583,586,587,586,589,591,592,595],{},[43,584,585],{},"Bridge",", ",[43,588,489],{},[43,590,80],{}," ve ",[43,593,594],{},"Adapter"," desenleri benzer bir kompozisyon yapısına sahiptir; hepsi işi başka nesnelere delege eder. Ancak her biri farklı bir yazılımsal probleme odaklanır.",[50,597,598,601,602,604],{},[43,599,600],{},"Decorator"," nesnenin dış görünüşünü\u002Fkabuğunu değiştirirken, ",[43,603,80],{}," nesnenin özünü ve çalışma biçimini değiştirir.",[50,606,607,610,611,613],{},[43,608,609],{},"Template Method"," kalıtım (inheritance) kullanarak algoritmanın parçalarını alt sınıflarda değiştirir (statiktir). ",[43,612,80],{}," ise kompozisyon kullanarak tüm davranışı çalışma zamanında değiştirmeye izin verir (dinamiktir).",[87,615],{},[90,617,619],{"id":618},"strategy-deseni-kod-örnekleri","Strategy Deseni Kod Örnekleri",[621,622,624],"h3",{"id":623},"örnek-php-kodu","Örnek PHP Kodu",[185,626,628],{"className":187,"code":627,"language":189,"meta":190,"style":190},"\u003C?php\n\nnamespace RefactoringGuru\\Strategy\\Conceptual;\n\nclass Context\n{\n    private Strategy $strategy;\n\n    public function __construct(Strategy $strategy)\n    {\n        $this->strategy = $strategy;\n    }\n\n    public function setStrategy(Strategy $strategy)\n    {\n        $this->strategy = $strategy;\n    }\n\n    public function doSomeBusinessLogic(): void\n    {\n        echo \"Context: Verileri strateji kullanarak sıralıyorum (nasıl yapıldığını bilmiyorum):\\n\";\n        $result = $this->strategy->doAlgorithm([\"a\", \"b\", \"c\", \"d\", \"e\"]);\n        echo implode(\",\", $result) . \"\\n\";\n    }\n}\n\ninterface Strategy\n{\n    public function doAlgorithm(array $data): array;\n}\n\nclass ConcreteStrategyA implements Strategy\n{\n    public function doAlgorithm(array $data): array\n    {\n        sort($data);\n        return $data;\n    }\n}\n\nclass ConcreteStrategyB implements Strategy\n{\n    public function doAlgorithm(array $data): array\n    {\n        rsort($data);\n        return $data;\n    }\n}\n\n$context = new Context(new ConcreteStrategyA());\necho \"Client: Normal sıralama stratejisi seçildi.\\n\";\n$context->doSomeBusinessLogic();\n\necho \"\\n\";\n\necho \"Client: Ters sıralama stratejisi seçildi.\\n\";\n$context->setStrategy(new ConcreteStrategyB());\n$context->doSomeBusinessLogic();\n",[74,629,630,635,639,644,648,653,658,663,667,672,677,682,686,690,695,699,703,707,711,716,720,725,730,735,739,743,747,752,756,761,765,769,774,778,783,787,792,797,801,805,809,814,818,822,826,831,835,839,843,848,854,860,866,871,877,882,888,894],{"__ignoreMap":190},[194,631,632],{"class":196,"line":197},[194,633,634],{},"\u003C?php\n",[194,636,637],{"class":196,"line":203},[194,638,225],{"emptyLinePlaceholder":224},[194,640,641],{"class":196,"line":209},[194,642,643],{},"namespace RefactoringGuru\\Strategy\\Conceptual;\n",[194,645,646],{"class":196,"line":215},[194,647,225],{"emptyLinePlaceholder":224},[194,649,650],{"class":196,"line":221},[194,651,652],{},"class Context\n",[194,654,655],{"class":196,"line":228},[194,656,657],{},"{\n",[194,659,660],{"class":196,"line":234},[194,661,662],{},"    private Strategy $strategy;\n",[194,664,665],{"class":196,"line":240},[194,666,225],{"emptyLinePlaceholder":224},[194,668,669],{"class":196,"line":246},[194,670,671],{},"    public function __construct(Strategy $strategy)\n",[194,673,674],{"class":196,"line":251},[194,675,676],{},"    {\n",[194,678,679],{"class":196,"line":257},[194,680,681],{},"        $this->strategy = $strategy;\n",[194,683,684],{"class":196,"line":263},[194,685,266],{},[194,687,688],{"class":196,"line":269},[194,689,225],{"emptyLinePlaceholder":224},[194,691,692],{"class":196,"line":274},[194,693,694],{},"    public function setStrategy(Strategy $strategy)\n",[194,696,697],{"class":196,"line":280},[194,698,676],{},[194,700,701],{"class":196,"line":286},[194,702,681],{},[194,704,705],{"class":196,"line":291},[194,706,266],{},[194,708,709],{"class":196,"line":296},[194,710,225],{"emptyLinePlaceholder":224},[194,712,713],{"class":196,"line":301},[194,714,715],{},"    public function doSomeBusinessLogic(): void\n",[194,717,718],{"class":196,"line":307},[194,719,676],{},[194,721,722],{"class":196,"line":313},[194,723,724],{},"        echo \"Context: Verileri strateji kullanarak sıralıyorum (nasıl yapıldığını bilmiyorum):\\n\";\n",[194,726,727],{"class":196,"line":318},[194,728,729],{},"        $result = $this->strategy->doAlgorithm([\"a\", \"b\", \"c\", \"d\", \"e\"]);\n",[194,731,732],{"class":196,"line":324},[194,733,734],{},"        echo implode(\",\", $result) . \"\\n\";\n",[194,736,737],{"class":196,"line":330},[194,738,266],{},[194,740,741],{"class":196,"line":335},[194,742,218],{},[194,744,745],{"class":196,"line":340},[194,746,225],{"emptyLinePlaceholder":224},[194,748,749],{"class":196,"line":345},[194,750,751],{},"interface Strategy\n",[194,753,754],{"class":196,"line":351},[194,755,657],{},[194,757,758],{"class":196,"line":356},[194,759,760],{},"    public function doAlgorithm(array $data): array;\n",[194,762,763],{"class":196,"line":361},[194,764,218],{},[194,766,767],{"class":196,"line":366},[194,768,225],{"emptyLinePlaceholder":224},[194,770,771],{"class":196,"line":372},[194,772,773],{},"class ConcreteStrategyA implements Strategy\n",[194,775,776],{"class":196,"line":378},[194,777,657],{},[194,779,780],{"class":196,"line":384},[194,781,782],{},"    public function doAlgorithm(array $data): array\n",[194,784,785],{"class":196,"line":390},[194,786,676],{},[194,788,789],{"class":196,"line":395},[194,790,791],{},"        sort($data);\n",[194,793,794],{"class":196,"line":401},[194,795,796],{},"        return $data;\n",[194,798,799],{"class":196,"line":407},[194,800,266],{},[194,802,803],{"class":196,"line":412},[194,804,218],{},[194,806,807],{"class":196,"line":417},[194,808,225],{"emptyLinePlaceholder":224},[194,810,811],{"class":196,"line":423},[194,812,813],{},"class ConcreteStrategyB implements Strategy\n",[194,815,816],{"class":196,"line":429},[194,817,657],{},[194,819,820],{"class":196,"line":434},[194,821,782],{},[194,823,824],{"class":196,"line":439},[194,825,676],{},[194,827,828],{"class":196,"line":445},[194,829,830],{},"        rsort($data);\n",[194,832,833],{"class":196,"line":451},[194,834,796],{},[194,836,837],{"class":196,"line":457},[194,838,266],{},[194,840,841],{"class":196,"line":462},[194,842,218],{},[194,844,846],{"class":196,"line":845},49,[194,847,225],{"emptyLinePlaceholder":224},[194,849,851],{"class":196,"line":850},50,[194,852,853],{},"$context = new Context(new ConcreteStrategyA());\n",[194,855,857],{"class":196,"line":856},51,[194,858,859],{},"echo \"Client: Normal sıralama stratejisi seçildi.\\n\";\n",[194,861,863],{"class":196,"line":862},52,[194,864,865],{},"$context->doSomeBusinessLogic();\n",[194,867,869],{"class":196,"line":868},53,[194,870,225],{"emptyLinePlaceholder":224},[194,872,874],{"class":196,"line":873},54,[194,875,876],{},"echo \"\\n\";\n",[194,878,880],{"class":196,"line":879},55,[194,881,225],{"emptyLinePlaceholder":224},[194,883,885],{"class":196,"line":884},56,[194,886,887],{},"echo \"Client: Ters sıralama stratejisi seçildi.\\n\";\n",[194,889,891],{"class":196,"line":890},57,[194,892,893],{},"$context->setStrategy(new ConcreteStrategyB());\n",[194,895,897],{"class":196,"line":896},58,[194,898,865],{},[621,900,902],{"id":901},"örnek-python-kodu","Örnek Python Kodu",[185,904,908],{"className":905,"code":906,"language":907,"meta":190,"style":190},"language-python shiki shiki-themes github-light github-dark","from __future__ import annotations\nfrom abc import ABC, abstractmethod\nfrom typing import List\n\nclass Context():\n    def __init__(self, strategy: Strategy) -> None:\n        self._strategy = strategy\n\n    @property\n    def strategy(self) -> Strategy:\n        return self._strategy\n\n    @strategy.setter\n    def strategy(self, strategy: Strategy) -> None:\n        self._strategy = strategy\n\n    def do_some_business_logic(self) -> None:\n        print(\"Context: Verileri strateji kullanarak sıralıyorum (nasıl yapıldığını bilmiyorum):\")\n        result = self._strategy.do_algorithm([\"a\", \"b\", \"c\", \"d\", \"e\"])\n        print(\",\".join(result))\n\n\nclass Strategy(ABC):\n    @abstractmethod\n    def do_algorithm(self, data: List):\n        pass\n\n\nclass ConcreteStrategyA(Strategy):\n    def do_algorithm(self, data: List) -> List:\n        return sorted(data)\n\n\nclass ConcreteStrategyB(Strategy):\n    def do_algorithm(self, data: List) -> List:\n        return list(reversed(sorted(data)))\n\n\nif __name__ == \"__main__\":\n    context = Context(ConcreteStrategyA())\n    print(\"Client: Normal sıralama stratejisi seçildi.\")\n    context.do_some_business_logic()\n    print()\n\n    print(\"Client: Ters sıralama stratejisi seçildi.\")\n    context.strategy = ConcreteStrategyB()\n    context.do_some_business_logic()\n","python",[74,909,910,915,920,925,929,934,939,944,948,953,958,963,967,972,977,981,985,990,995,1000,1005,1009,1013,1018,1023,1028,1033,1037,1041,1046,1051,1056,1060,1064,1069,1073,1078,1082,1086,1091,1096,1101,1106,1111,1115,1120,1125],{"__ignoreMap":190},[194,911,912],{"class":196,"line":197},[194,913,914],{},"from __future__ import annotations\n",[194,916,917],{"class":196,"line":203},[194,918,919],{},"from abc import ABC, abstractmethod\n",[194,921,922],{"class":196,"line":209},[194,923,924],{},"from typing import List\n",[194,926,927],{"class":196,"line":215},[194,928,225],{"emptyLinePlaceholder":224},[194,930,931],{"class":196,"line":221},[194,932,933],{},"class Context():\n",[194,935,936],{"class":196,"line":228},[194,937,938],{},"    def __init__(self, strategy: Strategy) -> None:\n",[194,940,941],{"class":196,"line":234},[194,942,943],{},"        self._strategy = strategy\n",[194,945,946],{"class":196,"line":240},[194,947,225],{"emptyLinePlaceholder":224},[194,949,950],{"class":196,"line":246},[194,951,952],{},"    @property\n",[194,954,955],{"class":196,"line":251},[194,956,957],{},"    def strategy(self) -> Strategy:\n",[194,959,960],{"class":196,"line":257},[194,961,962],{},"        return self._strategy\n",[194,964,965],{"class":196,"line":263},[194,966,225],{"emptyLinePlaceholder":224},[194,968,969],{"class":196,"line":269},[194,970,971],{},"    @strategy.setter\n",[194,973,974],{"class":196,"line":274},[194,975,976],{},"    def strategy(self, strategy: Strategy) -> None:\n",[194,978,979],{"class":196,"line":280},[194,980,943],{},[194,982,983],{"class":196,"line":286},[194,984,225],{"emptyLinePlaceholder":224},[194,986,987],{"class":196,"line":291},[194,988,989],{},"    def do_some_business_logic(self) -> None:\n",[194,991,992],{"class":196,"line":296},[194,993,994],{},"        print(\"Context: Verileri strateji kullanarak sıralıyorum (nasıl yapıldığını bilmiyorum):\")\n",[194,996,997],{"class":196,"line":301},[194,998,999],{},"        result = self._strategy.do_algorithm([\"a\", \"b\", \"c\", \"d\", \"e\"])\n",[194,1001,1002],{"class":196,"line":307},[194,1003,1004],{},"        print(\",\".join(result))\n",[194,1006,1007],{"class":196,"line":313},[194,1008,225],{"emptyLinePlaceholder":224},[194,1010,1011],{"class":196,"line":318},[194,1012,225],{"emptyLinePlaceholder":224},[194,1014,1015],{"class":196,"line":324},[194,1016,1017],{},"class Strategy(ABC):\n",[194,1019,1020],{"class":196,"line":330},[194,1021,1022],{},"    @abstractmethod\n",[194,1024,1025],{"class":196,"line":335},[194,1026,1027],{},"    def do_algorithm(self, data: List):\n",[194,1029,1030],{"class":196,"line":340},[194,1031,1032],{},"        pass\n",[194,1034,1035],{"class":196,"line":345},[194,1036,225],{"emptyLinePlaceholder":224},[194,1038,1039],{"class":196,"line":351},[194,1040,225],{"emptyLinePlaceholder":224},[194,1042,1043],{"class":196,"line":356},[194,1044,1045],{},"class ConcreteStrategyA(Strategy):\n",[194,1047,1048],{"class":196,"line":361},[194,1049,1050],{},"    def do_algorithm(self, data: List) -> List:\n",[194,1052,1053],{"class":196,"line":366},[194,1054,1055],{},"        return sorted(data)\n",[194,1057,1058],{"class":196,"line":372},[194,1059,225],{"emptyLinePlaceholder":224},[194,1061,1062],{"class":196,"line":378},[194,1063,225],{"emptyLinePlaceholder":224},[194,1065,1066],{"class":196,"line":384},[194,1067,1068],{},"class ConcreteStrategyB(Strategy):\n",[194,1070,1071],{"class":196,"line":390},[194,1072,1050],{},[194,1074,1075],{"class":196,"line":395},[194,1076,1077],{},"        return list(reversed(sorted(data)))\n",[194,1079,1080],{"class":196,"line":401},[194,1081,225],{"emptyLinePlaceholder":224},[194,1083,1084],{"class":196,"line":407},[194,1085,225],{"emptyLinePlaceholder":224},[194,1087,1088],{"class":196,"line":412},[194,1089,1090],{},"if __name__ == \"__main__\":\n",[194,1092,1093],{"class":196,"line":417},[194,1094,1095],{},"    context = Context(ConcreteStrategyA())\n",[194,1097,1098],{"class":196,"line":423},[194,1099,1100],{},"    print(\"Client: Normal sıralama stratejisi seçildi.\")\n",[194,1102,1103],{"class":196,"line":429},[194,1104,1105],{},"    context.do_some_business_logic()\n",[194,1107,1108],{"class":196,"line":434},[194,1109,1110],{},"    print()\n",[194,1112,1113],{"class":196,"line":439},[194,1114,225],{"emptyLinePlaceholder":224},[194,1116,1117],{"class":196,"line":445},[194,1118,1119],{},"    print(\"Client: Ters sıralama stratejisi seçildi.\")\n",[194,1121,1122],{"class":196,"line":451},[194,1123,1124],{},"    context.strategy = ConcreteStrategyB()\n",[194,1126,1127],{"class":196,"line":457},[194,1128,1105],{},[87,1130],{},[90,1132,1134],{"id":1133},"sıkça-sorulan-sorular-faq","Sıkça Sorulan Sorular (FAQ)",[621,1136,1138],{"id":1137},"neden-kalıtım-inheritance-yerine-kompozisyon-composition-tercih-edilir","Neden kalıtım (inheritance) yerine kompozisyon (composition) tercih edilir?",[11,1140,1141],{},"Kalıtım statiktir; sınıf yapısı kod yazılırken belirlenir ve çalışma zamanında değiştirilemez. Ayrıca alt sınıflar üst sınıfın tüm detaylarına bağımlı hale gelir (White-box reuse). Kompozisyon ise dinamiktir. Bağlam nesnesine çalışma zamanında farklı strateji nesneleri enjekte edilebilir ve bu sayede nesnenin davranışı esnek bir şekilde değiştirilir (Black-box reuse).",[621,1143,1145],{"id":1144},"strategy-deseni-ile-if-else-switch-kontrol-blokları-nasıl-azaltılır","Strategy deseni ile if-else \u002F switch kontrol blokları nasıl azaltılır?",[11,1147,1148,1149,1152],{},"Strateji deseni kullanılmadığında, farklı durum veya algoritma alternatifleri için kodun içinde ",[74,1150,1151],{},"if ($type == 'credit_card')"," gibi koşullu ifadeler yazılır. Strateji deseni ile her koşulun içi ayrı bir sınıf haline getirilir. İstemci, koşula uygun strateji nesnesini bir kez bağlama verir ve bağlam herhangi bir kontrol yapısı işletmeden doğrudan strateji metodunu çağırır.",[621,1154,1156],{"id":1155},"modern-dillerde-arayüz-interface-tanımlamadan-strateji-uygulayabilir-miyiz","Modern dillerde arayüz (Interface) tanımlamadan strateji uygulayabilir miyiz?",[11,1158,1159,1160,1163],{},"Evet. PHP 8+ veya Python 3 gibi modern dillerde, her strateji için ayrı bir sınıf oluşturmak yerine closure (fonksiyon) veya callback yapısı kullanabilirsiniz. Bağlam sınıfı bir interface yerine direkt bir ",[74,1161,1162],{},"callable"," parametre kabul edebilir. Küçük ve basit algoritmalar için bu yöntem ek dosya\u002Fsınıf kalabalığını önler.",[87,1165],{},[90,1167,1169],{"id":1168},"diğer-tasarım-kalıplarıdesign-patterns","Diğer Tasarım Kalıpları\u002FDesign Patterns",[11,1171,1172],{},[43,1173,1174],{},"Oluşumsal Kalıplar (Creational Patterns)",[11,1176,1177,1181,1182,1181,1186,1181,1190,1181,1194],{},[15,1178,1180],{"href":1179},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-factory-method-nedir","Factory Method",",\n",[15,1183,1185],{"href":1184},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-abstract-factory-nedir","Abstract Factory",[15,1187,1189],{"href":1188},"\u002Ftr\u002Fbuilder-tasarim-deseni-nedir","Builder",[15,1191,1193],{"href":1192},"\u002Ftr\u002Fprototype-tasarim-deseni-nedir","Prototype",[15,1195,1197],{"href":1196},"\u002Ftr\u002Fsingleton-tasarim-deseni-nedir","Singleton",[11,1199,1200],{},[43,1201,1202],{},"Yapısal Kalıplar (Structural Patterns)",[11,1204,1205,1181,1208,1181,1211,1181,1215,1181,1218,1181,1222,1181,1226],{},[15,1206,594],{"href":1207},"\u002Ftr\u002Fadapter-tasarim-deseni-nedir",[15,1209,585],{"href":1210},"\u002Ftr\u002Fbridge-tasarim-deseni-nedir",[15,1212,1214],{"href":1213},"\u002Ftr\u002Fcomposite-tasarim-deseni-nedir","Composite",[15,1216,600],{"href":1217},"\u002Ftr\u002Fdecorator-tasarim-deseni-nedir",[15,1219,1221],{"href":1220},"\u002Ftr\u002Ffacade-tasarim-deseni-nedir","Facade",[15,1223,1225],{"href":1224},"\u002Ftr\u002Fflyweight-tasarim-deseni-nedir","Flyweight",[15,1227,1229],{"href":1228},"\u002Ftr\u002Fproxy-tasarim-deseni-nedir","Proxy",[11,1231,1232],{},[43,1233,1234],{},"Davranışsal Kalıplar (Behavioral Patterns)",[11,1236,1237,1181,1241,1181,1245,1181,1249,1181,1253,1181,1257,1181,1261,1181,1264,1181,1267,1181,1270],{},[15,1238,1240],{"href":1239},"\u002Ftr\u002Fchain-of-responsibility-deseni-nedir","Chain of Responsibility",[15,1242,1244],{"href":1243},"\u002Ftr\u002Fcommand-tasarim-deseni-nedir","Command",[15,1246,1248],{"href":1247},"\u002Ftr\u002Fiterator-tasarim-deseni-nedir","Iterator",[15,1250,1252],{"href":1251},"\u002Ftr\u002Fmediator-tasarim-deseni-nedir","Mediator",[15,1254,1256],{"href":1255},"\u002Ftr\u002Fmemento-tasarim-deseni-nedir","Memento",[15,1258,1260],{"href":1259},"\u002Ftr\u002Fobserver-tasarim-deseni-nedir","Observer",[15,1262,489],{"href":1263},"\u002Ftr\u002Fstate-tasarim-deseni-nedir",[15,1265,80],{"href":1266},"\u002Ftr\u002Fstrategy-tasarim-deseni-nedir",[15,1268,609],{"href":1269},"\u002Ftr\u002Ftemplate-method-tasarim-deseni-nedir",[15,1271,1273],{"href":1272},"\u002Ftr\u002Fvisitor-tasarim-deseni-nedir","Visitor",[1275,1276,1277],"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":190,"searchDepth":203,"depth":203,"links":1279},[1280,1281,1282,1283,1284,1285,1286,1287,1291,1296],{"id":92,"depth":203,"text":93},{"id":103,"depth":203,"text":104},{"id":137,"depth":203,"text":138},{"id":175,"depth":203,"text":176},{"id":469,"depth":203,"text":470},{"id":537,"depth":203,"text":538},{"id":577,"depth":203,"text":578},{"id":618,"depth":203,"text":619,"children":1288},[1289,1290],{"id":623,"depth":209,"text":624},{"id":901,"depth":209,"text":902},{"id":1133,"depth":203,"text":1134,"children":1292},[1293,1294,1295],{"id":1137,"depth":209,"text":1138},{"id":1144,"depth":209,"text":1145},{"id":1155,"depth":209,"text":1156},{"id":1168,"depth":203,"text":1169},[1298],"technical",null,"2021-10-07","Strategy (Strateji) tasarım kalıbını, çalışma zamanında algoritma değiştirmeyi, ödeme entegrasyonu senaryolarını ve PHP\u002FPython örneklerini öğrenin.",false,"md","\u002Fimages\u002Fposts\u002F2021\u002F10\u002Fstrategy-tasarim-deseni-nedir.avif",{},{"title":6,"description":1301},"strategy-tasarim-deseni-nedir","tr\u002Fstrategy-tasarim-deseni-nedir",[1310,1311],"design-pattern","ipucu","9sv-nCdhlIxgh6DLCK6kQxiBVvNyQiPglivTHn1lSQw",{"prev":1314,"next":1316,"others":1318,"lucky":1428,"readingTime":234},{"path":1269,"title":1315},"Template Method Tasarım Deseni Nedir?",{"path":1263,"title":1317},"State Tasarım Deseni Nedir?",[1319,1321,1323,1326,1329,1331,1334,1337,1340,1343,1346,1349,1352,1353,1356,1359,1362,1365,1367,1370,1373,1376,1379,1382,1385,1388,1391,1394,1397,1399,1401,1404,1407,1410,1413,1415,1417,1420,1422,1425],{"path":1251,"title":1320},"Mediator Tasarım Deseni Nedir?",{"path":1259,"title":1322},"Observer Tasarım Deseni Nedir?",{"path":1324,"title":1325},"\u002Ftr\u002Fubuntu-20-04-composer-kurulumu","Ubuntu 20.04 - Composer Kurulumu",{"path":1327,"title":1328},"\u002Ftr\u002Fdigital-oceanda-vps-kurulumu","DigitalOcean'da VPS (Droplet) Kurulumu: Adım Adım Rehber",{"path":1179,"title":1330},"Factory Method Tasarım Deseni Nedir?",{"path":1332,"title":1333},"\u002Ftr\u002Faws-ec2-uzerinde-docker-ve-full-stack-web-performansi","AWS EC2 Üzerinde Docker ve Full Stack Web Performansı",{"path":1335,"title":1336},"\u002Ftr\u002Frest-api-uri-yapisi-nasil-olmali","REST API URI Yapısı Nasıl Olmalı?",{"path":1338,"title":1339},"\u002Ftr\u002Fes17-nedir-ecmascript-2026-nedir","ES17 nedir? ECMAScript 2026 nedir?",{"path":1341,"title":1342},"\u002Ftr\u002Fdocker-nedir","Docker Nedir?",{"path":1344,"title":1345},"\u002Ftr\u002Fwordpress-yonetici-sifresini-wp-cli-kullanarak-sifirlama","WordPress Yönetici Şifresini WP-CLI Kullanarak Sıfırlama",{"path":1347,"title":1348},"\u002Ftr\u002Fnext-js-on-bellegi-nasil-yenilenir-on-demand-cache-regeneration","Next.js Önbelleği Nasıl Yenilenir? \"On-Demand Cache Regeneration\"",{"path":1350,"title":1351},"\u002Ftr\u002Flitespeed-web-server-performans-artisi","Konfor Alanından Çıkıp, Konforlu Bir VPS'e Geçmek: LiteSpeed Web Server",{"path":1269,"title":1315},{"path":1354,"title":1355},"\u002Ftr\u002Fdocker-swarm-nedir","Docker Swarm Nedir?",{"path":1357,"title":1358},"\u002Ftr\u002Frest-api-dokumantasyonu-nasil-yapilir","REST Api Dokümantasyonu Nasıl Oluşturulur?",{"path":1360,"title":1361},"\u002Ftr\u002Fgo-slice-veri-tipi","Go Veri Tipleri: Slice",{"path":1363,"title":1364},"\u002Ftr\u002Fjavascriptde-moduller","JavaScript'te Modüller",{"path":1220,"title":1366},"Facade Tasarım Deseni Nedir?",{"path":1368,"title":1369},"\u002Ftr\u002Fmerhaba-gluster","Merhaba Gluster: Dağıtık Dosya Sistemi Nedir?",{"path":1371,"title":1372},"\u002Ftr\u002Fopenlitespeed-ve-litespeed-enterprisei-reverse-proxy-olarak-kullanmak","OpenLiteSpeed ve LiteSpeed Enterprise Sunucularını Reverse Proxy Olarak Kullanmak",{"path":1374,"title":1375},"\u002Ftr\u002Fvite-nedir","Vite Nedir? Modern Web Geliştirme ve Paketleme Aracı",{"path":1377,"title":1378},"\u002Ftr\u002Fes7-nedir-ecmascript-2016-nedir","ES7 Nedir? ECMAScript 2016 Nedir?",{"path":1380,"title":1381},"\u002Ftr\u002Fgoda-iota-nedir-iota-ne-zaman-ve-nerede-kullanilir","Go'da iota Nedir? iota Ne Zaman ve Nerede Kullanılır?",{"path":1383,"title":1384},"\u002Ftr\u002Fdocker-ile-litespeed-enterprise-kurulumu","Docker ile LiteSpeed Enterprise Kurulumu",{"path":1386,"title":1387},"\u002Ftr\u002Fdocker-ile-mariadb-kurulumu","Docker ile MariaDB Kurulumu",{"path":1389,"title":1390},"\u002Ftr\u002Fes16-nedir-ecmascript-2025-nedir","ES16 nedir? ECMAScript 2025 nedir?",{"path":1392,"title":1393},"\u002Ftr\u002Frest-api-hata-yonetimi","REST Api Hata Yönetimi",{"path":1395,"title":1396},"\u002Ftr\u002Flinuxda-golang-kurulumu","Linux'ta Golang Kurulumu",{"path":1239,"title":1398},"Chain of Responsibility Deseni Nedir?",{"path":1224,"title":1400},"Flyweight Tasarım Deseni Nedir?",{"path":1402,"title":1403},"\u002Ftr\u002Fgo-programlama-dilinin-ozellikleri","Go Programlama Dilinin Özellikleri",{"path":1405,"title":1406},"\u002Ftr\u002Fwsl-2-kurulumu-6-kolay-adim","WSL 2 Kurulumu - 6 kolay adım",{"path":1408,"title":1409},"\u002Ftr\u002Fgo-veri-tipleri-map","Go Veri Tipleri - Map",{"path":1411,"title":1412},"\u002Ftr\u002Fprogralama-ipucu-yoda-gosterimi","Yoda Koşulları (Yoda Conditions) Nedir? Programlama İpucu",{"path":1217,"title":1414},"Decorator Tasarım Deseni Nedir?",{"path":1228,"title":1416},"Proxy Tasarım Deseni Nedir?",{"path":1418,"title":1419},"\u002Ftr\u002Fcodeserver-nedir-codeserver-nasil-kurulur","Code-Server Nedir? Bulutta VS Code Geliştirme Ortamı Kurulumu",{"path":1192,"title":1421},"Prototype Tasarım Deseni Nedir?",{"path":1423,"title":1424},"\u002Ftr\u002Fyeni-tema-honeywind","Yeni WordPress Temam Honeywind: Tailwind CSS ve Minimalizm",{"path":1426,"title":1427},"\u002Ftr\u002Fecmascript-nedir-ecmascript-ne-degildir-bilinmesi-gerekenler","ECMAScript Nedir? Bilinmesi Gerekenler...",{"path":1357,"title":1358},[1430,1433,1435,1437],{"path":1272,"title":1431,"date":1432},"Visitor Tasarım Deseni Nedir?","2021-10-09",{"path":1269,"title":1315,"date":1434},"2021-10-08",{"path":1263,"title":1317,"date":1436},"2021-10-06",{"path":1259,"title":1322,"date":1438},"2021-10-05",[1440,1444,1446],{"path":1441,"title":1442,"date":1443},"\u002Ftr\u002Ffull-stack-proje-gelistiriyoruz","Full Stack Proje Geliştiriyoruz","2021-02-16",{"path":1354,"title":1355,"date":1445},"2021-01-19",{"path":1408,"title":1409,"date":1447},"2021-10-13",1782142003780]