[{"data":1,"prerenderedAt":1617},["ShallowReactive",2],{"post-\u002Ftr\u002Fobserver-tasarim-deseni-nedir":3},{"page":4,"translation":1461,"nav":1476,"related":1595,"random":1606},{"id":5,"title":6,"body":7,"categories":1459,"category":1461,"date":1462,"description":1463,"draft":1464,"extension":1465,"image":1466,"kind":1461,"lang":80,"meta":1467,"navigation":329,"path":1425,"readingTime":356,"seo":1468,"slug":1469,"stem":1470,"tags":1471,"translationKey":1469,"type":1460,"updated":1474,"__hash__":1475},"postsTr\u002Ftr\u002Fobserver-tasarim-deseni-nedir.md","Observer Tasarım Deseni Nedir?",{"type":8,"value":9,"toc":1446},"minimark",[10,43,52,65,68,73,127,129,134,140,142,146,157,164,167,170,172,176,179,182,191,197,200,203,206,212,214,218,223,226,231,234,236,240,297,299,303,307,906,910,1330,1332,1336,1341,1364,1369,1399,1404,1442],[11,12,13,21],"blockquote",{},[14,15,16,17],"p",{},"💡 ",[18,19,20],"strong",{},"Özet (TL;DR):",[22,23,24,31,37],"ul",{},[25,26,27,30],"li",{},[18,28,29],{},"Observer Nedir?:"," Bir nesnede (yayıncı\u002Fsubject) meydana gelen olayları, onu takip eden diğer nesnelere (aboneler\u002Fobservers) otomatik olarak bildiren davranışsal bir tasarım desenidir.",[25,32,33,36],{},[18,34,35],{},"Kullanım Amacı:"," Nesneler arasında gevşek bağlılık (loose coupling) kurarak, olay bazlı ve dinamik bir abonelik sistemi oluşturmak.",[25,38,39,42],{},[18,40,41],{},"Gerçek Dünya Benzetmesi:"," Abone olduğunuz bir e-bülten veya dergi; yeni sayı çıktığında kapınıza gelir, ilgilenmeyenlere ise spam yapılmaz.",[14,44,45,46,51],{},"Bu yazı ",[47,48,50],"a",{"href":49},"\u002Ftr\u002Fdesign-patterns-tasarim-desenleri-nedir","Design Patterns \u002F Tasarım Desenleri Nedir?"," başlıklı yazı dizisinin bir parçasıdır.",[14,53,54,55,64],{},"Bu içerik ağırlıklı olarak ",[47,56,63],{"href":57,"rel":58,"target":62},"https:\u002F\u002Frefactoring.guru\u002Fdesign-patterns",[59,60,61],"nofollow","noopener","noreferrer","_blank","refactoring.guru"," sitesindeki içeriğin tercümesi ve derlenmesinden oluşturulmuştur. Tüm tasarım desenlerine yönelik ayrıntılı içeriklere yazının sonundaki bağlantılardan ulaşabilirsiniz.",[66,67],"hr",{},[69,70,72],"h3",{"id":71},"observer-deseninin-avantajları-ve-dezavantajları","Observer Deseninin Avantajları ve Dezavantajları",[74,75,76,90],"table",{},[77,78,79],"thead",{},[80,81,82,87],"tr",{},[83,84,86],"th",{"align":85},"left","Avantajları",[83,88,89],{"align":85},"Dezavantajları",[91,92,93,105,116],"tbody",{},[80,94,95,102],{},[96,97,98,101],"td",{"align":85},[18,99,100],{},"Açık\u002FKapalı Prensibi (OCP):"," Yayıncı kodunu değiştirmeden yeni abone sınıfları ekleyebilirsiniz.",[96,103,104],{"align":85},"Abonelerin bilgilendirilme sırası üzerinde kontrolünüz yoktur (rastgele tetiklenirler).",[80,106,107,113],{},[96,108,109,112],{"align":85},[18,110,111],{},"Dinamik Abonelik:"," Çalışma zamanında (runtime) aboneler eklenebilir veya çıkarılabilir.",[96,114,115],{"align":85},"Aşırı kullanımda karmaşık bağımlılık zincirleri ve bellek sızıntıları (leak) oluşturabilir.",[80,117,118,124],{},[96,119,120,123],{"align":85},[18,121,122],{},"Gevşek Bağlılık (Loose Coupling):"," Yayıncı, abonelerin sınıflarını değil sadece ortak arayüzünü bilir.",[96,125,126],{"align":85},"Aboneler güncellemeleri pasif olarak dinler; gereksiz güncellemeler performans kaybına yol açabilir.",[66,128],{},[130,131,133],"h2",{"id":132},"observer-tasarım-deseninin-amacı","Observer Tasarım Deseninin Amacı",[14,135,136,139],{},[18,137,138],{},"Observer"," tasarım deseni, birden fazla nesneyi, takip ettikleri başka bir nesnede gerçekleşen olaylarla ilgili bilgilendirmeyi sağlayan bir abonelik mekanizması oluşturmayı amaçlar.",[66,141],{},[130,143,145],{"id":144},"sorun","Sorun",[14,147,148,152,153,156],{},[149,150,151],"code",{},"Müşteri"," (Customer) ve ",[149,154,155],{},"Mağaza"," (Store) adında iki nesne tipiniz olduğunu düşünün. Müşteri, belirli bir markanın yakın zamanda piyasaya sürülecek ürünüyle son derece ilgili olsun. Müşteri mağazayı her gün ziyaret ediyor ve ürünün durumunu kontrol ediyor. Ancak ürün henüz gelmemişse yapılan tüm bu ziyaretler boşuna zaman ve kaynak kaybına yol açar.",[14,158,159],{},[160,161],"img",{"alt":162,"src":163},"Neden observer deseni","\u002Fimages\u002Fobserver-tasarim-deseni-nedir\u002Fneden-observer-tasarim-deseni.avif",[14,165,166],{},"Diğer bir seçenek olarak mağaza, her yeni ürün geldiğinde bütün müşterilerine (spam olarak kabul edilebilecek) on binlerce e-posta gönderebilir. Bu müşterilerin her gün mağazaya gelmesini engellese de bu ürünlerle ilgilenmeyen müşteriler için son derece sinir bozucu olacaktır.",[14,168,169],{},"Bu durumda ya müşteri her gün mağazaya gelip zaman ve kaynak harcayacaktır ya da mağaza tüm müşterilere gereksiz e-postalar gönderip zaman ve kaynak tüketecektir.",[66,171],{},[130,173,175],{"id":174},"çözüm","Çözüm",[14,177,178],{},"Bir nesnenin durumuyla ilgileniyorsak bu nesne bizim için ana bir öznedir (subject). Bu özneyi, durum değişikliğini başka nesnelere de haber vereceği için yayıncı (publisher) olarak adlandırmak daha doğru olur. Bu nesnenin durumunu takip etmek isteyen diğer nesneler de bu nesnenin aboneleridir (subscribers).",[14,180,181],{},"Observer deseni, yayıncının sınıfı içerisine bir abonelik mekanizması eklenmesini tavsiye eder. Böylece diğer nesneler bu nesnede gerçekleşen olaylara abone olabilir ya da abonelikten çıkabilir. Bu süreç temelde oldukça basittir. Süreç şöyle ilerler:",[183,184,185,188],"ol",{},[25,186,187],{},"Abone nesnelerin referanslarını saklayan bir dizi (array) alanı oluşturulur.",[25,189,190],{},"Bu listeye abone eklemeyi veya çıkartmayı sağlayan birkaç dışa açık (public) metot tanımlanır.",[14,192,193],{},[160,194],{"alt":195,"src":196},"Observer deseni örnek","\u002Fimages\u002Fobserver-tasarim-deseni-nedir\u002Fobserver-tasarim-deseni-ornek.avif",[14,198,199],{},"Bu mekanizma ile birlikte yayıncı nesnede önemli bir olay gerçekleştiğinde, yayıncı tüm abonelerin üzerinden geçerek bu nesnelere özel bildirim metotlarını çağırır.",[14,201,202],{},"Gerçek dünyada uygulamaların tek bir yayıncı sınıfında gerçekleşen olaylarla ilgilenen onlarca abone sınıfı olabilir. Bütün bunları yayıncının içinde doğrudan belirtip sıkı bir bağımlılık (tight coupling) oluşturmak istemezsiniz; hatta çoğu zaman bu aboneleri önceden bilemeyebilirsiniz.",[14,204,205],{},"Bu nedenle tüm abonelerin, yayıncının kendileriyle iletişime geçebileceği ortak bir arayüzü paylaşmaları önemlidir. Bu arayüz, yayıncının bağlamla ilgili bilgileri aktarabileceği parametreleri de olan bir bildirim metodu tanımlamalıdır.",[14,207,208],{},[160,209],{"alt":210,"src":211},"Observer deseni örnekli açıklama","\u002Fimages\u002Fobserver-tasarim-deseni-nedir\u002Fobserver-deseni-ornekli-aciklama.avif",[66,213],{},[130,215,217],{"id":216},"uygulanabilirlik","Uygulanabilirlik",[14,219,220],{},[18,221,222],{},"Bir nesnedeki değişikliğin başka nesneleri de değiştirmesi gereken ve bu nesnelerin önceden bilinmesi mümkün olmayan durumlarda Observer desenini kullanabilirsiniz.",[14,224,225],{},"Bu sorunla genellikle kullanıcı arayüzleri (UI) ile çalışırken karşılaşırsınız. Örneğin bir buton sınıfı oluşturursunuz ve bu butona tıklandığında istemcinin belirleyeceği özel kodları tetikleyebilmesini istersiniz. Düğmelerinize bir abonelik mekanizması ekleyerek istemcinin düğmeye istediği özel kod parçalarını abone edebilmesini sağlarsınız.",[14,227,228],{},[18,229,230],{},"Uygulamanızdaki bazı nesnelerin başka bir nesneyi, belirli durumlar veya belirli bir süre için izlemesi gereken durumlarda bu deseni kullanabilirsiniz.",[14,232,233],{},"Abonelik listesi dinamiktir; böylece aboneler istedikleri zaman sisteme dahil olabilir veya abonelikten çıkabilirler.",[66,235],{},[130,237,239],{"id":238},"diğer-tasarım-desenleri-ile-i̇lişkisi","Diğer Tasarım Desenleri ile İlişkisi",[22,241,242,280],{},[25,243,244,247,248,247,251,254,255,257,258],{},[18,245,246],{},"Chain of Responsibility",", ",[18,249,250],{},"Command",[18,252,253],{},"Mediator"," ve ",[18,256,138],{}," alıcı ve göndericileri birbirine bağlamak için çeşitli yöntemler önerir:",[22,259,260,265,270,275],{},[25,261,262,264],{},[18,263,246],{}," bir isteği potansiyel alıcılardan en az biri işleyene kadar dinamik bir alıcı zinciri boyunca sırayla iletir.",[25,266,267,269],{},[18,268,250],{}," göndericiler ve alıcılar arasında tek yönlü bağlantılar kurar.",[25,271,272,274],{},[18,273,253],{}," göndericiler ve alıcılar arasındaki doğrudan bağlantıları ortadan kaldırarak onları bir aracı nesne aracılığıyla dolaylı olarak iletişim kurmaya zorlar.",[25,276,277,279],{},[18,278,138],{}," alıcıların isteklere dinamik olarak abone olmalarını ve abonelikten çıkmalarını sağlar.",[25,281,282,254,284,286,287,290,291,293,294,296],{},[18,283,253],{},[18,285,138],{}," arasındaki fark genellikle belirgin değildir. Çoğu durumda bu kalıplardan herhangi birini uygulayabilirsiniz fakat bazen ikisini aynı anda uygulamanız gerekebilir.",[288,289],"br",{},"Mediator'ün birincil amacı, bir dizi sistem bileşeni arasındaki karşılıklı bağımlılıkları ortadan kaldırmaktır. Bileşenler bunun yerine tek bir aracı nesneye bağımlı hale gelir. Observer'ın amacı ise nesneler arasında bazılarının diğerlerinin alt nesnesi olarak hareket ettiği, dinamik tek taraflı bir bağlantı oluşturmaktır.",[288,292],{},"Mediator deseninin Observer tabanlı popüler bir uygulama yöntemi vardır. Bu yöntemde mediator yayıncı, bileşenler ise mediator'ün olaylarına (event) abone olan (subscribe) ya da abonelikten çıkan (unsubscribe) aboneler olarak hareket ederler. Mediator bu şekilde inşa edildiğinde Observer'a çok benzer.",[288,295],{},"Mediator ve Observer'ın ortak noktaları vardır ve bazen birbirleriyle iç içe geçebilirler, ama birbirlerinden tamamen farklı kullanımları da vardır. Örneğin tüm bileşenleri kalıcı olarak bir mediator nesnesine bağlayabilirsiniz. Bu uygulama Observer'a benzemez ve hâlâ bir Mediator desenidir.",[66,298],{},[130,300,302],{"id":301},"observer-deseni-kod-örnekleri","Observer Deseni Kod Örnekleri",[69,304,306],{"id":305},"örnek-php-kodu","Örnek PHP Kodu",[308,309,314],"pre",{"className":310,"code":311,"language":312,"meta":313,"style":313},"language-php shiki shiki-themes github-light github-dark","\u003C?php\n\nnamespace RefactoringGuru\\Observer\\Conceptual;\n\n\u002F**\n * PHP, Observer deseniyle ilgili yerleşik arayüzlere sahiptir.\n *\n * SplSubject arayüzü şu şekildedir:\n * @link http:\u002F\u002Fphp.net\u002Fmanual\u002Fen\u002Fclass.splsubject.php\n *\u002F\nclass Subject implements \\SplSubject\n{\n    \u002F**\n     * @var int Aboneler için önemli olan özne durumu.\n     *\u002F\n    public $state;\n\n    \u002F**\n     * @var \\SplObjectStorage Abonelerin listesi.\n     *\u002F\n    private $observers;\n\n    public function __construct()\n    {\n        $this->observers = new \\SplObjectStorage();\n    }\n\n    \u002F**\n     * Abonelik yönetim metotları.\n     *\u002F\n    public function attach(\\SplObserver $observer): void\n    {\n        echo \"Subject: Attached an observer.\\n\";\n        $this->observers->attach($observer);\n    }\n\n    public function detach(\\SplObserver $observer): void\n    {\n        $this->observers->detach($observer);\n        echo \"Subject: Detached an observer.\\n\";\n    }\n\n    \u002F**\n     * Tüm aboneleri güncellemeler hakkında bilgilendirir.\n     *\u002F\n    public function notify(): void\n    {\n        echo \"Subject: Notifying observers...\\n\";\n        foreach ($this->observers as $observer) {\n            $observer->update($this);\n        }\n    }\n\n    \u002F**\n     * Özne, kendi iş mantığına göre durum değişikliği yaptığında aboneleri uyarır.\n     *\u002F\n    public function someBusinessLogic(): void\n    {\n        echo \"\\nSubject: I'm doing something important.\\n\";\n        $this->state = rand(0, 10);\n\n        echo \"Subject: My state has just changed to: {$this->state}\\n\";\n        $this->notify();\n    }\n}\n\n\u002F**\n * Somut Aboneler, bağlı oldukları Özne'den gelen güncellemelere tepki verir.\n *\u002F\nclass ConcreteObserverA implements \\SplObserver\n{\n    public function update(\\SplSubject $subject): void\n    {\n        if ($subject->state \u003C 3) {\n            echo \"ConcreteObserverA: Reacted to the event.\\n\";\n        }\n    }\n}\n\nclass ConcreteObserverB implements \\SplObserver\n{\n    public function update(\\SplSubject $subject): void\n    {\n        if ($subject->state == 0 || $subject->state >= 2) {\n            echo \"ConcreteObserverB: Reacted to the event.\\n\";\n        }\n    }\n}\n\n\u002F**\n * İstemci Kodu.\n *\u002F\n$subject = new Subject();\n\n$o1 = new ConcreteObserverA();\n$subject->attach($o1);\n\n$o2 = new ConcreteObserverB();\n$subject->attach($o2);\n\n$subject->someBusinessLogic();\n$subject->someBusinessLogic();\n\n$subject->detach($o2);\n\n$subject->someBusinessLogic();\n","php","",[149,315,316,324,331,337,342,348,354,360,366,372,378,384,390,396,402,408,414,419,424,430,435,441,446,452,458,464,470,475,480,486,491,497,502,508,514,519,524,530,535,541,547,552,557,562,568,573,579,584,590,596,602,608,613,618,623,629,634,640,645,651,657,662,668,674,679,685,690,695,701,706,712,717,723,728,734,740,745,750,755,760,766,771,776,781,787,793,798,803,808,813,818,824,829,835,840,846,852,857,863,869,874,880,885,890,896,901],{"__ignoreMap":313},[317,318,321],"span",{"class":319,"line":320},"line",1,[317,322,323],{},"\u003C?php\n",[317,325,327],{"class":319,"line":326},2,[317,328,330],{"emptyLinePlaceholder":329},true,"\n",[317,332,334],{"class":319,"line":333},3,[317,335,336],{},"namespace RefactoringGuru\\Observer\\Conceptual;\n",[317,338,340],{"class":319,"line":339},4,[317,341,330],{"emptyLinePlaceholder":329},[317,343,345],{"class":319,"line":344},5,[317,346,347],{},"\u002F**\n",[317,349,351],{"class":319,"line":350},6,[317,352,353],{}," * PHP, Observer deseniyle ilgili yerleşik arayüzlere sahiptir.\n",[317,355,357],{"class":319,"line":356},7,[317,358,359],{}," *\n",[317,361,363],{"class":319,"line":362},8,[317,364,365],{}," * SplSubject arayüzü şu şekildedir:\n",[317,367,369],{"class":319,"line":368},9,[317,370,371],{}," * @link http:\u002F\u002Fphp.net\u002Fmanual\u002Fen\u002Fclass.splsubject.php\n",[317,373,375],{"class":319,"line":374},10,[317,376,377],{}," *\u002F\n",[317,379,381],{"class":319,"line":380},11,[317,382,383],{},"class Subject implements \\SplSubject\n",[317,385,387],{"class":319,"line":386},12,[317,388,389],{},"{\n",[317,391,393],{"class":319,"line":392},13,[317,394,395],{},"    \u002F**\n",[317,397,399],{"class":319,"line":398},14,[317,400,401],{},"     * @var int Aboneler için önemli olan özne durumu.\n",[317,403,405],{"class":319,"line":404},15,[317,406,407],{},"     *\u002F\n",[317,409,411],{"class":319,"line":410},16,[317,412,413],{},"    public $state;\n",[317,415,417],{"class":319,"line":416},17,[317,418,330],{"emptyLinePlaceholder":329},[317,420,422],{"class":319,"line":421},18,[317,423,395],{},[317,425,427],{"class":319,"line":426},19,[317,428,429],{},"     * @var \\SplObjectStorage Abonelerin listesi.\n",[317,431,433],{"class":319,"line":432},20,[317,434,407],{},[317,436,438],{"class":319,"line":437},21,[317,439,440],{},"    private $observers;\n",[317,442,444],{"class":319,"line":443},22,[317,445,330],{"emptyLinePlaceholder":329},[317,447,449],{"class":319,"line":448},23,[317,450,451],{},"    public function __construct()\n",[317,453,455],{"class":319,"line":454},24,[317,456,457],{},"    {\n",[317,459,461],{"class":319,"line":460},25,[317,462,463],{},"        $this->observers = new \\SplObjectStorage();\n",[317,465,467],{"class":319,"line":466},26,[317,468,469],{},"    }\n",[317,471,473],{"class":319,"line":472},27,[317,474,330],{"emptyLinePlaceholder":329},[317,476,478],{"class":319,"line":477},28,[317,479,395],{},[317,481,483],{"class":319,"line":482},29,[317,484,485],{},"     * Abonelik yönetim metotları.\n",[317,487,489],{"class":319,"line":488},30,[317,490,407],{},[317,492,494],{"class":319,"line":493},31,[317,495,496],{},"    public function attach(\\SplObserver $observer): void\n",[317,498,500],{"class":319,"line":499},32,[317,501,457],{},[317,503,505],{"class":319,"line":504},33,[317,506,507],{},"        echo \"Subject: Attached an observer.\\n\";\n",[317,509,511],{"class":319,"line":510},34,[317,512,513],{},"        $this->observers->attach($observer);\n",[317,515,517],{"class":319,"line":516},35,[317,518,469],{},[317,520,522],{"class":319,"line":521},36,[317,523,330],{"emptyLinePlaceholder":329},[317,525,527],{"class":319,"line":526},37,[317,528,529],{},"    public function detach(\\SplObserver $observer): void\n",[317,531,533],{"class":319,"line":532},38,[317,534,457],{},[317,536,538],{"class":319,"line":537},39,[317,539,540],{},"        $this->observers->detach($observer);\n",[317,542,544],{"class":319,"line":543},40,[317,545,546],{},"        echo \"Subject: Detached an observer.\\n\";\n",[317,548,550],{"class":319,"line":549},41,[317,551,469],{},[317,553,555],{"class":319,"line":554},42,[317,556,330],{"emptyLinePlaceholder":329},[317,558,560],{"class":319,"line":559},43,[317,561,395],{},[317,563,565],{"class":319,"line":564},44,[317,566,567],{},"     * Tüm aboneleri güncellemeler hakkında bilgilendirir.\n",[317,569,571],{"class":319,"line":570},45,[317,572,407],{},[317,574,576],{"class":319,"line":575},46,[317,577,578],{},"    public function notify(): void\n",[317,580,582],{"class":319,"line":581},47,[317,583,457],{},[317,585,587],{"class":319,"line":586},48,[317,588,589],{},"        echo \"Subject: Notifying observers...\\n\";\n",[317,591,593],{"class":319,"line":592},49,[317,594,595],{},"        foreach ($this->observers as $observer) {\n",[317,597,599],{"class":319,"line":598},50,[317,600,601],{},"            $observer->update($this);\n",[317,603,605],{"class":319,"line":604},51,[317,606,607],{},"        }\n",[317,609,611],{"class":319,"line":610},52,[317,612,469],{},[317,614,616],{"class":319,"line":615},53,[317,617,330],{"emptyLinePlaceholder":329},[317,619,621],{"class":319,"line":620},54,[317,622,395],{},[317,624,626],{"class":319,"line":625},55,[317,627,628],{},"     * Özne, kendi iş mantığına göre durum değişikliği yaptığında aboneleri uyarır.\n",[317,630,632],{"class":319,"line":631},56,[317,633,407],{},[317,635,637],{"class":319,"line":636},57,[317,638,639],{},"    public function someBusinessLogic(): void\n",[317,641,643],{"class":319,"line":642},58,[317,644,457],{},[317,646,648],{"class":319,"line":647},59,[317,649,650],{},"        echo \"\\nSubject: I'm doing something important.\\n\";\n",[317,652,654],{"class":319,"line":653},60,[317,655,656],{},"        $this->state = rand(0, 10);\n",[317,658,660],{"class":319,"line":659},61,[317,661,330],{"emptyLinePlaceholder":329},[317,663,665],{"class":319,"line":664},62,[317,666,667],{},"        echo \"Subject: My state has just changed to: {$this->state}\\n\";\n",[317,669,671],{"class":319,"line":670},63,[317,672,673],{},"        $this->notify();\n",[317,675,677],{"class":319,"line":676},64,[317,678,469],{},[317,680,682],{"class":319,"line":681},65,[317,683,684],{},"}\n",[317,686,688],{"class":319,"line":687},66,[317,689,330],{"emptyLinePlaceholder":329},[317,691,693],{"class":319,"line":692},67,[317,694,347],{},[317,696,698],{"class":319,"line":697},68,[317,699,700],{}," * Somut Aboneler, bağlı oldukları Özne'den gelen güncellemelere tepki verir.\n",[317,702,704],{"class":319,"line":703},69,[317,705,377],{},[317,707,709],{"class":319,"line":708},70,[317,710,711],{},"class ConcreteObserverA implements \\SplObserver\n",[317,713,715],{"class":319,"line":714},71,[317,716,389],{},[317,718,720],{"class":319,"line":719},72,[317,721,722],{},"    public function update(\\SplSubject $subject): void\n",[317,724,726],{"class":319,"line":725},73,[317,727,457],{},[317,729,731],{"class":319,"line":730},74,[317,732,733],{},"        if ($subject->state \u003C 3) {\n",[317,735,737],{"class":319,"line":736},75,[317,738,739],{},"            echo \"ConcreteObserverA: Reacted to the event.\\n\";\n",[317,741,743],{"class":319,"line":742},76,[317,744,607],{},[317,746,748],{"class":319,"line":747},77,[317,749,469],{},[317,751,753],{"class":319,"line":752},78,[317,754,684],{},[317,756,758],{"class":319,"line":757},79,[317,759,330],{"emptyLinePlaceholder":329},[317,761,763],{"class":319,"line":762},80,[317,764,765],{},"class ConcreteObserverB implements \\SplObserver\n",[317,767,769],{"class":319,"line":768},81,[317,770,389],{},[317,772,774],{"class":319,"line":773},82,[317,775,722],{},[317,777,779],{"class":319,"line":778},83,[317,780,457],{},[317,782,784],{"class":319,"line":783},84,[317,785,786],{},"        if ($subject->state == 0 || $subject->state >= 2) {\n",[317,788,790],{"class":319,"line":789},85,[317,791,792],{},"            echo \"ConcreteObserverB: Reacted to the event.\\n\";\n",[317,794,796],{"class":319,"line":795},86,[317,797,607],{},[317,799,801],{"class":319,"line":800},87,[317,802,469],{},[317,804,806],{"class":319,"line":805},88,[317,807,684],{},[317,809,811],{"class":319,"line":810},89,[317,812,330],{"emptyLinePlaceholder":329},[317,814,816],{"class":319,"line":815},90,[317,817,347],{},[317,819,821],{"class":319,"line":820},91,[317,822,823],{}," * İstemci Kodu.\n",[317,825,827],{"class":319,"line":826},92,[317,828,377],{},[317,830,832],{"class":319,"line":831},93,[317,833,834],{},"$subject = new Subject();\n",[317,836,838],{"class":319,"line":837},94,[317,839,330],{"emptyLinePlaceholder":329},[317,841,843],{"class":319,"line":842},95,[317,844,845],{},"$o1 = new ConcreteObserverA();\n",[317,847,849],{"class":319,"line":848},96,[317,850,851],{},"$subject->attach($o1);\n",[317,853,855],{"class":319,"line":854},97,[317,856,330],{"emptyLinePlaceholder":329},[317,858,860],{"class":319,"line":859},98,[317,861,862],{},"$o2 = new ConcreteObserverB();\n",[317,864,866],{"class":319,"line":865},99,[317,867,868],{},"$subject->attach($o2);\n",[317,870,872],{"class":319,"line":871},100,[317,873,330],{"emptyLinePlaceholder":329},[317,875,877],{"class":319,"line":876},101,[317,878,879],{},"$subject->someBusinessLogic();\n",[317,881,883],{"class":319,"line":882},102,[317,884,879],{},[317,886,888],{"class":319,"line":887},103,[317,889,330],{"emptyLinePlaceholder":329},[317,891,893],{"class":319,"line":892},104,[317,894,895],{},"$subject->detach($o2);\n",[317,897,899],{"class":319,"line":898},105,[317,900,330],{"emptyLinePlaceholder":329},[317,902,904],{"class":319,"line":903},106,[317,905,879],{},[69,907,909],{"id":908},"örnek-python-kodu","Örnek Python Kodu",[308,911,915],{"className":912,"code":913,"language":914,"meta":313,"style":313},"language-python shiki shiki-themes github-light github-dark","from __future__ import annotations\nfrom abc import ABC, abstractmethod\nfrom random import randrange\nfrom typing import List\n\nclass Subject(ABC):\n    \"\"\"\n    Subject arayüzü, aboneleri yönetmek için gereken metotları tanımlar.\n    \"\"\"\n\n    @abstractmethod\n    def attach(self, observer: Observer) -> None:\n        pass\n\n    @abstractmethod\n    def detach(self, observer: Observer) -> None:\n        pass\n\n    @abstractmethod\n    def notify(self) -> None:\n        pass\n\nclass ConcreteSubject(Subject):\n    \"\"\"\n    Özne önemli bir duruma sahiptir ve bu durum değiştiğinde aboneleri bilgilendirir.\n    \"\"\"\n\n    _state: int = None\n    _observers: List[Observer] = []\n\n    def attach(self, observer: Observer) -> None:\n        print(\"Subject: Attached an observer.\")\n        self._observers.append(observer)\n\n    def detach(self, observer: Observer) -> None:\n        self._observers.remove(observer)\n\n    def notify(self) -> None:\n        \"\"\"\n        Tüm aboneleri güncellemeler hakkında tetikler.\n        \"\"\"\n        print(\"Subject: Notifying observers...\")\n        for observer in self._observers:\n            observer.update(self)\n\n    def some_business_logic(self) -> None:\n        print(\"\\nSubject: I'm doing something important.\")\n        self._state = randrange(0, 10)\n\n        print(f\"Subject: My state has just changed to: {self._state}\")\n        self.notify()\n\nclass Observer(ABC):\n    \"\"\"\n    Observer arayüzü, özneler tarafından çağrılan güncelleme metodunu tanımlar.\n    \"\"\"\n\n    @abstractmethod\n    def update(self, subject: Subject) -> None:\n        pass\n\n\"\"\"\nSomut Aboneler, bağlı oldukları Özne'den gelen güncellemelere tepki verir.\n\"\"\"\n\nclass ConcreteObserverA(Observer):\n    def update(self, subject: Subject) -> None:\n        if subject._state \u003C 3:\n            print(\"ConcreteObserverA: Reacted to the event\")\n\nclass ConcreteObserverB(Observer):\n    def update(self, subject: Subject) -> None:\n        if subject._state == 0 or subject._state >= 2:\n            print(\"ConcreteObserverB: Reacted to the event\")\n\nif __name__ == \"__main__\":\n    # İstemci Kodu.\n    subject = ConcreteSubject()\n\n    observer_a = ConcreteObserverA()\n    subject.attach(observer_a)\n\n    observer_b = ConcreteObserverB()\n    subject.attach(observer_b)\n\n    subject.some_business_logic()\n    subject.some_business_logic()\n\n    subject.detach(observer_a)\n\n    subject.some_business_logic()\n","python",[149,916,917,922,927,932,937,941,946,951,956,960,964,969,974,979,983,987,992,996,1000,1004,1009,1013,1017,1022,1026,1031,1035,1039,1044,1049,1053,1057,1062,1067,1071,1075,1080,1084,1088,1093,1098,1102,1107,1112,1117,1121,1126,1131,1136,1140,1145,1150,1154,1159,1163,1168,1172,1176,1180,1185,1189,1193,1198,1203,1207,1211,1216,1220,1225,1230,1234,1239,1243,1248,1253,1257,1262,1267,1272,1276,1281,1286,1290,1295,1300,1304,1309,1313,1317,1322,1326],{"__ignoreMap":313},[317,918,919],{"class":319,"line":320},[317,920,921],{},"from __future__ import annotations\n",[317,923,924],{"class":319,"line":326},[317,925,926],{},"from abc import ABC, abstractmethod\n",[317,928,929],{"class":319,"line":333},[317,930,931],{},"from random import randrange\n",[317,933,934],{"class":319,"line":339},[317,935,936],{},"from typing import List\n",[317,938,939],{"class":319,"line":344},[317,940,330],{"emptyLinePlaceholder":329},[317,942,943],{"class":319,"line":350},[317,944,945],{},"class Subject(ABC):\n",[317,947,948],{"class":319,"line":356},[317,949,950],{},"    \"\"\"\n",[317,952,953],{"class":319,"line":362},[317,954,955],{},"    Subject arayüzü, aboneleri yönetmek için gereken metotları tanımlar.\n",[317,957,958],{"class":319,"line":368},[317,959,950],{},[317,961,962],{"class":319,"line":374},[317,963,330],{"emptyLinePlaceholder":329},[317,965,966],{"class":319,"line":380},[317,967,968],{},"    @abstractmethod\n",[317,970,971],{"class":319,"line":386},[317,972,973],{},"    def attach(self, observer: Observer) -> None:\n",[317,975,976],{"class":319,"line":392},[317,977,978],{},"        pass\n",[317,980,981],{"class":319,"line":398},[317,982,330],{"emptyLinePlaceholder":329},[317,984,985],{"class":319,"line":404},[317,986,968],{},[317,988,989],{"class":319,"line":410},[317,990,991],{},"    def detach(self, observer: Observer) -> None:\n",[317,993,994],{"class":319,"line":416},[317,995,978],{},[317,997,998],{"class":319,"line":421},[317,999,330],{"emptyLinePlaceholder":329},[317,1001,1002],{"class":319,"line":426},[317,1003,968],{},[317,1005,1006],{"class":319,"line":432},[317,1007,1008],{},"    def notify(self) -> None:\n",[317,1010,1011],{"class":319,"line":437},[317,1012,978],{},[317,1014,1015],{"class":319,"line":443},[317,1016,330],{"emptyLinePlaceholder":329},[317,1018,1019],{"class":319,"line":448},[317,1020,1021],{},"class ConcreteSubject(Subject):\n",[317,1023,1024],{"class":319,"line":454},[317,1025,950],{},[317,1027,1028],{"class":319,"line":460},[317,1029,1030],{},"    Özne önemli bir duruma sahiptir ve bu durum değiştiğinde aboneleri bilgilendirir.\n",[317,1032,1033],{"class":319,"line":466},[317,1034,950],{},[317,1036,1037],{"class":319,"line":472},[317,1038,330],{"emptyLinePlaceholder":329},[317,1040,1041],{"class":319,"line":477},[317,1042,1043],{},"    _state: int = None\n",[317,1045,1046],{"class":319,"line":482},[317,1047,1048],{},"    _observers: List[Observer] = []\n",[317,1050,1051],{"class":319,"line":488},[317,1052,330],{"emptyLinePlaceholder":329},[317,1054,1055],{"class":319,"line":493},[317,1056,973],{},[317,1058,1059],{"class":319,"line":499},[317,1060,1061],{},"        print(\"Subject: Attached an observer.\")\n",[317,1063,1064],{"class":319,"line":504},[317,1065,1066],{},"        self._observers.append(observer)\n",[317,1068,1069],{"class":319,"line":510},[317,1070,330],{"emptyLinePlaceholder":329},[317,1072,1073],{"class":319,"line":516},[317,1074,991],{},[317,1076,1077],{"class":319,"line":521},[317,1078,1079],{},"        self._observers.remove(observer)\n",[317,1081,1082],{"class":319,"line":526},[317,1083,330],{"emptyLinePlaceholder":329},[317,1085,1086],{"class":319,"line":532},[317,1087,1008],{},[317,1089,1090],{"class":319,"line":537},[317,1091,1092],{},"        \"\"\"\n",[317,1094,1095],{"class":319,"line":543},[317,1096,1097],{},"        Tüm aboneleri güncellemeler hakkında tetikler.\n",[317,1099,1100],{"class":319,"line":549},[317,1101,1092],{},[317,1103,1104],{"class":319,"line":554},[317,1105,1106],{},"        print(\"Subject: Notifying observers...\")\n",[317,1108,1109],{"class":319,"line":559},[317,1110,1111],{},"        for observer in self._observers:\n",[317,1113,1114],{"class":319,"line":564},[317,1115,1116],{},"            observer.update(self)\n",[317,1118,1119],{"class":319,"line":570},[317,1120,330],{"emptyLinePlaceholder":329},[317,1122,1123],{"class":319,"line":575},[317,1124,1125],{},"    def some_business_logic(self) -> None:\n",[317,1127,1128],{"class":319,"line":581},[317,1129,1130],{},"        print(\"\\nSubject: I'm doing something important.\")\n",[317,1132,1133],{"class":319,"line":586},[317,1134,1135],{},"        self._state = randrange(0, 10)\n",[317,1137,1138],{"class":319,"line":592},[317,1139,330],{"emptyLinePlaceholder":329},[317,1141,1142],{"class":319,"line":598},[317,1143,1144],{},"        print(f\"Subject: My state has just changed to: {self._state}\")\n",[317,1146,1147],{"class":319,"line":604},[317,1148,1149],{},"        self.notify()\n",[317,1151,1152],{"class":319,"line":610},[317,1153,330],{"emptyLinePlaceholder":329},[317,1155,1156],{"class":319,"line":615},[317,1157,1158],{},"class Observer(ABC):\n",[317,1160,1161],{"class":319,"line":620},[317,1162,950],{},[317,1164,1165],{"class":319,"line":625},[317,1166,1167],{},"    Observer arayüzü, özneler tarafından çağrılan güncelleme metodunu tanımlar.\n",[317,1169,1170],{"class":319,"line":631},[317,1171,950],{},[317,1173,1174],{"class":319,"line":636},[317,1175,330],{"emptyLinePlaceholder":329},[317,1177,1178],{"class":319,"line":642},[317,1179,968],{},[317,1181,1182],{"class":319,"line":647},[317,1183,1184],{},"    def update(self, subject: Subject) -> None:\n",[317,1186,1187],{"class":319,"line":653},[317,1188,978],{},[317,1190,1191],{"class":319,"line":659},[317,1192,330],{"emptyLinePlaceholder":329},[317,1194,1195],{"class":319,"line":664},[317,1196,1197],{},"\"\"\"\n",[317,1199,1200],{"class":319,"line":670},[317,1201,1202],{},"Somut Aboneler, bağlı oldukları Özne'den gelen güncellemelere tepki verir.\n",[317,1204,1205],{"class":319,"line":676},[317,1206,1197],{},[317,1208,1209],{"class":319,"line":681},[317,1210,330],{"emptyLinePlaceholder":329},[317,1212,1213],{"class":319,"line":687},[317,1214,1215],{},"class ConcreteObserverA(Observer):\n",[317,1217,1218],{"class":319,"line":692},[317,1219,1184],{},[317,1221,1222],{"class":319,"line":697},[317,1223,1224],{},"        if subject._state \u003C 3:\n",[317,1226,1227],{"class":319,"line":703},[317,1228,1229],{},"            print(\"ConcreteObserverA: Reacted to the event\")\n",[317,1231,1232],{"class":319,"line":708},[317,1233,330],{"emptyLinePlaceholder":329},[317,1235,1236],{"class":319,"line":714},[317,1237,1238],{},"class ConcreteObserverB(Observer):\n",[317,1240,1241],{"class":319,"line":719},[317,1242,1184],{},[317,1244,1245],{"class":319,"line":725},[317,1246,1247],{},"        if subject._state == 0 or subject._state >= 2:\n",[317,1249,1250],{"class":319,"line":730},[317,1251,1252],{},"            print(\"ConcreteObserverB: Reacted to the event\")\n",[317,1254,1255],{"class":319,"line":736},[317,1256,330],{"emptyLinePlaceholder":329},[317,1258,1259],{"class":319,"line":742},[317,1260,1261],{},"if __name__ == \"__main__\":\n",[317,1263,1264],{"class":319,"line":747},[317,1265,1266],{},"    # İstemci Kodu.\n",[317,1268,1269],{"class":319,"line":752},[317,1270,1271],{},"    subject = ConcreteSubject()\n",[317,1273,1274],{"class":319,"line":757},[317,1275,330],{"emptyLinePlaceholder":329},[317,1277,1278],{"class":319,"line":762},[317,1279,1280],{},"    observer_a = ConcreteObserverA()\n",[317,1282,1283],{"class":319,"line":768},[317,1284,1285],{},"    subject.attach(observer_a)\n",[317,1287,1288],{"class":319,"line":773},[317,1289,330],{"emptyLinePlaceholder":329},[317,1291,1292],{"class":319,"line":778},[317,1293,1294],{},"    observer_b = ConcreteObserverB()\n",[317,1296,1297],{"class":319,"line":783},[317,1298,1299],{},"    subject.attach(observer_b)\n",[317,1301,1302],{"class":319,"line":789},[317,1303,330],{"emptyLinePlaceholder":329},[317,1305,1306],{"class":319,"line":795},[317,1307,1308],{},"    subject.some_business_logic()\n",[317,1310,1311],{"class":319,"line":800},[317,1312,1308],{},[317,1314,1315],{"class":319,"line":805},[317,1316,330],{"emptyLinePlaceholder":329},[317,1318,1319],{"class":319,"line":810},[317,1320,1321],{},"    subject.detach(observer_a)\n",[317,1323,1324],{"class":319,"line":815},[317,1325,330],{"emptyLinePlaceholder":329},[317,1327,1328],{"class":319,"line":820},[317,1329,1308],{},[66,1331],{},[130,1333,1335],{"id":1334},"diğer-tasarım-kalıpları-design-patterns","Diğer Tasarım Kalıpları \u002F Design Patterns",[14,1337,1338],{},[18,1339,1340],{},"Oluşumsal Kalıplar (Creational Patterns)",[14,1342,1343,1347,1348,1347,1352,1347,1356,1347,1360],{},[47,1344,1346],{"href":1345},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-factory-method-nedir","Factory Method",",\n",[47,1349,1351],{"href":1350},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-abstract-factory-nedir","Abstract Factory",[47,1353,1355],{"href":1354},"\u002Ftr\u002Fbuilder-tasarim-deseni-nedir","Builder",[47,1357,1359],{"href":1358},"\u002Ftr\u002Fprototype-tasarim-deseni-nedir","Prototype",[47,1361,1363],{"href":1362},"\u002Ftr\u002Fsingleton-tasarim-deseni-nedir","Singleton",[14,1365,1366],{},[18,1367,1368],{},"Yapısal Kalıplar (Structural Patterns)",[14,1370,1371,1347,1375,1347,1379,1347,1383,1347,1387,1347,1391,1347,1395],{},[47,1372,1374],{"href":1373},"\u002Ftr\u002Fadapter-tasarim-deseni-nedir","Adapter",[47,1376,1378],{"href":1377},"\u002Ftr\u002Fbridge-tasarim-deseni-nedir","Bridge",[47,1380,1382],{"href":1381},"\u002Ftr\u002Fcomposite-tasarim-deseni-nedir","Composite",[47,1384,1386],{"href":1385},"\u002Ftr\u002Fdecorator-tasarim-deseni-nedir","Decorator",[47,1388,1390],{"href":1389},"\u002Ftr\u002Ffacade-tasarim-deseni-nedir","Facade",[47,1392,1394],{"href":1393},"\u002Ftr\u002Fflyweight-tasarim-deseni-nedir","Flyweight",[47,1396,1398],{"href":1397},"\u002Ftr\u002Fproxy-tasarim-deseni-nedir","Proxy",[14,1400,1401],{},[18,1402,1403],{},"Davranışsal Kalıplar (Behavioral Patterns)",[14,1405,1406,1347,1409,1347,1412,1347,1416,1347,1419,1347,1423,1347,1426,1347,1430,1347,1434,1347,1438],{},[47,1407,246],{"href":1408},"\u002Ftr\u002Fchain-of-responsibility-deseni-nedir",[47,1410,250],{"href":1411},"\u002Ftr\u002Fcommand-tasarim-deseni-nedir",[47,1413,1415],{"href":1414},"\u002Ftr\u002Fiterator-tasarim-deseni-nedir","Iterator",[47,1417,253],{"href":1418},"\u002Ftr\u002Fmediator-tasarim-deseni-nedir",[47,1420,1422],{"href":1421},"\u002Ftr\u002Fmemento-tasarim-deseni-nedir","Memento",[47,1424,138],{"href":1425},"\u002Ftr\u002Fobserver-tasarim-deseni-nedir",[47,1427,1429],{"href":1428},"\u002Ftr\u002Fstate-tasarim-deseni-nedir","State",[47,1431,1433],{"href":1432},"\u002Ftr\u002Fstrategy-tasarim-deseni-nedir","Strategy",[47,1435,1437],{"href":1436},"\u002Ftr\u002Ftemplate-method-tasarim-deseni-nedir","Template Method",[47,1439,1441],{"href":1440},"\u002Ftr\u002Fvisitor-tasarim-deseni-nedir","Visitor",[1443,1444,1445],"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":313,"searchDepth":326,"depth":326,"links":1447},[1448,1449,1450,1451,1452,1453,1454,1458],{"id":71,"depth":333,"text":72},{"id":132,"depth":326,"text":133},{"id":144,"depth":326,"text":145},{"id":174,"depth":326,"text":175},{"id":216,"depth":326,"text":217},{"id":238,"depth":326,"text":239},{"id":301,"depth":326,"text":302,"children":1455},[1456,1457],{"id":305,"depth":333,"text":306},{"id":908,"depth":333,"text":909},{"id":1334,"depth":326,"text":1335},[1460],"technical",null,"2021-10-05","Observer tasarım deseninin ne olduğunu, PHP ve Python kod örneklerini, avantajlarını, dezavantajlarını ve diğer tasarım kalıplarıyla ilişkilerini öğrenin.",false,"md","\u002Fimages\u002Fposts\u002F2021\u002F10\u002Fobserver-tasarim-deseni.avif",{},{"title":6,"description":1463},"observer-tasarim-deseni-nedir","tr\u002Fobserver-tasarim-deseni-nedir",[1472,1473],"design-pattern","ipucu","2026-06-21","Sr9U7Ft5GMl0di-QsRAIm1CLcBFQia5Zfb9HtjLtjDI",{"prev":1477,"next":1479,"others":1482,"lucky":1592,"readingTime":356},{"path":1428,"title":1478},"State Tasarım Deseni Nedir?",{"path":1480,"title":1481},"\u002Ftr\u002Fgo-ve-degiskenler","Go ve Değişkenler",[1483,1486,1489,1492,1495,1498,1501,1503,1505,1508,1511,1514,1517,1520,1523,1526,1528,1531,1533,1535,1538,1541,1544,1547,1550,1553,1554,1557,1559,1561,1564,1566,1568,1571,1574,1577,1580,1583,1586,1589],{"path":1484,"title":1485},"\u002Ftr\u002Fes5-nedir","ES5 Nedir? JavaScript Geliştiricileri İçin Kılavuz",{"path":1487,"title":1488},"\u002Ftr\u002Fjavascriptde-moduller","JavaScript'te Modüller",{"path":1490,"title":1491},"\u002Ftr\u002Ftricolor-garbage-collection-algoritmasi-nedir","Tricolor Garbage Collection Algoritması Nedir?",{"path":1493,"title":1494},"\u002Ftr\u002Fes17-nedir-ecmascript-2026-nedir","ES17 nedir? ECMAScript 2026 nedir?",{"path":1496,"title":1497},"\u002Ftr\u002Fphalcon-frameworkun-gelecegi","Phalcon Framework'ün Geleceği: Bir Devrin Sonu",{"path":1499,"title":1500},"\u002Ftr\u002Fphp-8-0-yenilikler","Merhaba PHP 8: Modern PHP 8.x Çağı",{"path":1393,"title":1502},"Flyweight Tasarım Deseni Nedir?",{"path":1408,"title":1504},"Chain of Responsibility Deseni Nedir?",{"path":1506,"title":1507},"\u002Ftr\u002Fdocker-ile-mongodb-kurulumu","Docker ile MongoDB Kurulumu",{"path":1509,"title":1510},"\u002Ftr\u002Fprogralama-ipucu-yoda-gosterimi","Yoda Koşulları (Yoda Conditions) Nedir? Programlama İpucu",{"path":1512,"title":1513},"\u002Ftr\u002Fes6-nedir-ecmascript-2015-nedir","ES6 Nedir? ECMAScript 2015 Nedir?",{"path":1515,"title":1516},"\u002Ftr\u002Fubuntu-24-04-uzerinde-cyberpanel-kurulumu","Ubuntu 24.04 LTS ve 22.04 LTS Üzerinde CyberPanel Kurulumu",{"path":1518,"title":1519},"\u002Ftr\u002Fmutable-ve-immutable-kavrami","Mutable ve Immutable Kavramları Nedir?",{"path":1521,"title":1522},"\u002Ftr\u002Fmerhaba-phalcon-framework","Merhaba Phalcon Framework",{"path":1524,"title":1525},"\u002Ftr\u002Fvue-js-nedir","Vue.js Nedir? Yeni Başlayanlar İçin Rehber",{"path":1418,"title":1527},"Mediator Tasarım Deseni Nedir?",{"path":1529,"title":1530},"\u002Ftr\u002Fmerhaba-tailwind-css","Merhaba Tailwind CSS",{"path":1362,"title":1532},"Singleton Tasarım Deseni Nedir?",{"path":1421,"title":1534},"Memento Tasarım Deseni Nedir?",{"path":1536,"title":1537},"\u002Ftr\u002Fes16-nedir-ecmascript-2025-nedir","ES16 nedir? ECMAScript 2025 nedir?",{"path":1539,"title":1540},"\u002Ftr\u002Fgo-veri-tipleri-map","Go Veri Tipleri - Map",{"path":1542,"title":1543},"\u002Ftr\u002Fes15-nedir-ecmascript-2024-nedir","ES15 nedir? ECMAScript 2024 nedir?",{"path":1545,"title":1546},"\u002Ftr\u002Frest-api-hata-yonetimi","REST Api Hata Yönetimi",{"path":1548,"title":1549},"\u002Ftr\u002Fes10-nedir-ecmascript-2019-nedir","ES10 Nedir? ECMAScript 2019 Nedir?",{"path":1551,"title":1552},"\u002Ftr\u002Fheadless-wordpress-hakkinda-her-sey","Headless WordPress Hakkında Her Şey",{"path":1480,"title":1481},{"path":1555,"title":1556},"\u002Ftr\u002Fgo-slice-veri-tipi","Go Veri Tipleri: Slice",{"path":1381,"title":1558},"Composite Tasarım Deseni Nedir?",{"path":1358,"title":1560},"Prototype Tasarım Deseni Nedir?",{"path":1562,"title":1563},"\u002Ftr\u002Fecmascript-nedir-ecmascript-ne-degildir-bilinmesi-gerekenler","ECMAScript Nedir? Bilinmesi Gerekenler...",{"path":1432,"title":1565},"Strategy Tasarım Deseni Nedir?",{"path":1373,"title":1567},"Adapter Tasarım Deseni Nedir?",{"path":1569,"title":1570},"\u002Ftr\u002Ftailwind-css-just-in-time-modu","Tailwind CSS Just-in-Time (JIT) Modu Nedir?",{"path":1572,"title":1573},"\u002Ftr\u002Fphp-ve-makine-ogrenimi-php-ml-kutuphanesi","PHP ve Makine Öğrenimi: PHP-ML Kütüphanesi ile Pratik Çözümler",{"path":1575,"title":1576},"\u002Ftr\u002Frest-api-kimlik-dogrulama-nasil-yapilir","REST API Kimlik Doğrulama Nasıl Yapılır?",{"path":1578,"title":1579},"\u002Ftr\u002Frest-api-tasarimi","REST API Tasarım İncelikleri",{"path":1581,"title":1582},"\u002Ftr\u002Fself-hosted-api-gateway-nasil-kurulur-kapsamli-rehber","Self-Hosted API Gateway Nasıl Kurulur? Kapsamlı Rehber",{"path":1584,"title":1585},"\u002Ftr\u002Fnostalji-ibibik-online","Nostalji: İbibik Online (1998'den Bir Web Macerası)",{"path":1587,"title":1588},"\u002Ftr\u002Fgarbage-collection-ve-golang","Garbage Collection ve Go (Golang)",{"path":1590,"title":1591},"\u002Ftr\u002Fdocker-ile-redis-kurulumu","Docker ile Redis Kurulumu",{"path":1593,"title":1594},"\u002Ftr\u002Ffull-stack-proje-agaci","Full-Stack Proje Yol Haritası ve İçindekiler",[1596,1599,1602,1604],{"path":1440,"title":1597,"date":1598},"Visitor Tasarım Deseni Nedir?","2021-10-09",{"path":1436,"title":1600,"date":1601},"Template Method Tasarım Deseni Nedir?","2021-10-08",{"path":1432,"title":1565,"date":1603},"2021-10-07",{"path":1428,"title":1478,"date":1605},"2021-10-06",[1607,1609,1613],{"path":1381,"title":1558,"date":1608},"2021-09-11",{"path":1610,"title":1611,"date":1612},"\u002Ftr\u002Fubuntu-guncellemesi-sonrasi-cyberpanele-ulasilamama-sorunlarini-giderme","Ubuntu Güncellemesi Sonrası CyberPanel'e Ulaşılamama Sorunlarını Giderme","2023-10-14",{"path":1614,"title":1615,"date":1616},"\u002Ftr\u002Fgo-programlama-dilinin-ozellikleri","Go Programlama Dilinin Özellikleri","2021-09-28",1782142004039]