[{"data":1,"prerenderedAt":1363},["ShallowReactive",2],{"post-\u002Ftr\u002Ffacade-tasarim-deseni-nedir":3},{"page":4,"translation":1211,"nav":1225,"related":1341,"random":1352},{"id":5,"title":6,"body":7,"categories":1209,"category":1211,"date":1212,"description":1213,"draft":1214,"extension":1215,"image":1216,"kind":1211,"lang":373,"meta":1217,"navigation":176,"path":1132,"readingTime":173,"seo":1218,"slug":1219,"stem":1220,"tags":1221,"translationKey":1211,"type":1210,"updated":1211,"__hash__":1224},"postsTr\u002Ftr\u002Ffacade-tasarim-deseni-nedir.md","Facade Tasarım Deseni Nedir?",{"type":8,"value":9,"toc":1190},"minimark",[10,20,33,36,77,80,85,90,92,96,99,102,104,108,113,116,127,129,133,136,360,362,366,441,443,447,461,463,467,495,497,501,506,835,839,1048,1050,1054,1058,1061,1065,1068,1072,1075,1077,1081,1086,1108,1113,1140,1145,1186],[11,12,13,14,19],"p",{},"Bu yazı ",[15,16,18],"a",{"href":17},"\u002Ftr\u002Fdesign-patterns-tasarim-desenleri-nedir","Design Patterns\u002FTasarım Desenleri Nedir?"," başlıklı yazı dizisinin bir parçasıdır.",[11,21,22,23,32],{},"Bu içerik ağırlıklı olarak ",[15,24,31],{"href":25,"rel":26,"target":30},"https:\u002F\u002Frefactoring.guru\u002Fdesign-patterns",[27,28,29],"nofollow","noopener","noreferrer","_blank","refactoring.guru"," sitesindeki içeriğin tercümesi ve derlenmesinden oluşturulmuştur.",[11,34,35],{},"Tüm tasarım desenleri ya da diğer adıyla tasarım kalıplarına yönelik ayrıntılı içeriklere yazının sonundaki bağlantılardan ulaşabilirsiniz.",[37,38,39,46],"blockquote",{},[11,40,41,42],{},"💡 ",[43,44,45],"strong",{},"Özet (TL;DR):",[47,48,49,56,71],"ul",{},[50,51,52,55],"li",{},[43,53,54],{},"Amaç:"," Çok sayıda karmaşık sınıftan oluşan bir alt sisteme (subsystem), kullanımı kolay basitleştirilmiş tek bir giriş kapısı (arayüz) sağlar.",[50,57,58,61,62,66,67,70],{},[43,59,60],{},"Kilit Yapılar:"," Önyüz Sınıfı (",[63,64,65],"code",{},"Facade",") ve Alt Sistem Sınıfları (",[63,68,69],{},"Subsystems",").",[50,72,73,76],{},[43,74,75],{},"Avantajları:"," İstemci kodun alt sisteme olan bağımlılığını (tight coupling) azaltır. Kodun okunabilirliğini ve bakımını kolaylaştırır.",[78,79],"hr",{},[81,82,84],"h2",{"id":83},"facade-tasarım-deseninin-amacı","Facade Tasarım Deseninin Amacı",[11,86,87,89],{},[43,88,65],{}," (Önyüz), bir kütüphane, framework ya da karmaşık sınıflardan oluşan bir alt sistem için basitleştirilmiş bir arayüz sunan yapısal (structural) bir tasarım desenidir.",[78,91],{},[81,93,95],{"id":94},"sorun","Sorun",[11,97,98],{},"Kodunuzu karmaşık bir kütüphane veya framework içerisindeki onlarca nesneyle çalışacak şekilde tasarlamanız gerektiğini düşünün. Normal şartlarda bu nesnelerin tamamını başlatmanız (initialize), bağımlılıklarını yönetmeniz ve metotları doğru sırada çalıştırmanız gerekir.",[11,100,101],{},"Bu durumda, yazmış olduğunuz kendi sınıflarınızın iş mantığı, üçüncü parti kütüphanelerin sınıflarına sıkı sıkıya bağlı (tightly coupled) hale gelecektir. Bu da kodun anlaşılmasını, test edilmesini ve gelecekte yönetilmesini zorlaştırır.",[78,103],{},[81,105,107],{"id":106},"çözüm","Çözüm",[11,109,110,112],{},[43,111,65],{},", birçok değişken parça içeren karmaşık bir sisteme basit bir giriş arayüzü sunan bir sınıftır. Alt sisteme doğrudan erişmeye kıyasla daha sınırlı ve özelleştirilmiş bir işlevsellik sağlar, ancak istemcilerin en çok ihtiyaç duyduğu özellikleri tek bir çatı altında toplar.",[11,114,115],{},"Bir kütüphanenin sadece çok küçük bir özelliğine ihtiyaç duyduğunuzda Facade harika iş çıkarır.",[11,117,118,119,122,123,126],{},"Örneğin, sosyal medyaya video yükleyen basit bir uygulama yaptığınızı varsayalım. Arka planda onlarca ayarı ve parametresi olan devasa bir video dönüştürme (encoding) kütüphanesi kullanıyorsunuz. İstemcinin tüm bu detaylarla boğuşması yerine, sadece ",[63,120,121],{},"encode(filename, format)"," metoduna sahip bir ",[63,124,125],{},"VideoConverterFacade"," sınıfı yazarız. Bu sınıf karmaşık kütüphaneyi arka planda başlatır ve yönetir. İstemci ise sadece bu Facade ile konuşur.",[78,128],{},[81,130,132],{"id":131},"gerçek-hayat-senaryosu-e-ticaret-sipariş-i̇şlemleri-checkout","Gerçek Hayat Senaryosu: E-Ticaret Sipariş İşlemleri (Checkout)",[11,134,135],{},"Bir sipariş checkout süreci; stok kontrolü, ödeme tahsilatı, kargo gönderimi ve bildirim gönderimi gibi birçok bağımsız servisin çalışmasını gerektirir:",[137,138,143],"pre",{"className":139,"code":140,"language":141,"meta":142,"style":142},"language-php shiki shiki-themes github-light github-dark","\u002F\u002F 1. Alt Sistemler (Subsystems)\nclass InventoryService {\n    public function checkStock(int $productId): bool { return true; }\n}\n\nclass PaymentService {\n    public function charge(int $customerId, int $amount): void {\n        echo \"Ödeme alındı.\\n\";\n    }\n}\n\nclass ShippingService {\n    public function createShipment(int $productId): void {\n        echo \"Kargo kaydı oluşturuldu.\\n\";\n    }\n}\n\n\u002F\u002F 2. Facade Sınıfı (Orkestrasyonu üstlenir)\nclass OrderProcessingFacade {\n    private InventoryService $inventory;\n    private PaymentService $payment;\n    private ShippingService $shipping;\n\n    public function __construct() {\n        $this->inventory = new InventoryService();\n        $this->payment = new PaymentService();\n        $this->shipping = new ShippingService();\n    }\n\n    public function placeOrder(int $customerId, int $productId, int $amount): void {\n        if ($this->inventory->checkStock($productId)) {\n            $this->payment->charge($customerId, $amount);\n            $this->shipping->createShipment($productId);\n            echo \"Sipariş başarıyla tamamlandı!\\n\";\n        }\n    }\n}\n","php","",[63,144,145,153,159,165,171,178,184,190,196,202,207,212,218,224,230,235,240,245,251,257,263,269,275,280,286,292,298,304,309,314,320,326,332,338,344,350,355],{"__ignoreMap":142},[146,147,150],"span",{"class":148,"line":149},"line",1,[146,151,152],{},"\u002F\u002F 1. Alt Sistemler (Subsystems)\n",[146,154,156],{"class":148,"line":155},2,[146,157,158],{},"class InventoryService {\n",[146,160,162],{"class":148,"line":161},3,[146,163,164],{},"    public function checkStock(int $productId): bool { return true; }\n",[146,166,168],{"class":148,"line":167},4,[146,169,170],{},"}\n",[146,172,174],{"class":148,"line":173},5,[146,175,177],{"emptyLinePlaceholder":176},true,"\n",[146,179,181],{"class":148,"line":180},6,[146,182,183],{},"class PaymentService {\n",[146,185,187],{"class":148,"line":186},7,[146,188,189],{},"    public function charge(int $customerId, int $amount): void {\n",[146,191,193],{"class":148,"line":192},8,[146,194,195],{},"        echo \"Ödeme alındı.\\n\";\n",[146,197,199],{"class":148,"line":198},9,[146,200,201],{},"    }\n",[146,203,205],{"class":148,"line":204},10,[146,206,170],{},[146,208,210],{"class":148,"line":209},11,[146,211,177],{"emptyLinePlaceholder":176},[146,213,215],{"class":148,"line":214},12,[146,216,217],{},"class ShippingService {\n",[146,219,221],{"class":148,"line":220},13,[146,222,223],{},"    public function createShipment(int $productId): void {\n",[146,225,227],{"class":148,"line":226},14,[146,228,229],{},"        echo \"Kargo kaydı oluşturuldu.\\n\";\n",[146,231,233],{"class":148,"line":232},15,[146,234,201],{},[146,236,238],{"class":148,"line":237},16,[146,239,170],{},[146,241,243],{"class":148,"line":242},17,[146,244,177],{"emptyLinePlaceholder":176},[146,246,248],{"class":148,"line":247},18,[146,249,250],{},"\u002F\u002F 2. Facade Sınıfı (Orkestrasyonu üstlenir)\n",[146,252,254],{"class":148,"line":253},19,[146,255,256],{},"class OrderProcessingFacade {\n",[146,258,260],{"class":148,"line":259},20,[146,261,262],{},"    private InventoryService $inventory;\n",[146,264,266],{"class":148,"line":265},21,[146,267,268],{},"    private PaymentService $payment;\n",[146,270,272],{"class":148,"line":271},22,[146,273,274],{},"    private ShippingService $shipping;\n",[146,276,278],{"class":148,"line":277},23,[146,279,177],{"emptyLinePlaceholder":176},[146,281,283],{"class":148,"line":282},24,[146,284,285],{},"    public function __construct() {\n",[146,287,289],{"class":148,"line":288},25,[146,290,291],{},"        $this->inventory = new InventoryService();\n",[146,293,295],{"class":148,"line":294},26,[146,296,297],{},"        $this->payment = new PaymentService();\n",[146,299,301],{"class":148,"line":300},27,[146,302,303],{},"        $this->shipping = new ShippingService();\n",[146,305,307],{"class":148,"line":306},28,[146,308,201],{},[146,310,312],{"class":148,"line":311},29,[146,313,177],{"emptyLinePlaceholder":176},[146,315,317],{"class":148,"line":316},30,[146,318,319],{},"    public function placeOrder(int $customerId, int $productId, int $amount): void {\n",[146,321,323],{"class":148,"line":322},31,[146,324,325],{},"        if ($this->inventory->checkStock($productId)) {\n",[146,327,329],{"class":148,"line":328},32,[146,330,331],{},"            $this->payment->charge($customerId, $amount);\n",[146,333,335],{"class":148,"line":334},33,[146,336,337],{},"            $this->shipping->createShipment($productId);\n",[146,339,341],{"class":148,"line":340},34,[146,342,343],{},"            echo \"Sipariş başarıyla tamamlandı!\\n\";\n",[146,345,347],{"class":148,"line":346},35,[146,348,349],{},"        }\n",[146,351,353],{"class":148,"line":352},36,[146,354,201],{},[146,356,358],{"class":148,"line":357},37,[146,359,170],{},[78,361],{},[81,363,365],{"id":364},"facade-vs-mediator-vs-adapter-vs-proxy","Facade vs Mediator vs Adapter vs Proxy",[367,368,369,386],"table",{},[370,371,372],"thead",{},[373,374,375,380,383],"tr",{},[376,377,379],"th",{"align":378},"left","Desen",[376,381,382],{"align":378},"Amaç",[376,384,385],{"align":378},"Alt Sistem İlişkisi",[387,388,389,402,415,428],"tbody",{},[373,390,391,396,399],{},[392,393,394],"td",{"align":378},[43,395,65],{},[392,397,398],{"align":378},"Karmaşık alt sistemleri tek ve basit bir arayüzle sunmak.",[392,400,401],{"align":378},"Alt sistem Facade'in varlığından habersizdir.",[373,403,404,409,412],{},[392,405,406],{"align":378},[43,407,408],{},"Mediator",[392,410,411],{"align":378},"Nesneler arası iletişimi merkezileştirip kaosu önlemek.",[392,413,414],{"align":378},"Nesneler sadece Mediator ile konuşur, birbirini bilmez.",[373,416,417,422,425],{},[392,418,419],{"align":378},[43,420,421],{},"Adapter",[392,423,424],{"align":378},"Uyumsuz bir arayüzü uyumlu hale getirmek.",[392,426,427],{"align":378},"Genelde tek bir nesneyi sarar (dönüştürür).",[373,429,430,435,438],{},[392,431,432],{"align":378},[43,433,434],{},"Proxy",[392,436,437],{"align":378},"Gerçek nesneye erişimi kontrol etmek (caching, auth vb.).",[392,439,440],{"align":378},"Gerçek nesne ile aynı arayüze sahiptir.",[78,442],{},[81,444,446],{"id":445},"uygulanabilirlik","Uygulanabilirlik",[47,448,449,455],{},[50,450,451,454],{},[43,452,453],{},"Basit Arayüz İhtiyacı:"," Karmaşık ve çok sayıda sınıftan oluşan bir alt sisteme sınırlı ama kullanımı kolay bir geçiş noktası sağlamak istediğinizde kullanın.",[50,456,457,460],{},[43,458,459],{},"Katmanlı Mimari (Decoupling):"," Alt sistemleri katmanlara ayırmak ve katmanlar arasındaki geçişleri sadece belirli Facade kapıları üzerinden yaparak bağımlılıkları en aza indirmek istediğinizde kullanın.",[78,462],{},[81,464,466],{"id":465},"diğer-tasarım-desenleri-ile-i̇lişkisi","Diğer Tasarım Desenleri ile İlişkisi",[47,468,469,477,487],{},[50,470,471,473,474,476],{},[43,472,65],{}," mevcut nesneler için yeni bir arayüz tanımlarken, ",[43,475,421],{}," mevcut bir arayüzü kullanılabilir hale getirmeye çalışır.",[50,478,479,480,483,484,486],{},"Alt sistem nesnelerinin sadece oluşturulma aşamalarını istemci koddan gizlemek istiyorsanız ",[43,481,482],{},"Abstract Factory",", ",[43,485,65],{},"'e bir alternatif veya yardımcı olarak kullanılabilir.",[50,488,489,491,492,494],{},[43,490,65],{},"'ler kompleks nesnelerle çalışırken ara tampon görevi görmeleri yönüyle ",[43,493,434],{},"'lere benzerler. Ancak Proxy, servis nesnesi ile birebir aynı arayüze sahiptir.",[78,496],{},[81,498,500],{"id":499},"facade-tasarım-deseni-kod-örnekleri","Facade Tasarım Deseni Kod Örnekleri",[502,503,505],"h3",{"id":504},"örnek-php-kodu","Örnek PHP Kodu",[137,507,509],{"className":139,"code":508,"language":141,"meta":142,"style":142},"\u003C?php\n\nnamespace RefactoringGuru\\Facade\\Conceptual;\n\nclass Facade\n{\n    protected Subsystem1 $subsystem1;\n    protected Subsystem2 $subsystem2;\n\n    public function __construct(\n        ?Subsystem1 $subsystem1 = null,\n        ?Subsystem2 $subsystem2 = null\n    ) {\n        $this->subsystem1 = $subsystem1 ?: new Subsystem1();\n        $this->subsystem2 = $subsystem2 ?: new Subsystem2();\n    }\n\n    public function operation(): string\n    {\n        $result = \"Facade alt sistemleri hazırlıyor:\\n\";\n        $result .= $this->subsystem1->operation1();\n        $result .= $this->subsystem2->operation1();\n        $result .= \"Facade alt sistemlere komut veriyor:\\n\";\n        $result .= $this->subsystem1->operationN();\n        $result .= $this->subsystem2->operationZ();\n\n        return $result;\n    }\n}\n\nclass Subsystem1\n{\n    public function operation1(): string\n    {\n        return \"Subsystem1: Hazır!\\n\";\n    }\n\n    public function operationN(): string\n    {\n        return \"Subsystem1: Başla!\\n\";\n    }\n}\n\nclass Subsystem2\n{\n    public function operation1(): string\n    {\n        return \"Subsystem2: Hazırlan!\\n\";\n    }\n\n    public function operationZ(): string\n    {\n        return \"Subsystem2: Ateşle!\\n\";\n    }\n}\n\nfunction clientCode(Facade $facade)\n{\n    echo $facade->operation();\n}\n\n$subsystem1 = new Subsystem1();\n$subsystem2 = new Subsystem2();\n$facade = new Facade($subsystem1, $subsystem2);\nclientCode($facade);\n",[63,510,511,516,520,525,529,534,539,544,549,553,558,563,568,573,578,583,587,591,596,601,606,611,616,621,626,631,635,640,644,648,652,657,661,666,670,675,679,683,689,694,700,705,710,715,721,726,731,736,742,747,752,758,763,769,774,779,784,790,795,801,806,811,817,823,829],{"__ignoreMap":142},[146,512,513],{"class":148,"line":149},[146,514,515],{},"\u003C?php\n",[146,517,518],{"class":148,"line":155},[146,519,177],{"emptyLinePlaceholder":176},[146,521,522],{"class":148,"line":161},[146,523,524],{},"namespace RefactoringGuru\\Facade\\Conceptual;\n",[146,526,527],{"class":148,"line":167},[146,528,177],{"emptyLinePlaceholder":176},[146,530,531],{"class":148,"line":173},[146,532,533],{},"class Facade\n",[146,535,536],{"class":148,"line":180},[146,537,538],{},"{\n",[146,540,541],{"class":148,"line":186},[146,542,543],{},"    protected Subsystem1 $subsystem1;\n",[146,545,546],{"class":148,"line":192},[146,547,548],{},"    protected Subsystem2 $subsystem2;\n",[146,550,551],{"class":148,"line":198},[146,552,177],{"emptyLinePlaceholder":176},[146,554,555],{"class":148,"line":204},[146,556,557],{},"    public function __construct(\n",[146,559,560],{"class":148,"line":209},[146,561,562],{},"        ?Subsystem1 $subsystem1 = null,\n",[146,564,565],{"class":148,"line":214},[146,566,567],{},"        ?Subsystem2 $subsystem2 = null\n",[146,569,570],{"class":148,"line":220},[146,571,572],{},"    ) {\n",[146,574,575],{"class":148,"line":226},[146,576,577],{},"        $this->subsystem1 = $subsystem1 ?: new Subsystem1();\n",[146,579,580],{"class":148,"line":232},[146,581,582],{},"        $this->subsystem2 = $subsystem2 ?: new Subsystem2();\n",[146,584,585],{"class":148,"line":237},[146,586,201],{},[146,588,589],{"class":148,"line":242},[146,590,177],{"emptyLinePlaceholder":176},[146,592,593],{"class":148,"line":247},[146,594,595],{},"    public function operation(): string\n",[146,597,598],{"class":148,"line":253},[146,599,600],{},"    {\n",[146,602,603],{"class":148,"line":259},[146,604,605],{},"        $result = \"Facade alt sistemleri hazırlıyor:\\n\";\n",[146,607,608],{"class":148,"line":265},[146,609,610],{},"        $result .= $this->subsystem1->operation1();\n",[146,612,613],{"class":148,"line":271},[146,614,615],{},"        $result .= $this->subsystem2->operation1();\n",[146,617,618],{"class":148,"line":277},[146,619,620],{},"        $result .= \"Facade alt sistemlere komut veriyor:\\n\";\n",[146,622,623],{"class":148,"line":282},[146,624,625],{},"        $result .= $this->subsystem1->operationN();\n",[146,627,628],{"class":148,"line":288},[146,629,630],{},"        $result .= $this->subsystem2->operationZ();\n",[146,632,633],{"class":148,"line":294},[146,634,177],{"emptyLinePlaceholder":176},[146,636,637],{"class":148,"line":300},[146,638,639],{},"        return $result;\n",[146,641,642],{"class":148,"line":306},[146,643,201],{},[146,645,646],{"class":148,"line":311},[146,647,170],{},[146,649,650],{"class":148,"line":316},[146,651,177],{"emptyLinePlaceholder":176},[146,653,654],{"class":148,"line":322},[146,655,656],{},"class Subsystem1\n",[146,658,659],{"class":148,"line":328},[146,660,538],{},[146,662,663],{"class":148,"line":334},[146,664,665],{},"    public function operation1(): string\n",[146,667,668],{"class":148,"line":340},[146,669,600],{},[146,671,672],{"class":148,"line":346},[146,673,674],{},"        return \"Subsystem1: Hazır!\\n\";\n",[146,676,677],{"class":148,"line":352},[146,678,201],{},[146,680,681],{"class":148,"line":357},[146,682,177],{"emptyLinePlaceholder":176},[146,684,686],{"class":148,"line":685},38,[146,687,688],{},"    public function operationN(): string\n",[146,690,692],{"class":148,"line":691},39,[146,693,600],{},[146,695,697],{"class":148,"line":696},40,[146,698,699],{},"        return \"Subsystem1: Başla!\\n\";\n",[146,701,703],{"class":148,"line":702},41,[146,704,201],{},[146,706,708],{"class":148,"line":707},42,[146,709,170],{},[146,711,713],{"class":148,"line":712},43,[146,714,177],{"emptyLinePlaceholder":176},[146,716,718],{"class":148,"line":717},44,[146,719,720],{},"class Subsystem2\n",[146,722,724],{"class":148,"line":723},45,[146,725,538],{},[146,727,729],{"class":148,"line":728},46,[146,730,665],{},[146,732,734],{"class":148,"line":733},47,[146,735,600],{},[146,737,739],{"class":148,"line":738},48,[146,740,741],{},"        return \"Subsystem2: Hazırlan!\\n\";\n",[146,743,745],{"class":148,"line":744},49,[146,746,201],{},[146,748,750],{"class":148,"line":749},50,[146,751,177],{"emptyLinePlaceholder":176},[146,753,755],{"class":148,"line":754},51,[146,756,757],{},"    public function operationZ(): string\n",[146,759,761],{"class":148,"line":760},52,[146,762,600],{},[146,764,766],{"class":148,"line":765},53,[146,767,768],{},"        return \"Subsystem2: Ateşle!\\n\";\n",[146,770,772],{"class":148,"line":771},54,[146,773,201],{},[146,775,777],{"class":148,"line":776},55,[146,778,170],{},[146,780,782],{"class":148,"line":781},56,[146,783,177],{"emptyLinePlaceholder":176},[146,785,787],{"class":148,"line":786},57,[146,788,789],{},"function clientCode(Facade $facade)\n",[146,791,793],{"class":148,"line":792},58,[146,794,538],{},[146,796,798],{"class":148,"line":797},59,[146,799,800],{},"    echo $facade->operation();\n",[146,802,804],{"class":148,"line":803},60,[146,805,170],{},[146,807,809],{"class":148,"line":808},61,[146,810,177],{"emptyLinePlaceholder":176},[146,812,814],{"class":148,"line":813},62,[146,815,816],{},"$subsystem1 = new Subsystem1();\n",[146,818,820],{"class":148,"line":819},63,[146,821,822],{},"$subsystem2 = new Subsystem2();\n",[146,824,826],{"class":148,"line":825},64,[146,827,828],{},"$facade = new Facade($subsystem1, $subsystem2);\n",[146,830,832],{"class":148,"line":831},65,[146,833,834],{},"clientCode($facade);\n",[502,836,838],{"id":837},"örnek-python-kodu","Örnek Python Kodu",[137,840,844],{"className":841,"code":842,"language":843,"meta":142,"style":142},"language-python shiki shiki-themes github-light github-dark","from __future__ import annotations\n\nclass Facade:\n    def __init__(self, subsystem1: Subsystem1 | None = None, subsystem2: Subsystem2 | None = None) -> None:\n        self._subsystem1 = subsystem1 or Subsystem1()\n        self._subsystem2 = subsystem2 or Subsystem2()\n\n    def operation(self) -> str:\n        results = []\n        results.append(\"Facade alt sistemleri hazırlıyor:\")\n        results.append(self._subsystem1.operation1())\n        results.append(self._subsystem2.operation1())\n        results.append(\"Facade alt sistemlere komut veriyor:\")\n        results.append(self._subsystem1.operation_n())\n        results.append(self._subsystem2.operation_z())\n        return \"\\n\".join(results)\n\n\nclass Subsystem1:\n    def operation1(self) -> str:\n        return \"Subsystem1: Hazır!\"\n\n    def operation_n(self) -> str:\n        return \"Subsystem1: Başla!\"\n\n\nclass Subsystem2:\n    def operation1(self) -> str:\n        return \"Subsystem2: Hazırlan!\"\n\n    def operation_z(self) -> str:\n        return \"Subsystem2: Ateşle!\"\n\n\ndef client_code(facade: Facade) -> None:\n    print(facade.operation(), end=\"\")\n\n\nif __name__ == \"__main__\":\n    subsystem1 = Subsystem1()\n    subsystem2 = Subsystem2()\n    facade = Facade(subsystem1, subsystem2)\n    client_code(facade)\n","python",[63,845,846,851,855,860,865,870,875,879,884,889,894,899,904,909,914,919,924,928,932,937,942,947,951,956,961,965,969,974,978,983,987,992,997,1001,1005,1010,1015,1019,1023,1028,1033,1038,1043],{"__ignoreMap":142},[146,847,848],{"class":148,"line":149},[146,849,850],{},"from __future__ import annotations\n",[146,852,853],{"class":148,"line":155},[146,854,177],{"emptyLinePlaceholder":176},[146,856,857],{"class":148,"line":161},[146,858,859],{},"class Facade:\n",[146,861,862],{"class":148,"line":167},[146,863,864],{},"    def __init__(self, subsystem1: Subsystem1 | None = None, subsystem2: Subsystem2 | None = None) -> None:\n",[146,866,867],{"class":148,"line":173},[146,868,869],{},"        self._subsystem1 = subsystem1 or Subsystem1()\n",[146,871,872],{"class":148,"line":180},[146,873,874],{},"        self._subsystem2 = subsystem2 or Subsystem2()\n",[146,876,877],{"class":148,"line":186},[146,878,177],{"emptyLinePlaceholder":176},[146,880,881],{"class":148,"line":192},[146,882,883],{},"    def operation(self) -> str:\n",[146,885,886],{"class":148,"line":198},[146,887,888],{},"        results = []\n",[146,890,891],{"class":148,"line":204},[146,892,893],{},"        results.append(\"Facade alt sistemleri hazırlıyor:\")\n",[146,895,896],{"class":148,"line":209},[146,897,898],{},"        results.append(self._subsystem1.operation1())\n",[146,900,901],{"class":148,"line":214},[146,902,903],{},"        results.append(self._subsystem2.operation1())\n",[146,905,906],{"class":148,"line":220},[146,907,908],{},"        results.append(\"Facade alt sistemlere komut veriyor:\")\n",[146,910,911],{"class":148,"line":226},[146,912,913],{},"        results.append(self._subsystem1.operation_n())\n",[146,915,916],{"class":148,"line":232},[146,917,918],{},"        results.append(self._subsystem2.operation_z())\n",[146,920,921],{"class":148,"line":237},[146,922,923],{},"        return \"\\n\".join(results)\n",[146,925,926],{"class":148,"line":242},[146,927,177],{"emptyLinePlaceholder":176},[146,929,930],{"class":148,"line":247},[146,931,177],{"emptyLinePlaceholder":176},[146,933,934],{"class":148,"line":253},[146,935,936],{},"class Subsystem1:\n",[146,938,939],{"class":148,"line":259},[146,940,941],{},"    def operation1(self) -> str:\n",[146,943,944],{"class":148,"line":265},[146,945,946],{},"        return \"Subsystem1: Hazır!\"\n",[146,948,949],{"class":148,"line":271},[146,950,177],{"emptyLinePlaceholder":176},[146,952,953],{"class":148,"line":277},[146,954,955],{},"    def operation_n(self) -> str:\n",[146,957,958],{"class":148,"line":282},[146,959,960],{},"        return \"Subsystem1: Başla!\"\n",[146,962,963],{"class":148,"line":288},[146,964,177],{"emptyLinePlaceholder":176},[146,966,967],{"class":148,"line":294},[146,968,177],{"emptyLinePlaceholder":176},[146,970,971],{"class":148,"line":300},[146,972,973],{},"class Subsystem2:\n",[146,975,976],{"class":148,"line":306},[146,977,941],{},[146,979,980],{"class":148,"line":311},[146,981,982],{},"        return \"Subsystem2: Hazırlan!\"\n",[146,984,985],{"class":148,"line":316},[146,986,177],{"emptyLinePlaceholder":176},[146,988,989],{"class":148,"line":322},[146,990,991],{},"    def operation_z(self) -> str:\n",[146,993,994],{"class":148,"line":328},[146,995,996],{},"        return \"Subsystem2: Ateşle!\"\n",[146,998,999],{"class":148,"line":334},[146,1000,177],{"emptyLinePlaceholder":176},[146,1002,1003],{"class":148,"line":340},[146,1004,177],{"emptyLinePlaceholder":176},[146,1006,1007],{"class":148,"line":346},[146,1008,1009],{},"def client_code(facade: Facade) -> None:\n",[146,1011,1012],{"class":148,"line":352},[146,1013,1014],{},"    print(facade.operation(), end=\"\")\n",[146,1016,1017],{"class":148,"line":357},[146,1018,177],{"emptyLinePlaceholder":176},[146,1020,1021],{"class":148,"line":685},[146,1022,177],{"emptyLinePlaceholder":176},[146,1024,1025],{"class":148,"line":691},[146,1026,1027],{},"if __name__ == \"__main__\":\n",[146,1029,1030],{"class":148,"line":696},[146,1031,1032],{},"    subsystem1 = Subsystem1()\n",[146,1034,1035],{"class":148,"line":702},[146,1036,1037],{},"    subsystem2 = Subsystem2()\n",[146,1039,1040],{"class":148,"line":707},[146,1041,1042],{},"    facade = Facade(subsystem1, subsystem2)\n",[146,1044,1045],{"class":148,"line":712},[146,1046,1047],{},"    client_code(facade)\n",[78,1049],{},[81,1051,1053],{"id":1052},"sıkça-sorulan-sorular-faq","Sıkça Sorulan Sorular (FAQ)",[502,1055,1057],{"id":1056},"facade-sınıfı-kendi-içinde-ek-bir-iş-mantığı-business-logic-barındırmalı-mıdır","Facade sınıfı kendi içinde ek bir iş mantığı (business logic) barındırmalı mıdır?",[11,1059,1060],{},"Hayır. Facade'in tek sorumluluğu, alt sistemleri istemci adına orkestre etmek ve doğru sırayla çağırmaktır. Facade sınıfına doğrudan iş mantığı eklenirse, bu sınıf zamanla büyüyerek kendisi bir \"God Class\" (aşırı yüklenmiş sınıf) haline gelir ve desenin amacına aykırı olur.",[502,1062,1064],{"id":1063},"alt-sistemler-subsystems-facade-sınıfına-bağımlı-mıdır","Alt sistemler (Subsystems) Facade sınıfına bağımlı mıdır?",[11,1066,1067],{},"Kesinlikle hayır. Alt sistemdeki sınıflar Facade'den tamamen habersizdir. Facade olmadan da doğrudan istemci kodlar tarafından başlatılabilir ve kullanılabilirler. Facade sadece dışarıdan gelen istekleri alt sistemlere dağıtan tek yönlü bir geçittir.",[502,1069,1071],{"id":1070},"facade-sınıfları-neden-genellikle-singleton-olarak-tasarlanır","Facade sınıfları neden genellikle Singleton olarak tasarlanır?",[11,1073,1074],{},"Çoğu senaryoda tüm uygulama genelinde alt sisteme erişim sağlayan tek bir Facade örneği (instance) yeterlidir. Gereksiz yere birden fazla Facade nesnesi oluşturup hafıza harcamamak adına, bu sınıflar sıklıkla Singleton deseniyle birleştirilir.",[78,1076],{},[81,1078,1080],{"id":1079},"diğer-tasarım-kalıplarıdesign-patterns","Diğer Tasarım Kalıpları\u002FDesign Patterns",[11,1082,1083],{},[43,1084,1085],{},"Oluşumsal Kalıplar (Creational Patterns)",[11,1087,1088,1092,1093,1092,1096,1092,1100,1092,1104],{},[15,1089,1091],{"href":1090},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-factory-method-nedir","Factory Method",",\n",[15,1094,482],{"href":1095},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-abstract-factory-nedir",[15,1097,1099],{"href":1098},"\u002Ftr\u002Fbuilder-tasarim-deseni-nedir","Builder",[15,1101,1103],{"href":1102},"\u002Ftr\u002Fprototype-tasarim-deseni-nedir","Prototype",[15,1105,1107],{"href":1106},"\u002Ftr\u002Fsingleton-tasarim-deseni-nedir","Singleton",[11,1109,1110],{},[43,1111,1112],{},"Yapısal Kalıplar (Structural Patterns)",[11,1114,1115,1092,1118,1092,1122,1092,1126,1092,1130,1092,1133,1092,1137],{},[15,1116,421],{"href":1117},"\u002Ftr\u002Fadapter-tasarim-deseni-nedir",[15,1119,1121],{"href":1120},"\u002Ftr\u002Fbridge-tasarim-deseni-nedir","Bridge",[15,1123,1125],{"href":1124},"\u002Ftr\u002Fcomposite-tasarim-deseni-nedir","Composite",[15,1127,1129],{"href":1128},"\u002Ftr\u002Fdecorator-tasarim-deseni-nedir","Decorator",[15,1131,65],{"href":1132},"\u002Ftr\u002Ffacade-tasarim-deseni-nedir",[15,1134,1136],{"href":1135},"\u002Ftr\u002Fflyweight-tasarim-deseni-nedir","Flyweight",[15,1138,434],{"href":1139},"\u002Ftr\u002Fproxy-tasarim-deseni-nedir",[11,1141,1142],{},[43,1143,1144],{},"Davranışsal Kalıplar (Behavioral Patterns)",[11,1146,1147,1092,1151,1092,1155,1092,1159,1092,1162,1092,1166,1092,1170,1092,1174,1092,1178,1092,1182],{},[15,1148,1150],{"href":1149},"\u002Ftr\u002Fchain-of-responsibility-deseni-nedir","Chain of Responsibility",[15,1152,1154],{"href":1153},"\u002Ftr\u002Fcommand-tasarim-deseni-nedir","Command",[15,1156,1158],{"href":1157},"\u002Ftr\u002Fiterator-tasarim-deseni-nedir","Iterator",[15,1160,408],{"href":1161},"\u002Ftr\u002Fmediator-tasarim-deseni-nedir",[15,1163,1165],{"href":1164},"\u002Ftr\u002Fmemento-tasarim-deseni-nedir","Memento",[15,1167,1169],{"href":1168},"\u002Ftr\u002Fobserver-tasarim-deseni-nedir","Observer",[15,1171,1173],{"href":1172},"\u002Ftr\u002Fstate-tasarim-deseni-nedir","State",[15,1175,1177],{"href":1176},"\u002Ftr\u002Fstrategy-tasarim-deseni-nedir","Strategy",[15,1179,1181],{"href":1180},"\u002Ftr\u002Ftemplate-method-tasarim-deseni-nedir","Template Method",[15,1183,1185],{"href":1184},"\u002Ftr\u002Fvisitor-tasarim-deseni-nedir","Visitor",[1187,1188,1189],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":142,"searchDepth":155,"depth":155,"links":1191},[1192,1193,1194,1195,1196,1197,1198,1199,1203,1208],{"id":83,"depth":155,"text":84},{"id":94,"depth":155,"text":95},{"id":106,"depth":155,"text":107},{"id":131,"depth":155,"text":132},{"id":364,"depth":155,"text":365},{"id":445,"depth":155,"text":446},{"id":465,"depth":155,"text":466},{"id":499,"depth":155,"text":500,"children":1200},[1201,1202],{"id":504,"depth":161,"text":505},{"id":837,"depth":161,"text":838},{"id":1052,"depth":155,"text":1053,"children":1204},[1205,1206,1207],{"id":1056,"depth":161,"text":1057},{"id":1063,"depth":161,"text":1064},{"id":1070,"depth":161,"text":1071},{"id":1079,"depth":155,"text":1080},[1210],"technical",null,"2021-09-13","Facade (Önyüz) tasarım kalıbını, karmaşık alt sistemleri basitleştirmeyi, sipariş süreci senaryolarını ve PHP\u002FPython örneklerini öğrenin.",false,"md","\u002Fimages\u002Fposts\u002F2021\u002F09\u002Ffacade-tasarim-deseni.avif",{},{"title":6,"description":1213},"facade-tasarim-deseni-nedir","tr\u002Ffacade-tasarim-deseni-nedir",[1222,1223],"design-pattern","ipucu","sXts7u5WSOCb4yq-MxBCC7gFfrr7_WGISzuriO73Piw",{"prev":1226,"next":1228,"others":1230,"lucky":1340,"readingTime":173},{"path":1135,"title":1227},"Flyweight Tasarım Deseni Nedir?",{"path":1128,"title":1229},"Decorator Tasarım Deseni Nedir?",[1231,1234,1237,1239,1242,1244,1247,1250,1253,1256,1258,1261,1263,1265,1267,1270,1272,1275,1278,1281,1284,1287,1290,1293,1296,1299,1302,1305,1307,1309,1311,1314,1317,1320,1323,1326,1329,1331,1334,1337],{"path":1232,"title":1233},"\u002Ftr\u002Fgo-veri-tipleri-struct","Go Veri Tipleri: Struct",{"path":1235,"title":1236},"\u002Ftr\u002Fphalcon-frameworkun-gelecegi","Phalcon Framework'ün Geleceği: Bir Devrin Sonu",{"path":1149,"title":1238},"Chain of Responsibility Deseni Nedir?",{"path":1240,"title":1241},"\u002Ftr\u002Fjavascriptde-moduller","JavaScript'te Modüller",{"path":1180,"title":1243},"Template Method Tasarım Deseni Nedir?",{"path":1245,"title":1246},"\u002Ftr\u002Fmerhabadunya","Merhaba Dünya",{"path":1248,"title":1249},"\u002Ftr\u002Fdigital-oceanda-vps-kurulumu","DigitalOcean'da VPS (Droplet) Kurulumu: Adım Adım Rehber",{"path":1251,"title":1252},"\u002Ftr\u002Fphp-ve-makine-ogrenimi-php-ml-kutuphanesi","PHP ve Makine Öğrenimi: PHP-ML Kütüphanesi ile Pratik Çözümler",{"path":1254,"title":1255},"\u002Ftr\u002Fes5-nedir","ES5 Nedir? JavaScript Geliştiricileri İçin Kılavuz",{"path":1161,"title":1257},"Mediator Tasarım Deseni Nedir?",{"path":1259,"title":1260},"\u002Ftr\u002Fgo-veri-tipleri-map","Go Veri Tipleri - Map",{"path":1102,"title":1262},"Prototype Tasarım Deseni Nedir?",{"path":1124,"title":1264},"Composite Tasarım Deseni Nedir?",{"path":1157,"title":1266},"Iterator Tasarım Deseni Nedir?",{"path":1268,"title":1269},"\u002Ftr\u002Fdocker-ile-redis-kurulumu","Docker ile Redis Kurulumu",{"path":1106,"title":1271},"Singleton Tasarım Deseni Nedir?",{"path":1273,"title":1274},"\u002Ftr\u002Fwsl-2-kurulumu-6-kolay-adim","WSL 2 Kurulumu - 6 kolay adım",{"path":1276,"title":1277},"\u002Ftr\u002Fgo-ve-degiskenler","Go ve Değişkenler",{"path":1279,"title":1280},"\u002Ftr\u002Fphp-generator-ve-iterator-farki","PHP'de Generator ve Iterator Arasındaki Temel Farklar",{"path":1282,"title":1283},"\u002Ftr\u002Fearly-return-erken-donus-nedir","Early Return \u002F Erken Dönüş nedir?",{"path":1285,"title":1286},"\u002Ftr\u002Froot-yetkisi-olmayan-kullanici-ssh-baglantisini-ssh-baglantisini-ssh-anahtari-ile-nasil-kurabilir","Root yetkisi olmayan kullanıcı, SSH bağlantısını, SSH anahtarı ile nasıl kurabilir?",{"path":1288,"title":1289},"\u002Ftr\u002Fdocker-ile-mariadb-kurulumu","Docker ile MariaDB Kurulumu",{"path":1291,"title":1292},"\u002Ftr\u002Fes10-nedir-ecmascript-2019-nedir","ES10 Nedir? ECMAScript 2019 Nedir?",{"path":1294,"title":1295},"\u002Ftr\u002Fvite-nedir","Vite Nedir? Modern Web Geliştirme ve Paketleme Aracı",{"path":1297,"title":1298},"\u002Ftr\u002Fgo-programlama-dilinin-ozellikleri","Go Programlama Dilinin Özellikleri",{"path":1300,"title":1301},"\u002Ftr\u002Fself-hosted-api-gateway-nasil-kurulur-kapsamli-rehber","Self-Hosted API Gateway Nasıl Kurulur? Kapsamlı Rehber",{"path":1303,"title":1304},"\u002Ftr\u002Fes13-nedir-ecmascript-2022-nedir","ES13 nedir? ECMAScript 2022 nedir?",{"path":1184,"title":1306},"Visitor Tasarım Deseni Nedir?",{"path":1139,"title":1308},"Proxy Tasarım Deseni Nedir?",{"path":1095,"title":1310},"Abstract Factory Tasarım Deseni Nedir?",{"path":1312,"title":1313},"\u002Ftr\u002Frest-api-dokumantasyonu-nasil-yapilir","REST Api Dokümantasyonu Nasıl Oluşturulur?",{"path":1315,"title":1316},"\u002Ftr\u002Fes6-nedir-ecmascript-2015-nedir","ES6 Nedir? ECMAScript 2015 Nedir?",{"path":1318,"title":1319},"\u002Ftr\u002Fgoda-iota-nedir-iota-ne-zaman-ve-nerede-kullanilir","Go'da iota Nedir? iota Ne Zaman ve Nerede Kullanılır?",{"path":1321,"title":1322},"\u002Ftr\u002Fnext-js-on-bellegi-nasil-yenilenir-on-demand-cache-regeneration","Next.js Önbelleği Nasıl Yenilenir? \"On-Demand Cache Regeneration\"",{"path":1324,"title":1325},"\u002Ftr\u002Frestful-api-bilesenleri","RESTful API Bileşenleri",{"path":1327,"title":1328},"\u002Ftr\u002Fecmascript-nedir-ecmascript-ne-degildir-bilinmesi-gerekenler","ECMAScript Nedir? Bilinmesi Gerekenler...",{"path":1117,"title":1330},"Adapter Tasarım Deseni Nedir?",{"path":1332,"title":1333},"\u002Ftr\u002Fdocker-swarm-nedir","Docker Swarm Nedir?",{"path":1335,"title":1336},"\u002Ftr\u002Fubuntu-guncellemesi-sonrasi-cyberpanele-ulasilamama-sorunlarini-giderme","Ubuntu Güncellemesi Sonrası CyberPanel'e Ulaşılamama Sorunlarını Giderme",{"path":1338,"title":1339},"\u002Ftr\u002Frest-api-uri-yapisi-nasil-olmali","REST API URI Yapısı Nasıl Olmalı?",{"path":1149,"title":1238},[1342,1344,1346,1349],{"path":1184,"title":1306,"date":1343},"2021-10-09",{"path":1180,"title":1243,"date":1345},"2021-10-08",{"path":1176,"title":1347,"date":1348},"Strategy Tasarım Deseni Nedir?","2021-10-07",{"path":1172,"title":1350,"date":1351},"State Tasarım Deseni Nedir?","2021-10-06",[1353,1357,1359],{"path":1354,"title":1355,"date":1356},"\u002Ftr\u002Frest-api-tasarimi","REST API Tasarım İncelikleri","2021-02-04",{"path":1273,"title":1274,"date":1358},"2021-09-20",{"path":1360,"title":1361,"date":1362},"\u002Ftr\u002Fgraylog-nedir-docker-ile-nasil-kurulur","Graylog Nedir? Docker Compose ile Adım Adım Kurulum Rehberi","2021-03-12",1782142084029]