{"id":35117,"date":"2025-11-25T22:01:25","date_gmt":"2025-11-25T19:01:25","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/"},"modified":"2025-11-25T22:01:25","modified_gmt":"2025-11-25T19:01:25","slug":"phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/","title":{"rendered":"PHP&#8217;de If-Else Cehenneminden Strateji Deseniyle Kurtulmak"},"content":{"rendered":"<p><body><\/p>\n<p>PHP projelerinizde karma\u015f\u0131k if-else bloklar\u0131 aras\u0131nda kaybolmak, kodunuzun s\u00fcrd\u00fcr\u00fclebilirli\u011fini ve okunabilirli\u011fini tehlikeye atar. Bu teknik makale, \u201cIf-Else Cehennemi\u201d olarak adland\u0131r\u0131lan bu durumu Strateji Deseni (Strategy Pattern) ile nas\u0131l a\u015faca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor. Kod kalitenizi art\u0131rarak daha esnek ve y\u00f6netilebilir sistemler kurman\u0131n yollar\u0131n\u0131 ke\u015ffedin.<\/p>\n<p>Yaz\u0131l\u0131m geli\u015ftirmede, genellikle bir i\u015flemin farkl\u0131 varyasyonlar\u0131n\u0131 y\u00f6netmek i\u00e7in ko\u015fullu ifadeler kullan\u0131r\u0131z. Ancak bu ko\u015fullu mant\u0131k, projenin b\u00fcy\u00fcmesiyle birlikte h\u0131zla bir karma\u015fa yuma\u011f\u0131na d\u00f6n\u00fc\u015febilir. Bu duruma yaz\u0131l\u0131mc\u0131 jargonunda \u201cIf-Else Cehennemi\u201d (If-Else Hell) ad\u0131 verilir. Peki, bu durum neden ortaya \u00e7\u0131kar ve neden bu kadar tehlikelidir?<\/p>\n<p>Ba\u015flang\u0131\u00e7ta basit g\u00f6r\u00fcnen bir karar a\u011fac\u0131, yeni \u00f6zellikler eklendik\u00e7e veya i\u015f gereksinimleri de\u011fi\u015ftik\u00e7e i\u00e7 i\u00e7e ge\u00e7mi\u015f <code>if<\/code>, <code>else if<\/code> ve <code>else<\/code> bloklar\u0131yla dolmaya ba\u015flar. Bu durum, \u00f6zellikle tek bir fonksiyonda veya metotta farkl\u0131 ko\u015fullara ba\u011fl\u0131 olarak benzer ama varyasyonlu i\u015flemlerin yap\u0131ld\u0131\u011f\u0131 senaryolarda s\u0131k\u00e7a kar\u015f\u0131m\u0131za \u00e7\u0131kar. \u00d6rne\u011fin, bir \u00f6deme i\u015flemcisi d\u00fc\u015f\u00fcn\u00fcn: kredi kart\u0131, PayPal, havale gibi farkl\u0131 \u00f6deme y\u00f6ntemlerinin her biri i\u00e7in ayr\u0131 bir <code>if<\/code> blo\u011fu a\u00e7\u0131l\u0131r. Yeni bir \u00f6deme y\u00f6ntemi eklendi\u011finde mevcut koda m\u00fcdahale etmek zorunda kal\u0131r\u0131z. Bu t\u00fcr de\u011fi\u015fiklikler hem zaman al\u0131c\u0131d\u0131r hem de mevcut kodda beklenmedik hatalara yol a\u00e7ma riskini ta\u015f\u0131r. Kod taban\u0131n\u0131n b\u00fcy\u00fcmesiyle birlikte, bu bloklar i\u00e7 i\u00e7e ge\u00e7erek okunabilirli\u011fi tamamen yok edebilir, b\u00f6ylece geli\u015ftiriciler i\u00e7in adeta bir labirente d\u00f6n\u00fc\u015f\u00fcr.<\/p>\n<p>Dahas\u0131, bu yap\u0131 kodun test edilebilirli\u011fini ciddi \u015fekilde d\u00fc\u015f\u00fcr\u00fcr. Her bir ko\u015fullu dal\u0131 ayr\u0131 ayr\u0131 test etmek zorla\u015f\u0131r, \u00e7\u00fcnk\u00fc ba\u011f\u0131ml\u0131l\u0131klar ve yan etkiler birbiriyle i\u00e7 i\u00e7e ge\u00e7mi\u015ftir. Tek bir de\u011fi\u015fiklik, sistemin farkl\u0131 ve alakas\u0131z g\u00f6r\u00fcnen yerlerinde beklenmedik davran\u0131\u015flara neden olabilir. Bu durum, bak\u0131m maliyetlerini art\u0131r\u0131r, yeni geli\u015ftiricilerin projeye adaptasyon s\u00fcrecini uzat\u0131r ve nihayetinde yaz\u0131l\u0131m\u0131n geli\u015fim h\u0131z\u0131n\u0131 d\u00fc\u015f\u00fcr\u00fcr. Bu nedenle, daha s\u00fcrd\u00fcr\u00fclebilir, esnek ve y\u00f6netilebilir bir kod yap\u0131s\u0131 olu\u015fturmak i\u00e7in bu t\u00fcr karma\u015f\u0131k ko\u015fullu mant\u0131klardan ka\u00e7\u0131nmak ve onlar\u0131 daha uygun tasar\u0131m desenleriyle de\u011fi\u015ftirmek kritik \u00f6neme sahiptir.<\/p>\n<h3>Neden If-Else Bloklar\u0131 Bir Kabusa D\u00f6n\u00fc\u015febilir?<\/h3>\n<p><code>If-Else<\/code> bloklar\u0131n\u0131n a\u015f\u0131r\u0131 kullan\u0131m\u0131, yaz\u0131l\u0131m\u0131n evrimi i\u00e7in bir\u00e7ok olumsuz etkiyi beraberinde getirir. \u0130lk olarak, <strong>kod tekrar\u0131 (duplication)<\/strong> b\u00fcy\u00fck bir problem haline gelir. Farkl\u0131 ko\u015fullar alt\u0131nda benzer i\u015flemlerin yap\u0131lmas\u0131 gerekti\u011finde, \u00e7o\u011fu zaman ayn\u0131 veya \u00e7ok benzer kod par\u00e7ac\u0131klar\u0131 birden fazla <code>if<\/code> blo\u011funda tekrar yaz\u0131l\u0131r. Bu durum, herhangi bir mant\u0131k de\u011fi\u015fikli\u011finde birden fazla yeri g\u00fcncelleme zorunlulu\u011fu do\u011furur ve hata yapma olas\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<p>\u0130kincisi, <strong>tek sorumluluk ilkesi (Single Responsibility Principle &#8211; SRP)<\/strong> ihlal edilir. Bir metodun veya s\u0131n\u0131f\u0131n birden fazla sorumlulu\u011fu \u00fcstlenmesi, onun karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r. <code>If-Else<\/code> cehennemi durumunda, tek bir metot farkl\u0131 ko\u015fullara g\u00f6re \u00e7ok say\u0131da i\u015flemi y\u00f6netmeye \u00e7al\u0131\u015f\u0131r, bu da onun odak noktas\u0131n\u0131 kaybetmesine ve bir &#8220;tanr\u0131 metot&#8221; haline gelmesine neden olur. SRP&#8217;nin ihlali, test yazmay\u0131 da zorla\u015ft\u0131r\u0131r, \u00e7\u00fcnk\u00fc her bir test senaryosu t\u00fcm metodun karma\u015f\u0131k yap\u0131s\u0131n\u0131 dikkate almak zorunda kal\u0131r.<\/p>\n<p>\u00dc\u00e7\u00fcnc\u00fcs\u00fc, <strong>a\u00e7\u0131k\/kapal\u0131 ilkesi (Open\/Closed Principle &#8211; OCP)<\/strong> g\u00f6z ard\u0131 edilir. OCP&#8217;ye g\u00f6re, bir yaz\u0131l\u0131m varl\u0131\u011f\u0131 (s\u0131n\u0131f, mod\u00fcl, fonksiyon vb.) geli\u015ftirmeye a\u00e7\u0131k ancak de\u011fi\u015ftirmeye kapal\u0131 olmal\u0131d\u0131r. Yani, yeni bir \u00f6zellik eklendi\u011finde mevcut kodun davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirmek yerine, yeni kod eklemeliyiz. <code>If-Else<\/code> y\u0131\u011f\u0131n\u0131nda ise, her yeni ko\u015ful veya \u00f6zellik i\u00e7in mevcut <code>if<\/code> yap\u0131s\u0131na yeni <code>else if<\/code> bloklar\u0131 eklememiz gerekir, bu da mevcut kodun s\u00fcrekli olarak de\u011fi\u015ftirilmesine yol a\u00e7ar. Bu durum, sistemin kararl\u0131l\u0131\u011f\u0131n\u0131 riske atar ve her de\u011fi\u015fiklikte regresyon hatalar\u0131n\u0131n ortaya \u00e7\u0131kma ihtimalini y\u00fckseltir.<\/p>\n<p>Son olarak, <strong>kodun anla\u015f\u0131lmas\u0131 ve bak\u0131m\u0131<\/strong> zorla\u015f\u0131r. Bir geli\u015ftirici, karma\u015f\u0131k bir <code>if-else<\/code> yap\u0131s\u0131n\u0131 anlamak i\u00e7in zihinsel olarak daha fazla \u00e7aba sarf etmek zorunda kal\u0131r. Bu durum, hata ay\u0131klama (debugging) s\u00fcrecini uzat\u0131r ve yeni \u00f6zelliklerin entegrasyonunu yava\u015flat\u0131r. Uzun vadede, bu t\u00fcr kod tabanlar\u0131 &#8220;teknik bor\u00e7&#8221; biriktirir ve gelecekteki geli\u015ftirmeleri ciddi \u015fekilde yava\u015flatan bir y\u00fck haline gelir.<\/p>\n<h3>Peki \u00c7\u00f6z\u00fcm Ne Olmal\u0131?<\/h3>\n<p>Yukar\u0131da bahsedilen sorunlar, daha iyi bir yap\u0131land\u0131rma ihtiyac\u0131n\u0131 a\u00e7\u0131k\u00e7a ortaya koymaktad\u0131r. Modern yaz\u0131l\u0131m geli\u015ftirmenin temel prensiplerinden biri, kodun esnekli\u011fini, geni\u015fletilebilirli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131rmakt\u0131r. Bu prensipleri sa\u011flaman\u0131n yollar\u0131ndan biri de tasar\u0131m desenlerini (design patterns) kullanmakt\u0131r. Tasar\u0131m desenleri, yaz\u0131l\u0131m geli\u015ftirme s\u00fcrecinde kar\u015f\u0131la\u015f\u0131lan yayg\u0131n sorunlara kan\u0131tlanm\u0131\u015f ve tekrar kullan\u0131labilir \u00e7\u00f6z\u00fcmler sunar.<\/p>\n<p><code>If-Else<\/code> cehenneminden kurtulman\u0131n anahtar\u0131, ko\u015fullu mant\u0131\u011f\u0131 soyutlamak ve farkl\u0131 davran\u0131\u015flar\u0131 ayr\u0131, de\u011fi\u015ftirilebilir s\u0131n\u0131flara veya nesnelere b\u00f6lmektir. Bu sayede, her bir davran\u0131\u015f kendi i\u00e7inde izole edilebilir, test edilebilir ve ba\u011f\u0131ms\u0131z olarak geli\u015ftirilebilir hale gelir. Bu yakla\u015f\u0131m, kod tekrar\u0131n\u0131 azalt\u0131r, her bir mod\u00fcl\u00fcn tek bir sorumlulu\u011fa sahip olmas\u0131n\u0131 sa\u011flar ve sisteme yeni davran\u0131\u015flar eklerken mevcut kodu de\u011fi\u015ftirmeye gerek kalmamas\u0131n\u0131 temin eder.<\/p>\n<p>Bu ba\u011flamda, &#8220;Strateji Deseni&#8221; (Strategy Pattern) tam da arad\u0131\u011f\u0131m\u0131z \u00e7\u00f6z\u00fcmd\u00fcr. Strateji Deseni, bir algoritma ailesini tan\u0131mlar, her birini ayr\u0131 bir s\u0131n\u0131fa kaps\u00fcller ve onlar\u0131 birbirinin yerine kullan\u0131labilir hale getirir. Bu, algoritman\u0131n istemciden ba\u011f\u0131ms\u0131z olarak de\u011fi\u015ftirilmesine olanak tan\u0131r. B\u00f6ylece, karma\u015f\u0131k ko\u015fullu mant\u0131k yerine, sistem \u00e7al\u0131\u015fma zaman\u0131nda hangi algoritman\u0131n veya stratejinin kullan\u0131laca\u011f\u0131na karar verir. Bu yakla\u015f\u0131m, sadece kodu d\u00fczenlemekle kalmaz, ayn\u0131 zamanda sistemin genel mimarisini iyile\u015ftirerek daha sa\u011flam ve uyarlanabilir uygulamalar olu\u015fturman\u0131n temelini atar.<\/p>\n<h2>Strateji Deseni Nedir ve Neden Hayat Kurtar\u0131r?<\/h2>\n<p>Strateji Deseni, yaz\u0131l\u0131m tasar\u0131m\u0131nda s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan bir soruna zarif bir \u00e7\u00f6z\u00fcm sunan davran\u0131\u015fsal (behavioral) bir tasar\u0131m desenidir: belirli bir i\u015flemi ger\u00e7ekle\u015ftirmenin birden fazla yolu oldu\u011funda ve bu yollar\u0131n istemci taraf\u0131ndan \u00e7al\u0131\u015fma zaman\u0131nda se\u00e7ilebilmesi gerekti\u011finde kullan\u0131l\u0131r. Bu desen, her bir algoritmay\u0131 (veya stratejiyi) ayr\u0131 bir s\u0131n\u0131f\u0131n i\u00e7ine kaps\u00fcller ve bu s\u0131n\u0131flar\u0131n ortak bir aray\u00fcz\u00fc uygulamas\u0131n\u0131 sa\u011flar. B\u00f6ylece, istemci kod, belirli bir algoritmay\u0131 do\u011frudan \u00e7a\u011f\u0131rmak yerine, ortak aray\u00fcz \u00fczerinden i\u015flem yapar ve hangi algoritman\u0131n kullan\u0131laca\u011f\u0131n\u0131 \u00e7al\u0131\u015fma zaman\u0131nda dinamik olarak belirleyebilir.<\/p>\n<p>Temelde, Strateji Deseni \u00fc\u00e7 ana bile\u015fenden olu\u015fur:<\/p>\n<ol>\n<li><strong>Strateji Aray\u00fcz\u00fc (Strategy Interface\/Abstract Class):<\/strong> T\u00fcm stratejilerin uygulamas\u0131 gereken ortak bir aray\u00fcz\u00fc veya soyut s\u0131n\u0131f\u0131 tan\u0131mlar. Bu aray\u00fcz, stratejilerin ger\u00e7ekle\u015ftirece\u011fi i\u015flemi tan\u0131mlayan metotlar\u0131 i\u00e7erir. \u00d6rne\u011fin, bir \u00f6deme i\u015flemcisinde <code>processPayment()<\/code> metodu bu aray\u00fczde yer alabilir.<\/li>\n<li><strong>Somut Stratejiler (Concrete Strategies):<\/strong> Strateji aray\u00fcz\u00fcn\u00fc uygulayan ve belirli bir algoritmay\u0131 veya davran\u0131\u015f\u0131 ger\u00e7ekle\u015ftiren s\u0131n\u0131flard\u0131r. Her bir somut strateji, tan\u0131mlanan i\u015flemi kendi \u00f6zel yoluyla yapar. \u00d6rne\u011fin, <code>CreditCardPaymentStrategy<\/code>, <code>PayPalPaymentStrategy<\/code> gibi s\u0131n\u0131flar.<\/li>\n<li><strong>Ba\u011flam S\u0131n\u0131f\u0131 (Context):<\/strong> Strateji nesnesini tutan ve istemciye sunan s\u0131n\u0131ft\u0131r. Ba\u011flam s\u0131n\u0131f\u0131, istemciden gelen iste\u011fi strateji aray\u00fcz\u00fc \u00fczerinden mevcut strateji nesnesine y\u00f6nlendirir. \u0130stemcinin hangi somut stratejiyi kullanaca\u011f\u0131n\u0131 bilmesine gerek kalmaz; sadece ba\u011flam s\u0131n\u0131f\u0131na stratejiyi ayarlar ve i\u015flemi ba\u015flat\u0131r. Ba\u011flam, i\u015f mant\u0131\u011f\u0131n\u0131n kendisini de\u011fil, farkl\u0131 stratejilerin uygulanmas\u0131 i\u00e7in bir k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr.<\/li>\n<\/ol>\n<p>Bu yap\u0131 sayesinde, yeni bir algoritma veya davran\u0131\u015f eklendi\u011finde, sadece Strateji aray\u00fcz\u00fcn\u00fc uygulayan yeni bir Somut Strateji s\u0131n\u0131f\u0131 olu\u015fturmak yeterli olur. Mevcut Ba\u011flam s\u0131n\u0131f\u0131nda veya di\u011fer somut stratejilerde herhangi bir de\u011fi\u015fiklik yapmaya gerek kalmaz. Bu, kodun a\u00e7\u0131k\/kapal\u0131 ilkesine (Open\/Closed Principle) uymas\u0131n\u0131 sa\u011flar ve sistemin geni\u015fletilebilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Strateji Deseni, <code>if-else<\/code> bloklar\u0131n\u0131n neden oldu\u011fu kod karma\u015fas\u0131n\u0131 ortadan kald\u0131rarak, daha mod\u00fcler, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir bir mimari olu\u015fturman\u0131n kap\u0131lar\u0131n\u0131 a\u00e7ar.<\/p>\n<h3>Strateji Deseni: Polimorfizmin G\u00fcc\u00fc<\/h3>\n<p>Strateji Deseni&#8217;nin temelinde, nesne y\u00f6nelimli programlaman\u0131n en g\u00fc\u00e7l\u00fc kavramlar\u0131ndan biri olan polimorfizm yatar. Polimorfizm, farkl\u0131 nesnelerin ayn\u0131 aray\u00fcz \u00fczerinden farkl\u0131 \u015fekillerde davranabilmesi anlam\u0131na gelir. Strateji Deseni&#8217;nde, t\u00fcm somut strateji s\u0131n\u0131flar\u0131 ayn\u0131 ortak strateji aray\u00fcz\u00fcn\u00fc (veya soyut s\u0131n\u0131f\u0131n\u0131) uygulad\u0131\u011f\u0131 i\u00e7in, ba\u011flam s\u0131n\u0131f\u0131 veya istemci kod, hangi somut stratejiyi kulland\u0131\u011f\u0131n\u0131 bilmek zorunda kalmadan o aray\u00fcz \u00fczerinden i\u015flem yapabilir.<\/p>\n<p>Bu, \u015fu \u015fekilde \u00e7al\u0131\u015f\u0131r: Strateji aray\u00fcz\u00fc, ger\u00e7ekle\u015ftirilecek genel bir i\u015flemi tan\u0131mlar. \u00d6rne\u011fin, bir \u00f6deme sisteminde <code>odemeYap()<\/code> metodu. Daha sonra, <code>KrediKartiOdemeStratejisi<\/code>, <code>HavaleOdemeStratejisi<\/code> ve <code>PayPalOdemeStratejisi<\/code> gibi her somut strateji, bu <code>odemeYap()<\/code> metodunu kendi \u00f6zel \u00f6deme y\u00f6ntemi mant\u0131\u011f\u0131yla uygular. Ba\u011flam s\u0131n\u0131f\u0131 ise, sadece bir <code>IOdemeStratejisi<\/code> tipinde bir nesneye referans tutar. Ba\u011flam, <code>odemeYap()<\/code> metodunu \u00e7a\u011f\u0131rd\u0131\u011f\u0131nda, bu \u00e7a\u011fr\u0131, o anki referans\u0131n i\u015faret etti\u011fi somut stratejinin \u00f6zel implementasyonunu tetikler.<\/p>\n<p>Bu mekanizma, <code>if-else<\/code> bloklar\u0131n\u0131n neden oldu\u011fu karma\u015fay\u0131 do\u011frudan \u00e7\u00f6zer. Art\u0131k, &#8220;E\u011fer \u00f6deme y\u00f6ntemi kredi kart\u0131 ise \u015funu yap, yok e\u011fer PayPal ise bunu yap&#8230;&#8221; \u015feklinde bir dizi ko\u015fullu kontrol yerine, tek bir polimorfik \u00e7a\u011fr\u0131 yeterli olur. Ba\u011flam s\u0131n\u0131f\u0131, belirli bir stratejiyi do\u011frudan se\u00e7ip \u00e7a\u011f\u0131rmak yerine, yaln\u0131zca elindeki strateji nesnesinin <code>odemeYap()<\/code> metodunu \u00e7a\u011f\u0131r\u0131r. Hangi somut stratejinin kullan\u0131ld\u0131\u011f\u0131na dair karar, genellikle ba\u011flam s\u0131n\u0131f\u0131n\u0131 olu\u015fturan veya ona stratejiyi enjekte eden kod taraf\u0131ndan verilir. Bu esneklik, kodun daha mod\u00fcler olmas\u0131n\u0131 sa\u011flar, \u00e7\u00fcnk\u00fc yeni bir \u00f6deme y\u00f6ntemi eklendi\u011finde, sadece yeni bir somut strateji s\u0131n\u0131f\u0131 olu\u015fturulur ve mevcut kodda hi\u00e7bir de\u011fi\u015fiklik yapmaya gerek kalmaz. Bu sayede, sistemin geni\u015fletilebilirli\u011fi ve bak\u0131m kolayl\u0131\u011f\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde artar. Polimorfizm sayesinde, farkl\u0131 davran\u0131\u015flar ayn\u0131 aray\u00fcz alt\u0131nda toplanabilir ve bu, kodun daha temiz, daha anla\u015f\u0131l\u0131r ve daha s\u00fcrd\u00fcr\u00fclebilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<div class=\"interactive-element\">\n<p><strong>Uzman \u0130pucu:<\/strong> Strateji Deseni&#8217;ni kullan\u0131rken, genellikle Dependency Injection (Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu) prensibini de uygulayarak ba\u011flam s\u0131n\u0131f\u0131n\u0131n hangi stratejiyi kullanaca\u011f\u0131n\u0131 d\u0131\u015far\u0131dan belirlemesini sa\u011flamak en iyi uygulamad\u0131r. Bu, kodun daha gev\u015fek ba\u011fl\u0131 (loosely coupled) ve test edilebilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<\/p><\/div>\n<h3>Bu Desen Bize Hangi Avantajlar\u0131 Sunar?<\/h3>\n<p>Strateji Deseni, yaz\u0131l\u0131m projelerinize bir dizi \u00f6nemli avantaj getirir:<\/p>\n<ol>\n<li><strong>Kodun Geni\u015fletilebilirli\u011fi ve Esnekli\u011fi:<\/strong> En b\u00fcy\u00fck avantajlar\u0131ndan biri, sisteme yeni davran\u0131\u015flar veya algoritmalar eklemenin ne kadar kolay oldu\u011fudur. Yeni bir stratejiye mi ihtiyac\u0131n\u0131z var? Sadece Strateji aray\u00fcz\u00fcn\u00fc uygulayan yeni bir s\u0131n\u0131f olu\u015fturun. Mevcut kodu de\u011fi\u015ftirmeye gerek kalmaz, bu da a\u00e7\u0131k\/kapal\u0131 ilkesine uyulmas\u0131n\u0131 sa\u011flar ve gelecekteki de\u011fi\u015fikliklerde hata riskini azalt\u0131r. Bu esneklik, i\u015f gereksinimleri de\u011fi\u015ftik\u00e7e veya yeni \u00f6zellikler eklendik\u00e7e projenizin daha h\u0131zl\u0131 adapte olmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>Kod Tekrar\u0131n\u0131 Azaltma (DRY Prensibi):<\/strong> Ortak i\u015flevselli\u011fi Strateji Aray\u00fcz\u00fc i\u00e7inde tan\u0131mlayarak ve her bir strateji s\u0131n\u0131f\u0131nda yaln\u0131zca farkl\u0131 olan k\u0131s\u0131mlar\u0131 uygulayarak kod tekrar\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r\u0131z. Her bir strateji, kendi \u00f6zel sorumlulu\u011funu \u00fcstlendi\u011fi i\u00e7in kod daha d\u00fczenli ve konsantre olur.<\/li>\n<li><strong>Daha \u0130yi Test Edilebilirlik:<\/strong> Her bir strateji, ba\u011f\u0131ms\u0131z bir s\u0131n\u0131f oldu\u011fu i\u00e7in kendi ba\u015f\u0131na kolayca test edilebilir. Bu, birim testlerini yazmay\u0131 ve s\u00fcrd\u00fcrmeyi \u00e7ok daha basit hale getirir. <code>If-Else<\/code> bloklar\u0131nda her bir dal\u0131 test etmek i\u00e7in karma\u015f\u0131k kurulumlar gerekebilirken, stratejilerde her bir davran\u0131\u015f kendi ba\u015f\u0131na izole edilebilir.<\/li>\n<li><strong>Daha Temiz ve Okunabilir Kod:<\/strong> Karma\u015f\u0131k <code>if-else<\/code> y\u0131\u011f\u0131nlar\u0131 yerini anlaml\u0131 isimlendirilmi\u015f strateji s\u0131n\u0131flar\u0131na b\u0131rak\u0131r. Bu, kodun amac\u0131n\u0131 ve i\u015flevselli\u011fini daha net bir \u015fekilde anlamay\u0131 sa\u011flar. \u0130stemci kod, hangi spesifik algoritman\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 bilmek zorunda kalmaz, sadece bir strateji ile etkile\u015fime girer. Bu soyutlama, kod taban\u0131n\u0131n genel okunabilirli\u011fini art\u0131r\u0131r.<\/li>\n<li><strong>Sorumluluklar\u0131n Ayr\u0131lmas\u0131 (SRP):<\/strong> Her bir strateji s\u0131n\u0131f\u0131, belirli bir algoritmay\u0131 ger\u00e7ekle\u015ftirme konusunda tek bir sorumlulu\u011fa sahiptir. Bu, s\u0131n\u0131flar\u0131n daha k\u00fc\u00e7\u00fck, daha odakl\u0131 ve y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flar. Tek sorumluluk ilkesine uygunluk, yaz\u0131l\u0131m\u0131n genel kalitesini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131r\u0131r.<\/li>\n<li><strong>\u00c7al\u0131\u015fma Zaman\u0131nda Davran\u0131\u015f De\u011fi\u015fikli\u011fi:<\/strong> Strateji Deseni, bir nesnenin \u00e7al\u0131\u015fma zaman\u0131nda davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirmesine olanak tan\u0131r. Ba\u011flam s\u0131n\u0131f\u0131n\u0131n farkl\u0131 strateji nesneleriyle dinamik olarak yap\u0131land\u0131r\u0131labilmesi sayesinde, ayn\u0131 nesne farkl\u0131 senaryolarda farkl\u0131 algoritmalar\u0131 kullanabilir. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n tercihine g\u00f6re farkl\u0131 bir vergi hesaplama stratejisi uygulanabilir.<\/li>\n<\/ol>\n<p>Bu avantajlar g\u00f6z \u00f6n\u00fcne al\u0131nd\u0131\u011f\u0131nda, Strateji Deseni, \u00f6zellikle karma\u015f\u0131k ve de\u011fi\u015fen i\u015f mant\u0131\u011f\u0131na sahip uygulamalarda, kod kalitesini ve geli\u015ftirme verimlili\u011fini art\u0131rmak i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r. If-Else Hell&#8217;in getirdi\u011fi sorunlardan kurtulmak ve daha modern, esnek bir mimariye ge\u00e7mek isteyen her PHP geli\u015ftiricisi i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<h2>Uygulamal\u0131 K\u0131s\u0131m: Ad\u0131m Ad\u0131m If-Else&#8217;den Stratejiye Ge\u00e7i\u015f (Vaka Analizi: \u00d6deme \u0130\u015flemleri)<\/h2>\n<p>\u015eimdi teorik bilgiyi prati\u011fe d\u00f6kelim. Ger\u00e7ek d\u00fcnya senaryolar\u0131nda s\u0131k\u00e7a kar\u015f\u0131la\u015ft\u0131\u011f\u0131m\u0131z bir \u00f6rne\u011fi ele alal\u0131m: farkl\u0131 \u00f6deme y\u00f6ntemlerini y\u00f6neten bir sistem. Bu sistemin ba\u015flang\u0131\u00e7ta nas\u0131l bir &#8220;If-Else Cehennemi&#8221;ne sahip olabilece\u011fini g\u00f6recek, ard\u0131ndan Strateji Deseni&#8217;ni kullanarak bu karma\u015f\u0131kl\u0131\u011f\u0131 nas\u0131l ortadan kald\u0131raca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Bu vaka analizi, konunun s\u0131f\u0131rdan anla\u015f\u0131lmas\u0131na olanak tan\u0131yacak \u015fekilde tasarlanm\u0131\u015ft\u0131r.<\/p>\n<p>Hayal edin ki bir e-ticaret uygulaman\u0131z var ve m\u00fc\u015fterilerinize kredi kart\u0131, PayPal ve banka havalesi gibi farkl\u0131 \u00f6deme se\u00e7enekleri sunuyorsunuz. Yeni \u00f6deme y\u00f6ntemleri ekledik\u00e7e veya mevcut y\u00f6ntemlerin mant\u0131\u011f\u0131n\u0131 de\u011fi\u015ftirdik\u00e7e, kodunuz h\u0131zla y\u00f6netilemez hale gelebilir. \u0130\u015fte tam bu noktada Strateji Deseni devreye giriyor. \u00d6rnek kod bloklar\u0131m\u0131z PHP&#8217;de yaz\u0131lm\u0131\u015f olup, her a\u015fama i\u00e7in hem mevcut (k\u00f6t\u00fc) durumu hem de refactoring (iyile\u015ftirme) sonras\u0131 (iyi) durumu g\u00f6sterecektir.<\/p>\n<p>Amac\u0131m\u0131z, \u00f6deme i\u015flemcimizi \u00f6yle bir hale getirmek ki, yeni bir \u00f6deme y\u00f6ntemi eklemek veya mevcut bir y\u00f6ntemin detaylar\u0131n\u0131 de\u011fi\u015ftirmek i\u00e7in <code>PaymentProcessor<\/code> s\u0131n\u0131f\u0131nda b\u00fcy\u00fck de\u011fi\u015fiklikler yapmam\u0131za gerek kalmas\u0131n. Bu sayede, A\u00e7\u0131k\/Kapal\u0131 Prensibi&#8217;ne uyacak, kod tekrar\u0131n\u0131 azaltacak ve her bir \u00f6deme y\u00f6nteminin kendi sorumlulu\u011funa sahip olmas\u0131n\u0131 sa\u011flayaca\u011f\u0131z. Hadi ba\u015flayal\u0131m ve bu d\u00f6n\u00fc\u015f\u00fcm\u00fc ad\u0131m ad\u0131m ger\u00e7ekle\u015ftirelim.<\/p>\n<h3>Mevcut Durum: If-Else Hell&#8217;deki \u00d6deme \u0130\u015flemcimiz<\/h3>\n<p>\u00d6ncelikle, ba\u015flang\u0131\u00e7taki &#8220;If-Else Cehennemi&#8221;ne d\u00fc\u015fm\u00fc\u015f \u00f6deme i\u015flemcisi s\u0131n\u0131f\u0131m\u0131z\u0131 inceleyelim. Bu s\u0131n\u0131f, <code>processPayment<\/code> ad\u0131nda tek bir metoda sahip olup, ald\u0131\u011f\u0131 \u00f6deme y\u00f6ntemine g\u00f6re farkl\u0131 mant\u0131klar uygulamaktad\u0131r.<\/p>\n<pre><code class=\"language-php\">\n<?php\n\nclass PaymentProcessor\n{\n    public function processPayment(string $paymentMethod, float $amount): bool\n    {\n        if ($paymentMethod === 'credit_card') {\n            echo \"Kredi kart\u0131 ile {$amount} TL \u00f6deme i\u015fleniyor...\\n\";\n            \/\/ Kredi kart\u0131 API'si ile entegrasyon mant\u0131\u011f\u0131\n            if ($amount > 1000) {\n                echo \"1000 TL \u00fczeri i\u015flem i\u00e7in ek g\u00fcvenlik kontrol\u00fc yap\u0131ld\u0131.\\n\";\n            }\n            \/\/ Ba\u015far\u0131l\u0131 \u00f6deme\n            return true;\n        } elseif ($paymentMethod === 'paypal') {\n            echo \"PayPal ile {$amount} TL \u00f6deme i\u015fleniyor...\\n\";\n            \/\/ PayPal API'si ile entegrasyon mant\u0131\u011f\u0131\n            \/\/ PayPal'a \u00f6zel komisyon hesaplamalar\u0131\n            $commission = $amount * 0.02;\n            echo \"PayPal komisyonu: {$commission} TL.\\n\";\n            return true;\n        } elseif ($paymentMethod === 'bank_transfer') {\n            echo \"Banka havalesi ile {$amount} TL \u00f6deme i\u015fleniyor...\\n\";\n            \/\/ Banka havalesi \u00f6zel mant\u0131\u011f\u0131: i\u015flem durumu 'beklemede' olarak ayarlan\u0131r.\n            echo \"Havale i\u015flemi onay bekliyor.\\n\";\n            return true;\n        } else {\n            echo \"Ge\u00e7ersiz \u00f6deme y\u00f6ntemi: {$paymentMethod}\\n\";\n            return false;\n        }\n    }\n}\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi\n$processor = new PaymentProcessor();\n$processor->processPayment('credit_card', 150.00);\n$processor->processPayment('paypal', 500.00);\n$processor->processPayment('bank_transfer', 2500.00);\n$processor->processPayment('bitcoin', 100.00); \/\/ Hata: ge\u00e7ersiz \u00f6deme y\u00f6ntemi\n\n?>\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki koda bakt\u0131\u011f\u0131n\u0131zda, <code>PaymentProcessor<\/code> s\u0131n\u0131f\u0131n\u0131n <code>processPayment<\/code> metodu, birden fazla sorumlulu\u011fu \u00fczerinde bar\u0131nd\u0131r\u0131yor:<\/p>\n<ul>\n<li>Kredi kart\u0131 \u00f6deme mant\u0131\u011f\u0131<\/li>\n<li>PayPal \u00f6deme mant\u0131\u011f\u0131<\/li>\n<li>Banka havalesi \u00f6deme mant\u0131\u011f\u0131<\/li>\n<li>Ge\u00e7ersiz \u00f6deme y\u00f6ntemi y\u00f6netimi<\/li>\n<\/ul>\n<p>Her yeni \u00f6deme y\u00f6ntemi eklendi\u011finde (\u00f6rne\u011fin, bir mobil \u00f6deme uygulamas\u0131), bu metoda yeni bir <code>else if<\/code> blo\u011fu eklememiz gerekecek. Bu durum:<\/p>\n<ul>\n<li><code>PaymentProcessor<\/code> s\u0131n\u0131f\u0131n\u0131n b\u00fcy\u00fcmesine ve karma\u015f\u0131kla\u015fmas\u0131na neden olur.<\/li>\n<li><code>processPayment<\/code> metodunun tek sorumluluk ilkesini ihlal etmesine yol a\u00e7ar.<\/li>\n<li>Yeni \u00f6zellikler eklerken mevcut kodu de\u011fi\u015ftirmemizi gerektirdi\u011fi i\u00e7in a\u00e7\u0131k\/kapal\u0131 ilkesine ayk\u0131r\u0131d\u0131r.<\/li>\n<li>Test yazmay\u0131 zorla\u015ft\u0131r\u0131r, \u00e7\u00fcnk\u00fc her bir \u00f6deme y\u00f6nteminin kendi i\u00e7inde karma\u015f\u0131k alt mant\u0131klar\u0131 olabilir.<\/li>\n<\/ul>\n<p>Bu yap\u0131, projenin s\u00fcrd\u00fcr\u00fclebilirli\u011fi ve bak\u0131m kolayl\u0131\u011f\u0131 a\u00e7\u0131s\u0131ndan ciddi bir problem te\u015fkil etmektedir. \u015eimdi bu karma\u015f\u0131kl\u0131\u011f\u0131 Strateji Deseni ile nas\u0131l sadele\u015ftirece\u011fimizi g\u00f6relim.<\/p>\n<h3>Strateji Aray\u00fcz\u00fcn\u00fc Tan\u0131mlamak<\/h3>\n<p>Strateji Deseni'nin ilk ad\u0131m\u0131, t\u00fcm stratejilerin uygulayaca\u011f\u0131 ortak bir aray\u00fcz tan\u0131mlamakt\u0131r. Bu aray\u00fcz, her bir \u00f6deme y\u00f6nteminin ger\u00e7ekle\u015ftirmesi gereken <code>pay<\/code> metodunu tan\u0131mlayacakt\u0131r.<\/p>\n<pre><code class=\"language-php\">\n<?php\n\ninterface PaymentStrategy\n{\n    public function pay(float $amount): bool;\n}\n\n?>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu aray\u00fcz, basit ama g\u00fc\u00e7l\u00fc bir s\u00f6zle\u015fme sunar: <code>PaymentStrategy<\/code> aray\u00fcz\u00fcn\u00fc uygulayan her s\u0131n\u0131f\u0131n bir <code>pay(float $amount)<\/code> metodu olmal\u0131d\u0131r. Bu metot, belirtilen miktar\u0131 i\u015fleyip i\u015flemin ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 d\u00f6nd\u00fcrmelidir. Bu sayede, farkl\u0131 \u00f6deme y\u00f6ntemleri i\u00e7in ayn\u0131 metod imzas\u0131 korunmu\u015f olur ve polimorfizm ilkesi uygulan\u0131r. \u0130stemci kod, spesifik bir \u00f6deme y\u00f6nteminin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 bilmeden bu aray\u00fcz \u00fczerinden i\u015flem yapabilir.<\/p>\n<p>Bu ad\u0131m, \"If-Else Cehennemi\"nden kurtulmak i\u00e7in temel bir soyutlama katman\u0131 olu\u015fturur. Art\u0131k, \u00f6deme i\u015flemini yapma sorumlulu\u011fu <code>PaymentProcessor<\/code> s\u0131n\u0131f\u0131ndan, bu yeni aray\u00fcz\u00fc uygulayacak olan strateji s\u0131n\u0131flar\u0131na devredilecektir. Bu, her bir sorumlulu\u011fun kendi ayr\u0131 s\u0131n\u0131f\u0131na ait olmas\u0131n\u0131 sa\u011flayarak kodun mod\u00fclerli\u011fini ve anla\u015f\u0131l\u0131rl\u0131\u011f\u0131n\u0131 art\u0131racakt\u0131r. Gelecekte ekleyece\u011fimiz yeni \u00f6deme y\u00f6ntemleri de sadece bu aray\u00fcz\u00fc uygulayarak sisteme kolayca entegre edilebilecektir.<\/p>\n<h3>Somut Stratejilerimizi Olu\u015fturmak<\/h3>\n<p>\u015eimdi, tan\u0131mlad\u0131\u011f\u0131m\u0131z <code>PaymentStrategy<\/code> aray\u00fcz\u00fcn\u00fc uygulayan somut \u00f6deme stratejisi s\u0131n\u0131flar\u0131n\u0131 olu\u015ftural\u0131m. Her bir s\u0131n\u0131f, belirli bir \u00f6deme y\u00f6ntemine (kredi kart\u0131, PayPal, banka havalesi) ait mant\u0131\u011f\u0131 kapsayacakt\u0131r.<\/p>\n<pre><code class=\"language-php\">\n<?php\n\n\/\/ CreditCardPaymentStrategy.php\nclass CreditCardPaymentStrategy implements PaymentStrategy\n{\n    public function pay(float $amount): bool\n    {\n        echo \"Kredi kart\u0131 ile {$amount} TL \u00f6deme i\u015fleniyor (Strateji).\\n\";\n        \/\/ Kredi kart\u0131 API'si ile entegrasyon mant\u0131\u011f\u0131\n        if ($amount > 1000) {\n            echo \"1000 TL \u00fczeri i\u015flem i\u00e7in ek g\u00fcvenlik kontrol\u00fc yap\u0131ld\u0131 (Kredi Kart\u0131).\\n\";\n        }\n        \/\/ Ba\u015far\u0131l\u0131 \u00f6deme\n        return true;\n    }\n}\n\n\/\/ PayPalPaymentStrategy.php\nclass PayPalPaymentStrategy implements PaymentStrategy\n{\n    public function pay(float $amount): bool\n    {\n        echo \"PayPal ile {$amount} TL \u00f6deme i\u015fleniyor (Strateji).\\n\";\n        \/\/ PayPal API'si ile entegrasyon mant\u0131\u011f\u0131\n        $commission = $amount * 0.02;\n        echo \"PayPal komisyonu: {$commission} TL (PayPal).\\n\";\n        return true;\n    }\n}\n\n\/\/ BankTransferPaymentStrategy.php\nclass BankTransferPaymentStrategy implements PaymentStrategy\n{\n    public function pay(float $amount): bool\n    {\n        echo \"Banka havalesi ile {$amount} TL \u00f6deme i\u015fleniyor (Strateji).\\n\";\n        \/\/ Banka havalesi \u00f6zel mant\u0131\u011f\u0131: i\u015flem durumu 'beklemede' olarak ayarlan\u0131r.\n        echo \"Havale i\u015flemi onay bekliyor (Banka Havalesi).\\n\";\n        return true;\n    }\n}\n\n?>\n<\/pre>\n<p><\/code><\/p>\n<p>Her bir somut strateji s\u0131n\u0131f\u0131 art\u0131k tek bir sorumlulu\u011fa sahiptir: kendi \u00f6deme y\u00f6ntemine \u00f6zel mant\u0131\u011f\u0131 ger\u00e7ekle\u015ftirmek. Bu, a\u015fa\u011f\u0131daki avantajlar\u0131 sa\u011flar:<\/p>\n<ul>\n<li><strong>Tek Sorumluluk \u0130lkesi (SRP):<\/strong> Her s\u0131n\u0131f\u0131n sadece bir i\u015fi vard\u0131r (\u00f6rn. kredi kart\u0131 \u00f6demesi yapmak).<\/li>\n<li><strong>A\u00e7\u0131k\/Kapal\u0131 \u0130lkesi (OCP):<\/strong> Yeni bir \u00f6deme y\u00f6ntemi (\u00f6rne\u011fin Bitcoin) eklemek istedi\u011finizde, mevcut s\u0131n\u0131flar\u0131 de\u011fi\u015ftirmek yerine sadece <code>PaymentStrategy<\/code> aray\u00fcz\u00fcn\u00fc uygulayan yeni bir s\u0131n\u0131f (<code>BitcoinPaymentStrategy<\/code>) olu\u015fturursunuz.<\/li>\n<li><strong>Test Edilebilirlik:<\/strong> Her bir strateji s\u0131n\u0131f\u0131 ba\u011f\u0131ms\u0131zd\u0131r ve kendi ba\u015f\u0131na kolayca test edilebilir. Kredi kart\u0131 \u00f6deme mant\u0131\u011f\u0131n\u0131 test etmek i\u00e7in PayPal s\u0131n\u0131f\u0131na ihtiyac\u0131n\u0131z yoktur.<\/li>\n<li><strong>Okunabilirlik:<\/strong> Kod \u00e7ok daha okunabilir ve anla\u015f\u0131l\u0131r hale gelir. Hangi \u00f6deme y\u00f6nteminin ne yapt\u0131\u011f\u0131n\u0131 bulmak i\u00e7in karma\u015f\u0131k <code>if-else<\/code> bloklar\u0131n\u0131 taramak yerine, ilgili strateji s\u0131n\u0131f\u0131na bakman\u0131z yeterlidir.<\/li>\n<\/ul>\n<p>Bu ad\u0131mla, <code>PaymentProcessor<\/code> s\u0131n\u0131f\u0131m\u0131z\u0131n \u00fczerindeki y\u00fck\u00fc b\u00fcy\u00fck \u00f6l\u00e7\u00fcde hafiflettik ve \u00f6deme mant\u0131klar\u0131n\u0131 daha y\u00f6netilebilir, mod\u00fcler par\u00e7alara ay\u0131rd\u0131k. \u015eimdi bu stratejileri y\u00f6netecek olan Ba\u011flam s\u0131n\u0131f\u0131m\u0131z\u0131 olu\u015fturmaya ge\u00e7ebiliriz.<\/p>\n<h3>Ba\u011flam S\u0131n\u0131f\u0131 (Context) ile Stratejileri Y\u00f6netmek<\/h3>\n<p>Stratejilerimizi tan\u0131mlad\u0131ktan ve somut strateji s\u0131n\u0131flar\u0131m\u0131z\u0131 olu\u015fturduktan sonra, s\u0131ra bu stratejileri kullanacak olan Ba\u011flam (Context) s\u0131n\u0131f\u0131n\u0131 olu\u015fturmaya geldi. Ba\u011flam s\u0131n\u0131f\u0131, istemci (client) ile stratejiler aras\u0131ndaki k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr. \u0130stemci, do\u011frudan somut stratejilerle etkile\u015fime girmez; bunun yerine, ba\u011flam s\u0131n\u0131f\u0131 arac\u0131l\u0131\u011f\u0131yla i\u015flem yapar ve ba\u011flam, o anki se\u00e7ili stratejiye g\u00f6re i\u015flemi y\u00f6nlendirir.<\/p>\n<pre><code class=\"language-php\">\n<?php\n\nclass PaymentContext\n{\n    private PaymentStrategy $paymentStrategy;\n\n    public function __construct(PaymentStrategy $paymentStrategy)\n    {\n        $this->paymentStrategy = $paymentStrategy;\n    }\n\n    \/\/ \u00c7al\u0131\u015fma zaman\u0131nda stratejiyi de\u011fi\u015ftirmek i\u00e7in setter metot\n    public function setPaymentStrategy(PaymentStrategy $paymentStrategy): void\n    {\n        $this->paymentStrategy = $paymentStrategy;\n    }\n\n    public function executePayment(float $amount): bool\n    {\n        echo \"\u00d6deme ba\u011flam\u0131 arac\u0131l\u0131\u011f\u0131yla i\u015flem ba\u015flat\u0131l\u0131yor...\\n\";\n        return $this->paymentStrategy->pay($amount);\n    }\n}\n\n?>\n<\/pre>\n<p><\/code><\/p>\n<p><code>PaymentContext<\/code> s\u0131n\u0131f\u0131n\u0131n ana \u00f6zellikleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Strateji Tutucu:<\/strong> Bir <code>PaymentStrategy<\/code> aray\u00fcz\u00fc t\u00fcr\u00fcnde bir nesne tutar. Bu, herhangi bir somut strateji nesnesi olabilece\u011fi anlam\u0131na gelir (polimorfizm sayesinde).<\/li>\n<li><strong>Constructor Enjeksiyonu:<\/strong> Yap\u0131c\u0131 metodu (<code>__construct<\/code>) arac\u0131l\u0131\u011f\u0131yla bir <code>PaymentStrategy<\/code> nesnesi al\u0131r. Bu, Ba\u011flam s\u0131n\u0131f\u0131n\u0131n hangi stratejiyi kullanaca\u011f\u0131n\u0131 d\u0131\u015far\u0131dan belirlenmesini sa\u011flar ve ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu prensibini uygular.<\/li>\n<li><strong>Setter Metodu:<\/strong> <code>setPaymentStrategy<\/code> metodu sayesinde, Ba\u011flam s\u0131n\u0131f\u0131n\u0131n stratejisi \u00e7al\u0131\u015fma zaman\u0131nda dinamik olarak de\u011fi\u015ftirilebilir. Bu, uygulaman\u0131n esnekli\u011fini art\u0131r\u0131r.<\/li>\n<li><strong><code>executePayment<\/code> Metodu:<\/strong> \u0130stemcinin \u00e7a\u011f\u0131raca\u011f\u0131 ana metottur. Bu metot, kendi i\u00e7inde \u00f6deme mant\u0131\u011f\u0131 bar\u0131nd\u0131rmak yerine, sadece mevcut strateji nesnesinin <code>pay()<\/code> metodunu \u00e7a\u011f\u0131r\u0131r. Bu sayede, t\u00fcm ko\u015fullu mant\u0131k Ba\u011flam s\u0131n\u0131f\u0131ndan temizlenmi\u015f olur.<\/li>\n<\/ul>\n<p>Bu yap\u0131 ile <code>PaymentContext<\/code> s\u0131n\u0131f\u0131m\u0131z olduk\u00e7a \"ince\" (thin) ve odaklanm\u0131\u015f hale gelir. Kendi ba\u015f\u0131na karma\u015f\u0131k bir i\u015f mant\u0131\u011f\u0131 i\u00e7ermez; sadece stratejiyi kullanarak i\u015fi delege eder. Bu da onu y\u00fcksek oranda yeniden kullan\u0131labilir, test edilebilir ve anla\u015f\u0131l\u0131r k\u0131lar. Art\u0131k ilk \"If-Else Cehennemi\"mizden eser kalmad\u0131! Sadece hangi stratejiyi kullanmak istiyorsak onu <code>PaymentContext<\/code>'e veririz ve o da i\u015fi halleder.<\/p>\n<h3>Uygulama ve Test Etme: Refactoring Sonras\u0131<\/h3>\n<p>Strateji aray\u00fcz\u00fcm\u00fcz\u00fc, somut stratejilerimizi ve ba\u011flam s\u0131n\u0131f\u0131m\u0131z\u0131 olu\u015fturduktan sonra, art\u0131k sistemimizi yeni, temiz haliyle kullanabiliriz. \u0130\u015fte refactoring sonras\u0131 kodumuzun nas\u0131l g\u00f6r\u00fcnd\u00fc\u011f\u00fcn\u00fc ve nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6steren bir \u00f6rnek:<\/p>\n<pre><code class=\"language-php\">\n<?php\n\n\/\/ T\u00fcm s\u0131n\u0131flar\u0131 dahil edelim (ger\u00e7ek uygulamada autoloader kullan\u0131l\u0131r)\n\/\/ PaymentStrategy.php\ninterface PaymentStrategy\n{\n    public function pay(float $amount): bool;\n}\n\n\/\/ CreditCardPaymentStrategy.php\nclass CreditCardPaymentStrategy implements PaymentStrategy\n{\n    public function pay(float $amount): bool\n    {\n        echo \"Kredi kart\u0131 ile {$amount} TL \u00f6deme i\u015fleniyor (Strateji).\\n\";\n        if ($amount > 1000) {\n            echo \"1000 TL \u00fczeri i\u015flem i\u00e7in ek g\u00fcvenlik kontrol\u00fc yap\u0131ld\u0131 (Kredi Kart\u0131).\\n\";\n        }\n        return true;\n    }\n}\n\n\/\/ PayPalPaymentStrategy.php\nclass PayPalPaymentStrategy implements PaymentStrategy\n{\n    public function pay(float $amount): bool\n    {\n        echo \"PayPal ile {$amount} TL \u00f6deme i\u015fleniyor (Strateji).\\n\";\n        $commission = $amount * 0.02;\n        echo \"PayPal komisyonu: {$commission} TL (PayPal).\\n\";\n        return true;\n    }\n}\n\n\/\/ BankTransferPaymentStrategy.php\nclass BankTransferPaymentStrategy implements PaymentStrategy\n{\n    public function pay(float $amount): bool\n    {\n        echo \"Banka havalesi ile {$amount} TL \u00f6deme i\u015fleniyor (Strateji).\\n\";\n        echo \"Havale i\u015flemi onay bekliyor (Banka Havalesi).\\n\";\n        return true;\n    }\n}\n\n\/\/ PaymentContext.php\nclass PaymentContext\n{\n    private PaymentStrategy $paymentStrategy;\n\n    public function __construct(PaymentStrategy $paymentStrategy)\n    {\n        $this->paymentStrategy = $paymentStrategy;\n    }\n\n    public function setPaymentStrategy(PaymentStrategy $paymentStrategy): void\n    {\n        $this->paymentStrategy = $paymentStrategy;\n    }\n\n    public function executePayment(float $amount): bool\n    {\n        echo \"\u00d6deme ba\u011flam\u0131 arac\u0131l\u0131\u011f\u0131yla i\u015flem ba\u015flat\u0131l\u0131yor...\\n\";\n        return $this->paymentStrategy->pay($amount);\n    }\n}\n\n\/\/ --- Kullan\u0131m Alan\u0131 (Client Code) ---\n\n\/\/ Kredi kart\u0131 ile \u00f6deme\n$creditCardPayment = new PaymentContext(new CreditCardPaymentStrategy());\n$creditCardPayment->executePayment(250.00);\necho \"---\\n\";\n\n\/\/ PayPal ile \u00f6deme\n$payPalPayment = new PaymentContext(new PayPalPaymentStrategy());\n$payPalPayment->executePayment(75.50);\necho \"---\\n\";\n\n\/\/ Dinamik strateji de\u011fi\u015fimi - \u00f6rne\u011fin ayn\u0131 ba\u011flam nesnesini yeniden kullanmak\n$bankTransferPayment = new PaymentContext(new BankTransferPaymentStrategy());\n$bankTransferPayment->executePayment(1200.00);\necho \"---\\n\";\n\n\/\/ Yeni bir \u00f6deme y\u00f6ntemi eklemek istedi\u011finizde:\n\/\/ 1. Yeni bir PaymentStrategy uygulayan s\u0131n\u0131f olu\u015fturun (\u00f6r: BitcoinPaymentStrategy).\n\/\/ 2. Bu yeni stratejiyi PaymentContext'e verin.\n\/\/ Hi\u00e7bir mevcut s\u0131n\u0131f\u0131 de\u011fi\u015ftirmek zorunda kalmazs\u0131n\u0131z!\n\n?>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, <code>PaymentContext<\/code> s\u0131n\u0131f\u0131 art\u0131k herhangi bir <code>if-else<\/code> blo\u011fu i\u00e7ermiyor. Hangi \u00f6deme stratejisinin kullan\u0131laca\u011f\u0131, <code>PaymentContext<\/code> nesnesi olu\u015fturulurken veya <code>setPaymentStrategy<\/code> metodu arac\u0131l\u0131\u011f\u0131yla \u00e7al\u0131\u015fma zaman\u0131nda belirleniyor. \u0130stemci kod, sadece <code>executePayment<\/code> metodunu \u00e7a\u011f\u0131rarak i\u015flemi ger\u00e7ekle\u015ftiriyor ve altta yatan spesifik \u00f6deme mant\u0131\u011f\u0131yla ilgilenmiyor.<\/p>\n<p>Bu mimari, \"If-Else Cehennemi\"nden tamamen kurtulmam\u0131z\u0131 sa\u011fl\u0131yor ve bir\u00e7ok avantaj sunuyor:<\/p>\n<ul>\n<li><strong>Temiz ve Okunabilir Kod:<\/strong> Her bir s\u0131n\u0131f\u0131n amac\u0131 netle\u015fti.<\/li>\n<li><strong>Y\u00fcksek Geni\u015fletilebilirlik:<\/strong> Yeni bir \u00f6deme y\u00f6ntemi (\u00f6rne\u011fin Bitcoin, Google Pay) eklemek i\u00e7in sadece <code>PaymentStrategy<\/code> aray\u00fcz\u00fcn\u00fc uygulayan yeni bir s\u0131n\u0131f olu\u015fturman\u0131z yeterlidir. Mevcut <code>PaymentContext<\/code> veya di\u011fer strateji s\u0131n\u0131flar\u0131na dokunman\u0131z gerekmez. Bu, A\u00e7\u0131k\/Kapal\u0131 Prensibi'ne m\u00fckemmel bir \u00f6rnektir.<\/li>\n<li><strong>Kolay Test Edilebilirlik:<\/strong> Her bir strateji s\u0131n\u0131f\u0131, kendi i\u00e7inde ba\u011f\u0131ms\u0131z olarak test edilebilir. <code>CreditCardPaymentStrategy<\/code> s\u0131n\u0131f\u0131n\u0131 test etmek i\u00e7in <code>PayPalPaymentStrategy<\/code> s\u0131n\u0131f\u0131na ba\u011f\u0131ml\u0131 de\u011filsiniz.<\/li>\n<li><strong>Tek Sorumluluk:<\/strong> Her s\u0131n\u0131f\u0131n tek bir sorumlulu\u011fu vard\u0131r: <code>PaymentStrategy<\/code> aray\u00fcz\u00fc s\u00f6zle\u015fmeyi tan\u0131mlar, somut stratejiler belirli bir \u00f6deme y\u00f6ntemini uygular ve <code>PaymentContext<\/code> stratejiyi y\u00f6netir ve delege eder.<\/li>\n<\/ul>\n<p>Bu refactoring ile kodumuz \u00e7ok daha esnek, s\u00fcrd\u00fcr\u00fclebilir ve y\u00f6netilebilir hale geldi. Art\u0131k projenizin b\u00fcy\u00fcmesi ve i\u015f gereksinimlerinin de\u011fi\u015fmesi durumunda bile \u00f6deme sisteminizi kolayca adapte edebilirsiniz.<\/p>\n<h2>\u0130leri D\u00fczey Kullan\u0131m: Strateji Desenini Daha Verimli Hale Getirmek<\/h2>\n<p>Strateji Deseni, temel haliyle bile kod kalitesini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Ancak, daha b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda, stratejilerin se\u00e7imi ve y\u00f6netimi konusunda daha geli\u015fmi\u015f yakla\u015f\u0131mlara ihtiya\u00e7 duyabiliriz. Bu b\u00f6l\u00fcmde, Strateji Deseni'nin g\u00fcc\u00fcn\u00fc daha da art\u0131racak baz\u0131 ileri d\u00fczey teknikleri ve en iyi uygulamalar\u0131 inceleyece\u011fiz.<\/p>\n<p>\u00d6zellikle, \u00e7al\u0131\u015fma zaman\u0131nda do\u011fru stratejiyi dinamik olarak se\u00e7me mekanizmas\u0131 ve bu se\u00e7imi daha esnek hale getirme yollar\u0131 \u00f6nemlidir. Geleneksel <code>if-else<\/code> bloklar\u0131ndan ka\u00e7\u0131nmak i\u00e7in strateji se\u00e7iminde de ak\u0131ll\u0131ca davranmal\u0131y\u0131z. Ayr\u0131ca, Strateji Deseni'ni di\u011fer tasar\u0131m desenleri veya prensiplerle birle\u015ftirerek daha sa\u011flam ve performansl\u0131 sistemler nas\u0131l olu\u015fturulur, bu konulara de\u011finece\u011fiz.<\/p>\n<p>Bu teknikler, \u00f6zellikle modern PHP framework'leri (Laravel, Symfony vb.) veya b\u00fcy\u00fck \u00f6l\u00e7ekli kurumsal uygulamalar geli\u015ftirirken \u00e7ok i\u015finize yarayacakt\u0131r. Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (Dependency Injection) konteynerleri gibi ara\u00e7lar, stratejileri y\u00f6netmek i\u00e7in m\u00fckemmel bir ortam sa\u011flar. Performans optimizasyonu ve kod temizli\u011fi i\u00e7in dikkat edilmesi gereken noktalar da bu b\u00f6l\u00fcmde ele al\u0131nacakt\u0131r, b\u00f6ylece strateji desenini sadece uygulamakla kalmayacak, ayn\u0131 zamanda onu en verimli \u015fekilde kullanabileceksiniz.<\/p>\n<h3>Strateji Se\u00e7imini Dinamik Hale Getirmek (Dependency Injection)<\/h3>\n<p>Yukar\u0131daki \u00f6rnekte, istemci kodun do\u011frudan belirli bir strateji s\u0131n\u0131f\u0131n\u0131 \u00f6rnekleyip <code>PaymentContext<\/code>'e enjekte etti\u011fini g\u00f6rd\u00fck (<code>new PaymentContext(new CreditCardPaymentStrategy())<\/code>). K\u00fc\u00e7\u00fck uygulamalar i\u00e7in bu kabul edilebilir olsa da, b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalarda bu yakla\u015f\u0131m istemci kodunu yine de belirli somut stratejilere ba\u011f\u0131ml\u0131 hale getirir. Bu, yeni bir strateji eklendi\u011finde istemci kodunda de\u011fi\u015fiklik yapma ihtiyac\u0131n\u0131 do\u011furabilir.<\/p>\n<p>Bu ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 daha da azaltmak ve strateji se\u00e7imini tamamen dinamik hale getirmek i\u00e7in genellikle <strong>Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (Dependency Injection - DI)<\/strong> ve bir <strong>Strateji Fabrikas\u0131 (Strategy Factory)<\/strong> veya <strong>Registry (Kay\u0131t)<\/strong> yap\u0131s\u0131 kullan\u0131l\u0131r.<\/p>\n<p><strong>Strateji Fabrikas\u0131 Yakla\u015f\u0131m\u0131:<\/strong><\/p>\n<p>Bir strateji fabrikas\u0131, belirli kriterlere g\u00f6re do\u011fru strateji nesnesini d\u00f6nd\u00fcrme sorumlulu\u011funu \u00fcstlenir. Bu sayede istemci kod, hangi stratejiyi se\u00e7ece\u011fini bilmek veya do\u011frudan somut stratejileri \u00f6rneklemek zorunda kalmaz.<\/p>\n<pre><code class=\"language-php\">\n<?php\n\n\/\/ PaymentStrategyFactory.php\nclass PaymentStrategyFactory\n{\n    private array $strategies;\n\n    public function __construct()\n    {\n        \/\/ Ger\u00e7ek uygulamalarda bu listeleme DI konteynerinden veya konfig\u00fcrasyondan gelir.\n        $this->strategies = [\n            'credit_card'   => new CreditCardPaymentStrategy(),\n            'paypal'        => new PayPalPaymentStrategy(),\n            'bank_transfer' => new BankTransferPaymentStrategy(),\n        ];\n    }\n\n    public function getStrategy(string $method): ?PaymentStrategy\n    {\n        if (isset($this->strategies[$method])) {\n            return $this->strategies[$method];\n        }\n        \/\/ E\u011fer strateji bulunamazsa null veya varsay\u0131lan bir strateji d\u00f6nd\u00fcr\u00fclebilir.\n        \/\/ Veya bir istisna f\u0131rlat\u0131labilir.\n        return null;\n    }\n}\n\n\/\/ --- Kullan\u0131m Alan\u0131 (Client Code) ---\n$factory = new PaymentStrategyFactory();\n$paymentMethodFromRequest = 'credit_card'; \/\/ Bu de\u011fer HTTP iste\u011finden gelebilir\n\n$strategy = $factory->getStrategy($paymentMethodFromRequest);\n\nif ($strategy) {\n    $context = new PaymentContext($strategy);\n    $context->executePayment(500.00);\n} else {\n    echo \"Hata: Ge\u00e7ersiz \u00f6deme y\u00f6ntemi se\u00e7ildi.\\n\";\n}\n\n\/\/ Yeni bir strateji eklemek i\u00e7in sadece factory s\u0131n\u0131f\u0131n\u0131 ve strategies dizisini g\u00fcncellersiniz.\n\/\/ \u0130stemci kodunda hi\u00e7bir de\u011fi\u015fiklik yapman\u0131za gerek kalmaz.\n\n?>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu fabrika yap\u0131s\u0131 sayesinde, <code>PaymentContext<\/code>'e hangi stratejinin gidece\u011fini belirleme sorumlulu\u011fu factory s\u0131n\u0131f\u0131na ge\u00e7er. \u0130stemci sadece \"bana bu \u00f6deme y\u00f6ntemi i\u00e7in stratejiyi ver\" der. Bu, <strong>ba\u011f\u0131ml\u0131l\u0131klar\u0131n tersine \u00e7evrilmesi (Inversion of Control - IoC)<\/strong> prensibini daha da g\u00fc\u00e7lendirir.<\/p>\n<p><strong>DI Konteynerleri ile Entegrasyon:<\/strong><\/p>\n<p>Modern PHP framework'lerinde (Laravel, Symfony vb.), bir DI konteyneri stratejileri y\u00f6netmek i\u00e7in harika bir yoldur. Kontenyerin, belirli bir anahtar veya ko\u015fula g\u00f6re uygun strateji \u00f6rne\u011fini resolve etmesini sa\u011flayabilirsiniz.<\/p>\n<pre><code class=\"language-php\">\n<?php\n\n\/\/ Laravel \u00f6rne\u011fi (pseudocode)\n\/\/ ServiceProvider i\u00e7inde kay\u0131t:\n\/\/ $this->app->bind(PaymentStrategy::class, function ($app) {\n\/\/     $method = request()->input('payment_method');\n\/\/     switch ($method) {\n\/\/         case 'credit_card': return $app->make(CreditCardPaymentStrategy::class);\n\/\/         case 'paypal': return $app->make(PayPalPaymentStrategy::class);\n\/\/         \/\/ ...\n\/\/         default: throw new InvalidArgumentException(\"Ge\u00e7ersiz \u00f6deme y\u00f6ntemi.\");\n\/\/     }\n\/\/ });\n\n\/\/ Kontrolc\u00fc veya Servis S\u0131n\u0131f\u0131nda Kullan\u0131m:\n\/\/ public function process(Request $request, PaymentContext $context)\n\/\/ {\n\/\/     \/\/ PaymentContext otomatik olarak do\u011fru PaymentStrategy ile enjekte edilir\n\/\/     $amount = $request->input('amount');\n\/\/     $context->executePayment($amount);\n\/\/ }\n\n?>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yakla\u015f\u0131m, strateji se\u00e7im mant\u0131\u011f\u0131n\u0131 merkezi bir yere ta\u015f\u0131r ve istemci kodunu somut strateji ba\u011f\u0131ml\u0131l\u0131klar\u0131ndan tamamen ay\u0131r\u0131r. Bu da uygulaman\u0131n esnekli\u011fini, test edilebilirli\u011fini ve genel mimarisini zirveye ta\u015f\u0131r. Dependency Injection ve Strateji Deseni birle\u015fimi, s\u00fcrd\u00fcr\u00fclebilir yaz\u0131l\u0131m geli\u015ftirme i\u00e7in g\u00fc\u00e7l\u00fc bir ikilidir.<\/p>\n<h3>Performans \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar<\/h3>\n<p>Strateji Deseni'ni uygularken, performans ve genel kod kalitesini art\u0131rmak i\u00e7in g\u00f6z \u00f6n\u00fcnde bulundurman\u0131z gereken baz\u0131 en iyi uygulamalar ve ipu\u00e7lar\u0131 bulunmaktad\u0131r:<\/p>\n<ol>\n<li><strong>Strateji \u00d6rneklerini Bellekte Tutma (Caching\/Singleton):<\/strong> E\u011fer strateji nesneleriniz durumsuz (stateless) ise ve her \u00e7a\u011fr\u0131da yeni bir \u00f6rnek olu\u015fturulmas\u0131na gerek yoksa, performans i\u00e7in strateji nesnelerini bellekte tutmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz. \u00d6rne\u011fin, bir strateji fabrikas\u0131nda, stratejiler bir kez olu\u015fturulduktan sonra tekrar kullan\u0131labilir. Bu, \u00f6zellikle her istekte y\u00fczlerce kez \u00e7a\u011fr\u0131lan stratejiler i\u00e7in ba\u015flang\u0131\u00e7 maliyetini azalt\u0131r.<\/li>\n<li><strong>Varsay\u0131lan Strateji Kullan\u0131m\u0131:<\/strong> E\u011fer bir strateji bulunamazsa, bir hata f\u0131rlatmak yerine \"varsay\u0131lan\" veya \"Null Object\" deseniyle bir strateji d\u00f6nd\u00fcrmeyi d\u00fc\u015f\u00fcnebilirsiniz. Bu, uygulaman\u0131z\u0131n daha sa\u011flam olmas\u0131n\u0131 sa\u011flar ve beklenmeyen durumlar\u0131 daha zarif bir \u015fekilde y\u00f6netir. \u00d6rne\u011fin, <code>DefaultPaymentStrategy<\/code>, \"Ge\u00e7ersiz \u00f6deme y\u00f6ntemi\" mesaj\u0131n\u0131 g\u00f6sterip <code>false<\/code> d\u00f6nd\u00fcrebilir.<\/li>\n<li><strong>Kriterlerin A\u00e7\u0131k Tan\u0131mlanmas\u0131:<\/strong> Strateji se\u00e7imini (fabrika, registry veya DI konteyneri arac\u0131l\u0131\u011f\u0131yla) yaparken, hangi kriterlere g\u00f6re hangi stratejinin se\u00e7ilece\u011fini a\u00e7\u0131k\u00e7a tan\u0131mlay\u0131n. Bu, kodun anla\u015f\u0131l\u0131rl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r ve gelecekteki de\u011fi\u015fikliklerde karma\u015f\u0131kl\u0131\u011f\u0131 \u00f6nler. Dize tabanl\u0131 anahtarlar yerine enum veya sabitler kullanmak, yaz\u0131m hatalar\u0131n\u0131 azalt\u0131r.<\/li>\n<li><strong>Strateji S\u0131n\u0131flar\u0131n\u0131 K\u00fc\u00e7\u00fck ve Odakl\u0131 Tutma:<\/strong> Her bir strateji s\u0131n\u0131f\u0131n\u0131n tek bir sorumlulu\u011fu olmal\u0131 ve sadece kendi algoritmas\u0131n\u0131 i\u00e7ermelidir. B\u00fcy\u00fck ve karma\u015f\u0131k stratejiler, onlar\u0131 daha k\u00fc\u00e7\u00fck alt stratejilere b\u00f6lerek veya di\u011fer tasar\u0131m desenleriyle (\u00f6rne\u011fin Kompozit Deseni) birle\u015ftirerek iyile\u015ftirilebilir.<\/li>\n<li><strong>S\u0131k\u00e7a De\u011fi\u015fen Davran\u0131\u015flar \u0130\u00e7in Kullan\u0131m:<\/strong> Strateji Deseni'ni, davran\u0131\u015flar\u0131n s\u0131k s\u0131k de\u011fi\u015fti\u011fi veya yeni davran\u0131\u015flar\u0131n eklendi\u011fi alanlarda kullan\u0131n. E\u011fer bir davran\u0131\u015f\u0131n de\u011fi\u015fme olas\u0131l\u0131\u011f\u0131 \u00e7ok d\u00fc\u015f\u00fckse, bu deseni uygulamak a\u015f\u0131r\u0131 m\u00fchendislik (over-engineering) olabilir. Her zaman problemin karma\u015f\u0131kl\u0131\u011f\u0131 ile \u00e7\u00f6z\u00fcm\u00fcn karma\u015f\u0131kl\u0131\u011f\u0131 aras\u0131nda bir denge kurmaya \u00e7al\u0131\u015f\u0131n.<\/li>\n<li><strong>\u0130yi \u0130simlendirme:<\/strong> Strateji aray\u00fczlerine, somut stratejilere ve ba\u011flam s\u0131n\u0131f\u0131na anlaml\u0131 ve a\u00e7\u0131klay\u0131c\u0131 isimler verin. \u00d6rne\u011fin, <code>PaymentStrategy<\/code>, <code>CreditCardPaymentStrategy<\/code>, <code>PaymentContext<\/code> gibi isimler, kodun amac\u0131n\u0131 ilk bak\u0131\u015fta anlamay\u0131 kolayla\u015ft\u0131r\u0131r.<\/li>\n<li><strong>Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu Kullan\u0131m\u0131:<\/strong> Strateji Deseni'ni uygularken, ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu prensibini aktif olarak kullan\u0131n. Ba\u011flam s\u0131n\u0131f\u0131n\u0131n strateji ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 yap\u0131c\u0131 metodu arac\u0131l\u0131\u011f\u0131yla almas\u0131, test edilebilirli\u011fi ve esnekli\u011fi art\u0131r\u0131r. Ayr\u0131ca, genel uygulaman\u0131zda bir DI konteyneri kullan\u0131yorsan\u0131z, stratejilerinizi bu konteyner arac\u0131l\u0131\u011f\u0131yla y\u00f6netmeyi tercih edin.<\/li>\n<\/ol>\n<div class=\"interactive-element\">\n<p><strong>Uzman \u0130pucu:<\/strong> B\u00fcy\u00fck \u00f6l\u00e7ekli bir uygulamada strateji se\u00e7imini optimize etmek i\u00e7in, stratejileri bir dizi yerine bir <code>SplObjectStorage<\/code> (PHP'nin yerle\u015fik nesne haritalama yap\u0131s\u0131) veya benzeri bir veri yap\u0131s\u0131nda tutarak arama s\u00fcrelerini k\u0131saltabilir ve bellek kullan\u0131m\u0131n\u0131 daha verimli hale getirebilirsiniz. Ayr\u0131ca, <code>WeakMap<\/code> gibi yap\u0131lar, strateji nesnelerinin art\u0131k referans edilmedi\u011finde otomatik olarak bellekten kald\u0131r\u0131lmas\u0131n\u0131 sa\u011flayarak bellek y\u00f6netimini optimize edebilir.<\/p>\n<\/p><\/div>\n<p>Bu ipu\u00e7lar\u0131n\u0131 ve en iyi uygulamalar\u0131 takip ederek, Strateji Deseni'nin avantajlar\u0131ndan tam olarak yararlanabilir ve hem performansl\u0131 hem de bak\u0131m\u0131 kolay, esnek PHP uygulamalar\u0131 geli\u015ftirebilirsiniz. Unutmay\u0131n, tasar\u0131m desenleri ara\u00e7lard\u0131r; onlar\u0131 ne zaman ve nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 bilmek, ustala\u015fman\u0131n anahtar\u0131d\u0131r.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<h3>\u00d6zet: Temiz Koda Giden Yol<\/h3>\n<p>Bu kapsaml\u0131 teknik makalede, PHP projelerinde s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan \"If-Else Cehennemi\" sorununu ve bu karma\u015fadan kurtulman\u0131n etkili bir yolu olan Strateji Deseni'ni detayl\u0131 bir \u015fekilde inceledik. Ba\u015flang\u0131\u00e7ta basit g\u00f6r\u00fcnen ko\u015fullu bloklar\u0131n zamanla nas\u0131l bir bak\u0131m kabusuna, kod tekrar\u0131na ve test edilebilirlik sorunlar\u0131na yol a\u00e7t\u0131\u011f\u0131n\u0131 g\u00f6rd\u00fck. Ard\u0131ndan, Strateji Deseni'nin temel yap\u0131s\u0131n\u0131 (Strateji Aray\u00fcz\u00fc, Somut Stratejiler, Ba\u011flam S\u0131n\u0131f\u0131) ve bu desenin polimorfizm g\u00fcc\u00fcn\u00fc nas\u0131l kulland\u0131\u011f\u0131n\u0131 \u00f6\u011frendik.<\/p>\n<p>\u00d6deme i\u015flemleri gibi ger\u00e7ek d\u00fcnya senaryolar\u0131nda ad\u0131m ad\u0131m uygulad\u0131\u011f\u0131m\u0131z vaka analizi sayesinde, <code>if-else<\/code> bloklar\u0131yla dolu bir kod par\u00e7as\u0131n\u0131 nas\u0131l daha mod\u00fcler, esnek ve s\u00fcrd\u00fcr\u00fclebilir bir yap\u0131ya d\u00f6n\u00fc\u015ft\u00fcrebilece\u011fimizi pratik olarak g\u00f6rd\u00fck. Her bir \u00f6deme y\u00f6nteminin kendi strateji s\u0131n\u0131f\u0131na ayr\u0131lmas\u0131yla, kod tekrar\u0131n\u0131 azaltt\u0131k, Tek Sorumluluk \u0130lkesi'ne uyum sa\u011flad\u0131k ve A\u00e7\u0131k\/Kapal\u0131 \u0130lkesi'ni uygulayarak gelecekteki geli\u015ftirmelere kap\u0131 a\u00e7t\u0131k.<\/p>\n<p>Son olarak, strateji se\u00e7imini dinamik hale getirmek i\u00e7in Strateji Fabrikas\u0131 ve Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu gibi ileri d\u00fczey tekniklere de\u011findik ve performans ipu\u00e7lar\u0131 ile en iyi uygulamalar\u0131 payla\u015ft\u0131k. Unutmamak gerekir ki, Strateji Deseni sadece kodunuzu g\u00f6rsel olarak temizlemekle kalmaz, ayn\u0131 zamanda uygulaman\u0131z\u0131n genel mimarisini g\u00fc\u00e7lendirir, test edilebilirli\u011fi art\u0131r\u0131r ve uzun vadede geli\u015ftirme s\u00fcre\u00e7lerinizi h\u0131zland\u0131r\u0131r.<\/p>\n<p>PHP projelerinizde karma\u015f\u0131k ko\u015fullu mant\u0131kla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda, Strateji Deseni'nin sundu\u011fu bu zarif ve g\u00fc\u00e7l\u00fc \u00e7\u00f6z\u00fcm\u00fc g\u00f6z \u00f6n\u00fcnde bulundurarak daha y\u00fcksek kaliteli, bak\u0131m\u0131 kolay ve gelece\u011fe uyumlu yaz\u0131l\u0131mlar in\u015fa edebilirsiniz. If-Else Hell'den kurtulmak sadece bir refactoring ad\u0131m\u0131 de\u011fil, ayn\u0131 zamanda daha iyi bir yaz\u0131l\u0131m m\u00fchendisli\u011fi anlay\u0131\u015f\u0131na do\u011fru at\u0131lan \u00f6nemli bir ad\u0131md\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<ul>\n<li>\n            <strong>Strateji Deseni her zaman <code>if-else<\/code> yerine kullan\u0131lmal\u0131 m\u0131d\u0131r?<\/strong><br \/>\n            Hay\u0131r, her zaman de\u011fil. Strateji Deseni, davran\u0131\u015flar\u0131n s\u0131k\u00e7a de\u011fi\u015fti\u011fi, \u00e7al\u0131\u015fma zaman\u0131nda se\u00e7ilmesi gereken farkl\u0131 algoritmalar\u0131n oldu\u011fu veya yeni algoritmalar\u0131n kolayca eklenebilmesi gereken durumlarda en faydal\u0131d\u0131r. E\u011fer ko\u015fullar\u0131n\u0131z \u00e7ok basitse ve de\u011fi\u015fme olas\u0131l\u0131\u011f\u0131 d\u00fc\u015f\u00fckse, basit bir <code>if-else<\/code> blo\u011fu veya <code>switch<\/code> ifadesi yeterli olabilir. A\u015f\u0131r\u0131 m\u00fchendislikten ka\u00e7\u0131nmak \u00f6nemlidir.\n        <\/li>\n<li>\n            <strong>Strateji Deseni ve Fabrika Deseni aras\u0131ndaki ili\u015fki nedir?<\/strong><br \/>\n            Strateji Deseni, bir algoritma ailesini ve istemcinin bu algoritmalar\u0131 \u00e7al\u0131\u015fma zaman\u0131nda nas\u0131l kullanaca\u011f\u0131n\u0131 tan\u0131mlar. Fabrika Deseni ise nesne olu\u015fturma mant\u0131\u011f\u0131n\u0131 kaps\u00fcller. Bu iki desen genellikle birlikte kullan\u0131l\u0131r. Bir strateji fabrikas\u0131, do\u011fru strateji nesnesini olu\u015fturma ve istemciye sunma sorumlulu\u011funu \u00fcstlenerek, istemcinin hangi somut stratejiyi se\u00e7ece\u011fini bilme ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r. Bu sayede Strateji Deseni daha esnek ve dinamik hale gelir.\n        <\/li>\n<li>\n            <strong>Strateji Deseni kullanman\u0131n performansa olumsuz bir etkisi var m\u0131d\u0131r?<\/strong><br \/>\n            Genel olarak, modern sistemlerdeki performans maliyeti ihmal edilebilir d\u00fczeydedir. Ekstra s\u0131n\u0131f olu\u015fturma ve metod \u00e7a\u011fr\u0131lar\u0131 gibi k\u00fc\u00e7\u00fck bir genel y\u00fck olabilir, ancak bu genellikle kodun esnekli\u011fi, bak\u0131m\u0131 ve test edilebilirli\u011fi gibi sa\u011flad\u0131\u011f\u0131 avantajlar kar\u015f\u0131s\u0131nda \u00f6nemsizdir. E\u011fer strateji nesneleri durumsuz ise (stateless), bunlar\u0131 \u00f6nbelle\u011fe alarak veya tekil (singleton) olarak kullanarak bu k\u00fc\u00e7\u00fck maliyet daha da optimize edilebilir.\n        <\/li>\n<li>\n            <strong>Strateji Deseni ile hangi di\u011fer tasar\u0131m desenlerini birle\u015ftirebilirim?<\/strong><br \/>\n            Strateji Deseni, s\u0131kl\u0131kla Fabrika Deseni (strateji olu\u015fturmak i\u00e7in), Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (stratejileri ba\u011flama enjekte etmek i\u00e7in), Komut Deseni (bir strateji bir komutu uygulayabilir) ve Adapt\u00f6r Deseni (mevcut bir k\u00fct\u00fcphaneyi bir strateji aray\u00fcz\u00fcne uydurmak i\u00e7in) ile birle\u015ftirilir. Ayr\u0131ca, Null Object Deseni, bir strateji bulunamad\u0131\u011f\u0131nda sa\u011flam bir varsay\u0131lan davran\u0131\u015f sa\u011flamak i\u00e7in kullan\u0131labilir.\n        <\/li>\n<\/ul>\n<style>\n        \/* Bu b\u00f6l\u00fcm, mobil uyumlu HTML i\u00e7in genel bir stil \u00f6rne\u011fi sunar. *\/\n        \/* Makalenin ana i\u00e7eri\u011fi PHP refactoring oldu\u011fu i\u00e7in bu CSS kodlar\u0131\n           sadece g\u00f6rsel bir \u00f6rnektir ve makalenin ana konusuna do\u011frudan\n           katk\u0131da bulunmaz, ancak \"mobil uyumlu HTML\" talebini kar\u015f\u0131lamak\n           i\u00e7in eklenmi\u015ftir. *\/<\/p>\n<p>        \/* Genel responsive ayarlar *\/\n        body {\n            font-family: Arial, sans-serif;\n            line-height: 1.6;\n            margin: 0;\n            padding: 20px;\n            box-sizing: border-box;\n        }<\/p>\n<p>        h2, h3 {\n            color: #333;\n            margin-top: 2em;\n        }<\/p>\n<p>        p, ul, ol, table {\n            margin-bottom: 1em;\n            max-width: 100%; \/* \u0130\u00e7erik geni\u015fli\u011fini s\u0131n\u0131rlama *\/\n        }<\/p>\n<p>        \/* Kod bloklar\u0131 i\u00e7in \u00f6zel stiller *\/\n        pre {\n            background-color: #f4f4f4;\n            border: 1px solid #ddd;\n            padding: 10px;\n            border-radius: 5px;\n            overflow-x: auto; \/* Yatay kayd\u0131rma \u00e7ubu\u011fu ekler *\/\n            -webkit-overflow-scrolling: touch; \/* Mobil cihazlarda daha yumu\u015fak kayd\u0131rma *\/\n            white-space: pre-wrap; \/* Metin ta\u015fmas\u0131n\u0131 engeller *\/\n            word-wrap: break-word; \/* Uzun kelimeleri b\u00f6ler *\/\n        }<\/p>\n<p>        code {\n            font-family: 'Courier New', Courier, monospace;\n            color: #d14; \/* Kod rengi *\/\n        }<\/p>\n<p>        \/* \u0130nteraktif \u00f6\u011feler i\u00e7in stil *\/\n        .interactive-element {\n            background-color: #e6f7ff;\n            border-left: 5px solid #0096d6;\n            padding: 15px;\n            margin: 20px 0;\n            border-radius: 4px;\n        }<\/p>\n<p>        \/* Tablolar i\u00e7in responsive d\u00fczenleme *\/\n        table {\n            width: 100%;\n            border-collapse: collapse;\n            margin-top: 20px;\n        }<\/p>\n<p>        th, td {\n            border: 1px solid #ccc;\n            padding: 8px;\n            text-align: left;\n        }<\/p>\n<p>        th {\n            background-color: #f2f2f2;\n        }<\/p>\n<p>        \/* Mobil cihazlar i\u00e7in medya sorgusu \u00f6rne\u011fi *\/\n        @media (max-width: 768px) {\n            body {\n                padding: 15px;\n            }\n            h2 {\n                font-size: 1.8em;\n            }\n            h3 {\n                font-size: 1.4em;\n            }\n            \/* Tablolar\u0131n mobil cihazlarda daha iyi g\u00f6r\u00fcnmesini sa\u011flamak i\u00e7in *\/\n            table, thead, tbody, th, td, tr {\n                display: block;\n            }\n            thead tr {\n                position: absolute;\n                top: -9999px;\n                left: -9999px;\n            }\n            tr { border: 1px solid #ccc; }\n            td {\n                border: none;\n                border-bottom: 1px solid #eee;\n                position: relative;\n                padding-left: 50%;\n            }\n            td:before {\n                position: absolute;\n                top: 6px;\n                left: 6px;\n                width: 45%;\n                padding-right: 10px;\n                white-space: nowrap;\n                content: attr(data-label); \/* data-label niteli\u011fi ile ba\u015fl\u0131k g\u00f6ster *\/\n                font-weight: bold;\n            }\n        }\n    <\/style>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"PHP projelerinizde karma\u015f\u0131k if-else bloklar\u0131 aras\u0131nda kaybolmak, kodunuzun s\u00fcrd\u00fcr\u00fclebilirli\u011fini ve okunabilirli\u011fini tehlikeye atar. Bu teknik makale, \u201cIf-Else Cehennemi\u201d&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[133],"tags":[],"class_list":{"0":"post-35117","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-php","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PHP&#039;de If-Else Cehenneminden Strateji Deseniyle Kurtulmak<\/title>\n<meta name=\"description\" content=\"PHP projelerinizde karma\u015f\u0131k if-else bloklar\u0131 aras\u0131nda kaybolmak, kodunuzun s\u00fcrd\u00fcr\u00fclebilirli\u011fini ve okunabilirli\u011fini tehlikeye atar. Bu teknik makale, \u201cIf-Else Cehennemi\u201d olarak adland\u0131r\u0131lan bu durumu Strateji Deseni (Strategy Pattern) ile nas\u0131l a\u015faca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor. Kod kalitenizi art\u0131rarak daha esnek ve y\u00f6netilebilir sistemler kurman\u0131n yollar\u0131n\u0131 ke\u015ffedin.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PHP&#039;de If-Else Cehenneminden Strateji Deseniyle Kurtulmak\" \/>\n<meta property=\"og:description\" content=\"PHP projelerinizde karma\u015f\u0131k if-else bloklar\u0131 aras\u0131nda kaybolmak, kodunuzun s\u00fcrd\u00fcr\u00fclebilirli\u011fini ve okunabilirli\u011fini tehlikeye atar. Bu teknik makale, \u201cIf-Else Cehennemi\u201d olarak adland\u0131r\u0131lan bu durumu Strateji Deseni (Strategy Pattern) ile nas\u0131l a\u015faca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor. Kod kalitenizi art\u0131rarak daha esnek ve y\u00f6netilebilir sistemler kurman\u0131n yollar\u0131n\u0131 ke\u015ffedin.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-25T19:01:25+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"25 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"PHP&#8217;de If-Else Cehenneminden Strateji Deseniyle Kurtulmak\",\"datePublished\":\"2025-11-25T19:01:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/\"},\"wordCount\":5724,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"PHP\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/\",\"name\":\"PHP'de If-Else Cehenneminden Strateji Deseniyle Kurtulmak\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-25T19:01:25+00:00\",\"description\":\"PHP projelerinizde karma\u015f\u0131k if-else bloklar\u0131 aras\u0131nda kaybolmak, kodunuzun s\u00fcrd\u00fcr\u00fclebilirli\u011fini ve okunabilirli\u011fini tehlikeye atar. Bu teknik makale, \u201cIf-Else Cehennemi\u201d olarak adland\u0131r\u0131lan bu durumu Strateji Deseni (Strategy Pattern) ile nas\u0131l a\u015faca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor. Kod kalitenizi art\u0131rarak daha esnek ve y\u00f6netilebilir sistemler kurman\u0131n yollar\u0131n\u0131 ke\u015ffedin.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PHP&#8217;de If-Else Cehenneminden Strateji Deseniyle Kurtulmak\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"PHP'de If-Else Cehenneminden Strateji Deseniyle Kurtulmak","description":"PHP projelerinizde karma\u015f\u0131k if-else bloklar\u0131 aras\u0131nda kaybolmak, kodunuzun s\u00fcrd\u00fcr\u00fclebilirli\u011fini ve okunabilirli\u011fini tehlikeye atar. Bu teknik makale, \u201cIf-Else Cehennemi\u201d olarak adland\u0131r\u0131lan bu durumu Strateji Deseni (Strategy Pattern) ile nas\u0131l a\u015faca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor. Kod kalitenizi art\u0131rarak daha esnek ve y\u00f6netilebilir sistemler kurman\u0131n yollar\u0131n\u0131 ke\u015ffedin.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/","og_locale":"tr_TR","og_type":"article","og_title":"PHP'de If-Else Cehenneminden Strateji Deseniyle Kurtulmak","og_description":"PHP projelerinizde karma\u015f\u0131k if-else bloklar\u0131 aras\u0131nda kaybolmak, kodunuzun s\u00fcrd\u00fcr\u00fclebilirli\u011fini ve okunabilirli\u011fini tehlikeye atar. Bu teknik makale, \u201cIf-Else Cehennemi\u201d olarak adland\u0131r\u0131lan bu durumu Strateji Deseni (Strategy Pattern) ile nas\u0131l a\u015faca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor. Kod kalitenizi art\u0131rarak daha esnek ve y\u00f6netilebilir sistemler kurman\u0131n yollar\u0131n\u0131 ke\u015ffedin.","og_url":"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-25T19:01:25+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"25 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"PHP&#8217;de If-Else Cehenneminden Strateji Deseniyle Kurtulmak","datePublished":"2025-11-25T19:01:25+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/"},"wordCount":5724,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["PHP"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/","url":"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/","name":"PHP'de If-Else Cehenneminden Strateji Deseniyle Kurtulmak","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-25T19:01:25+00:00","description":"PHP projelerinizde karma\u015f\u0131k if-else bloklar\u0131 aras\u0131nda kaybolmak, kodunuzun s\u00fcrd\u00fcr\u00fclebilirli\u011fini ve okunabilirli\u011fini tehlikeye atar. Bu teknik makale, \u201cIf-Else Cehennemi\u201d olarak adland\u0131r\u0131lan bu durumu Strateji Deseni (Strategy Pattern) ile nas\u0131l a\u015faca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor. Kod kalitenizi art\u0131rarak daha esnek ve y\u00f6netilebilir sistemler kurman\u0131n yollar\u0131n\u0131 ke\u015ffedin.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/phpde-if-else-cehenneminden-strateji-deseniyle-kurtulmak\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PHP&#8217;de If-Else Cehenneminden Strateji Deseniyle Kurtulmak"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35117","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=35117"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35117\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35117"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35117"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35117"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}