{"id":34464,"date":"2025-11-17T02:01:37","date_gmt":"2025-11-16T23:01:37","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/"},"modified":"2025-11-17T02:01:37","modified_gmt":"2025-11-16T23:01:37","slug":"python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/","title":{"rendered":"Python Tasar\u0131m Desenleriyle Temiz Mimari Nas\u0131l Olu\u015fturulur?"},"content":{"rendered":"<p><body><\/p>\n<p>Modern Python projelerinde yaz\u0131l\u0131m\u0131n s\u00fcrd\u00fcr\u00fclebilirli\u011fini, test edilebilirli\u011fini ve \u00f6l\u00e7eklenebilirli\u011fini sa\u011flamak, her geli\u015ftiricinin en b\u00fcy\u00fck hedeflerindendir. Ancak, zamanla karma\u015f\u0131kla\u015fan kod tabanlar\u0131, projenin y\u00f6netimini bir kabusa \u00e7evirebilir. Peki, bu sorunlar\u0131n \u00fcstesinden gelmek ve uzun \u00f6m\u00fcrl\u00fc, sa\u011fl\u0131kl\u0131 uygulamalar in\u015fa etmek m\u00fcmk\u00fcn m\u00fc? Elbette! Bu makale, Python tasar\u0131m desenlerini kullanarak temiz mimari prensiplerini projelerinize nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacak, b\u00f6ylece daha esnek ve g\u00fc\u00e7l\u00fc sistemler geli\u015ftirebileceksiniz.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m d\u00fcnyas\u0131nda, bir projenin sadece \u00e7al\u0131\u015f\u0131r durumda olmas\u0131 yeterli de\u011fildir; ayn\u0131 zamanda de\u011fi\u015fen gereksinimlere h\u0131zla adapte olabilmeli, kolayca test edilebilmeli ve yeni \u00f6zellikler eklendi\u011finde mevcut yap\u0131y\u0131 bozmamal\u0131d\u0131r. Ne yaz\u0131k ki, bir\u00e7ok proje ba\u015flang\u0131\u00e7ta h\u0131zl\u0131 geli\u015fim vaadiyle spagetti koda d\u00f6n\u00fc\u015fme potansiyeli ta\u015f\u0131r. Ba\u011f\u0131ml\u0131l\u0131klar\u0131n i\u00e7 i\u00e7e ge\u00e7ti\u011fi, i\u015f mant\u0131\u011f\u0131n\u0131n veritaban\u0131 sorgular\u0131yla kar\u0131\u015ft\u0131\u011f\u0131 veya kullan\u0131c\u0131 aray\u00fcz\u00fc bile\u015fenlerinin direkt i\u015f kurallar\u0131na m\u00fcdahale etti\u011fi yap\u0131lar, zamanla bak\u0131m\u0131 zor, hatalara a\u00e7\u0131k ve geli\u015ftirici verimlili\u011fini d\u00fc\u015f\u00fcren canavarlara d\u00f6n\u00fc\u015f\u00fcr. Bu durum, \u00f6zellikle b\u00fcy\u00fck ve uzun soluklu Python uygulamalar\u0131 i\u00e7in ciddi bir engel te\u015fkil eder. De\u011fi\u015fen veritaban\u0131 teknolojileri, farkl\u0131 kullan\u0131c\u0131 aray\u00fcz\u00fc gereksinimleri veya \u00fc\u00e7\u00fcnc\u00fc taraf API entegrasyonlar\u0131 gibi d\u0131\u015f fakt\u00f6rler, mimarisi zay\u0131f bir sistemi kolayca \u00e7\u00f6kertebilir.<\/p>\n<p>Temiz Mimari (Clean Architecture) ise tam da bu noktada devreye girerek, yaz\u0131l\u0131m\u0131n temel i\u015f kurallar\u0131n\u0131 (domain logic) d\u0131\u015f etkenlerden (veritaban\u0131, UI, framework&#8217;ler) izole etmeyi ama\u00e7lar. Bu yakla\u015f\u0131m, yaz\u0131l\u0131m\u0131n farkl\u0131 katmanlar aras\u0131nda net bir sorumluluk ayr\u0131m\u0131 yapmas\u0131n\u0131 sa\u011flayarak, her bir bile\u015fenin kendi i\u015fini en iyi \u015fekilde yapmas\u0131n\u0131 hedefler. Temiz mimari, bir yandan kodun okunabilirli\u011fini ve anla\u015f\u0131l\u0131rl\u0131\u011f\u0131n\u0131 art\u0131r\u0131rken, di\u011fer yandan her bir mod\u00fcl\u00fcn ba\u011f\u0131ms\u0131z olarak geli\u015ftirilmesine ve test edilmesine olanak tan\u0131r. Python&#8217;\u0131n esnek yap\u0131s\u0131 ve zengin k\u00fct\u00fcphane ekosistemi, bu mimari prensiplerini uygulamak i\u00e7in m\u00fckemmel bir ortam sunar. Do\u011fru tasar\u0131m desenleri ve katmanl\u0131 bir yakla\u015f\u0131mla, Python projelerimizi gelece\u011fe haz\u0131r, s\u00fcrd\u00fcr\u00fclebilir ve y\u00fcksek kaliteli yap\u0131lar haline getirebiliriz. Bu sayede, geli\u015ftiriciler yeni \u00f6zellikler eklerken veya mevcut hatalar\u0131 giderirken \u00e7ok daha az stres ya\u015far, proje maliyetleri d\u00fc\u015fer ve \u00fcr\u00fcn\u00fcn piyasaya s\u00fcr\u00fclme s\u00fcresi k\u0131sal\u0131r. \u00d6zetle, temiz mimari, yaz\u0131l\u0131m geli\u015ftirme s\u00fcrecinin her a\u015famas\u0131nda hem teknik ekip hem de i\u015fletme i\u00e7in somut faydalar sa\u011flar.<\/p>\n<h2>Temiz Mimari (Clean Architecture) Nedir ve Temel Prensipleri Nelerdir?<\/h2>\n<p>Temiz Mimari, Robert C. Martin (Uncle Bob) taraf\u0131ndan pop\u00fcler hale getirilen, yaz\u0131l\u0131m sistemlerini d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klardan (veritabanlar\u0131, UI, \u00e7er\u00e7eveler vb.) m\u00fcmk\u00fcn oldu\u011funca izole eden, test edilebilirli\u011fi ve s\u00fcrd\u00fcr\u00fclebilirli\u011fi y\u00fcksek bir mimari yakla\u015f\u0131md\u0131r. Temel prensibi, yaz\u0131l\u0131m\u0131n \u00e7ekirdek i\u015f mant\u0131\u011f\u0131n\u0131 (domain logic) merkeze almak ve di\u011fer t\u00fcm unsurlar\u0131 bu \u00e7ekirde\u011fin etraf\u0131na katmanlar halinde sarmakt\u0131r. Bu katmanlar, i\u00e7ten d\u0131\u015fa do\u011fru bir ba\u011f\u0131ml\u0131l\u0131k hiyerar\u015fisi olu\u015fturur; yani d\u0131\u015f katmanlar i\u00e7 katmanlara ba\u011fl\u0131 olabilirken, i\u00e7 katmanlar d\u0131\u015f katmanlar hakk\u0131nda hi\u00e7bir bilgiye sahip olmamal\u0131d\u0131r. Bu ba\u011f\u0131ms\u0131zl\u0131k, projenin herhangi bir katman\u0131nda yap\u0131lan bir de\u011fi\u015fikli\u011fin, di\u011fer katmanlar\u0131 minimal d\u00fczeyde etkilemesini sa\u011flar.<\/p>\n<p>Temiz Mimari&#8217;nin en bilinen g\u00f6rsel temsili, konsantrik halkalard\u0131r. En i\u00e7teki halka &#8220;Varl\u0131klar&#8221; (Entities) veya &#8220;\u0130\u015f Kurallar\u0131&#8221;n\u0131 (Domain Objects) temsil eder. Bunlar, uygulaman\u0131n en temel i\u015f nesneleri ve genel i\u015f kurallar\u0131d\u0131r. Bu katman, hi\u00e7bir d\u0131\u015f katmandan etkilenmez ve t\u00fcm sistemin de\u011fi\u015fime en kapal\u0131 k\u0131sm\u0131d\u0131r. Bir sonraki halka &#8220;Kullan\u0131m Durumlar\u0131&#8221;n\u0131 (Use Cases) i\u00e7erir. Bu katman, uygulaman\u0131n belirli senaryolar\u0131n\u0131 veya i\u015f ak\u0131\u015flar\u0131n\u0131 tan\u0131mlayan uygulama bazl\u0131 i\u015f kurallar\u0131d\u0131r. Varl\u0131klar ile etkile\u015fime girer ancak veritaban\u0131 veya kullan\u0131c\u0131 aray\u00fcz\u00fc gibi detaylar hakk\u0131nda bilgi sahibi de\u011fildir. D\u0131\u015fa do\u011fru ilerlerken, &#8220;Arabirim Ba\u011fda\u015ft\u0131r\u0131c\u0131lar\u0131&#8221; (Interface Adapters) katman\u0131 gelir. Bu katman, i\u00e7teki kullan\u0131m durumlar\u0131 ile d\u0131\u015f d\u00fcnya aras\u0131ndaki ileti\u015fimi sa\u011flar. Veritaban\u0131 a\u011f ge\u00e7itleri (Repository implementations), API denetleyicileri (Controllers) ve sunumcular (Presenters) bu katmanda yer al\u0131r. Son olarak, en d\u0131\u015ftaki halka &#8220;\u00c7er\u00e7eveler ve S\u00fcr\u00fcc\u00fcler&#8221; (Frameworks &#038; Drivers) katman\u0131d\u0131r. Bu katman, veritaban\u0131 sistemleri, web \u00e7er\u00e7eveleri (Django, Flask), kullan\u0131c\u0131 aray\u00fczleri ve harici API&#8217;ler gibi t\u00fcm d\u0131\u015f ara\u00e7lar\u0131 ve teknolojileri bar\u0131nd\u0131r\u0131r. Bu d\u0131\u015f katman, i\u00e7 katmanlardan tamamen ba\u011f\u0131ms\u0131zd\u0131r ve herhangi bir d\u0131\u015f teknoloji kolayca de\u011fi\u015ftirilebilir veya farkl\u0131 bir uygulamaya aktar\u0131labilir.<\/p>\n<p>Bu yap\u0131n\u0131n temelinde, SOLID prensipleri yatar: Tek Sorumluluk Prensibi (SRP), A\u00e7\u0131k\/Kapal\u0131 Prensibi (OCP), Liskov Yerine Ge\u00e7me Prensibi (LSP), Aray\u00fcz Ay\u0131rma Prensibi (ISP) ve Ba\u011f\u0131ml\u0131l\u0131k Tersine \u00c7evirme Prensibi (DIP). \u00d6zellikle Ba\u011f\u0131ml\u0131l\u0131k Tersine \u00c7evirme Prensibi (DIP), temiz mimarinin kalbinde yer al\u0131r. Bu prensip, y\u00fcksek seviyeli mod\u00fcllerin d\u00fc\u015f\u00fck seviyeli mod\u00fcllere ba\u011f\u0131ml\u0131 olmamas\u0131 gerekti\u011fini, her ikisinin de soyutlamalara ba\u011f\u0131ml\u0131 olmas\u0131 gerekti\u011fini s\u00f6yler. Ayr\u0131ca, soyutlamalar\u0131n detaylara ba\u011f\u0131ml\u0131 olmamas\u0131, detaylar\u0131n soyutlamalara ba\u011f\u0131ml\u0131 olmas\u0131 gerekti\u011fini vurgular. Python&#8217;da soyut s\u0131n\u0131flar (ABC mod\u00fcl\u00fc ile) ve aray\u00fczler (protokoller veya soyut metotlar arac\u0131l\u0131\u011f\u0131yla) kullanarak bu ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netebiliriz. Bu sayede, \u00f6rne\u011fin bir veritaban\u0131 de\u011fi\u015ftirildi\u011finde, sadece &#8220;Arabirim Ba\u011fda\u015ft\u0131r\u0131c\u0131lar\u0131&#8221; katman\u0131ndaki ilgili Repository implementasyonunu de\u011fi\u015ftirmek yeterli olur, \u00e7ekirdek i\u015f mant\u0131\u011f\u0131na dokunmaya gerek kalmaz. Bu g\u00fc\u00e7l\u00fc ayr\u0131m, projenin ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca esneklik, bak\u0131m kolayl\u0131\u011f\u0131 ve maliyet etkinli\u011fi sa\u011flar, b\u00f6ylece geli\u015ftiriciler daha \u00e7ok i\u015f de\u011feri yaratan \u00f6zelliklere odaklanabilir.<\/p>\n<h2>Python Tasar\u0131m Desenleri: Temiz Mimariye Giden Yol<\/h2>\n<p>Tasar\u0131m desenleri, yaz\u0131l\u0131m m\u00fchendisli\u011finde s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan problemleri \u00e7\u00f6zmek i\u00e7in genel, tekrar kullan\u0131labilir \u00e7\u00f6z\u00fcmler sunan \u015fablonlard\u0131r. Gang of Four (GoF) taraf\u0131ndan kategorize edilen bu desenler, yarat\u0131msal (creational), yap\u0131sal (structural) ve davran\u0131\u015fsal (behavioral) olmak \u00fczere \u00fc\u00e7 ana gruba ayr\u0131l\u0131r. Temiz mimarinin temel amac\u0131 olan katmanlar aras\u0131 ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 azaltmak, test edilebilirli\u011fi art\u0131rmak ve esnek bir yap\u0131 kurmak i\u00e7in tasar\u0131m desenleri vazge\u00e7ilmez ara\u00e7lard\u0131r. Python&#8217;\u0131n dinamik ve esnek do\u011fas\u0131, bu desenleri uygulamak i\u00e7in g\u00fc\u00e7l\u00fc olanaklar sunar ve \u00e7o\u011fu zaman GoF desenlerinin daha basit, &#8220;Pythonik&#8221; versiyonlar\u0131n\u0131 kullanmam\u0131za imkan tan\u0131r.<\/p>\n<p>Yarat\u0131msal desenler, nesne yaratma mekanizmalar\u0131n\u0131 soyutlayarak, istemcinin hangi nesnenin yarat\u0131ld\u0131\u011f\u0131n\u0131 bilmeden kullanmas\u0131n\u0131 sa\u011flar. Temiz mimaride, \u00f6zellikle d\u0131\u015f katmanlar\u0131n i\u00e7 katmanlara olan ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00f6netirken veya farkl\u0131 veritaban\u0131 s\u00fcr\u00fcc\u00fcleri gibi somut implementasyonlar\u0131 se\u00e7erken Fabrika (Factory) veya Olu\u015fturucu (Builder) desenlerinden faydalan\u0131r\u0131z. Bu desenler, Ba\u011f\u0131ml\u0131l\u0131k Tersine \u00c7evirme Prensibi&#8217;ni (DIP) uygulamak i\u00e7in kritik \u00f6neme sahiptir, \u00e7\u00fcnk\u00fc hangi somut s\u0131n\u0131f\u0131n \u00f6rneklenece\u011fine dair karar\u0131 bir aray\u00fcz veya soyutlama arkas\u0131na gizlerler. \u00d6rne\u011fin, bir <code>UserRepository<\/code> aray\u00fcz\u00fcn\u00fcn farkl\u0131 veritaban\u0131 implementasyonlar\u0131n\u0131 (SQL, NoSQL) bir Fabrika deseni ile dinamik olarak olu\u015fturabiliriz.<\/p>\n<p>Yap\u0131sal desenler, nesnelerin ve s\u0131n\u0131flar\u0131n b\u00fcy\u00fck yap\u0131lar\u0131 olu\u015fturmak i\u00e7in nas\u0131l birle\u015ftirilece\u011fini ele al\u0131r. Adapt\u00f6r (Adapter), Vekil (Proxy) veya Cephe (Facade) gibi desenler, sistemdeki farkl\u0131 bile\u015fenler aras\u0131ndaki ili\u015fkileri d\u00fczenleyerek mod\u00fclerli\u011fi art\u0131r\u0131r ve karma\u015f\u0131kl\u0131\u011f\u0131 azalt\u0131r. Temiz mimaride, farkl\u0131 harici sistemlerle (\u00fc\u00e7\u00fcnc\u00fc taraf API&#8217;ler, legacy sistemler) entegrasyon yaparken veya katmanlar aras\u0131nda uyumsuz aray\u00fczleri birle\u015ftirirken yap\u0131sal desenlerden yararlan\u0131r\u0131z. \u00d6rne\u011fin, bir legacy loglama sistemini yeni bir loglama aray\u00fcz\u00fcne Adapt\u00f6r deseniyle ba\u011flayabilir veya bir veritaban\u0131 ba\u011flant\u0131 havuzuna eri\u015fimi Vekil deseniyle kontrol edebiliriz. Bu sayede, i\u00e7 katmanlar d\u0131\u015f sistemlerin karma\u015f\u0131kl\u0131\u011f\u0131ndan veya de\u011fi\u015fikliklerinden korunmu\u015f olur.<\/p>\n<p>Davran\u0131\u015fsal desenler ise, nesneler aras\u0131ndaki ileti\u015fim ve sorumluluk da\u011f\u0131l\u0131m\u0131n\u0131 optimize eder. Strateji (Strategy), Komut (Command) veya G\u00f6zlemci (Observer) gibi desenler, i\u015f mant\u0131\u011f\u0131n\u0131n ve algoritmalar\u0131n esnek bir \u015fekilde de\u011fi\u015ftirilmesine, nesneler aras\u0131ndaki ba\u011flant\u0131lar\u0131n gev\u015femesine yard\u0131mc\u0131 olur. Temiz mimaride, kullan\u0131m durumlar\u0131 (use cases) katman\u0131nda farkl\u0131 i\u015f kurallar\u0131n\u0131 uygulamak veya kullan\u0131c\u0131 aray\u00fcz\u00fc olaylar\u0131n\u0131 i\u015flemek i\u00e7in davran\u0131\u015fsal desenler s\u0131kl\u0131kla kullan\u0131l\u0131r. \u00d6rne\u011fin, bir \u00f6deme i\u015fleminde farkl\u0131 \u00f6deme y\u00f6ntemlerini (kredi kart\u0131, banka havalesi) Strateji deseniyle y\u00f6netebilir veya bir i\u015flem listesini Komut deseniyle geri al\u0131nabilir hale getirebiliriz. Bu desenler, A\u00e7\u0131k\/Kapal\u0131 Prensibi&#8217;ni (OCP) destekleyerek, yeni \u00f6zellikler eklendi\u011finde mevcut kodun de\u011fi\u015ftirilmesini engeller ve sistemin geni\u015flemesini kolayla\u015ft\u0131r\u0131r. Genel olarak, tasar\u0131m desenlerini temiz mimariyle birlikte kullanmak, projelerinizi daha sa\u011flam, esnek ve bak\u0131m\u0131 kolay hale getirir, b\u00f6ylece uzun vadede geli\u015ftirme maliyetlerinden ve potansiyel hatalardan tasarruf etmenizi sa\u011flar. Her bir desen, belirli bir problemi \u00e7\u00f6zmek i\u00e7in belirli bir ba\u011flamda en iyi sonucu verir; bu nedenle, do\u011fru deseni do\u011fru yerde kullanmak, temiz mimarinin ba\u015far\u0131s\u0131 i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<h3>Yarat\u0131msal Desenlerle Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Y\u00f6netmek: Fabrika (Factory) ve Builder Desenleri Nas\u0131l Kullan\u0131l\u0131r?<\/h3>\n<p>Temiz mimaride ba\u011f\u0131ml\u0131l\u0131klar\u0131n y\u00f6netimi, projenin s\u00fcrd\u00fcr\u00fclebilirli\u011fi a\u00e7\u0131s\u0131ndan kilit bir rol oynar. \u00d6zellikle d\u0131\u015f katmanlardaki somut implementasyonlara olan ba\u011f\u0131ml\u0131l\u0131klar\u0131 azaltmak ve i\u00e7 katmanlar\u0131n bu detaylardan habersiz kalmas\u0131n\u0131 sa\u011flamak i\u00e7in yarat\u0131msal tasar\u0131m desenleri olduk\u00e7a etkilidir. Fabrika (Factory) ve Builder (Olu\u015fturucu) desenleri, nesne olu\u015fturma s\u00fcre\u00e7lerini soyutlayarak bu amaca hizmet eder.<\/p>\n<h4>Fabrika Metodu (Factory Method) Deseni<\/h4>\n<p>Fabrika Metodu deseni, bir nesne olu\u015fturma sorumlulu\u011funu alt s\u0131n\u0131flara devreder. B\u00f6ylece, \u00fcst s\u0131n\u0131f hangi somut s\u0131n\u0131f\u0131n \u00f6rneklenece\u011fini bilmeden nesnelerle \u00e7al\u0131\u015fabilir. Bu, Ba\u011f\u0131ml\u0131l\u0131k Tersine \u00c7evirme Prensibi&#8217;nin (DIP) harika bir uygulamas\u0131d\u0131r, \u00e7\u00fcnk\u00fc y\u00fcksek seviyeli mod\u00fcller (\u00f6rne\u011fin, bir Use Case) d\u00fc\u015f\u00fck seviyeli mod\u00fcllerin (\u00f6rne\u011fin, farkl\u0131 veritaban\u0131 implementasyonlar\u0131) somut s\u0131n\u0131flar\u0131na ba\u011f\u0131ml\u0131 olmaz, bunun yerine soyut bir aray\u00fcze veya fonksiyona ba\u011f\u0131ml\u0131 olur. Bir e-ticaret uygulamas\u0131nda farkl\u0131 \u00f6deme y\u00f6ntemlerini ele alal\u0131m. \u00d6deme i\u015fleme mant\u0131\u011f\u0131, belirli bir \u00f6deme sa\u011flay\u0131c\u0131s\u0131na (PayPal, Stripe, Banka Havalesi) do\u011frudan ba\u011f\u0131ml\u0131 olmamal\u0131d\u0131r. Bunun yerine, bir \u00f6deme fabrikas\u0131, istenen t\u00fcre g\u00f6re do\u011fru \u00f6deme i\u015fleyiciyi d\u00f6nd\u00fcrebilir.<\/p>\n<pre><code>\n# app\/domain\/interfaces.py\nfrom abc import ABC, abstractmethod\n\nclass PaymentProcessor(ABC):\n    @abstractmethod\n    def process_payment(self, amount: float) -> str:\n        pass\n\n# app\/infrastructure\/payment_gateways.py\nclass PayPalProcessor(PaymentProcessor):\n    def process_payment(self, amount: float) -> str:\n        return f\"PayPal ile {amount} birim \u00f6deme i\u015flendi.\"\n\nclass StripeProcessor(PaymentProcessor):\n    def process_payment(self, amount: float) -> str:\n        return f\"Stripe ile {amount} birim \u00f6deme i\u015flendi.\"\n\n# app\/application\/factories.py\nclass PaymentProcessorFactory:\n    @staticmethod\n    def get_processor(processor_type: str) -> PaymentProcessor:\n        if processor_type == \"paypal\":\n            return PayPalProcessor()\n        elif processor_type == \"stripe\":\n            return StripeProcessor()\n        else:\n            raise ValueError(\"Ge\u00e7ersiz \u00f6deme i\u015flemci tipi.\")\n\n# app\/application\/use_cases.py\nclass ProcessOrderUseCase:\n    def execute(self, amount: float, payment_type: str):\n        processor = PaymentProcessorFactory.get_processor(payment_type)\n        result = processor.process_payment(amount)\n        return f\"Sipari\u015f i\u015flendi: {result}\"\n\n# Kullan\u0131m\nif __name__ == \"__main__\":\n    use_case = ProcessOrderUseCase()\n    print(use_case.execute(100.0, \"paypal\"))\n    print(use_case.execute(250.0, \"stripe\"))\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>ProcessOrderUseCase<\/code> direkt olarak <code>PayPalProcessor<\/code> veya <code>StripeProcessor<\/code> s\u0131n\u0131flar\u0131na ba\u011f\u0131ml\u0131 de\u011fildir. Bunun yerine, soyut <code>PaymentProcessor<\/code> aray\u00fcz\u00fcn\u00fc kullanan bir fabrika arac\u0131l\u0131\u011f\u0131yla \u00f6deme i\u015flemcisini al\u0131r. Bu sayede yeni bir \u00f6deme y\u00f6ntemi eklendi\u011finde (\u00f6rne\u011fin Banka Havalesi), <code>PaymentProcessorFactory<\/code>'yi g\u00fcncelleyip yeni bir s\u0131n\u0131f eklemek yeterli olacakt\u0131r; <code>ProcessOrderUseCase<\/code> kodunda herhangi bir de\u011fi\u015fiklik yapmaya gerek kalmaz.<\/p>\n<aside class=\"expert-tip\">\n        Uzman \u0130pucu: Fabrika Metodu deseni, \u00f6zellikle farkl\u0131 veritaban\u0131 ba\u011flant\u0131lar\u0131, dosya depolama sa\u011flay\u0131c\u0131lar\u0131 veya mesaj kuyru\u011fu implementasyonlar\u0131 gibi harici sistemlerle entegrasyon yaparken Clean Architecture'\u0131n Infrastructure katman\u0131nda ba\u011f\u0131ml\u0131l\u0131klar\u0131 azaltmak i\u00e7in \u00e7ok etkilidir.<br \/>\n    <\/aside>\n<h4>Builder (Olu\u015fturucu) Deseni<\/h4>\n<p>Builder deseni, karma\u015f\u0131k nesnelerin ad\u0131m ad\u0131m olu\u015fturulmas\u0131n\u0131 sa\u011flar. Bu desen, ayn\u0131 in\u015fa s\u00fcrecinin farkl\u0131 g\u00f6sterimler \u00fcretebilmesini m\u00fcmk\u00fcn k\u0131lar. \u00d6zellikle, bir nesnenin bir\u00e7ok iste\u011fe ba\u011fl\u0131 \u00f6zelli\u011fi oldu\u011funda ve farkl\u0131 kombinasyonlarda olu\u015fturulmas\u0131 gerekti\u011finde kullan\u0131\u015fl\u0131d\u0131r. Temiz mimaride, karma\u015f\u0131k raporlar, kullan\u0131c\u0131 profilleri veya veri transfer nesneleri (DTO'lar) gibi varl\u0131klar\u0131 olu\u015ftururken Builder deseninden yararlanabiliriz. \u00d6rne\u011fin, bir \"Rapor Olu\u015fturucu\" nesnesi, farkl\u0131 filtreler, s\u0131ralama kriterleri ve \u00e7\u0131kt\u0131 formatlar\u0131yla bir rapor nesnesi olu\u015fturabilir.<\/p>\n<pre><code>\n# app\/domain\/entities.py\nclass Report:\n    def __init__(self):\n        self.title = \"\"\n        self.header = \"\"\n        self.body = []\n        self.footer = \"\"\n        self.format = \"PDF\"\n\n    def __str__(self):\n        body_str = \"\\n\".join(self.body)\n        return (f\"--- {self.title} ({self.format}) ---\\n\"\n                f\"{self.header}\\n\"\n                f\"{body_str}\\n\"\n                f\"{self.footer}\\n\"\n                f\"--------------------\")\n\n# app\/application\/builders.py\nclass ReportBuilder:\n    def __init__(self):\n        self.report = Report()\n\n    def set_title(self, title: str):\n        self.report.title = title\n        return self\n\n    def set_header(self, header: str):\n        self.report.header = header\n        return self\n\n    def add_line(self, line: str):\n        self.report.body.append(line)\n        return self\n\n    def set_footer(self, footer: str):\n        self.report.footer = footer\n        return self\n    \n    def set_format(self, fmt: str):\n        self.report.format = fmt\n        return self\n\n    def build(self) -> Report:\n        return self.report\n\n# app\/application\/use_cases.py\nclass GenerateDailyReportUseCase:\n    def execute(self, data: list):\n        builder = ReportBuilder()\n        report = builder.set_title(\"G\u00fcnl\u00fck Faaliyet Raporu\") \\\n                        .set_header(f\"Tarih: {datetime.now().strftime('%Y-%m-%d')}\")\n        \n        for item in data:\n            report.add_line(f\"- {item}\")\n            \n        report.set_footer(\"Rapor Sonu\") \\\n              .set_format(\"TXT\") \\\n              .build()\n        return report\n\nfrom datetime import datetime\nif __name__ == \"__main__\":\n    report_data = [\"\u00dcr\u00fcn A sat\u0131ld\u0131\", \"\u00dcr\u00fcn B stokta azald\u0131\", \"Yeni m\u00fc\u015fteri kayd\u0131\"]\n    use_case = GenerateDailyReportUseCase()\n    daily_report = use_case.execute(report_data)\n    print(daily_report)\n\n    # Ba\u015fka bir rapor format\u0131 i\u00e7in\n    custom_report = ReportBuilder().set_title(\"\u00d6zel Rapor\") \\\n                                   .add_line(\"Sat\u0131\u015f \u00f6zeti\") \\\n                                   .set_footer(\"Gizli\") \\\n                                   .set_format(\"HTML\") \\\n                                   .build()\n    print(custom_report)\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>Report<\/code> nesnesinin olu\u015fturulmas\u0131 <code>ReportBuilder<\/code> s\u0131n\u0131f\u0131na delege edilmi\u015ftir. <code>GenerateDailyReportUseCase<\/code> do\u011frudan <code>Report<\/code> nesnesinin karma\u015f\u0131k yap\u0131s\u0131yla ilgilenmez; sadece builder'\u0131n y\u00f6ntemlerini \u00e7a\u011f\u0131rarak istedi\u011fi raporu olu\u015fturur. Bu, raporun yap\u0131land\u0131rma mant\u0131\u011f\u0131n\u0131 kullan\u0131m senaryosundan ay\u0131r\u0131r ve yeni rapor tipleri veya formatlar\u0131 eklendi\u011finde <code>ReportBuilder<\/code>'\u0131 geni\u015fleterek kolayca adapte olmay\u0131 sa\u011flar. Builder deseni, \u00f6zellikle \u00e7ok say\u0131da parametresi olan, okunabilirli\u011fi ve bak\u0131m\u0131 zor olabilecek kurucular\u0131 (constructors) y\u00f6netmek i\u00e7in idealdir. Bu sayede, Temiz Mimari'nin \"Kullan\u0131m Durumlar\u0131\" veya \"Varl\u0131klar\" katman\u0131nda karma\u015f\u0131k nesneleri daha d\u00fczenli ve anla\u015f\u0131l\u0131r bir \u015fekilde olu\u015fturabiliriz.<\/p>\n<h3>Yap\u0131sal Desenlerle Mod\u00fclerli\u011fi Sa\u011flamak: Adapt\u00f6r (Adapter) ve Vekil (Proxy) Desenleri Neden \u00d6nemlidir?<\/h3>\n<p>Yap\u0131sal tasar\u0131m desenleri, farkl\u0131 i\u015flevselliklere sahip s\u0131n\u0131flar\u0131 ve nesneleri daha b\u00fcy\u00fck yap\u0131lar olu\u015fturmak i\u00e7in bir araya getirme mekanizmalar\u0131 sunar. Bu desenler, Temiz Mimari'de \u00f6zellikle d\u0131\u015f katmanlarla (veritabanlar\u0131, harici servisler, legacy sistemler) etkile\u015fimde bulunurken i\u00e7 katmanlar\u0131n ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131n\u0131 korumak ve mod\u00fclerli\u011fi art\u0131rmak i\u00e7in hayati \u00f6neme sahiptir. Adapt\u00f6r (Adapter) ve Vekil (Proxy) desenleri, bu ba\u011flamda s\u0131k\u00e7a kullan\u0131lan g\u00fc\u00e7l\u00fc ara\u00e7lard\u0131r.<\/p>\n<h4>Adapt\u00f6r (Adapter) Deseni<\/h4>\n<p>Adapt\u00f6r deseni, uyumsuz aray\u00fczlere sahip iki nesnenin birlikte \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. Genellikle, mevcut bir s\u0131n\u0131f\u0131 yeni bir aray\u00fcze uydurmak veya \u00fc\u00e7\u00fcnc\u00fc taraf bir k\u00fct\u00fcphaneyi uygulaman\u0131z\u0131n bekledi\u011fi aray\u00fcze d\u00f6n\u00fc\u015ft\u00fcrmek istedi\u011finizde kullan\u0131l\u0131r. Temiz mimaride, bu durum genellikle \"Arabirim Ba\u011fda\u015ft\u0131r\u0131c\u0131lar\u0131\" (Interface Adapters) katman\u0131nda ortaya \u00e7\u0131kar. \u00d6rne\u011fin, uygulaman\u0131z\u0131n bir mesajla\u015fma aray\u00fcz\u00fc vard\u0131r, ancak elinizdeki mevcut bir k\u00fct\u00fcphane farkl\u0131 bir aray\u00fczle \u00e7al\u0131\u015f\u0131r. Adapt\u00f6r, bu iki aray\u00fcz aras\u0131ndaki \"k\u00f6pr\u00fc\" g\u00f6revi g\u00f6r\u00fcr.<\/p>\n<pre><code>\n# app\/domain\/interfaces.py\nfrom abc import ABC, abstractmethod\n\nclass NotificationService(ABC):\n    @abstractmethod\n    def send_message(self, recipient: str, message: str) -> None:\n        pass\n\n# app\/infrastructure\/legacy_sms_system.py (D\u0131\u015f\/Uyumsuz Sistem)\nclass LegacySmsSender:\n    def send_sms(self, phone_number: str, text_content: str):\n        print(f\"Legacy SMS sistemi ile '{text_content}' '{phone_number}' numaras\u0131na g\u00f6nderildi.\")\n\n# app\/infrastructure\/adapters.py (Adapt\u00f6r)\nclass LegacySmsAdapter(NotificationService):\n    def __init__(self, legacy_sender: LegacySmsSender):\n        self._legacy_sender = legacy_sender\n\n    def send_message(self, recipient: str, message: str) -> None:\n        # Aray\u00fczleri birbirine uydur\n        self._legacy_sender.send_sms(recipient, message)\n\n# app\/application\/use_cases.py\nclass SendWelcomeNotificationUseCase:\n    def __init__(self, notification_service: NotificationService):\n        self._notification_service = notification_service\n\n    def execute(self, user_phone: str, user_name: str):\n        message = f\"Ho\u015f geldiniz, {user_name}! Kayd\u0131n\u0131z ba\u015far\u0131yla tamamland\u0131.\"\n        self._notification_service.send_message(user_phone, message)\n\n# Kullan\u0131m\nif __name__ == \"__main__\":\n    legacy_sms_sender = LegacySmsSender()\n    sms_adapter = LegacySmsAdapter(legacy_sms_sender)\n    \n    use_case = SendWelcomeNotificationUseCase(sms_adapter)\n    use_case.execute(\"555-123-4567\", \"Ahmet Y\u0131lmaz\")\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>SendWelcomeNotificationUseCase<\/code> bir <code>NotificationService<\/code> aray\u00fcz\u00fcne ba\u011f\u0131ml\u0131d\u0131r. <code>LegacySmsSender<\/code> s\u0131n\u0131f\u0131 bu aray\u00fcze do\u011frudan uymad\u0131\u011f\u0131ndan, <code>LegacySmsAdapter<\/code> onu <code>NotificationService<\/code> aray\u00fcz\u00fcne uyumlu hale getirir. B\u00f6ylece, kullan\u0131m senaryosu (i\u00e7 katman), d\u0131\u015ftaki legacy sistemin detaylar\u0131ndan habersiz kal\u0131r ve onunla soyut bir aray\u00fcz \u00fczerinden etkile\u015fime girer. Bu sayede, legacy sistemi ba\u015fka bir modern bildirim servisiyle de\u011fi\u015ftirmek istedi\u011fimizde, sadece yeni bir adapt\u00f6r yazmak veya mevcut bir servisi direkt <code>NotificationService<\/code> olarak kullanmak yeterli olacakt\u0131r. \u0130\u015f mant\u0131\u011f\u0131 katman\u0131nda hi\u00e7bir de\u011fi\u015fiklik yap\u0131lmas\u0131na gerek kalmaz, bu da A\u00e7\u0131k\/Kapal\u0131 Prensibi'ne (OCP) harika bir \u00f6rnektir.<\/p>\n<h4>Vekil (Proxy) Deseni<\/h4>\n<p>Vekil deseni, ba\u015fka bir nesneye eri\u015fimi kontrol etmek i\u00e7in bir yer tutucu veya vekil sa\u011flar. Orijinal nesneye do\u011frudan eri\u015fmek yerine, istemci vekil arac\u0131l\u0131\u011f\u0131yla onunla etkile\u015fime girer. Vekil, orijinal nesnenin kendisini \u00e7a\u011f\u0131rarak iste\u011fi iletebilir veya ek i\u015flevler (\u00f6rne\u011fin, gecikmeli y\u00fckleme, eri\u015fim kontrol\u00fc, loglama, \u00f6nbelle\u011fe alma) ekleyebilir. Temiz mimaride, vekil deseni genellikle d\u0131\u015f kaynaklara eri\u015fimi y\u00f6netirken veya bir servisin performans\u0131n\u0131 art\u0131r\u0131rken kullan\u0131l\u0131r.<\/p>\n<pre><code>\n# app\/domain\/interfaces.py\nclass DataService(ABC):\n    @abstractmethod\n    def get_data(self, item_id: str) -> dict:\n        pass\n\n# app\/infrastructure\/real_data_service.py (Ger\u00e7ek Servis - A\u011f\u0131r Operasyon)\nclass RealDataService(DataService):\n    def get_data(self, item_id: str) -> dict:\n        print(f\"Ger\u00e7ek servis: {item_id} i\u00e7in veri veritaban\u0131ndan getiriliyor...\")\n        # Sim\u00fcle edilmi\u015f a\u011f\u0131r bir veritaban\u0131 sorgusu\n        import time\n        time.sleep(2) \n        return {\"id\": item_id, \"name\": f\"Item {item_id}\", \"value\": 100}\n\n# app\/infrastructure\/proxies.py (Vekil - \u00d6nbelle\u011fe Alma)\nclass CachedDataServiceProxy(DataService):\n    def __init__(self, real_service: DataService):\n        self._real_service = real_service\n        self._cache = {}\n\n    def get_data(self, item_id: str) -> dict:\n        if item_id in self._cache:\n            print(f\"Vekil: {item_id} i\u00e7in veri \u00f6nbellekten getirildi.\")\n            return self._cache[item_id]\n        \n        data = self._real_service.get_data(item_id)\n        self._cache[item_id] = data\n        return data\n\n# app\/application\/use_cases.py\nclass FetchItemDetailsUseCase:\n    def __init__(self, data_service: DataService):\n        self._data_service = data_service\n\n    def execute(self, item_id: str) -> dict:\n        return self._data_service.get_data(item_id)\n\n# Kullan\u0131m\nif __name__ == \"__main__\":\n    real_service = RealDataService()\n    \n    # Vekili kullanarak\n    cached_service = CachedDataServiceProxy(real_service)\n    use_case_cached = FetchItemDetailsUseCase(cached_service)\n\n    print(\"--- \u0130lk kez (\u00f6nbelle\u011fe al\u0131nacak) ---\")\n    print(use_case_cached.execute(\"ITEM-001\"))\n    print(\"\\n--- \u0130kinci kez (\u00f6nbellekten gelecek) ---\")\n    print(use_case_cached.execute(\"ITEM-001\")) # \u0130kinci \u00e7a\u011fr\u0131 daha h\u0131zl\u0131 olacak\n\n    print(\"\\n--- Do\u011frudan ger\u00e7ek servis ile ---\")\n    use_case_real = FetchItemDetailsUseCase(real_service)\n    print(use_case_real.execute(\"ITEM-002\"))\n    print(use_case_real.execute(\"ITEM-002\")) # Her seferinde veritaban\u0131na gidecek\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>FetchItemDetailsUseCase<\/code> (i\u00e7 katman) <code>DataService<\/code> aray\u00fcz\u00fcne ba\u011f\u0131ml\u0131d\u0131r. <code>CachedDataServiceProxy<\/code> s\u0131n\u0131f\u0131, <code>RealDataService<\/code>'in yerine ge\u00e7erek veri eri\u015fimini kontrol eder ve \u00f6nbelle\u011fe alma i\u015flevselli\u011fi ekler. Kullan\u0131m senaryosu, ger\u00e7ek servisin mi yoksa vekilin mi kullan\u0131ld\u0131\u011f\u0131n\u0131 bilmez; sadece <code>get_data<\/code> metodunu \u00e7a\u011f\u0131r\u0131r. Vekil deseni, sistemin \u00e7ekirdek i\u015f mant\u0131\u011f\u0131n\u0131 (use case) d\u0131\u015ftaki performans optimizasyonu veya g\u00fcvenlik gibi konulardan soyutlayarak, Temiz Mimari'nin ana hedeflerinden biri olan \"sorumluluk ayr\u0131l\u0131\u011f\u0131\" prensibini g\u00fc\u00e7lendirir. Bu, sistemin genel yap\u0131s\u0131n\u0131 daha esnek ve bak\u0131m\u0131 kolay hale getirir, ayn\u0131 zamanda performans gibi operasyonel konular\u0131 ana i\u015f ak\u0131\u015f\u0131ndan ay\u0131rarak odaklanmay\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>Davran\u0131\u015fsal Desenlerle \u0130\u015f Mant\u0131\u011f\u0131n\u0131 Ay\u0131rmak: Strateji (Strategy) ve Komut (Command) Desenleri ile Esneklik Kazanmak.<\/h3>\n<p>Davran\u0131\u015fsal tasar\u0131m desenleri, nesneler aras\u0131ndaki etkile\u015fimleri ve sorumluluklar\u0131 d\u00fczenleyerek, algoritma veya davran\u0131\u015f\u0131n \u00e7al\u0131\u015fma zaman\u0131nda de\u011fi\u015ftirilebilmesini veya soyutlanmas\u0131n\u0131 sa\u011flar. Temiz Mimari'de, \u00f6zellikle \"Kullan\u0131m Durumlar\u0131\" (Use Cases) katman\u0131nda, i\u015f mant\u0131\u011f\u0131n\u0131 esnek, geni\u015fletilebilir ve test edilebilir bir \u015fekilde uygulamak i\u00e7in bu desenler vazge\u00e7ilmezdir. Strateji (Strategy) ve Komut (Command) desenleri, bu amaca hizmet eden \u00f6nemli ara\u00e7lard\u0131r.<\/p>\n<h4>Strateji (Strategy) Deseni<\/h4>\n<p>Strateji deseni, bir algoritma ailesini tan\u0131mlar, her bir algoritmay\u0131 ayr\u0131 bir s\u0131n\u0131f olarak kaps\u00fcller ve bunlar\u0131 birbirinin yerine ge\u00e7ebilir hale getirir. Bu, istemcinin bir algoritma se\u00e7imine ba\u011f\u0131ml\u0131 kalmadan, farkl\u0131 algoritmalar aras\u0131nda \u00e7al\u0131\u015fma zaman\u0131nda ge\u00e7i\u015f yapmas\u0131na olanak tan\u0131r. A\u00e7\u0131k\/Kapal\u0131 Prensibi'ne (OCP) harika bir \u00f6rnektir: mevcut kodu de\u011fi\u015ftirmeden yeni stratejiler ekleyebilirsiniz. Bir e-ticaret uygulamas\u0131nda farkl\u0131 indirim stratejilerini ele alal\u0131m:<\/p>\n<pre><code>\n# app\/domain\/interfaces.py\nfrom abc import ABC, abstractmethod\n\nclass DiscountStrategy(ABC):\n    @abstractmethod\n    def calculate_discount(self, price: float) -> float:\n        pass\n\n# app\/domain\/strategies.py (Somut Stratejiler)\nclass NoDiscountStrategy(DiscountStrategy):\n    def calculate_discount(self, price: float) -> float:\n        return 0.0\n\nclass PercentageDiscountStrategy(DiscountStrategy):\n    def __init__(self, percentage: float):\n        self._percentage = percentage \/ 100.0\n\n    def calculate_discount(self, price: float) -> float:\n        return price * self._percentage\n\nclass FixedDiscountStrategy(DiscountStrategy):\n    def __init__(self, fixed_amount: float):\n        self._fixed_amount = fixed_amount\n\n    def calculate_discount(self, price: float) -> float:\n        return self._fixed_amount if self._fixed_amount <= price else price\n\n# app\/application\/use_cases.py\nclass ApplyDiscountUseCase:\n    def execute(self, price: float, strategy: DiscountStrategy) -> float:\n        discount = strategy.calculate_discount(price)\n        final_price = price - discount\n        return max(0.0, final_price) # Fiyat negatif olamaz\n\n# Kullan\u0131m\nif __name__ == \"__main__\":\n    use_case = ApplyDiscountUseCase()\n\n    price = 100.0\n\n    # \u0130ndirim yok\n    no_discount = use_case.execute(price, NoDiscountStrategy())\n    print(f\"\u0130ndirimsiz fiyat: {no_discount}\")\n\n    # Y\u00fczde 10 indirim\n    percentage_discount = use_case.execute(price, PercentageDiscountStrategy(10))\n    print(f\"Y\u00fczde 10 indirimli fiyat: {percentage_discount}\")\n\n    # Sabit 20 birim indirim\n    fixed_discount = use_case.execute(price, FixedDiscountStrategy(20))\n    print(f\"Sabit 20 birim indirimli fiyat: {fixed_discount}\")\n\n    # Yeni bir kampanya stratejisi eklemek kolay\n    class BlackFridayStrategy(DiscountStrategy):\n        def calculate_discount(self, price: float) -> float:\n            return price * 0.30 if price >= 50 else 0.0 # %30 indirim, min 50 birim al\u0131\u015fveri\u015fe\n    \n    black_friday_price = use_case.execute(120.0, BlackFridayStrategy())\n    print(f\"Black Friday indirimli fiyat: {black_friday_price}\")\n    <\/pre>\n<p><\/code><\/p>\n<p>Burada, <code>ApplyDiscountUseCase<\/code> direkt olarak indirim hesaplama mant\u0131klar\u0131n\u0131 i\u00e7ermez. Bunun yerine, bir <code>DiscountStrategy<\/code> aray\u00fcz\u00fcne (soyutlama) ba\u011f\u0131ml\u0131d\u0131r. \u0130stemci (kullan\u0131m kodu), hangi stratejinin uygulanaca\u011f\u0131na karar verir ve bunu kullan\u0131m senaryosuna ge\u00e7irir. Bu, yeni indirim t\u00fcrleri (\u00f6rne\u011fin, \"\u00d6\u011frenci \u0130ndirimi\", \"Sezon \u0130ndirimi\") eklemek istedi\u011fimizde, sadece yeni bir <code>DiscountStrategy<\/code> s\u0131n\u0131f\u0131 olu\u015fturmam\u0131z gerekti\u011fi anlam\u0131na gelir. Mevcut <code>ApplyDiscountUseCase<\/code> s\u0131n\u0131f\u0131nda herhangi bir de\u011fi\u015fiklik yapmaya gerek kalmaz, bu da kodu olduk\u00e7a esnek ve geni\u015fletilebilir hale getirir.<\/p>\n<aside class=\"expert-tip\">\n        Uzman \u0130pucu: Strateji deseni, finansal hesaplamalar, veri do\u011frulama kurallar\u0131, dosya d\u0131\u015fa aktarma formatlar\u0131 veya s\u0131ralama algoritmalar\u0131 gibi i\u015f mant\u0131\u011f\u0131 bile\u015fenlerinin s\u0131k\u00e7a de\u011fi\u015fti\u011fi veya farkl\u0131 varyasyonlar\u0131n\u0131n oldu\u011fu durumlarda Temiz Mimari'nin Use Cases katman\u0131nda g\u00fc\u00e7l\u00fc bir soyutlama sa\u011flar.<br \/>\n    <\/aside>\n<h4>Komut (Command) Deseni<\/h4>\n<p>Komut deseni, bir iste\u011fi bir nesne olarak kaps\u00fcller, b\u00f6ylece farkl\u0131 istekleri farkl\u0131 parametrelerle parametrelendirebilir, istekleri bir s\u0131raya koyabilir, g\u00fcnl\u00fckleyebilir veya geri al\u0131nabilir operasyonlar\u0131 destekleyebilirsiniz. Bu desen, genellikle kullan\u0131c\u0131 aray\u00fcz\u00fc eylemlerini, men\u00fc komutlar\u0131n\u0131 veya transaction y\u00f6netimini ele al\u0131rken kullan\u0131l\u0131r. Temiz mimaride, Komut deseni, i\u015f mant\u0131\u011f\u0131 katman\u0131ndaki belirli operasyonlar\u0131 soyutlamak ve bu operasyonlar\u0131n y\u00fcr\u00fct\u00fclme zaman\u0131, s\u0131ralamas\u0131 veya geri al\u0131nabilirli\u011fi \u00fczerinde daha fazla kontrol sa\u011flamak i\u00e7in kullan\u0131labilir.<\/p>\n<pre><code>\n# app\/domain\/interfaces.py\nclass Command(ABC):\n    @abstractmethod\n    def execute(self) -> None:\n        pass\n\n    @abstractmethod\n    def undo(self) -> None:\n        pass\n\n# app\/domain\/commands.py (Somut Komutlar ve Receiver)\nclass Light: # Receiver\n    def turn_on(self):\n        print(\"Lamba a\u00e7\u0131ld\u0131.\")\n    \n    def turn_off(self):\n        print(\"Lamba kapat\u0131ld\u0131.\")\n\nclass TurnOnLightCommand(Command):\n    def __init__(self, light: Light):\n        self._light = light\n\n    def execute(self) -> None:\n        self._light.turn_on()\n    \n    def undo(self) -> None:\n        self._light.turn_off()\n\nclass TurnOffLightCommand(Command):\n    def __init__(self, light: Light):\n        self._light = light\n\n    def execute(self) -> None:\n        self._light.turn_off()\n    \n    def undo(self) -> None:\n        self._light.turn_on()\n\n# app\/application\/invokers.py (\u00c7a\u011f\u0131r\u0131c\u0131)\nclass RemoteControl:\n    def __init__(self):\n        self._commands: list[Command] = []\n        self._history: list[Command] = []\n\n    def set_command(self, command: Command):\n        self._commands.append(command)\n\n    def press_button(self, index: int):\n        if 0 <= index < len(self._commands):\n            command = self._commands[index]\n            command.execute()\n            self._history.append(command)\n        else:\n            print(\"Ge\u00e7ersiz d\u00fc\u011fme.\")\n\n    def press_undo(self):\n        if self._history:\n            command = self._history.pop()\n            command.undo()\n            print(\"Geri alma i\u015flemi tamamland\u0131.\")\n        else:\n            print(\"Geri al\u0131nacak komut yok.\")\n\n# Kullan\u0131m\nif __name__ == \"__main__\":\n    light = Light()\n    remote = RemoteControl()\n\n    turn_on_command = TurnOnLightCommand(light)\n    turn_off_command = TurnOffLightCommand(light)\n\n    remote.set_command(turn_on_command) # D\u00fc\u011fme 0\n    remote.set_command(turn_off_command) # D\u00fc\u011fme 1\n\n    print(\"--- \u0130lk Komut ---\")\n    remote.press_button(0) # Lambay\u0131 a\u00e7\n\n    print(\"\\n--- \u0130kinci Komut ---\")\n    remote.press_button(1) # Lambay\u0131 kapat\n\n    print(\"\\n--- Geri Al ---\")\n    remote.press_undo() # Lambay\u0131 tekrar a\u00e7acak\n\n    print(\"\\n--- Bir Daha Geri Al ---\")\n    remote.press_undo() # Lambay\u0131 kapatacak\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>Light<\/code> nesnesi bir \"al\u0131c\u0131\" (receiver) rol\u00fcndedir. <code>TurnOnLightCommand<\/code> ve <code>TurnOffLightCommand<\/code> ise belirli istekleri (<code>light.turn_on()<\/code>, <code>light.turn_off()<\/code>) kaps\u00fclleyen komut nesneleridir. <code>RemoteControl<\/code> (\u00e7a\u011f\u0131r\u0131c\u0131), bu komutlar\u0131 saklar ve y\u00fcr\u00fct\u00fcr, ayr\u0131ca geri alma i\u015flevselli\u011fi de sunar. <code>RemoteControl<\/code> s\u0131n\u0131f\u0131, \u00e7a\u011f\u0131raca\u011f\u0131 komutlar\u0131n somut implementasyonlar\u0131ndan tamamen ba\u011f\u0131ms\u0131zd\u0131r; sadece <code>Command<\/code> aray\u00fcz\u00fcne uyan herhangi bir nesneyi bekler. Bu, yeni komutlar (\u00f6rne\u011fin, \"Klima A\u00e7ma Komutu\") eklendi\u011finde, <code>RemoteControl<\/code> s\u0131n\u0131f\u0131nda herhangi bir de\u011fi\u015fiklik yapmadan kolayca geni\u015fletilebilece\u011fi anlam\u0131na gelir. Komut deseni, temiz mimarinin \"Uygulama \u0130\u015f Kurallar\u0131\" veya \"Kullan\u0131m Durumlar\u0131\" katman\u0131nda, farkl\u0131 operasyonlar\u0131 soyutlayarak ve bu operasyonlar\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc \u00fczerinde kontrol sa\u011flayarak, sistemin karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 y\u00f6netmeye ve esnekli\u011fini art\u0131rmaya yard\u0131mc\u0131 olur.<\/p>\n<h2>Temiz Mimari Katmanlar\u0131n\u0131n Python ile Uygulanmas\u0131: Repository ve Use Case Katmanlar\u0131 Nas\u0131l \u015eekillendirilir?<\/h2>\n<p>Temiz mimarinin kalbinde, uygulaman\u0131n temel i\u015f kurallar\u0131n\u0131 d\u0131\u015f etkenlerden izole eden katmanl\u0131 bir yap\u0131 bulunur. Bu katmanlar, genellikle Varl\u0131klar (Entities), Kullan\u0131m Durumlar\u0131 (Use Cases), Arabirim Ba\u011fda\u015ft\u0131r\u0131c\u0131lar\u0131 (Interface Adapters) ve \u00c7er\u00e7eveler\/S\u00fcr\u00fcc\u00fcler (Frameworks\/Drivers) olarak tan\u0131mlan\u0131r. Python ile bu katmanlar\u0131 uygularken, \u00f6zellikle Repository (Depo) deseni ve Use Case'lerin yap\u0131land\u0131r\u0131lmas\u0131, ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmek ve test edilebilirli\u011fi sa\u011flamak a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir.<\/p>\n<h3>Varl\u0131klar (Entities) Katman\u0131<\/h3>\n<p>Bu, uygulaman\u0131n en i\u00e7 katman\u0131d\u0131r ve temel i\u015f nesnelerini (domain objects) ve genel i\u015f kurallar\u0131n\u0131 bar\u0131nd\u0131r\u0131r. Bu objeler, uygulaman\u0131n t\u00fcm katmanlar\u0131nda tutarl\u0131 bir \u015fekilde kullan\u0131l\u0131r. Veritaban\u0131 veya UI gibi d\u0131\u015f detaylardan tamamen ba\u011f\u0131ms\u0131zd\u0131rlar. Python'da, basit s\u0131n\u0131flar veya dataclass'ler bu varl\u0131klar\u0131 temsil etmek i\u00e7in kullan\u0131labilir. \u00d6rne\u011fin, bir e-ticaret uygulamas\u0131nda:<\/p>\n<pre><code>\n# src\/domain\/entities.py\nfrom dataclasses import dataclass\nfrom datetime import datetime\n\n@dataclass\nclass Product:\n    id: str\n    name: str\n    description: str\n    price: float\n    stock: int\n\n@dataclass\nclass OrderItem:\n    product: Product\n    quantity: int\n    subtotal: float\n\n@dataclass\nclass Order:\n    id: str\n    customer_id: str\n    items: list[OrderItem]\n    total_amount: float\n    order_date: datetime\n    status: str = \"pending\"\n\n    def calculate_total(self) -> None:\n        self.total_amount = sum(item.subtotal for item in self.items)\n    <\/pre>\n<p><\/code><\/p>\n<h3>Kullan\u0131m Durumlar\u0131 (Use Cases \/ Interactors) Katman\u0131<\/h3>\n<p>Bu katman, uygulamaya \u00f6zg\u00fc i\u015f kurallar\u0131n\u0131 i\u00e7erir ve varl\u0131klar \u00fczerinde operasyonlar yapar. Kullan\u0131m durumlar\u0131, belirli bir i\u015f ak\u0131\u015f\u0131n\u0131 veya senaryoyu tan\u0131mlar. D\u0131\u015f katmanlardan gelen verileri al\u0131r, varl\u0131klar\u0131 kullanarak i\u015f mant\u0131\u011f\u0131n\u0131 uygular ve sonu\u00e7lar\u0131 d\u0131\u015f katmana geri g\u00f6nderir. Bu katman, veritaban\u0131 detaylar\u0131, web \u00e7er\u00e7evesi veya UI hakk\u0131nda hi\u00e7bir \u015fey bilmemelidir. Ba\u011f\u0131ml\u0131l\u0131k Tersine \u00c7evirme Prensibi (DIP) burada devreye girer: Kullan\u0131m Durumlar\u0131, somut depolara (Repository implementasyonlar\u0131) ba\u011f\u0131ml\u0131 olmak yerine, Repository aray\u00fczlerine (soyutlamalara) ba\u011f\u0131ml\u0131d\u0131r.<\/p>\n<pre><code>\n# src\/domain\/interfaces\/repositories.py\nfrom abc import ABC, abstractmethod\nfrom typing import Optional\nfrom src.domain.entities import Product, Order\n\nclass ProductRepository(ABC):\n    @abstractmethod\n    def get_by_id(self, product_id: str) -> Optional[Product]:\n        pass\n\n    @abstractmethod\n    def get_all(self) -> list[Product]:\n        pass\n\n    @abstractmethod\n    def save(self, product: Product) -> None:\n        pass\n\nclass OrderRepository(ABC):\n    @abstractmethod\n    def get_by_id(self, order_id: str) -> Optional[Order]:\n        pass\n\n    @abstractmethod\n    def save(self, order: Order) -> None:\n        pass\n\n# src\/application\/use_cases\/place_order.py\nclass PlaceOrderRequest:\n    customer_id: str\n    product_ids_with_quantities: dict[str, int]\n\nclass PlaceOrderResponse:\n    order_id: str\n    total_amount: float\n    status: str\n\nclass PlaceOrderUseCase:\n    def __init__(self, product_repo: ProductRepository, order_repo: OrderRepository):\n        self._product_repo = product_repo\n        self._order_repo = order_repo\n\n    def execute(self, request: PlaceOrderRequest) -> PlaceOrderResponse:\n        order_items = []\n        total_amount = 0.0\n\n        for product_id, quantity in request.product_ids_with_quantities.items():\n            product = self._product_repo.get_by_id(product_id)\n            if not product or product.stock < quantity:\n                raise ValueError(f\"\u00dcr\u00fcn {product_id} bulunamad\u0131 veya stok yetersiz.\")\n            \n            subtotal = product.price * quantity\n            order_items.append(OrderItem(product=product, quantity=quantity, subtotal=subtotal))\n            total_amount += subtotal\n            product.stock -= quantity # Stok g\u00fcncelleme\n            self._product_repo.save(product) # Stok g\u00fcncellemeyi kaydet\n\n        new_order = Order(\n            id=f\"ORD-{datetime.now().timestamp()}\",\n            customer_id=request.customer_id,\n            items=order_items,\n            total_amount=total_amount,\n            order_date=datetime.now(),\n            status=\"pending\"\n        )\n        self._order_repo.save(new_order)\n        \n        return PlaceOrderResponse(\n            order_id=new_order.id,\n            total_amount=new_order.total_amount,\n            status=new_order.status\n        )\n    <\/pre>\n<p><\/code><\/p>\n<h3>Arabirim Ba\u011fda\u015ft\u0131r\u0131c\u0131lar\u0131 (Interface Adapters) Katman\u0131: Repository Implementasyonlar\u0131<\/h3>\n<p>Bu katman, i\u00e7teki kullan\u0131m durumlar\u0131 ile d\u0131\u015ftaki \u00e7er\u00e7eveler ve s\u00fcr\u00fcc\u00fcler aras\u0131ndaki k\u00f6pr\u00fcy\u00fc olu\u015fturur. Veritaban\u0131 Repository'lerinin somut implementasyonlar\u0131, web \u00e7er\u00e7evelerinin denetleyicileri (controllers) ve sunumcular (presenters) burada yer al\u0131r. Veritaban\u0131 Repository'leri, <code>ProductRepository<\/code> ve <code>OrderRepository<\/code> aray\u00fczlerini uygular ve veritaban\u0131 spesifik i\u015flemleri (SQL sorgular\u0131, ORM kullan\u0131m\u0131) bu katmanda ger\u00e7ekle\u015ftirir. Bu, kullan\u0131m durumlar\u0131n\u0131n (Use Cases) veritaban\u0131 detaylar\u0131ndan tamamen soyutlanmas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code>\n# src\/infrastructure\/repositories\/in_memory_repository.py (\u00d6rnek: Bellek \u0130\u00e7i Repo)\nclass InMemoryProductRepository(ProductRepository):\n    def __init__(self):\n        self._products: dict[str, Product] = {}\n        # Ba\u015flang\u0131\u00e7 verileri\n        self.save(Product(id=\"P001\", name=\"Laptop\", description=\"G\u00fc\u00e7l\u00fc Laptop\", price=1200.0, stock=10))\n        self.save(Product(id=\"P002\", name=\"Mouse\", description=\"Kablosuz Mouse\", price=25.0, stock=50))\n\n    def get_by_id(self, product_id: str) -> Optional[Product]:\n        return self._products.get(product_id)\n\n    def get_all(self) -> list[Product]:\n        return list(self._products.values())\n\n    def save(self, product: Product) -> None:\n        self._products[product.id] = product\n\nclass InMemoryOrderRepository(OrderRepository):\n    def __init__(self):\n        self._orders: dict[str, Order] = {}\n\n    def get_by_id(self, order_id: str) -> Optional[Order]:\n        return self._orders.get(order_id)\n\n    def save(self, order: Order) -> None:\n        self._orders[order.id] = order\n\n# src\/presentation\/controllers\/order_controller.py (\u00d6rnek: Web API Controller)\nfrom flask import Blueprint, request, jsonify\nfrom src.application.use_cases.place_order import PlaceOrderUseCase, PlaceOrderRequest\nfrom src.infrastructure.repositories.in_memory_repository import InMemoryProductRepository, InMemoryOrderRepository\n\n# Flask Blueprint\norder_bp = Blueprint('order', __name__)\n\n# Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (Ger\u00e7ek uygulamada bir DI container kullan\u0131labilir)\nproduct_repo = InMemoryProductRepository()\norder_repo = InMemoryOrderRepository()\nplace_order_use_case = PlaceOrderUseCase(product_repo, order_repo)\n\n@order_bp.route('\/orders', methods=['POST'])\ndef place_order():\n    data = request.json\n    req = PlaceOrderRequest()\n    req.customer_id = data.get('customer_id')\n    req.product_ids_with_quantities = data.get('products')\n\n    try:\n        response = place_order_use_case.execute(req)\n        return jsonify({\n            \"message\": \"Sipari\u015f ba\u015far\u0131yla olu\u015fturuldu.\",\n            \"order_id\": response.order_id,\n            \"total_amount\": response.total_amount,\n            \"status\": response.status\n        }), 201\n    except ValueError as e:\n        return jsonify({\"error\": str(e)}), 400\n    except Exception as e:\n        return jsonify({\"error\": \"Bir hata olu\u015ftu.\"}), 500\n\n# main.py (Uygulama ba\u015flatma)\n# from flask import Flask\n# from src.presentation.controllers.order_controller import order_bp\n# \n# app = Flask(__name__)\n# app.register_blueprint(order_bp)\n# \n# if __name__ == '__main__':\n#     app.run(debug=True)\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki yap\u0131, Temiz Mimari prensiplerini Python'da nas\u0131l uygulayaca\u011f\u0131m\u0131za dair net bir yol haritas\u0131 sunar. <code>PlaceOrderUseCase<\/code>, <code>ProductRepository<\/code> ve <code>OrderRepository<\/code> aray\u00fczlerine ba\u011f\u0131ml\u0131 oldu\u011fu i\u00e7in, farkl\u0131 veritaban\u0131 implementasyonlar\u0131 (\u00f6rne\u011fin, PostgreSQL i\u00e7in bir <code>PostgreSQLProductRepository<\/code> veya MongoDB i\u00e7in bir <code>MongoProductRepository<\/code>) kolayca \"tak\u0131l\u0131p \u00e7\u0131kar\u0131labilir\" hale gelir. <code>order_controller.py<\/code> dosyas\u0131ndaki Flask denetleyicisi, <code>PlaceOrderUseCase<\/code>'i kullanarak d\u0131\u015f d\u00fcnyadan gelen iste\u011fi i\u015fler ve bir yan\u0131t d\u00f6ner. Bu katmanlar aras\u0131ndaki s\u0131k\u0131 sorumluluk ayr\u0131m\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n soyutlamalar \u00fczerinden y\u00f6netilmesi, kodun her b\u00f6l\u00fcm\u00fcn\u00fcn kendi i\u015fine odaklanmas\u0131n\u0131 sa\u011flar, bu da test edilebilirli\u011fi, s\u00fcrd\u00fcr\u00fclebilirli\u011fi ve \u00f6l\u00e7eklenebilirli\u011fi \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<h2>Vaka Analizi: E-Ticaret Uygulamas\u0131nda Temiz Mimari<\/h2>\n<p>Bir e-ticaret uygulamas\u0131, \u00fcr\u00fcn y\u00f6netimi, sipari\u015f i\u015fleme, \u00f6deme entegrasyonu, kullan\u0131c\u0131 y\u00f6netimi gibi bir\u00e7ok karma\u015f\u0131k i\u015f ak\u0131\u015f\u0131n\u0131 bar\u0131nd\u0131r\u0131r. Bu senaryo, Temiz Mimari prensiplerini ve tasar\u0131m desenlerini uygulamak i\u00e7in harika bir \u00f6rnektir. \u015eimdi, bir e-ticaret uygulamas\u0131 \u00fczerinde bu prensiplerin nas\u0131l somutla\u015ft\u0131\u011f\u0131n\u0131 inceleyelim.<\/p>\n<h3>Senaryo: Yeni Sipari\u015f Olu\u015fturma ve \u00d6deme \u0130\u015flemi<\/h3>\n<p>Kullan\u0131c\u0131, sepetine \u00fcr\u00fcnler ekler ve bir sipari\u015f olu\u015fturmaya karar verir. Sistem, \u00fcr\u00fcnlerin stok durumunu kontrol etmeli, sipari\u015fi kaydetmeli ve se\u00e7ilen \u00f6deme y\u00f6ntemine g\u00f6re \u00f6demeyi i\u015flemelidir.<\/p>\n<table border=\"1\" style=\"width:100%; border-collapse: collapse;\">\n<thead>\n<tr>\n<th>Temiz Mimari Katman\u0131<\/th>\n<th>Python Uygulamas\u0131 (\u00d6rnek S\u0131n\u0131flar\/Mod\u00fcller)<\/th>\n<th>A\u00e7\u0131klama<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Varl\u0131klar (Entities)<\/strong><\/td>\n<td><code>Product<\/code>, <code>Order<\/code>, <code>OrderItem<\/code>, <code>User<\/code><\/td>\n<td>Uygulaman\u0131n temel i\u015f nesneleri. Fiyatland\u0131rma kurallar\u0131, stok kontrol\u00fc gibi genel i\u015f kurallar\u0131 burada tan\u0131mlanabilir. Veritaban\u0131 veya web detaylar\u0131ndan tamamen ba\u011f\u0131ms\u0131zd\u0131r.<\/td>\n<\/tr>\n<tr>\n<td><strong>Kullan\u0131m Durumlar\u0131 (Use Cases)<\/strong><\/td>\n<td><code>CreateOrderUseCase<\/code>, <code>ProcessPaymentUseCase<\/code>, <code>GetProductDetailsUseCase<\/code><\/td>\n<td>Uygulamaya \u00f6zg\u00fc i\u015f ak\u0131\u015flar\u0131. \u00d6rne\u011fin, <code>CreateOrderUseCase<\/code>, \u00fcr\u00fcnlerin stokunu kontrol eder, sipari\u015f nesnesini olu\u015fturur ve <code>OrderRepository<\/code>'ye kaydeder. <code>ProcessPaymentUseCase<\/code>, \u00f6deme fabrikas\u0131 arac\u0131l\u0131\u011f\u0131yla uygun \u00f6deme i\u015flemcisini al\u0131r.<\/td>\n<\/tr>\n<tr>\n<td><strong>Arabirim Ba\u011fda\u015ft\u0131r\u0131c\u0131lar\u0131 (Interface Adapters)<\/strong><\/td>\n<td><code>ProductRepository<\/code> (aray\u00fcz), <code>OrderRepository<\/code> (aray\u00fcz), <code>PaymentProcessor<\/code> (aray\u00fcz)<\/td>\n<td>Bu katmanda, d\u0131\u015f servislerle etkile\u015fim kuran somut implementasyonlar\u0131n aray\u00fczleri tan\u0131mlan\u0131r. \u00d6rne\u011fin, <code>PostgreSQLProductRepository<\/code>, <code>StripePaymentProcessor<\/code> gibi s\u0131n\u0131flar bu aray\u00fczleri uygular. Veri DTO'lar\u0131 (Data Transfer Objects) da burada tan\u0131mlanabilir.<\/td>\n<\/tr>\n<tr>\n<td><strong>\u00c7er\u00e7eveler ve S\u00fcr\u00fcc\u00fcler (Frameworks & Drivers)<\/strong><\/td>\n<td>Flask\/FastAPI Controller'lar, SQLAlchemy\/Pydantic ORM, PostgreSQL veritaban\u0131, Stripe\/PayPal API istemcileri<\/td>\n<td>En d\u0131\u015ftaki katman. Web \u00e7er\u00e7evesi arac\u0131l\u0131\u011f\u0131yla gelen HTTP isteklerini i\u015fler (\u00f6rne\u011fin, <code>OrderController<\/code>). Veritaban\u0131 s\u00fcr\u00fcc\u00fcleri ve ORM'ler veri kal\u0131c\u0131l\u0131\u011f\u0131n\u0131 sa\u011flar. Harici \u00f6deme a\u011f ge\u00e7idi k\u00fct\u00fcphaneleri (Stripe Python SDK) burada kullan\u0131l\u0131r.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Uygulamada Tasar\u0131m Desenlerinin Rol\u00fc:<\/h3>\n<ul>\n<li><strong>Repository Deseni (Arabirim Ba\u011fda\u015ft\u0131r\u0131c\u0131lar\u0131):<\/strong> <code>ProductRepository<\/code> ve <code>OrderRepository<\/code> aray\u00fczleri tan\u0131mlan\u0131r. <code>CreateOrderUseCase<\/code> bu aray\u00fczlere ba\u011f\u0131ml\u0131d\u0131r. PostgreSQL, MongoDB veya in-memory gibi farkl\u0131 veritabanlar\u0131 i\u00e7in somut Repository s\u0131n\u0131flar\u0131 (\u00f6rne\u011fin, <code>PostgreSQLProductRepository<\/code>) bu aray\u00fczleri uygular. Bu, veritaban\u0131 teknolojisini de\u011fi\u015ftirdi\u011finizde i\u015f mant\u0131\u011f\u0131na dokunmak zorunda kalmaman\u0131z\u0131 sa\u011flar.<\/li>\n<li><strong>Fabrika Deseni (Yarat\u0131msal, Arabirim Ba\u011fda\u015ft\u0131r\u0131c\u0131lar\u0131):<\/strong> <code>PaymentProcessorFactory<\/code>, kullan\u0131c\u0131 taraf\u0131ndan se\u00e7ilen \u00f6deme y\u00f6ntemine (kredi kart\u0131, PayPal, banka havalesi) g\u00f6re do\u011fru <code>PaymentProcessor<\/code> implementasyonunu (<code>StripeProcessor<\/code>, <code>PayPalProcessor<\/code> vb.) olu\u015fturur. <code>ProcessPaymentUseCase<\/code>, \u00f6deme i\u015flemcisini do\u011frudan \u00f6rneklemek yerine bu fabrikay\u0131 kullan\u0131r, bu da \u00f6deme sistemleri aras\u0131nda kolayca ge\u00e7i\u015f yapmay\u0131 sa\u011flar.<\/li>\n<li><strong>Strateji Deseni (Davran\u0131\u015fsal, Kullan\u0131m Durumlar\u0131):<\/strong> \u0130ndirim hesaplamalar\u0131 i\u00e7in kullan\u0131labilir. \u00d6rne\u011fin, <code>ApplyDiscountUseCase<\/code>, farkl\u0131 indirim stratejilerini (<code>SeasonalDiscountStrategy<\/code>, <code>LoyaltyDiscountStrategy<\/code>) parametre olarak alabilir. Bu, yeni indirim kampanyalar\u0131 ekledi\u011finizde mevcut kodu de\u011fi\u015ftirmek yerine sadece yeni bir strateji s\u0131n\u0131f\u0131 olu\u015fturman\u0131z\u0131 gerektirir.<\/li>\n<li><strong>Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (Dependency Injection - DI):<\/strong> T\u00fcm bu katmanlar aras\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar, genellikle bir DI konteyneri (\u00f6rne\u011fin, <code>punq<\/code>, <code>injector<\/code> veya basit bir elle yap\u0131lan enjeksiyon) arac\u0131l\u0131\u011f\u0131yla y\u00f6netilir. Bu, kullan\u0131m durumlar\u0131na ve kontrolc\u00fclere ihtiya\u00e7 duyduklar\u0131 Repository veya servis ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n d\u0131\u015far\u0131dan sa\u011flanmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r, b\u00f6ylece bile\u015fenler daha ba\u011f\u0131ms\u0131z ve test edilebilir hale gelir.<\/li>\n<\/ul>\n<h3>Faydalar\u0131:<\/h3>\n<ol>\n<li><strong>Test Edilebilirlik:<\/strong> Her katman ayr\u0131 ayr\u0131 test edilebilir. \u00d6rne\u011fin, <code>CreateOrderUseCase<\/code>'i test ederken ger\u00e7ek bir veritaban\u0131na ihtiya\u00e7 duymazs\u0131n\u0131z; sahte (mock) Repository implementasyonlar\u0131 kullanabilirsiniz.<\/li>\n<li><strong>S\u00fcrd\u00fcr\u00fclebilirlik:<\/strong> Kodun farkl\u0131 b\u00f6l\u00fcmleri aras\u0131nda net bir sorumluluk ayr\u0131m\u0131 oldu\u011fu i\u00e7in, bir de\u011fi\u015fiklik yap\u0131ld\u0131\u011f\u0131nda di\u011fer b\u00f6l\u00fcmlerin etkilenme riski azal\u0131r.<\/li>\n<li><strong>\u00d6l\u00e7eklenebilirlik:<\/strong> Sistemin bir b\u00f6l\u00fcm\u00fcn\u00fc (\u00f6rne\u011fin, veritaban\u0131) de\u011fi\u015ftirmek veya farkl\u0131 bir teknolojiye ge\u00e7mek \u00e7ok daha kolayd\u0131r. Farkl\u0131 \u00f6deme y\u00f6ntemleri veya bildirim servisleri eklemek, mevcut \u00e7ekirdek i\u015f mant\u0131\u011f\u0131n\u0131 etkilemez.<\/li>\n<li><strong>Esneklik:<\/strong> \u0130\u015f gereksinimleri de\u011fi\u015fti\u011finde (yeni bir indirim politikas\u0131, farkl\u0131 bir \u00f6deme sa\u011flay\u0131c\u0131s\u0131), sistem kolayca adapte edilebilir.<\/li>\n<\/ol>\n<p>Bu vaka analizi, Python tasar\u0131m desenlerinin Temiz Mimari ile nas\u0131l birle\u015ferek ger\u00e7ek d\u00fcnya sorunlar\u0131na sa\u011flam ve esnek \u00e7\u00f6z\u00fcmler sundu\u011funu g\u00f6stermektedir. Projenizin boyutundan ba\u011f\u0131ms\u0131z olarak, bu prensipleri benimsemek, uzun vadede daha kaliteli, y\u00f6netilebilir ve ba\u015far\u0131l\u0131 yaz\u0131l\u0131mlar geli\u015ftirmenize yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h2>\u0130leri D\u00fczey \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar: Projelerinizi Bir Sonraki Seviyeye Ta\u015f\u0131y\u0131n<\/h2>\n<p>Temiz Mimari prensiplerini ve tasar\u0131m desenlerini Python projelerinize entegre etmek, ba\u015flang\u0131\u00e7 i\u00e7in harika bir ad\u0131md\u0131r. Ancak, projeler b\u00fcy\u00fcd\u00fck\u00e7e ve karma\u015f\u0131kl\u0131k artt\u0131k\u00e7a, bu yap\u0131y\u0131 s\u00fcrd\u00fcrmek ve ondan en iyi \u015fekilde yararlanmak i\u00e7in baz\u0131 ileri d\u00fczey ipu\u00e7lar\u0131 ve en iyi uygulamalara ihtiya\u00e7 duyulabilir. Bu b\u00f6l\u00fcm, mevcut bilginizi bir sonraki seviyeye ta\u015f\u0131yacak pratik \u00f6neriler sunmaktad\u0131r.<\/p>\n<h3>1. Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (Dependency Injection - DI) \u00c7er\u00e7eveleri Kullan\u0131m\u0131<\/h3>\n<p>\u00d6nceki \u00f6rneklerde ba\u011f\u0131ml\u0131l\u0131klar\u0131 elle enjekte ettik, ancak b\u00fcy\u00fck projelerde bu, zamanla yorucu ve hataya a\u00e7\u0131k hale gelebilir. Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (DI) \u00e7er\u00e7eveleri, ba\u011f\u0131ml\u0131l\u0131klar\u0131n otomatik olarak y\u00f6netilmesini ve bile\u015fenlere sa\u011flanmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r. Python'da <code>punq<\/code>, <code>injector<\/code> veya <code>FastAPI<\/code>'nin kendi DI sistemi gibi k\u00fct\u00fcphaneler mevcuttur. Bu \u00e7er\u00e7eveler, hangi somut implementasyonun hangi aray\u00fcze kar\u015f\u0131l\u0131k geldi\u011fini yap\u0131land\u0131rman\u0131za ve uygulaman\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca ba\u011f\u0131ml\u0131l\u0131k grafi\u011fini y\u00f6netmenize olanak tan\u0131r. Bu sayede, \"Kullan\u0131m Durumlar\u0131\" katman\u0131n\u0131z\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131 otomatik olarak \u00e7\u00f6z\u00fcl\u00fcr ve testleriniz i\u00e7in mock (sahte) implementasyonlar\u0131 kolayca enjekte edebilirsiniz.<\/p>\n<pre><code>\n# \u00d6rnek: punq ile basit DI\n# from punq import Container\n# \n# # Aray\u00fczler ve Implementasyonlar (\u00f6nceki \u00f6rneklerden)\n# from src.domain.interfaces.repositories import ProductRepository, OrderRepository\n# from src.infrastructure.repositories.in_memory_repository import InMemoryProductRepository, InMemoryOrderRepository\n# from src.application.use_cases.place_order import PlaceOrderUseCase\n# \n# container = Container()\n# container.register(ProductRepository, InMemoryProductRepository)\n# container.register(OrderRepository, InMemoryOrderRepository)\n# container.register(PlaceOrderUseCase) # punq, PlaceOrderUseCase'in ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 otomatik bulur\n# \n# # Kullan\u0131m\n# place_order_use_case = container.resolve(PlaceOrderUseCase)\n# print(\"Use case ba\u015far\u0131yla DI ile \u00e7\u00f6z\u00fcld\u00fc.\")\n    <\/pre>\n<p><\/code><\/p>\n<aside class=\"expert-tip\">\n        Uzman \u0130pucu: Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu, \u00f6zellikle Aray\u00fcz Ba\u011fda\u015ft\u0131r\u0131c\u0131lar\u0131 katman\u0131n\u0131zda birden fazla Repository implementasyonu oldu\u011funda (\u00f6rne\u011fin, test ortam\u0131 i\u00e7in in-memory, \u00fcretim i\u00e7in PostgreSQL) uygulaman\u0131n kolayca yap\u0131land\u0131r\u0131labilmesini sa\u011flar.<br \/>\n    <\/aside>\n<h3>2. CQRS (Command Query Responsibility Segregation) Anlay\u0131\u015f\u0131<\/h3>\n<p>B\u00fcy\u00fck ve performans odakl\u0131 uygulamalarda, okuma (query) operasyonlar\u0131 ile yazma (command) operasyonlar\u0131n\u0131 ay\u0131rmak faydal\u0131 olabilir. CQRS, bu iki sorumlulu\u011fu farkl\u0131 modellere ay\u0131rarak sistemin \u00f6l\u00e7eklenebilirli\u011fini ve performans\u0131n\u0131 art\u0131r\u0131r. Okuma operasyonlar\u0131 i\u00e7in optimize edilmi\u015f veri modelleri ve yazma operasyonlar\u0131 i\u00e7in optimize edilmi\u015f komut i\u015fleyicileri kullan\u0131rs\u0131n\u0131z. Temiz Mimari i\u00e7inde CQRS'yi uygulamak, okuma ve yazma kullan\u0131m durumlar\u0131n\u0131 ayr\u0131 s\u0131n\u0131flar olarak tan\u0131mlamak ve her birine \u00f6zel Repository'ler veya veri eri\u015fim mekanizmalar\u0131 atamak anlam\u0131na gelebilir. Bu, sistemin belirli b\u00f6l\u00fcmlerinin a\u015f\u0131r\u0131 y\u00fcklenmesini \u00f6nler ve daha \u00f6zel optimizasyonlara izin verir.<\/p>\n<ul>\n<li><strong>Command (Yazma):<\/strong> Veri de\u011fi\u015ftiren i\u015flemler (<code>CreateOrderCommand<\/code>, <code>UpdateProductCommand<\/code>). Genellikle bir <code>CommandHandler<\/code> taraf\u0131ndan i\u015flenir.<\/li>\n<li><strong>Query (Okuma):<\/strong> Sadece veri okuyan i\u015flemler (<code>GetProductDetailsQuery<\/code>, <code>GetCustomerOrdersQuery<\/code>). Genellikle bir <code>QueryHandler<\/code> veya direkt <code>Repository<\/code> metotlar\u0131 taraf\u0131ndan i\u015flenir.<\/li>\n<\/ul>\n<h3>3. Kapsaml\u0131 Test Stratejileri<\/h3>\n<p>Temiz Mimari'nin en b\u00fcy\u00fck faydalar\u0131ndan biri test edilebilirli\u011fidir. Bu avantajdan tam olarak yararlanmak i\u00e7in kapsaml\u0131 bir test stratejisi benimseyin:<\/p>\n<ul>\n<li><strong>Unit Testleri:<\/strong> Her katmandaki i\u015f mant\u0131\u011f\u0131n\u0131 (\u00f6zellikle varl\u0131klar ve kullan\u0131m durumlar\u0131) ayr\u0131 ayr\u0131 test edin. Ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 mock'layarak, her bir bile\u015fenin kendi ba\u015f\u0131na do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olun.<\/li>\n<li><strong>Entegrasyon Testleri:<\/strong> Katmanlar aras\u0131 etkile\u015fimi ve harici sistemlerle (veritaban\u0131, API'ler) entegrasyonu test edin. Ger\u00e7ek veya test veritabanlar\u0131 kullanarak Repository'lerin do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulay\u0131n.<\/li>\n<li><strong>U\u00e7tan Uca (End-to-End) Testler:<\/strong> Uygulaman\u0131n tamam\u0131n\u0131, kullan\u0131c\u0131 aray\u00fcz\u00fc veya API \u00fczerinden bir kullan\u0131c\u0131 senaryosu ak\u0131\u015f\u0131n\u0131 sim\u00fcle ederek test edin. Bu, t\u00fcm sistemin beklendi\u011fi gibi \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olman\u0131z\u0131 sa\u011flar.<\/li>\n<\/ul>\n<p>Python'da <code>pytest<\/code> gibi g\u00fc\u00e7l\u00fc test \u00e7er\u00e7eveleri ve <code>unittest.mock<\/code> mod\u00fcl\u00fc, bu testleri yazmay\u0131 olduk\u00e7a kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>4. Detayl\u0131 Dok\u00fcmantasyon ve Kod Yorumlar\u0131<\/h3>\n<p>Mimari ne kadar temiz olursa olsun, karma\u015f\u0131k i\u015f kurallar\u0131n\u0131n ve tasar\u0131m kararlar\u0131n\u0131n dok\u00fcmantasyonu hayati \u00f6nem ta\u015f\u0131r. \u00d6zellikle kullan\u0131m durumlar\u0131, onlar\u0131n bekledi\u011fi girdi\/\u00e7\u0131kt\u0131 tipleri ve uygulad\u0131klar\u0131 i\u015f mant\u0131\u011f\u0131 iyi belgelenmelidir. Sphinx veya MkDocs gibi ara\u00e7larla otomatik dok\u00fcmantasyon olu\u015fturabilir, docstring'ler ve tip ipu\u00e7lar\u0131 (type hints) ile kodunuzu daha anla\u015f\u0131l\u0131r hale getirebilirsiniz. Bu, yeni ekip \u00fcyelerinin projeye h\u0131zla adapte olmas\u0131na ve mevcut geli\u015ftiricilerin i\u015f mant\u0131\u011f\u0131n\u0131 daha kolay anlamas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<h3>5. Geli\u015fmi\u015f Hata Y\u00f6netimi ve Loglama<\/h3>\n<p>Temiz Mimari'de hata y\u00f6netimi ve loglama da katmanlara ayr\u0131lmal\u0131d\u0131r. \u0130\u00e7 katmanlar (Varl\u0131klar, Kullan\u0131m Durumlar\u0131) i\u015f mant\u0131\u011f\u0131na \u00f6zg\u00fc istisnalar f\u0131rlatmal\u0131, d\u0131\u015f katmanlar (Arabirim Ba\u011fda\u015ft\u0131r\u0131c\u0131lar\u0131) ise bu istisnalar\u0131 yakalay\u0131p uygun HTTP yan\u0131tlar\u0131na d\u00f6n\u00fc\u015ft\u00fcrmeli veya loglamal\u0131d\u0131r. Python'\u0131n yerle\u015fik <code>logging<\/code> mod\u00fcl\u00fcn\u00fc kullanarak, farkl\u0131 katmanlardan gelen log mesajlar\u0131n\u0131 yap\u0131land\u0131rabilir ve hata ay\u0131klama s\u00fcrecini kolayla\u015ft\u0131rabilirsiniz.<\/p>\n<h3>6. Continuous Integration\/Deployment (CI\/CD) S\u00fcre\u00e7leri<\/h3>\n<p>Temiz Mimari'nin getirdi\u011fi mod\u00fclerlik ve test edilebilirli\u011fi kullanarak CI\/CD s\u00fcre\u00e7lerinizi g\u00fc\u00e7lendirin. Her kod de\u011fi\u015fikli\u011finde otomatik testleri \u00e7al\u0131\u015ft\u0131r\u0131n, kod kalitesi kontrolleri yap\u0131n (\u00f6rne\u011fin, <code>flake8<\/code>, <code>mypy<\/code>) ve ba\u015far\u0131l\u0131 derlemeleri otomatik olarak da\u011f\u0131t\u0131m i\u00e7in haz\u0131r hale getirin. Bu, hatalar\u0131n erken tespit edilmesini sa\u011flar ve geli\u015ftirme d\u00f6ng\u00fcs\u00fcn\u00fc h\u0131zland\u0131r\u0131r.<\/p>\n<pre><code class=\"language-css\">\n\/* Responsive Styles for Mobile *\/\n@media (max-width: 768px) {\n    body {\n        font-size: 16px;\n        padding: 10px;\n    }\n    h2 {\n        font-size: 24px;\n    }\n    h3 {\n        font-size: 20px;\n    }\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        text-align: right;\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        text-align: left;\n        font-weight: bold;\n    }\n    \/* S\u00fctun ba\u015fl\u0131klar\u0131n\u0131 td'nin \u00f6n\u00fcne ekle *\/\n    td:nth-of-type(1):before { content: \"Temiz Mimari Katman\u0131:\"; }\n    td:nth-of-type(2):before { content: \"Python Uygulamas\u0131:\"; }\n    td:nth-of-type(3):before { content: \"A\u00e7\u0131klama:\"; }\n    .expert-tip {\n        margin: 15px 0;\n        padding: 10px;\n        font-size: 0.9em;\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu ileri d\u00fczey ipu\u00e7lar\u0131, Temiz Mimari ve tasar\u0131m desenlerinin projelerinizdeki ger\u00e7ek potansiyelini ortaya \u00e7\u0131karman\u0131za yard\u0131mc\u0131 olacakt\u0131r. Sisteminizi sadece bug\u00fcn i\u00e7in de\u011fil, yar\u0131n i\u00e7in de sa\u011flam ve esnek tutarak, uzun vadede daha az teknik bor\u00e7 ve daha y\u00fcksek geli\u015ftirici memnuniyeti elde edeceksiniz.<\/p>\n<h2>Sonu\u00e7: Neden Temiz Mimari ve Tasar\u0131m Desenleri Yat\u0131r\u0131m\u0131n\u0131za De\u011fer?<\/h2>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme, s\u00fcrekli de\u011fi\u015fen gereksinimler ve teknolojilerle dolu karma\u015f\u0131k bir aland\u0131r. Bu dinamik ortamda, projelerin sadece i\u015flevsel de\u011fil, ayn\u0131 zamanda esnek, s\u00fcrd\u00fcr\u00fclebilir ve bak\u0131m\u0131 kolay olmas\u0131 hayati \u00f6nem ta\u015f\u0131r. Bu makale boyunca ele ald\u0131\u011f\u0131m\u0131z Python tasar\u0131m desenleriyle Temiz Mimari yakla\u015f\u0131m\u0131, bu hedeflere ula\u015fmak i\u00e7in kan\u0131tlanm\u0131\u015f bir yol haritas\u0131 sunar. Temiz Mimari, \u00e7ekirdek i\u015f mant\u0131\u011f\u0131n\u0131z\u0131 d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klardan izole ederek, yaz\u0131l\u0131m\u0131n farkl\u0131 katmanlar\u0131 aras\u0131nda net bir sorumluluk ayr\u0131m\u0131 olu\u015fturur. Bu ayr\u0131m, test edilebilirli\u011fi art\u0131r\u0131r, kodun okunabilirli\u011fini iyile\u015ftirir ve yeni \u00f6zellikler eklendi\u011finde veya mevcut teknolojiler de\u011fi\u015fti\u011finde sisteme adapte olmay\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<p>Tasar\u0131m desenleri ise, bu mimari prensipleri somutla\u015ft\u0131rmak i\u00e7in g\u00fc\u00e7l\u00fc ara\u00e7lard\u0131r. Fabrika deseniyle nesne yaratma s\u00fcre\u00e7lerini soyutlayabilir, Adapt\u00f6r deseniyle uyumsuz aray\u00fczleri birle\u015ftirebilir, Strateji deseniyle i\u015f mant\u0131\u011f\u0131n\u0131 esnek hale getirebilir ve Repository deseniyle veri eri\u015fimini soyutlayarak veritaban\u0131 ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131n\u0131 sa\u011flayabilirsiniz. Her bir desen, belirli bir problemi \u00e7\u00f6zmek i\u00e7in belirli bir ba\u011flamda en iyi sonucu vererek, Temiz Mimari'nin temel direkleri olan SOLID prensiplerini uygulamam\u0131za yard\u0131mc\u0131 olur. \u00d6zellikle Python'\u0131n esnek yap\u0131s\u0131, bu desenleri zarif ve \"Pythonik\" bir \u015fekilde uygulaman\u0131za olanak tan\u0131r.<\/p>\n<p>E-ticaret uygulamas\u0131 vaka analizi gibi ger\u00e7ek d\u00fcnya senaryolar\u0131nda g\u00f6rd\u00fc\u011f\u00fcm\u00fcz \u00fczere, Temiz Mimari ve tasar\u0131m desenlerinin entegrasyonu, sadece teknik bir tercih de\u011fil, ayn\u0131 zamanda stratejik bir yat\u0131r\u0131m karar\u0131d\u0131r. Bu yakla\u015f\u0131m, uzun vadede geli\u015ftirme maliyetlerini d\u00fc\u015f\u00fcr\u00fcr, hatalar\u0131 azalt\u0131r, ekibin verimlili\u011fini art\u0131r\u0131r ve en \u00f6nemlisi, m\u00fc\u015fterilerinize de\u011fer katan kaliteli ve sa\u011flam yaz\u0131l\u0131mlar sunman\u0131z\u0131 sa\u011flar. Ba\u015flang\u0131\u00e7ta biraz daha fazla planlama ve soyutlama gerektirse de, bu yat\u0131r\u0131mlar projenin ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca fazlas\u0131yla geri d\u00f6ner. Unutmay\u0131n, iyi bir mimari, sadece bug\u00fcn\u00fcn de\u011fil, yar\u0131n\u0131n da sorunlar\u0131na \u00e7\u00f6z\u00fcm \u00fcretir.<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<ol>\n<li>\n            <strong>S: Temiz Mimari Python'da a\u015f\u0131r\u0131 m\u00fchendislik (over-engineering) anlam\u0131na gelir mi?<\/strong><\/p>\n<p><strong>C:<\/strong> Her mimari yakla\u015f\u0131m gibi, Temiz Mimari de projenin boyutu ve karma\u015f\u0131kl\u0131\u011f\u0131na g\u00f6re adapte edilmelidir. K\u00fc\u00e7\u00fck, tek kullan\u0131ml\u0131k betikler i\u00e7in a\u015f\u0131r\u0131 olabilirken, orta ve b\u00fcy\u00fck \u00f6l\u00e7ekli, uzun \u00f6m\u00fcrl\u00fc, s\u00fcrekli geli\u015fmesi gereken uygulamalar i\u00e7in teknik borcu azaltarak uzun vadede geli\u015ftirme maliyetlerini d\u00fc\u015f\u00fcr\u00fcr ve s\u00fcrd\u00fcr\u00fclebilirli\u011fi art\u0131r\u0131r. Bu nedenle, projenin ihtiya\u00e7lar\u0131na g\u00f6re dengeli bir yakla\u015f\u0131m benimsemek \u00f6nemlidir.<\/p>\n<\/li>\n<li>\n            <strong>S: Python'da Temiz Mimari i\u00e7in hangi k\u00fct\u00fcphaneler\/\u00e7er\u00e7eveler \u00f6nerilir?<\/strong><\/p>\n<p><strong>C:<\/strong> Temiz Mimari prensipleri \u00e7er\u00e7eveden ba\u011f\u0131ms\u0131zd\u0131r. Flask veya FastAPI gibi hafif web \u00e7er\u00e7eveleri, ba\u011f\u0131ml\u0131l\u0131k enjeksiyonunu daha kolay y\u00f6netmenizi sa\u011flayabilir. Ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu i\u00e7in <code>punq<\/code> veya <code>injector<\/code> gibi k\u00fct\u00fcphaneler, ORM olarak SQLAlchemy (Core veya ORM) ve testler i\u00e7in <code>pytest<\/code> olduk\u00e7a pop\u00fcler ve uyumlu se\u00e7eneklerdir. \u00d6nemli olan, bu ara\u00e7lar\u0131 prensiplere uygun bir \u015fekilde kullanmakt\u0131r.<\/p>\n<\/li>\n<li>\n            <strong>S: Repository deseni ile ORM kullanmak \u00e7eli\u015fir mi?<\/strong><\/p>\n<p><strong>C:<\/strong> Hay\u0131r, tam aksine birbirini tamamlar. Repository deseni bir soyutlama sa\u011flarken, ORM (Object-Relational Mapper) bu soyutlaman\u0131n somut implementasyonlar\u0131ndan biri olabilir. \u00d6rne\u011fin, <code>ProductRepository<\/code> aray\u00fcz\u00fcn\u00fc uygulayan bir s\u0131n\u0131f i\u00e7inde <code>SQLAlchemy<\/code> ORM'i kullanarak veritaban\u0131 i\u015flemlerini ger\u00e7ekle\u015ftirebilirsiniz. Bu sayede, kullan\u0131m durumlar\u0131 ORM'in detaylar\u0131na ba\u011f\u0131ml\u0131 kalmaz, sadece Repository aray\u00fcz\u00fc ile etkile\u015fime girer.<\/p>\n<\/li>\n<li>\n            <strong>S: Temiz Mimari, mikroservis mimarileri i\u00e7in uygun mudur?<\/strong><\/p>\n<p><strong>C:<\/strong> Kesinlikle evet. Her bir mikroservis, kendi i\u00e7inde Temiz Mimari prensiplerini uygulayabilir. Bu, her bir servisin kendi i\u015f mant\u0131\u011f\u0131n\u0131 d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klardan izole etmesini sa\u011flar, b\u00f6ylece servisler daha ba\u011f\u0131ms\u0131z, test edilebilir ve geli\u015ftirilebilir hale gelir. Temiz Mimari'nin sa\u011flad\u0131\u011f\u0131 mod\u00fclerlik, mikroservislerin otonom yap\u0131s\u0131yla \u00e7ok iyi \u00f6rt\u00fc\u015f\u00fcr.<\/p>\n<\/li>\n<li>\n            <strong>S: Tasar\u0131m desenlerini Python'da nas\u0131l daha \"Pythonik\" kullanabilirim?<\/strong><\/p>\n<p><strong>C:<\/strong> Python'\u0131n dinamik yap\u0131s\u0131 ve dil \u00f6zellikleri, baz\u0131 GoF desenlerinin daha basit veya farkl\u0131 \u015fekillerde uygulanmas\u0131na olanak tan\u0131r. \u00d6rne\u011fin, Fabrika deseni i\u00e7in basit bir fabrika fonksiyonu (fonksiyonel programlama yakla\u015f\u0131m\u0131) veya kay\u0131t defteri (registry) kullanabilirsiniz. Strateji deseni i\u00e7in do\u011frudan fonksiyonlar\u0131 (first-class functions) veya lambdalar\u0131 kullanmak da m\u00fcmk\u00fcnd\u00fcr. \u00d6nemli olan, desenin alt\u0131nda yatan prensibi kavramak ve onu Python'\u0131n dil \u00f6zellikleriyle en temiz ve okunabilir \u015fekilde uygulamakt\u0131r, klasik GoF UML diyagramlar\u0131na s\u0131k\u0131 s\u0131k\u0131ya ba\u011fl\u0131 kalmaktan ziyade.<\/p>\n<\/li>\n<\/ol>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Modern Python projelerinde yaz\u0131l\u0131m\u0131n s\u00fcrd\u00fcr\u00fclebilirli\u011fini, test edilebilirli\u011fini ve \u00f6l\u00e7eklenebilirli\u011fini sa\u011flamak, her geli\u015ftiricinin en b\u00fcy\u00fck hedeflerindendir. Ancak, zamanla karma\u015f\u0131kla\u015fan&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":[1403],"tags":[],"class_list":{"0":"post-34464","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-python","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>Python Tasar\u0131m Desenleriyle Temiz Mimari Nas\u0131l Olu\u015fturulur?<\/title>\n<meta name=\"description\" content=\"Modern Python projelerinde yaz\u0131l\u0131m\u0131n s\u00fcrd\u00fcr\u00fclebilirli\u011fini, test edilebilirli\u011fini ve \u00f6l\u00e7eklenebilirli\u011fini sa\u011flamak, her geli\u015ftiricinin en b\u00fcy\u00fck hedeflerindendir. Ancak, zamanla karma\u015f\u0131kla\u015fan kod tabanlar\u0131, projenin y\u00f6netimini bir kabusa \u00e7evirebilir. Peki, bu sorunlar\u0131n \u00fcstesinden gelmek ve uzun \u00f6m\u00fcrl\u00fc, sa\u011fl\u0131kl\u0131 uygulamalar in\u015fa etmek m\u00fcmk\u00fcn m\u00fc? Elbette! Bu makale, Python tasar\u0131m desenlerini kullanarak temiz mimari prensiplerini projelerinize nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacak, b\u00f6ylece daha esnek ve g\u00fc\u00e7l\u00fc sistemler geli\u015ftirebileceksiniz.\" \/>\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\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Python Tasar\u0131m Desenleriyle Temiz Mimari Nas\u0131l Olu\u015fturulur?\" \/>\n<meta property=\"og:description\" content=\"Modern Python projelerinde yaz\u0131l\u0131m\u0131n s\u00fcrd\u00fcr\u00fclebilirli\u011fini, test edilebilirli\u011fini ve \u00f6l\u00e7eklenebilirli\u011fini sa\u011flamak, her geli\u015ftiricinin en b\u00fcy\u00fck hedeflerindendir. Ancak, zamanla karma\u015f\u0131kla\u015fan kod tabanlar\u0131, projenin y\u00f6netimini bir kabusa \u00e7evirebilir. Peki, bu sorunlar\u0131n \u00fcstesinden gelmek ve uzun \u00f6m\u00fcrl\u00fc, sa\u011fl\u0131kl\u0131 uygulamalar in\u015fa etmek m\u00fcmk\u00fcn m\u00fc? Elbette! Bu makale, Python tasar\u0131m desenlerini kullanarak temiz mimari prensiplerini projelerinize nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacak, b\u00f6ylece daha esnek ve g\u00fc\u00e7l\u00fc sistemler geli\u015ftirebileceksiniz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-16T23:01:37+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=\"22 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Python Tasar\u0131m Desenleriyle Temiz Mimari Nas\u0131l Olu\u015fturulur?\",\"datePublished\":\"2025-11-16T23:01:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/\"},\"wordCount\":6145,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Python\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/\",\"name\":\"Python Tasar\u0131m Desenleriyle Temiz Mimari Nas\u0131l Olu\u015fturulur?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-16T23:01:37+00:00\",\"description\":\"Modern Python projelerinde yaz\u0131l\u0131m\u0131n s\u00fcrd\u00fcr\u00fclebilirli\u011fini, test edilebilirli\u011fini ve \u00f6l\u00e7eklenebilirli\u011fini sa\u011flamak, her geli\u015ftiricinin en b\u00fcy\u00fck hedeflerindendir. Ancak, zamanla karma\u015f\u0131kla\u015fan kod tabanlar\u0131, projenin y\u00f6netimini bir kabusa \u00e7evirebilir. Peki, bu sorunlar\u0131n \u00fcstesinden gelmek ve uzun \u00f6m\u00fcrl\u00fc, sa\u011fl\u0131kl\u0131 uygulamalar in\u015fa etmek m\u00fcmk\u00fcn m\u00fc? Elbette! Bu makale, Python tasar\u0131m desenlerini kullanarak temiz mimari prensiplerini projelerinize nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacak, b\u00f6ylece daha esnek ve g\u00fc\u00e7l\u00fc sistemler geli\u015ftirebileceksiniz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python Tasar\u0131m Desenleriyle Temiz Mimari Nas\u0131l Olu\u015fturulur?\"}]},{\"@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":"Python Tasar\u0131m Desenleriyle Temiz Mimari Nas\u0131l Olu\u015fturulur?","description":"Modern Python projelerinde yaz\u0131l\u0131m\u0131n s\u00fcrd\u00fcr\u00fclebilirli\u011fini, test edilebilirli\u011fini ve \u00f6l\u00e7eklenebilirli\u011fini sa\u011flamak, her geli\u015ftiricinin en b\u00fcy\u00fck hedeflerindendir. Ancak, zamanla karma\u015f\u0131kla\u015fan kod tabanlar\u0131, projenin y\u00f6netimini bir kabusa \u00e7evirebilir. Peki, bu sorunlar\u0131n \u00fcstesinden gelmek ve uzun \u00f6m\u00fcrl\u00fc, sa\u011fl\u0131kl\u0131 uygulamalar in\u015fa etmek m\u00fcmk\u00fcn m\u00fc? Elbette! Bu makale, Python tasar\u0131m desenlerini kullanarak temiz mimari prensiplerini projelerinize nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacak, b\u00f6ylece daha esnek ve g\u00fc\u00e7l\u00fc sistemler geli\u015ftirebileceksiniz.","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\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/","og_locale":"tr_TR","og_type":"article","og_title":"Python Tasar\u0131m Desenleriyle Temiz Mimari Nas\u0131l Olu\u015fturulur?","og_description":"Modern Python projelerinde yaz\u0131l\u0131m\u0131n s\u00fcrd\u00fcr\u00fclebilirli\u011fini, test edilebilirli\u011fini ve \u00f6l\u00e7eklenebilirli\u011fini sa\u011flamak, her geli\u015ftiricinin en b\u00fcy\u00fck hedeflerindendir. Ancak, zamanla karma\u015f\u0131kla\u015fan kod tabanlar\u0131, projenin y\u00f6netimini bir kabusa \u00e7evirebilir. Peki, bu sorunlar\u0131n \u00fcstesinden gelmek ve uzun \u00f6m\u00fcrl\u00fc, sa\u011fl\u0131kl\u0131 uygulamalar in\u015fa etmek m\u00fcmk\u00fcn m\u00fc? Elbette! Bu makale, Python tasar\u0131m desenlerini kullanarak temiz mimari prensiplerini projelerinize nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacak, b\u00f6ylece daha esnek ve g\u00fc\u00e7l\u00fc sistemler geli\u015ftirebileceksiniz.","og_url":"https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-16T23:01:37+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"22 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Python Tasar\u0131m Desenleriyle Temiz Mimari Nas\u0131l Olu\u015fturulur?","datePublished":"2025-11-16T23:01:37+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/"},"wordCount":6145,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Python"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/","url":"https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/","name":"Python Tasar\u0131m Desenleriyle Temiz Mimari Nas\u0131l Olu\u015fturulur?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-16T23:01:37+00:00","description":"Modern Python projelerinde yaz\u0131l\u0131m\u0131n s\u00fcrd\u00fcr\u00fclebilirli\u011fini, test edilebilirli\u011fini ve \u00f6l\u00e7eklenebilirli\u011fini sa\u011flamak, her geli\u015ftiricinin en b\u00fcy\u00fck hedeflerindendir. Ancak, zamanla karma\u015f\u0131kla\u015fan kod tabanlar\u0131, projenin y\u00f6netimini bir kabusa \u00e7evirebilir. Peki, bu sorunlar\u0131n \u00fcstesinden gelmek ve uzun \u00f6m\u00fcrl\u00fc, sa\u011fl\u0131kl\u0131 uygulamalar in\u015fa etmek m\u00fcmk\u00fcn m\u00fc? Elbette! Bu makale, Python tasar\u0131m desenlerini kullanarak temiz mimari prensiplerini projelerinize nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacak, b\u00f6ylece daha esnek ve g\u00fc\u00e7l\u00fc sistemler geli\u015ftirebileceksiniz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/python-tasarim-desenleriyle-temiz-mimari-nasil-olusturulur\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Python Tasar\u0131m Desenleriyle Temiz Mimari Nas\u0131l Olu\u015fturulur?"}]},{"@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\/34464","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=34464"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34464\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34464"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34464"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34464"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}