[{"data":1,"prerenderedAt":1554},["ShallowReactive",2],{"post-\u002Ftr\u002Ftemplate-method-tasarim-deseni-nedir":3},{"page":4,"translation":1407,"nav":1421,"related":1536,"random":1546},{"id":5,"title":6,"body":7,"categories":1405,"category":1407,"date":1408,"description":1409,"draft":1410,"extension":1411,"image":1412,"kind":1407,"lang":366,"meta":1413,"navigation":272,"path":1375,"readingTime":245,"seo":1414,"slug":1415,"stem":1416,"tags":1417,"translationKey":1407,"type":1406,"updated":1407,"__hash__":1420},"postsTr\u002Ftr\u002Ftemplate-method-tasarim-deseni-nedir.md","Template Method Tasarım Deseni Nedir?",{"type":8,"value":9,"toc":1384},"minimark",[10,20,33,36,68,71,76,79,81,85,88,91,98,101,113,115,119,125,128,151,157,162,193,195,199,202,353,355,359,422,424,428,442,444,448,464,466,470,474,918,922,1221,1223,1227,1231,1234,1238,1260,1264,1267,1269,1273,1278,1300,1305,1335,1340,1380],[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,62],"ul",{},[50,51,52,55],"li",{},[43,53,54],{},"Amaç:"," Bir algoritmanın genel iskeletini üst sınıfta tanımlayıp, bazı adımların uygulanmasını alt sınıflara bırakarak algoritma yapısını bozmadan özelleştirme yapmayı sağlar.",[50,57,58,61],{},[43,59,60],{},"Hollywood İlkesi:"," \"Bizi arama, biz seni ararız.\" Yüksek seviyeli bileşen (üst sınıf), düşük seviyeli bileşenlerin (alt sınıflar) metotlarını ne zaman çağıracağına kendisi karar verir.",[50,63,64,67],{},[43,65,66],{},"Kilit Yapılar:"," Şablon Metot (iskelet), Soyut Adımlar (alt sınıfta uygulanması zorunlu) ve Kancalar (Hooks - isteğe bağlı adımlar).",[69,70],"hr",{},[72,73,75],"h2",{"id":74},"template-method-tasarım-deseninin-amacı","Template Method Tasarım Deseninin Amacı",[11,77,78],{},"Template Method (Şablon Yöntemi), üst sınıfta algoritmanın bir iskeletini oluşturan, alt sınıfların yapıyı değiştirmeden bu algoritmanın belirli adımlarını değiştirmesine izin veren davranışsal bir tasarım desenidir.",[69,80],{},[72,82,84],{"id":83},"sorun","Sorun",[11,86,87],{},"Kurumsal belgeleri analiz eden bir veri madenciliği uygulaması oluşturduğunuzu hayal edin. Kullanıcılar, uygulama belgelerini çeşitli biçimlerde (PDF, DOC, CSV) besler ve bu belgelerden tek tip bir biçimde anlamlı veriler çıkarmaya çalışır.",[11,89,90],{},"Uygulamanın ilk sürümü yalnızca DOC dosyalarıyla çalışırken, bir sonraki sürümde CSV dosyalarını desteklemeye karar verdiniz. Ve bir ay sonra uygulamanıza PDF dosyalarından veri çıkarmayı eklediniz.",[11,92,93],{},[94,95],"img",{"alt":96,"src":97},"Template Method nedir?","\u002Fimages\u002Ftemplate-method-tasarim-deseni-nedir\u002Ftemplate-method-tasarim-deseni-ornegi.avif",[11,99,100],{},"Bir noktada, her üç sınıfın da birçok benzer kodu olduğunu fark ettiniz. Dosya açma, veri ayıklama ve kapatma gibi işlemler dosya formatına göre değişirken, ham verileri analiz etme ve raporlama gibi adımlar tamamen aynıydı. Algoritmanın genel yapısını bozmadan bu kod tekrarlarından kurtulmak temiz kod prensipleri açısından büyük önem taşır.",[11,102,103,104,108,109,112],{},"İstemci kodu tarafında da sorunlar vardır; gelen nesne tipine göre (DOC, CSV, PDF) uygun analiz sınıfını seçmek için kodunuzda çok sayıda ",[105,106,107],"code",{},"if-else"," veya ",[105,110,111],{},"switch"," bloğu oluşmaya başlar.",[69,114],{},[72,116,118],{"id":117},"çözüm","Çözüm",[11,120,121,124],{},[43,122,123],{},"Template Method deseni",", bir algoritmayı belirli adımlara (adımları temsil eden metotlara) ayırmanızı ve bu adımların çağrılma sırasını tek bir \"Şablon Metot\" içinde sabitlemenizi önerir.",[11,126,127],{},"Gelin bunu veri madenciliği uygulamamızda nasıl çalışacağını görelim:",[129,130,131,138,145,148],"ol",{},[50,132,133,134,137],{},"Üç farklı ayrıştırma algoritması için ortak bir ",[105,135,136],{},"BaseDataMiner"," soyut sınıfı oluştururuz.",[50,139,140,141,144],{},"Bu sınıfta, tüm algoritma akışını yöneten bir ",[105,142,143],{},"mineData()"," şablon metodu tanımlarız.",[50,146,147],{},"Dosya açma ve veriyi okuma gibi formata özel adımları soyut (abstract) tanımlayarak alt sınıfların uygulamasına bırakırız.",[50,149,150],{},"Veri analizi ve raporlama gibi ortak adımları ise doğrudan üst sınıfta uygulayarak kod tekrarını önleriz.",[11,152,153],{},[94,154],{"alt":155,"src":156},"Template Method Uygulama Adımları","\u002Fimages\u002Ftemplate-method-tasarim-deseni-nedir\u002Ftemplate-method-uygulama-adimlari.avif",[158,159,161],"h3",{"id":160},"adım-çeşitleri","Adım Çeşitleri",[47,163,164,178,187],{},[50,165,166,169,170,173,174,177],{},[43,167,168],{},"Soyut Adımlar (Abstract Steps):"," Her alt sınıfın mutlaka kendi mantığına göre yazması gereken zorunlu adımlardır (Örn: ",[105,171,172],{},"readCSV()",", ",[105,175,176],{},"readPDF()",").",[50,179,180,183,184,177],{},[43,181,182],{},"Somut Adımlar (Concrete Steps):"," Üst sınıfta varsayılan olarak yazılmış, tüm alt sınıflarca ortak kullanılan adımlardır (Örn: ",[105,185,186],{},"analyzeData()",[50,188,189,192],{},[43,190,191],{},"Kancalar (Hooks):"," Üst sınıfta gövdesi boş bırakılan, alt sınıfların opsiyonel olarak araya kod enjekte etmek için ezebileceği metotlardır. Algoritmanın kritik noktalarından önce veya sonra çalıştırılırlar.",[69,194],{},[72,196,198],{"id":197},"gerçek-hayat-senaryosu-api-entegrasyon-akışı","Gerçek Hayat Senaryosu: API Entegrasyon Akışı",[11,200,201],{},"Yazılım dünyasında bu kalıbı en çok gördüğümüz yerlerden biri harici API'ler ile haberleşen sistemlerdir. Bir API entegrasyonunun temel akışı her servis için benzerdir:",[203,204,209],"pre",{"className":205,"code":206,"language":207,"meta":208,"style":208},"language-php shiki shiki-themes github-light github-dark","abstract class ApiIntegrator {\n    \u002F\u002F Şablon Metot (Final olmalı ki akış değiştirilemesin)\n    final public function process(): void {\n        $this->authenticate();\n        $data = $this->fetchData();\n        $parsed = $this->parseResponse($data);\n        $this->saveToDatabase($parsed);\n        $this->logActivity(); \u002F\u002F Kanca (Hook)\n    }\n\n    protected function authenticate(): void {\n        echo \"Varsayılan OAuth2 doğrulaması yapıldı.\\n\";\n    }\n\n    abstract protected function fetchData(): string;\n    abstract protected function parseResponse(string $data): array;\n\n    protected function saveToDatabase(array $data): void {\n        echo \"Veriler yerel veritabanına kaydedildi.\\n\";\n    }\n\n    \u002F\u002F Boş kanca metot - alt sınıflar isteğe bağlı ezer\n    protected function logActivity(): void {}\n}\n","php","",[105,210,211,219,225,231,237,243,249,255,261,267,274,280,286,291,296,302,308,313,319,325,330,335,341,347],{"__ignoreMap":208},[212,213,216],"span",{"class":214,"line":215},"line",1,[212,217,218],{},"abstract class ApiIntegrator {\n",[212,220,222],{"class":214,"line":221},2,[212,223,224],{},"    \u002F\u002F Şablon Metot (Final olmalı ki akış değiştirilemesin)\n",[212,226,228],{"class":214,"line":227},3,[212,229,230],{},"    final public function process(): void {\n",[212,232,234],{"class":214,"line":233},4,[212,235,236],{},"        $this->authenticate();\n",[212,238,240],{"class":214,"line":239},5,[212,241,242],{},"        $data = $this->fetchData();\n",[212,244,246],{"class":214,"line":245},6,[212,247,248],{},"        $parsed = $this->parseResponse($data);\n",[212,250,252],{"class":214,"line":251},7,[212,253,254],{},"        $this->saveToDatabase($parsed);\n",[212,256,258],{"class":214,"line":257},8,[212,259,260],{},"        $this->logActivity(); \u002F\u002F Kanca (Hook)\n",[212,262,264],{"class":214,"line":263},9,[212,265,266],{},"    }\n",[212,268,270],{"class":214,"line":269},10,[212,271,273],{"emptyLinePlaceholder":272},true,"\n",[212,275,277],{"class":214,"line":276},11,[212,278,279],{},"    protected function authenticate(): void {\n",[212,281,283],{"class":214,"line":282},12,[212,284,285],{},"        echo \"Varsayılan OAuth2 doğrulaması yapıldı.\\n\";\n",[212,287,289],{"class":214,"line":288},13,[212,290,266],{},[212,292,294],{"class":214,"line":293},14,[212,295,273],{"emptyLinePlaceholder":272},[212,297,299],{"class":214,"line":298},15,[212,300,301],{},"    abstract protected function fetchData(): string;\n",[212,303,305],{"class":214,"line":304},16,[212,306,307],{},"    abstract protected function parseResponse(string $data): array;\n",[212,309,311],{"class":214,"line":310},17,[212,312,273],{"emptyLinePlaceholder":272},[212,314,316],{"class":214,"line":315},18,[212,317,318],{},"    protected function saveToDatabase(array $data): void {\n",[212,320,322],{"class":214,"line":321},19,[212,323,324],{},"        echo \"Veriler yerel veritabanına kaydedildi.\\n\";\n",[212,326,328],{"class":214,"line":327},20,[212,329,266],{},[212,331,333],{"class":214,"line":332},21,[212,334,273],{"emptyLinePlaceholder":272},[212,336,338],{"class":214,"line":337},22,[212,339,340],{},"    \u002F\u002F Boş kanca metot - alt sınıflar isteğe bağlı ezer\n",[212,342,344],{"class":214,"line":343},23,[212,345,346],{},"    protected function logActivity(): void {}\n",[212,348,350],{"class":214,"line":349},24,[212,351,352],{},"}\n",[69,354],{},[72,356,358],{"id":357},"template-method-vs-strategy","Template Method vs Strategy",[360,361,362,379],"table",{},[363,364,365],"thead",{},[366,367,368,373,376],"tr",{},[369,370,372],"th",{"align":371},"left","Kriter",[369,374,375],{"align":371},"Template Method",[369,377,378],{"align":371},"Strategy",[380,381,382,396,409],"tbody",{},[366,383,384,390,393],{},[385,386,387],"td",{"align":371},[43,388,389],{},"İlişki Türü",[385,391,392],{"align":371},"Sınıf Seviyesinde (Kalıtım \u002F Inheritance)",[385,394,395],{"align":371},"Nesne Seviyesinde (Kompozisyon \u002F Composition)",[366,397,398,403,406],{},[385,399,400],{"align":371},[43,401,402],{},"Bağlantı Türü",[385,404,405],{"align":371},"Statiktir, çalışma zamanında algoritma yapısı değiştirilemez.",[385,407,408],{"align":371},"Dinamiktir, çalışma zamanında farklı stratejiler atanabilir.",[366,410,411,416,419],{},[385,412,413],{"align":371},[43,414,415],{},"Çalışma Prensibi",[385,417,418],{"align":371},"Algoritmanın iskeleti üst sınıfatadır; alt sınıflar sadece adımları değiştirir.",[385,420,421],{"align":371},"Tüm algoritma bağımsız sınıflara bölünür ve birbirinin yerine kullanılabilir.",[69,423],{},[72,425,427],{"id":426},"uygulanabilirlik","Uygulanabilirlik",[47,429,430,436],{},[50,431,432,435],{},[43,433,434],{},"Sadece Belirli Adımların Özelleştirilmesi:"," İstemcilerin tüm algoritma yapısını değil, yalnızca belirli adımları genişletmesine izin vermek istediğinizde kullanın.",[50,437,438,441],{},[43,439,440],{},"Kod Tekrarını Önleme:"," Birbirine çok benzeyen ama küçük farkları olan algoritmaları tek bir üst sınıfta toplayıp, ortak kısımları yukarı çekmek istediğinizde kullanın.",[69,443],{},[72,445,447],{"id":446},"diğer-tasarım-desenleri-ile-i̇lişkisi","Diğer Tasarım Desenleri ile İlişkisi",[47,449,450,456],{},[50,451,452,455],{},[43,453,454],{},"Factory Method"," esasen Template Method'un özelleştirilmiş bir halidir (nesne üretme adımını alt sınıflara bırakır).",[50,457,458,460,461,463],{},[43,459,375],{}," kalıtım kullanarak algoritmanın parçalarını değiştirirken, ",[43,462,378],{}," kompozisyon kullanarak tüm davranışı çalışma zamanında değiştirmeye odaklanır.",[69,465],{},[72,467,469],{"id":468},"template-method-kod-örnekleri","Template Method Kod Örnekleri",[158,471,473],{"id":472},"örnek-php-kodu","Örnek PHP Kodu",[203,475,477],{"className":205,"code":476,"language":207,"meta":208,"style":208},"\u003C?php\n\nnamespace RefactoringGuru\\TemplateMethod\\Conceptual;\n\nabstract class AbstractClass\n{\n    \u002F\u002F Şablon metot algoritmanın iskeletini belirler.\n    final public function templateMethod(): void\n    {\n        $this->baseOperation1();\n        $this->requiredOperations1();\n        $this->baseOperation2();\n        $this->hook1();\n        $this->requiredOperation2();\n        $this->baseOperation3();\n        $this->hook2();\n    }\n\n    protected function baseOperation1(): void\n    {\n        echo \"AbstractClass: Temel işleri yapıyorum.\\n\";\n    }\n\n    protected function baseOperation2(): void\n    {\n        echo \"AbstractClass: Alt sınıfların ezebileceği alanları hazırlıyorum.\\n\";\n    }\n\n    protected function baseOperation3(): void\n    {\n        echo \"AbstractClass: Genel işlemleri tamamlıyorum.\\n\";\n    }\n\n    \u002F\u002F Alt sınıfların uygulaması zorunlu soyut metotlar\n    abstract protected function requiredOperations1(): void;\n    abstract protected function requiredOperation2(): void;\n\n    \u002F\u002F Kanca (Hook) metotları - Opsiyonel\n    protected function hook1(): void { }\n    protected function hook2(): void { }\n}\n\nclass ConcreteClass1 extends AbstractClass\n{\n    protected function requiredOperations1(): void\n    {\n        echo \"ConcreteClass1: Operation1 uygulandı.\\n\";\n    }\n\n    protected function requiredOperation2(): void\n    {\n        echo \"ConcreteClass1: Operation2 uygulandı.\\n\";\n    }\n}\n\nclass ConcreteClass2 extends AbstractClass\n{\n    protected function requiredOperations1(): void\n    {\n        echo \"ConcreteClass2: Operation1 uygulandı.\\n\";\n    }\n\n    protected function requiredOperation2(): void\n    {\n        echo \"ConcreteClass2: Operation2 uygulandı.\\n\";\n    }\n\n    protected function hook1(): void\n    {\n        echo \"ConcreteClass2: Hook1 ezildi ve kod enjekte edildi.\\n\";\n    }\n}\n\nfunction clientCode(AbstractClass $class)\n{\n    $class->templateMethod();\n}\n\necho \"ConcreteClass1 ile çalışma:\\n\";\nclientCode(new ConcreteClass1());\necho \"\\n\";\n\necho \"ConcreteClass2 ile çalışma:\\n\";\nclientCode(new ConcreteClass2());\n",[105,478,479,484,488,493,497,502,507,512,517,522,527,532,537,542,547,552,557,561,565,570,574,579,583,587,592,597,603,608,613,619,624,630,635,640,646,652,658,663,669,675,681,686,691,697,702,708,713,719,724,729,735,740,746,751,756,761,767,772,777,782,788,793,798,803,808,814,819,824,830,835,841,846,851,856,862,867,873,878,883,889,895,901,906,912],{"__ignoreMap":208},[212,480,481],{"class":214,"line":215},[212,482,483],{},"\u003C?php\n",[212,485,486],{"class":214,"line":221},[212,487,273],{"emptyLinePlaceholder":272},[212,489,490],{"class":214,"line":227},[212,491,492],{},"namespace RefactoringGuru\\TemplateMethod\\Conceptual;\n",[212,494,495],{"class":214,"line":233},[212,496,273],{"emptyLinePlaceholder":272},[212,498,499],{"class":214,"line":239},[212,500,501],{},"abstract class AbstractClass\n",[212,503,504],{"class":214,"line":245},[212,505,506],{},"{\n",[212,508,509],{"class":214,"line":251},[212,510,511],{},"    \u002F\u002F Şablon metot algoritmanın iskeletini belirler.\n",[212,513,514],{"class":214,"line":257},[212,515,516],{},"    final public function templateMethod(): void\n",[212,518,519],{"class":214,"line":263},[212,520,521],{},"    {\n",[212,523,524],{"class":214,"line":269},[212,525,526],{},"        $this->baseOperation1();\n",[212,528,529],{"class":214,"line":276},[212,530,531],{},"        $this->requiredOperations1();\n",[212,533,534],{"class":214,"line":282},[212,535,536],{},"        $this->baseOperation2();\n",[212,538,539],{"class":214,"line":288},[212,540,541],{},"        $this->hook1();\n",[212,543,544],{"class":214,"line":293},[212,545,546],{},"        $this->requiredOperation2();\n",[212,548,549],{"class":214,"line":298},[212,550,551],{},"        $this->baseOperation3();\n",[212,553,554],{"class":214,"line":304},[212,555,556],{},"        $this->hook2();\n",[212,558,559],{"class":214,"line":310},[212,560,266],{},[212,562,563],{"class":214,"line":315},[212,564,273],{"emptyLinePlaceholder":272},[212,566,567],{"class":214,"line":321},[212,568,569],{},"    protected function baseOperation1(): void\n",[212,571,572],{"class":214,"line":327},[212,573,521],{},[212,575,576],{"class":214,"line":332},[212,577,578],{},"        echo \"AbstractClass: Temel işleri yapıyorum.\\n\";\n",[212,580,581],{"class":214,"line":337},[212,582,266],{},[212,584,585],{"class":214,"line":343},[212,586,273],{"emptyLinePlaceholder":272},[212,588,589],{"class":214,"line":349},[212,590,591],{},"    protected function baseOperation2(): void\n",[212,593,595],{"class":214,"line":594},25,[212,596,521],{},[212,598,600],{"class":214,"line":599},26,[212,601,602],{},"        echo \"AbstractClass: Alt sınıfların ezebileceği alanları hazırlıyorum.\\n\";\n",[212,604,606],{"class":214,"line":605},27,[212,607,266],{},[212,609,611],{"class":214,"line":610},28,[212,612,273],{"emptyLinePlaceholder":272},[212,614,616],{"class":214,"line":615},29,[212,617,618],{},"    protected function baseOperation3(): void\n",[212,620,622],{"class":214,"line":621},30,[212,623,521],{},[212,625,627],{"class":214,"line":626},31,[212,628,629],{},"        echo \"AbstractClass: Genel işlemleri tamamlıyorum.\\n\";\n",[212,631,633],{"class":214,"line":632},32,[212,634,266],{},[212,636,638],{"class":214,"line":637},33,[212,639,273],{"emptyLinePlaceholder":272},[212,641,643],{"class":214,"line":642},34,[212,644,645],{},"    \u002F\u002F Alt sınıfların uygulaması zorunlu soyut metotlar\n",[212,647,649],{"class":214,"line":648},35,[212,650,651],{},"    abstract protected function requiredOperations1(): void;\n",[212,653,655],{"class":214,"line":654},36,[212,656,657],{},"    abstract protected function requiredOperation2(): void;\n",[212,659,661],{"class":214,"line":660},37,[212,662,273],{"emptyLinePlaceholder":272},[212,664,666],{"class":214,"line":665},38,[212,667,668],{},"    \u002F\u002F Kanca (Hook) metotları - Opsiyonel\n",[212,670,672],{"class":214,"line":671},39,[212,673,674],{},"    protected function hook1(): void { }\n",[212,676,678],{"class":214,"line":677},40,[212,679,680],{},"    protected function hook2(): void { }\n",[212,682,684],{"class":214,"line":683},41,[212,685,352],{},[212,687,689],{"class":214,"line":688},42,[212,690,273],{"emptyLinePlaceholder":272},[212,692,694],{"class":214,"line":693},43,[212,695,696],{},"class ConcreteClass1 extends AbstractClass\n",[212,698,700],{"class":214,"line":699},44,[212,701,506],{},[212,703,705],{"class":214,"line":704},45,[212,706,707],{},"    protected function requiredOperations1(): void\n",[212,709,711],{"class":214,"line":710},46,[212,712,521],{},[212,714,716],{"class":214,"line":715},47,[212,717,718],{},"        echo \"ConcreteClass1: Operation1 uygulandı.\\n\";\n",[212,720,722],{"class":214,"line":721},48,[212,723,266],{},[212,725,727],{"class":214,"line":726},49,[212,728,273],{"emptyLinePlaceholder":272},[212,730,732],{"class":214,"line":731},50,[212,733,734],{},"    protected function requiredOperation2(): void\n",[212,736,738],{"class":214,"line":737},51,[212,739,521],{},[212,741,743],{"class":214,"line":742},52,[212,744,745],{},"        echo \"ConcreteClass1: Operation2 uygulandı.\\n\";\n",[212,747,749],{"class":214,"line":748},53,[212,750,266],{},[212,752,754],{"class":214,"line":753},54,[212,755,352],{},[212,757,759],{"class":214,"line":758},55,[212,760,273],{"emptyLinePlaceholder":272},[212,762,764],{"class":214,"line":763},56,[212,765,766],{},"class ConcreteClass2 extends AbstractClass\n",[212,768,770],{"class":214,"line":769},57,[212,771,506],{},[212,773,775],{"class":214,"line":774},58,[212,776,707],{},[212,778,780],{"class":214,"line":779},59,[212,781,521],{},[212,783,785],{"class":214,"line":784},60,[212,786,787],{},"        echo \"ConcreteClass2: Operation1 uygulandı.\\n\";\n",[212,789,791],{"class":214,"line":790},61,[212,792,266],{},[212,794,796],{"class":214,"line":795},62,[212,797,273],{"emptyLinePlaceholder":272},[212,799,801],{"class":214,"line":800},63,[212,802,734],{},[212,804,806],{"class":214,"line":805},64,[212,807,521],{},[212,809,811],{"class":214,"line":810},65,[212,812,813],{},"        echo \"ConcreteClass2: Operation2 uygulandı.\\n\";\n",[212,815,817],{"class":214,"line":816},66,[212,818,266],{},[212,820,822],{"class":214,"line":821},67,[212,823,273],{"emptyLinePlaceholder":272},[212,825,827],{"class":214,"line":826},68,[212,828,829],{},"    protected function hook1(): void\n",[212,831,833],{"class":214,"line":832},69,[212,834,521],{},[212,836,838],{"class":214,"line":837},70,[212,839,840],{},"        echo \"ConcreteClass2: Hook1 ezildi ve kod enjekte edildi.\\n\";\n",[212,842,844],{"class":214,"line":843},71,[212,845,266],{},[212,847,849],{"class":214,"line":848},72,[212,850,352],{},[212,852,854],{"class":214,"line":853},73,[212,855,273],{"emptyLinePlaceholder":272},[212,857,859],{"class":214,"line":858},74,[212,860,861],{},"function clientCode(AbstractClass $class)\n",[212,863,865],{"class":214,"line":864},75,[212,866,506],{},[212,868,870],{"class":214,"line":869},76,[212,871,872],{},"    $class->templateMethod();\n",[212,874,876],{"class":214,"line":875},77,[212,877,352],{},[212,879,881],{"class":214,"line":880},78,[212,882,273],{"emptyLinePlaceholder":272},[212,884,886],{"class":214,"line":885},79,[212,887,888],{},"echo \"ConcreteClass1 ile çalışma:\\n\";\n",[212,890,892],{"class":214,"line":891},80,[212,893,894],{},"clientCode(new ConcreteClass1());\n",[212,896,898],{"class":214,"line":897},81,[212,899,900],{},"echo \"\\n\";\n",[212,902,904],{"class":214,"line":903},82,[212,905,273],{"emptyLinePlaceholder":272},[212,907,909],{"class":214,"line":908},83,[212,910,911],{},"echo \"ConcreteClass2 ile çalışma:\\n\";\n",[212,913,915],{"class":214,"line":914},84,[212,916,917],{},"clientCode(new ConcreteClass2());\n",[158,919,921],{"id":920},"örnek-python-kodu","Örnek Python Kodu",[203,923,927],{"className":924,"code":925,"language":926,"meta":208,"style":208},"language-python shiki shiki-themes github-light github-dark","from abc import ABC, abstractmethod\n\nclass AbstractClass(ABC):\n    def template_method(self) -> None:\n        self.base_operation1()\n        self.required_operations1()\n        self.base_operation2()\n        self.hook1()\n        self.required_operations2()\n        self.base_operation3()\n        self.hook2()\n\n    def base_operation1(self) -> None:\n        print(\"AbstractClass: Temel işler yapılıyor.\")\n\n    def base_operation2(self) -> None:\n        print(\"AbstractClass: Alt sınıfların özelleştirebileceği alanlar.\")\n\n    def base_operation3(self) -> None:\n        print(\"AbstractClass: Algoritma sonlandırılıyor.\")\n\n    @abstractmethod\n    def required_operations1(self) -> None:\n        pass\n\n    @abstractmethod\n    def required_operations2(self) -> None:\n        pass\n\n    def hook1(self) -> None:\n        pass\n\n    def hook2(self) -> None:\n        pass\n\n\nclass ConcreteClass1(AbstractClass):\n    def required_operations1(self) -> None:\n        print(\"ConcreteClass1: Operation1 uygulandı.\")\n\n    def required_operations2(self) -> None:\n        print(\"ConcreteClass1: Operation2 uygulandı.\")\n\n\nclass ConcreteClass2(AbstractClass):\n    def required_operations1(self) -> None:\n        print(\"ConcreteClass2: Operation1 uygulandı.\")\n\n    def required_operations2(self) -> None:\n        print(\"ConcreteClass2: Operation2 uygulandı.\")\n\n    def hook1(self) -> None:\n        print(\"ConcreteClass2: Hook1 ezildi.\")\n\n\ndef client_code(abstract_class: AbstractClass) -> None:\n    abstract_class.template_method()\n\n\nif __name__ == \"__main__\":\n    print(\"ConcreteClass1:\")\n    client_code(ConcreteClass1())\n    print(\"\\nConcreteClass2:\")\n    client_code(ConcreteClass2())\n","python",[105,928,929,934,938,943,948,953,958,963,968,973,978,983,987,992,997,1001,1006,1011,1015,1020,1025,1029,1034,1039,1044,1048,1052,1057,1061,1065,1070,1074,1078,1083,1087,1091,1095,1100,1104,1109,1113,1117,1122,1126,1130,1135,1139,1144,1148,1152,1157,1161,1165,1170,1174,1178,1183,1188,1192,1196,1201,1206,1211,1216],{"__ignoreMap":208},[212,930,931],{"class":214,"line":215},[212,932,933],{},"from abc import ABC, abstractmethod\n",[212,935,936],{"class":214,"line":221},[212,937,273],{"emptyLinePlaceholder":272},[212,939,940],{"class":214,"line":227},[212,941,942],{},"class AbstractClass(ABC):\n",[212,944,945],{"class":214,"line":233},[212,946,947],{},"    def template_method(self) -> None:\n",[212,949,950],{"class":214,"line":239},[212,951,952],{},"        self.base_operation1()\n",[212,954,955],{"class":214,"line":245},[212,956,957],{},"        self.required_operations1()\n",[212,959,960],{"class":214,"line":251},[212,961,962],{},"        self.base_operation2()\n",[212,964,965],{"class":214,"line":257},[212,966,967],{},"        self.hook1()\n",[212,969,970],{"class":214,"line":263},[212,971,972],{},"        self.required_operations2()\n",[212,974,975],{"class":214,"line":269},[212,976,977],{},"        self.base_operation3()\n",[212,979,980],{"class":214,"line":276},[212,981,982],{},"        self.hook2()\n",[212,984,985],{"class":214,"line":282},[212,986,273],{"emptyLinePlaceholder":272},[212,988,989],{"class":214,"line":288},[212,990,991],{},"    def base_operation1(self) -> None:\n",[212,993,994],{"class":214,"line":293},[212,995,996],{},"        print(\"AbstractClass: Temel işler yapılıyor.\")\n",[212,998,999],{"class":214,"line":298},[212,1000,273],{"emptyLinePlaceholder":272},[212,1002,1003],{"class":214,"line":304},[212,1004,1005],{},"    def base_operation2(self) -> None:\n",[212,1007,1008],{"class":214,"line":310},[212,1009,1010],{},"        print(\"AbstractClass: Alt sınıfların özelleştirebileceği alanlar.\")\n",[212,1012,1013],{"class":214,"line":315},[212,1014,273],{"emptyLinePlaceholder":272},[212,1016,1017],{"class":214,"line":321},[212,1018,1019],{},"    def base_operation3(self) -> None:\n",[212,1021,1022],{"class":214,"line":327},[212,1023,1024],{},"        print(\"AbstractClass: Algoritma sonlandırılıyor.\")\n",[212,1026,1027],{"class":214,"line":332},[212,1028,273],{"emptyLinePlaceholder":272},[212,1030,1031],{"class":214,"line":337},[212,1032,1033],{},"    @abstractmethod\n",[212,1035,1036],{"class":214,"line":343},[212,1037,1038],{},"    def required_operations1(self) -> None:\n",[212,1040,1041],{"class":214,"line":349},[212,1042,1043],{},"        pass\n",[212,1045,1046],{"class":214,"line":594},[212,1047,273],{"emptyLinePlaceholder":272},[212,1049,1050],{"class":214,"line":599},[212,1051,1033],{},[212,1053,1054],{"class":214,"line":605},[212,1055,1056],{},"    def required_operations2(self) -> None:\n",[212,1058,1059],{"class":214,"line":610},[212,1060,1043],{},[212,1062,1063],{"class":214,"line":615},[212,1064,273],{"emptyLinePlaceholder":272},[212,1066,1067],{"class":214,"line":621},[212,1068,1069],{},"    def hook1(self) -> None:\n",[212,1071,1072],{"class":214,"line":626},[212,1073,1043],{},[212,1075,1076],{"class":214,"line":632},[212,1077,273],{"emptyLinePlaceholder":272},[212,1079,1080],{"class":214,"line":637},[212,1081,1082],{},"    def hook2(self) -> None:\n",[212,1084,1085],{"class":214,"line":642},[212,1086,1043],{},[212,1088,1089],{"class":214,"line":648},[212,1090,273],{"emptyLinePlaceholder":272},[212,1092,1093],{"class":214,"line":654},[212,1094,273],{"emptyLinePlaceholder":272},[212,1096,1097],{"class":214,"line":660},[212,1098,1099],{},"class ConcreteClass1(AbstractClass):\n",[212,1101,1102],{"class":214,"line":665},[212,1103,1038],{},[212,1105,1106],{"class":214,"line":671},[212,1107,1108],{},"        print(\"ConcreteClass1: Operation1 uygulandı.\")\n",[212,1110,1111],{"class":214,"line":677},[212,1112,273],{"emptyLinePlaceholder":272},[212,1114,1115],{"class":214,"line":683},[212,1116,1056],{},[212,1118,1119],{"class":214,"line":688},[212,1120,1121],{},"        print(\"ConcreteClass1: Operation2 uygulandı.\")\n",[212,1123,1124],{"class":214,"line":693},[212,1125,273],{"emptyLinePlaceholder":272},[212,1127,1128],{"class":214,"line":699},[212,1129,273],{"emptyLinePlaceholder":272},[212,1131,1132],{"class":214,"line":704},[212,1133,1134],{},"class ConcreteClass2(AbstractClass):\n",[212,1136,1137],{"class":214,"line":710},[212,1138,1038],{},[212,1140,1141],{"class":214,"line":715},[212,1142,1143],{},"        print(\"ConcreteClass2: Operation1 uygulandı.\")\n",[212,1145,1146],{"class":214,"line":721},[212,1147,273],{"emptyLinePlaceholder":272},[212,1149,1150],{"class":214,"line":726},[212,1151,1056],{},[212,1153,1154],{"class":214,"line":731},[212,1155,1156],{},"        print(\"ConcreteClass2: Operation2 uygulandı.\")\n",[212,1158,1159],{"class":214,"line":737},[212,1160,273],{"emptyLinePlaceholder":272},[212,1162,1163],{"class":214,"line":742},[212,1164,1069],{},[212,1166,1167],{"class":214,"line":748},[212,1168,1169],{},"        print(\"ConcreteClass2: Hook1 ezildi.\")\n",[212,1171,1172],{"class":214,"line":753},[212,1173,273],{"emptyLinePlaceholder":272},[212,1175,1176],{"class":214,"line":758},[212,1177,273],{"emptyLinePlaceholder":272},[212,1179,1180],{"class":214,"line":763},[212,1181,1182],{},"def client_code(abstract_class: AbstractClass) -> None:\n",[212,1184,1185],{"class":214,"line":769},[212,1186,1187],{},"    abstract_class.template_method()\n",[212,1189,1190],{"class":214,"line":774},[212,1191,273],{"emptyLinePlaceholder":272},[212,1193,1194],{"class":214,"line":779},[212,1195,273],{"emptyLinePlaceholder":272},[212,1197,1198],{"class":214,"line":784},[212,1199,1200],{},"if __name__ == \"__main__\":\n",[212,1202,1203],{"class":214,"line":790},[212,1204,1205],{},"    print(\"ConcreteClass1:\")\n",[212,1207,1208],{"class":214,"line":795},[212,1209,1210],{},"    client_code(ConcreteClass1())\n",[212,1212,1213],{"class":214,"line":800},[212,1214,1215],{},"    print(\"\\nConcreteClass2:\")\n",[212,1217,1218],{"class":214,"line":805},[212,1219,1220],{},"    client_code(ConcreteClass2())\n",[69,1222],{},[72,1224,1226],{"id":1225},"sıkça-sorulan-sorular-faq","Sıkça Sorulan Sorular (FAQ)",[158,1228,1230],{"id":1229},"şablon-metot-neden-final-veya-ezilemez-olarak-tanımlanmalıdır","Şablon Metot neden final (veya ezilemez) olarak tanımlanmalıdır?",[11,1232,1233],{},"Algoritmanın adımlarının sırası ve iskeleti üst sınıf tarafından garanti altına alınmalıdır. Eğer alt sınıflar şablon metodun kendisini ezebilirse, adımların çalışma sırasını bozabilirler ve bu da desenin amacını ortadan kaldırır.",[158,1235,1237],{"id":1236},"hook-kanca-ile-abstract-soyut-metot-arasındaki-fark-nedir","Hook (Kanca) ile Abstract (Soyut) metot arasındaki fark nedir?",[47,1239,1240,1250],{},[50,1241,1242,1245,1246,1249],{},[43,1243,1244],{},"Soyut metotlar:"," Alt sınıfta uygulanması ",[43,1247,1248],{},"zorunludur",".",[50,1251,1252,1255,1256,1259],{},[43,1253,1254],{},"Kanca metotlar:"," Üst sınıfta boş veya temel bir gövdeye sahiptir, alt sınıflarda ezilmesi ",[43,1257,1258],{},"opsiyoneldir",". Algoritma akışına zarar vermeden araya girmek için kullanılır.",[158,1261,1263],{"id":1262},"hollywood-i̇lkesi-hollywood-principle-nedir","Hollywood İlkesi (Hollywood Principle) nedir?",[11,1265,1266],{},"\"Bizi arama, biz seni ararız\" şeklinde özetlenen bu ilke, yüksek seviyeli modüllerin (üst sınıf) düşük seviyeli modüllere (alt sınıflar) bağımlı olmak yerine, onları doğrudan kontrol etmesidir. Alt sınıflar kendi metotlarının ne zaman ve nasıl çağrılacağını bilmezler; kararı üst sınıf verir.",[69,1268],{},[72,1270,1272],{"id":1271},"diğer-tasarım-kalıplarıdesign-patterns","Diğer Tasarım Kalıpları\u002FDesign Patterns",[11,1274,1275],{},[43,1276,1277],{},"Oluşumsal Kalıplar (Creational Patterns)",[11,1279,1280,1283,1284,1283,1288,1283,1292,1283,1296],{},[15,1281,454],{"href":1282},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-factory-method-nedir",",\n",[15,1285,1287],{"href":1286},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-abstract-factory-nedir","Abstract Factory",[15,1289,1291],{"href":1290},"\u002Ftr\u002Fbuilder-tasarim-deseni-nedir","Builder",[15,1293,1295],{"href":1294},"\u002Ftr\u002Fprototype-tasarim-deseni-nedir","Prototype",[15,1297,1299],{"href":1298},"\u002Ftr\u002Fsingleton-tasarim-deseni-nedir","Singleton",[11,1301,1302],{},[43,1303,1304],{},"Yapısal Kalıplar (Structural Patterns)",[11,1306,1307,1283,1311,1283,1315,1283,1319,1283,1323,1283,1327,1283,1331],{},[15,1308,1310],{"href":1309},"\u002Ftr\u002Fadapter-tasarim-deseni-nedir","Adapter",[15,1312,1314],{"href":1313},"\u002Ftr\u002Fbridge-tasarim-deseni-nedir","Bridge",[15,1316,1318],{"href":1317},"\u002Ftr\u002Fcomposite-tasarim-deseni-nedir","Composite",[15,1320,1322],{"href":1321},"\u002Ftr\u002Fdecorator-tasarim-deseni-nedir","Decorator",[15,1324,1326],{"href":1325},"\u002Ftr\u002Ffacade-tasarim-deseni-nedir","Facade",[15,1328,1330],{"href":1329},"\u002Ftr\u002Fflyweight-tasarim-deseni-nedir","Flyweight",[15,1332,1334],{"href":1333},"\u002Ftr\u002Fproxy-tasarim-deseni-nedir","Proxy",[11,1336,1337],{},[43,1338,1339],{},"Davranışsal Kalıplar (Behavioral Patterns)",[11,1341,1342,1283,1346,1283,1350,1283,1354,1283,1358,1283,1362,1283,1366,1283,1370,1283,1373,1283,1376],{},[15,1343,1345],{"href":1344},"\u002Ftr\u002Fchain-of-responsibility-deseni-nedir","Chain of Responsibility",[15,1347,1349],{"href":1348},"\u002Ftr\u002Fcommand-tasarim-deseni-nedir","Command",[15,1351,1353],{"href":1352},"\u002Ftr\u002Fiterator-tasarim-deseni-nedir","Iterator",[15,1355,1357],{"href":1356},"\u002Ftr\u002Fmediator-tasarim-deseni-nedir","Mediator",[15,1359,1361],{"href":1360},"\u002Ftr\u002Fmemento-tasarim-deseni-nedir","Memento",[15,1363,1365],{"href":1364},"\u002Ftr\u002Fobserver-tasarim-deseni-nedir","Observer",[15,1367,1369],{"href":1368},"\u002Ftr\u002Fstate-tasarim-deseni-nedir","State",[15,1371,378],{"href":1372},"\u002Ftr\u002Fstrategy-tasarim-deseni-nedir",[15,1374,375],{"href":1375},"\u002Ftr\u002Ftemplate-method-tasarim-deseni-nedir",[15,1377,1379],{"href":1378},"\u002Ftr\u002Fvisitor-tasarim-deseni-nedir","Visitor",[1381,1382,1383],"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":208,"searchDepth":221,"depth":221,"links":1385},[1386,1387,1388,1391,1392,1393,1394,1395,1399,1404],{"id":74,"depth":221,"text":75},{"id":83,"depth":221,"text":84},{"id":117,"depth":221,"text":118,"children":1389},[1390],{"id":160,"depth":227,"text":161},{"id":197,"depth":221,"text":198},{"id":357,"depth":221,"text":358},{"id":426,"depth":221,"text":427},{"id":446,"depth":221,"text":447},{"id":468,"depth":221,"text":469,"children":1396},[1397,1398],{"id":472,"depth":227,"text":473},{"id":920,"depth":227,"text":921},{"id":1225,"depth":221,"text":1226,"children":1400},[1401,1402,1403],{"id":1229,"depth":227,"text":1230},{"id":1236,"depth":227,"text":1237},{"id":1262,"depth":227,"text":1263},{"id":1271,"depth":221,"text":1272},[1406],"technical",null,"2021-10-08","Template Method (Şablon Yöntemi) tasarım kalıbını, kullanım alanlarını, sınıf yapılarını ve PHP\u002FPython örneklerini bu rehberde öğrenin.",false,"md","\u002Fimages\u002Fposts\u002F2021\u002F10\u002Ftemplate-method-tasarim-deseni.avif",{},{"title":6,"description":1409},"template-method-tasarim-deseni-nedir","tr\u002Ftemplate-method-tasarim-deseni-nedir",[1418,1419],"design-pattern","ipucu","QBgMEGDhef7pAHtc1RwrRS-mwDRIksfiTMJ2yun67ms",{"prev":1422,"next":1424,"others":1426,"lucky":1533,"readingTime":245},{"path":1378,"title":1423},"Visitor Tasarım Deseni Nedir?",{"path":1372,"title":1425},"Strategy Tasarım Deseni Nedir?",[1427,1429,1432,1435,1438,1441,1444,1447,1450,1453,1455,1458,1461,1464,1467,1470,1472,1475,1478,1480,1483,1486,1487,1490,1492,1495,1497,1498,1500,1502,1505,1508,1510,1513,1516,1519,1522,1525,1527,1530],{"path":1309,"title":1428},"Adapter Tasarım Deseni Nedir?",{"path":1430,"title":1431},"\u002Ftr\u002Fgo-ve-degiskenler","Go ve Değişkenler",{"path":1433,"title":1434},"\u002Ftr\u002Fself-hosted-api-gateway-nasil-kurulur-kapsamli-rehber","Self-Hosted API Gateway Nasıl Kurulur? Kapsamlı Rehber",{"path":1436,"title":1437},"\u002Ftr\u002Fcodeserver-nedir-codeserver-nasil-kurulur","Code-Server Nedir? Bulutta VS Code Geliştirme Ortamı Kurulumu",{"path":1439,"title":1440},"\u002Ftr\u002Ftailwind-css-nerede-kullanilir-tailwind-css-nerede-kullanilmaz","Tailwind CSS Nerede Kullanılır? Tailwind CSS Nerede Kullanılmaz?",{"path":1442,"title":1443},"\u002Ftr\u002Fdocker-ile-mongodb-kurulumu","Docker ile MongoDB Kurulumu",{"path":1445,"title":1446},"\u002Ftr\u002Frest-api-hata-yonetimi","REST Api Hata Yönetimi",{"path":1448,"title":1449},"\u002Ftr\u002Fes17-nedir-ecmascript-2026-nedir","ES17 nedir? ECMAScript 2026 nedir?",{"path":1451,"title":1452},"\u002Ftr\u002Fopenlitespeed-ve-litespeed-enterprisei-reverse-proxy-olarak-kullanmak","OpenLiteSpeed ve LiteSpeed Enterprise Sunucularını Reverse Proxy Olarak Kullanmak",{"path":1333,"title":1454},"Proxy Tasarım Deseni Nedir?",{"path":1456,"title":1457},"\u002Ftr\u002Fmutable-ve-immutable-kavrami","Mutable ve Immutable Kavramları Nedir?",{"path":1459,"title":1460},"\u002Ftr\u002Ffull-stack-proje-gelistiriyoruz","Full Stack Proje Geliştiriyoruz",{"path":1462,"title":1463},"\u002Ftr\u002Fecmascript-nedir-ecmascript-ne-degildir-bilinmesi-gerekenler","ECMAScript Nedir? Bilinmesi Gerekenler...",{"path":1465,"title":1466},"\u002Ftr\u002Fphp-ve-makine-ogrenimi-php-ml-kutuphanesi","PHP ve Makine Öğrenimi: PHP-ML Kütüphanesi ile Pratik Çözümler",{"path":1468,"title":1469},"\u002Ftr\u002Fgo-programlama-dilinin-ozellikleri","Go Programlama Dilinin Özellikleri",{"path":17,"title":1471},"Design Patterns \u002F Tasarım Desenleri nedir?",{"path":1473,"title":1474},"\u002Ftr\u002Fes6-nedir-ecmascript-2015-nedir","ES6 Nedir? ECMAScript 2015 Nedir?",{"path":1476,"title":1477},"\u002Ftr\u002Fnext-js-on-bellegi-nasil-yenilenir-on-demand-cache-regeneration","Next.js Önbelleği Nasıl Yenilenir? \"On-Demand Cache Regeneration\"",{"path":1348,"title":1479},"Command Tasarım Deseni Nedir?",{"path":1481,"title":1482},"\u002Ftr\u002Frestapi-ve-hateoas-kavrami","RestApi ve HATEOAS Kavramı",{"path":1484,"title":1485},"\u002Ftr\u002Fgo-veri-tipleri-string-integer-float-complex-boolean-ve-array","Go Veri Tipleri - String, Integer, Float, Complex, Boolean ve Array",{"path":1372,"title":1425},{"path":1488,"title":1489},"\u002Ftr\u002Frest-api-uri-yapisi-nasil-olmali","REST API URI Yapısı Nasıl Olmalı?",{"path":1368,"title":1491},"State Tasarım Deseni Nedir?",{"path":1493,"title":1494},"\u002Ftr\u002Fwebpack-nedir","Webpack Nedir? Modern JavaScript Paketleyici Ekosistemi",{"path":1298,"title":1496},"Singleton Tasarım Deseni Nedir?",{"path":1378,"title":1423},{"path":1286,"title":1499},"Abstract Factory Tasarım Deseni Nedir?",{"path":1282,"title":1501},"Factory Method Tasarım Deseni Nedir?",{"path":1503,"title":1504},"\u002Ftr\u002Ffull-stack-proje-agaci","Full-Stack Proje Yol Haritası ve İçindekiler",{"path":1506,"title":1507},"\u002Ftr\u002Fapi-gateway-nedir","API Gateway Nedir? Ne İşe Yarar?",{"path":1360,"title":1509},"Memento Tasarım Deseni Nedir?",{"path":1511,"title":1512},"\u002Ftr\u002Ffactory-method-ve-abstract-factory-farki-nedir","Factory Method ve Abstract Factory Farkı Nedir?",{"path":1514,"title":1515},"\u002Ftr\u002Fphalcon-frameworkun-gelecegi","Phalcon Framework'ün Geleceği: Bir Devrin Sonu",{"path":1517,"title":1518},"\u002Ftr\u002Ftemiz-moduler-ve-yeniden-kullanilabilir-php-kodu-yazma-rehberi","PHP'de Temiz, Modüler ve Yeniden Kullanılabilir Kod Yazma Rehberi",{"path":1520,"title":1521},"\u002Ftr\u002Fdocker-swarm-nedir","Docker Swarm Nedir?",{"path":1523,"title":1524},"\u002Ftr\u002Fearly-return-erken-donus-nedir","Early Return \u002F Erken Dönüş nedir?",{"path":1325,"title":1526},"Facade Tasarım Deseni Nedir?",{"path":1528,"title":1529},"\u002Ftr\u002Fes15-nedir-ecmascript-2024-nedir","ES15 nedir? ECMAScript 2024 nedir?",{"path":1531,"title":1532},"\u002Ftr\u002Faws-ec2-uzerinde-docker-ve-full-stack-web-performansi","AWS EC2 Üzerinde Docker ve Full Stack Web Performansı",{"path":1534,"title":1535},"\u002Ftr\u002Fvite-nedir","Vite Nedir? Modern Web Geliştirme ve Paketleme Aracı",[1537,1539,1541,1543],{"path":1378,"title":1423,"date":1538},"2021-10-09",{"path":1372,"title":1425,"date":1540},"2021-10-07",{"path":1368,"title":1491,"date":1542},"2021-10-06",{"path":1364,"title":1544,"date":1545},"Observer Tasarım Deseni Nedir?","2021-10-05",[1547,1549,1551],{"path":1298,"title":1496,"date":1548},"2021-08-17",{"path":1517,"title":1518,"date":1550},"2023-01-17",{"path":1321,"title":1552,"date":1553},"Decorator Tasarım Deseni Nedir?","2021-09-12",1782142003185]