{"id":32376,"date":"2025-10-21T02:01:26","date_gmt":"2025-10-20T23:01:26","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/"},"modified":"2025-10-21T02:01:26","modified_gmt":"2025-10-20T23:01:26","slug":"kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/","title":{"rendered":"Kompozisyon At\u00f6lyesi: &#8216;Has-A&#8217; \u0130li\u015fkileriyle Sa\u011flam Yap\u0131lar \u0130n\u015fa Etmek"},"content":{"rendered":"<p><body><\/p>\n<p>Yaz\u0131l\u0131m d\u00fcnyas\u0131nda karma\u015f\u0131k sistemler in\u015fa ederken, kodunuzu anla\u015f\u0131l\u0131r, s\u00fcrd\u00fcr\u00fclebilir ve esnek tutmak her zaman b\u00fcy\u00fck bir meydan okumad\u0131r. Peki, nesneleri bir araya getirerek g\u00fc\u00e7l\u00fc ve mod\u00fcler yap\u0131lar olu\u015fturman\u0131n en etkili yolu nedir? &#8220;Has-A&#8221; ili\u015fkileri, yani kompozisyon, tam da bu noktada devreye giriyor ve kodunuzu daha y\u00f6netilebilir, yeniden kullan\u0131labilir hale getirmenin anahtar\u0131n\u0131 sunuyor. Bu at\u00f6lye \u00e7al\u0131\u015fmas\u0131nda, kompozisyonun temellerinden ileri d\u00fczey uygulamalar\u0131na kadar her \u015feyi ke\u015ffedece\u011fiz.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m projeleri giderek daha karma\u015f\u0131k hale geliyor. Bir e-ticaret uygulamas\u0131ndan bir otomasyon sistemine kadar, her yaz\u0131l\u0131m par\u00e7as\u0131 bir\u00e7ok farkl\u0131 bile\u015fenin uyumlu bir \u015fekilde bir araya gelmesiyle \u00e7al\u0131\u015f\u0131r. \u0130\u015fte tam da bu noktada &#8220;nesne tabanl\u0131 programlama&#8221; (OOP) prensipleri imdad\u0131m\u0131za yeti\u015fir. OOP, ger\u00e7ek d\u00fcnyadaki varl\u0131klar\u0131 yaz\u0131l\u0131m nesneleri olarak modellememize olanak tan\u0131r. Ancak bu nesneler sadece tek ba\u015f\u0131na var olmakla kalmaz, ayn\u0131 zamanda birbirleriyle ili\u015fkiler kurarlar.<\/p>\n<p>Bu ili\u015fkileri kurman\u0131n iki temel yolu vard\u0131r: Kal\u0131t\u0131m (Inheritance), yani &#8220;Is-A&#8221; ili\u015fkisi ve Kompozisyon (Composition), yani &#8220;Has-A&#8221; ili\u015fkisi. Genellikle yeni ba\u015flayan geli\u015ftiriciler, kod tekrar\u0131n\u0131 azaltmak ve esneklik sa\u011flamak amac\u0131yla kal\u0131t\u0131ma y\u00f6nelme e\u011filimindedirler. Oysa kal\u0131t\u0131m, her zaman en iyi \u00e7\u00f6z\u00fcm olmayabilir, hatta bazen kodunuzu daha kat\u0131 ve de\u011fi\u015ftirmesi zor hale getirebilir. \u0130\u015fte bu y\u00fczden kompozisyon, yani &#8220;Has-A&#8221; ili\u015fkileri, modern yaz\u0131l\u0131m tasar\u0131m\u0131nda giderek daha fazla \u00f6nem kazanmaktad\u0131r.<\/p>\n<p>Kompozisyon, bir nesnenin ba\u015fka bir nesneyi &#8220;i\u00e7ermesi&#8221; veya &#8220;sahip olmas\u0131&#8221; anlam\u0131na gelir. \u00d6rne\u011fin, bir &#8220;Araba&#8221; nesnesinin bir &#8220;Motor&#8221; nesnesine sahip olmas\u0131, bir &#8220;Bilgisayar&#8221; nesnesinin bir &#8220;\u0130\u015flemci&#8221; nesnesine sahip olmas\u0131 gibi. Bu yakla\u015f\u0131m, sisteminizi daha k\u00fc\u00e7\u00fck, ba\u011f\u0131ms\u0131z ve yeniden kullan\u0131labilir par\u00e7alara ay\u0131rman\u0131za olanak tan\u0131r. B\u00f6ylece, bir bile\u015fende yap\u0131lan de\u011fi\u015fikliklerin sistemin di\u011fer b\u00f6l\u00fcmlerini beklenmedik \u015fekilde etkileme riskini azalt\u0131rs\u0131n\u0131z. Ayr\u0131ca, bu modularite, kod taban\u0131n\u0131z\u0131n okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Bu makalede, &#8220;Has-A&#8221; ili\u015fkilerinin g\u00fcc\u00fcn\u00fc ve yaz\u0131l\u0131m projelerinize nas\u0131l entegre edebilece\u011finizi ad\u0131m ad\u0131m inceleyece\u011fiz. Haydi, sa\u011flam ve esnek yaz\u0131l\u0131m yap\u0131lar\u0131 in\u015fa etme yolculu\u011fumuza ba\u015flayal\u0131m!<\/p>\n<h2 id=\"temel-kavramlar-has-a-iliskileri-nedir-ve-neden-kritiktir\">Temel Kavramlar: &#8216;Has-A&#8217; \u0130li\u015fkileri Nedir ve Neden Kritiktir?<\/h2>\n<p>&#8220;Has-A&#8221; ili\u015fkisi, nesne tabanl\u0131 programlaman\u0131n temel yap\u0131 ta\u015flar\u0131ndan biridir ve bir nesnenin, ba\u015fka bir nesneyi kendi i\u00e7inde bir \u00f6zellik (property) olarak bar\u0131nd\u0131rmas\u0131n\u0131 ifade eder. Teknik dilde buna &#8220;kompozisyon&#8221; denir. Ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, bir nesne ba\u015fka bir nesnenin i\u015flevselli\u011fini &#8220;kullan\u0131r&#8221; veya ona &#8220;sahiptir&#8221;. Bu, iki nesne aras\u0131nda g\u00fc\u00e7l\u00fc bir ba\u011f kurmak yerine, bir nesnenin di\u011ferine delegasyon yapmas\u0131na olanak tan\u0131r. Yani, bir nesne belirli bir g\u00f6revi yerine getirmek i\u00e7in di\u011fer nesnenin y\u00f6ntemlerini \u00e7a\u011f\u0131r\u0131r.<\/p>\n<p>Peki, bu neden bu kadar kritik? Cevap, yaz\u0131l\u0131m tasar\u0131m prensiplerinde sakl\u0131d\u0131r: <strong>Kat\u0131 Olmayan Yap\u0131lar (Loose Coupling)<\/strong> ve <strong>Y\u00fcksek Ba\u011fda\u015f\u0131kl\u0131k (High Cohesion)<\/strong>. Kompozisyon, nesneler aras\u0131ndaki ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 en aza indirir. Bir nesne, ba\u015fka bir nesnenin belirli bir t\u00fcr\u00fc olmak zorunda de\u011fildir; sadece onun aray\u00fcz\u00fcn\u00fc kullan\u0131r. Bu durum, bile\u015fenlerin birbirlerinden daha ba\u011f\u0131ms\u0131z olmas\u0131n\u0131 sa\u011flar ve bu da de\u011fi\u015fimin y\u00f6netimini kolayla\u015ft\u0131r\u0131r. \u00d6rne\u011fin, bir &#8220;E-posta Bildirimi&#8221; bile\u015feniniz oldu\u011funu varsayal\u0131m. Bu bile\u015fen, e-posta g\u00f6nderme i\u015fini yapan farkl\u0131 bir &#8220;E-posta G\u00f6nderici&#8221; servisine sahip olabilir. E\u011fer daha sonra e-posta g\u00f6nderim y\u00f6nteminizi de\u011fi\u015ftirmek isterseniz (\u00f6rne\u011fin, farkl\u0131 bir API kullanmaya ba\u015flamak), sadece &#8220;E-posta G\u00f6nderici&#8221; servisini de\u011fi\u015ftirmeniz yeterli olur, &#8220;E-posta Bildirimi&#8221; bile\u015feninin i\u00e7 mant\u0131\u011f\u0131n\u0131 de\u011fi\u015ftirmek zorunda kalmazs\u0131n\u0131z. Bu esneklik, b\u00fcy\u00fck ve uzun \u00f6m\u00fcrl\u00fc projelerde paha bi\u00e7ilmezdir.<\/p>\n<p>Ayr\u0131ca, kompozisyon yeniden kullan\u0131labilirli\u011fi art\u0131r\u0131r. Bir kez olu\u015fturdu\u011funuz bir bile\u015feni, farkl\u0131 ba\u011flamlarda ve farkl\u0131 ana nesnelerin i\u00e7inde rahatl\u0131kla kullanabilirsiniz. Kal\u0131t\u0131mda ise durum biraz farkl\u0131d\u0131r; bir s\u0131n\u0131f\u0131 miras ald\u0131\u011f\u0131n\u0131zda, o s\u0131n\u0131f\u0131n t\u00fcm davran\u0131\u015flar\u0131n\u0131 ve \u00f6zelliklerini devral\u0131rs\u0131n\u0131z. Bu, bazen ihtiyac\u0131n\u0131z olmayan \u015feyleri de beraberinde getirebilir ve &#8220;ana s\u0131n\u0131f\u0131n sorunlar\u0131&#8221; olarak bilinen problemlere yol a\u00e7abilir. Kompozisyonda ise sadece ihtiyac\u0131n\u0131z olan i\u015flevsellikleri i\u00e7eren nesneleri bir araya getirirsiniz, bu da sisteminizin daha yal\u0131n ve amaca y\u00f6nelik olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Sonu\u00e7 olarak, &#8220;Has-A&#8221; ili\u015fkileri, yaz\u0131l\u0131m tasar\u0131m\u0131nda daha esnek, s\u00fcrd\u00fcr\u00fclebilir ve y\u00f6netilebilir yap\u0131lar olu\u015fturman\u0131n temelini olu\u015fturur. Ba\u011f\u0131ml\u0131l\u0131klar\u0131 azaltarak ve mod\u00fclerli\u011fi te\u015fvik ederek, geli\u015ftirme s\u00fcrecinizi h\u0131zland\u0131r\u0131r ve gelecekteki de\u011fi\u015fikliklere daha kolay adapte olman\u0131z\u0131 sa\u011flar. \u015eimdi gelin, bu g\u00fc\u00e7l\u00fc prensibi ger\u00e7ek kod \u00f6rnekleri \u00fczerinden nas\u0131l uygulayabilece\u011fimize bir g\u00f6z atal\u0131m.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Kompozisyonu etkin kullanmak, kat\u0131 ba\u011f\u0131ml\u0131l\u0131klar\u0131 azalt\u0131r ve uygulaman\u0131z\u0131n farkl\u0131 par\u00e7alar\u0131n\u0131 birbirinden ba\u011f\u0131ms\u0131z olarak test etmenizi kolayla\u015ft\u0131r\u0131r. Bu da birim test yaz\u0131m\u0131n\u0131 olduk\u00e7a basitle\u015ftirir!\n<\/div>\n<h2 id=\"uygulamali-kisim-has-a-iliskilerini-kodda-nasil-uygulariz\">Uygulamal\u0131 K\u0131s\u0131m: &#8216;Has-A&#8217; \u0130li\u015fkilerini Kodda Nas\u0131l Uygular\u0131z?<\/h2>\n<p>&#8220;Has-A&#8221; ili\u015fkilerini koda d\u00f6kmek, asl\u0131nda olduk\u00e7a basittir ve bir\u00e7ok programlama dilinde benzer prensiplerle uygulan\u0131r. Temel fikir, bir s\u0131n\u0131f\u0131n (ana s\u0131n\u0131f), ba\u015fka bir s\u0131n\u0131f\u0131n (yard\u0131mc\u0131 s\u0131n\u0131f) bir \u00f6rne\u011fini (instance) kendi i\u00e7inde bir \u00f6zellik olarak bar\u0131nd\u0131rmas\u0131d\u0131r. Bu, ana s\u0131n\u0131f\u0131n yard\u0131mc\u0131 s\u0131n\u0131f\u0131n yeteneklerini kullanabilmesini sa\u011flar. \u015eimdi, bu prensibi daha iyi anlamak i\u00e7in iki farkl\u0131 ger\u00e7ek d\u00fcnya senaryosu \u00fczerinden ad\u0131m ad\u0131m ilerleyelim.<\/p>\n<h3 id=\"ornek-1-araba-ve-motor-iliskisi-bir-araba-bir-motora-sahiptir\">\u00d6rnek 1: Araba ve Motor \u0130li\u015fkisi (Bir Araba Bir Motora Sahiptir)<\/h3>\n<p>Bir araba d\u00fc\u015f\u00fcnelim. Bir araba \u00e7al\u0131\u015fmak i\u00e7in bir motora ihtiya\u00e7 duyar. Motor, araban\u0131n bir par\u00e7as\u0131d\u0131r ve araban\u0131n temel i\u015flevlerinden biri olan hareket etmeyi sa\u011flar. Bu, a\u00e7\u0131k\u00e7a bir &#8220;Has-A&#8221; ili\u015fkisidir: &#8220;Bir Araba, Bir Motora Sahiptir.&#8221; Bu senaryoyu kodda nas\u0131l modelleriz?<\/p>\n<pre><code class=\"language-javascript\">\nclass Motor {\n    constructor(guc) {\n        this.guc = guc;\n    }\n\n    calistir() {\n        console.log(<code>Motor ${this.guc} beygir g\u00fcc\u00fcyle \u00e7al\u0131\u015f\u0131yor.<\/code>);\n    }\n\n    durdur() {\n        console.log(\"Motor durduruldu.\");\n    }\n}\n\nclass Araba {\n    constructor(marka, model, motorGucu) {\n        this.marka = marka;\n        this.model = model;\n        \/\/ \u0130\u015fte \"Has-A\" ili\u015fkisi! Araba, bir Motor nesnesine sahip.\n        this.motor = new Motor(motorGucu); \n    }\n\n    kontagiCevir() {\n        console.log(<code>${this.marka} ${this.model} konta\u011f\u0131 \u00e7evrildi.<\/code>);\n        this.motor.calistir(); \/\/ Araba, motorunun i\u015flevselli\u011fini kullan\u0131r.\n    }\n\n    parkEt() {\n        console.log(<code>${this.marka} ${this.model} park ediliyor.<\/code>);\n        this.motor.durdur(); \/\/ Araba, motorunu durdurur.\n    }\n\n    \/\/ Araba'n\u0131n kendi metodlar\u0131\n    sur() {\n        if (this.motor) { \/\/ Motor var m\u0131 kontrol\u00fc\n            console.log(<code>${this.marka} ${this.model} ile yolculuk yap\u0131l\u0131yor.<\/code>);\n        } else {\n            console.log(\"Araba motoru olmad\u0131\u011f\u0131 i\u00e7in hareket edemiyor.\");\n        }\n    }\n}\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi\nconst benimArabam = new Araba(\"Honda\", \"Civic\", \"150HP\");\nbenimArabam.kontagiCevir();\nbenimArabam.sur();\nbenimArabam.parkEt();\n\nconst sporAraba = new Araba(\"Porsche\", \"911\", \"450HP\");\nsporAraba.kontagiCevir();\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki JavaScript \u00f6rne\u011finde, <code>Araba<\/code> s\u0131n\u0131f\u0131, <code>Motor<\/code> s\u0131n\u0131f\u0131n\u0131n bir \u00f6rne\u011fini (<code>this.motor<\/code>) kendi b\u00fcnyesinde bar\u0131nd\u0131r\u0131r. <code>Araba<\/code> s\u0131n\u0131f\u0131, motorun <code>calistir()<\/code> ve <code>durdur()<\/code> metodlar\u0131n\u0131 \u00e7a\u011f\u0131rarak kendi i\u015flevselli\u011fini yerine getirir. Bu, <code>Araba<\/code> s\u0131n\u0131f\u0131n\u0131n <code>Motor<\/code> s\u0131n\u0131f\u0131na do\u011frudan ba\u011f\u0131ml\u0131 olmas\u0131n\u0131 engeller, sadece onun sundu\u011fu aray\u00fcz\u00fc kullan\u0131r. E\u011fer bir g\u00fcn farkl\u0131 bir tip motor (\u00f6rne\u011fin elektrikli motor) kullanmak istersek, <code>Motor<\/code> s\u0131n\u0131f\u0131n\u0131 g\u00fcncelleyebilir veya yeni bir <code>ElektrikliMotor<\/code> s\u0131n\u0131f\u0131 olu\u015fturup <code>Araba<\/code> s\u0131n\u0131f\u0131ndaki <code>Motor<\/code> nesnesini bununla de\u011fi\u015ftirebiliriz. <code>Araba<\/code> s\u0131n\u0131f\u0131n\u0131n temel mant\u0131\u011f\u0131nda b\u00fcy\u00fck bir de\u011fi\u015fiklik yapmam\u0131za gerek kalmaz.<\/p>\n<h3 id=\"ornek-2-bilgisayar-ve-bilesenleri-iliskisi-bir-bilgisayar-bir-cpu-ram-ve-depolamaya-sahiptir\">\u00d6rnek 2: Bilgisayar ve Bile\u015fenleri \u0130li\u015fkisi (Bir Bilgisayar Bir CPU, RAM ve Depolamaya Sahiptir)<\/h3>\n<p>Daha karma\u015f\u0131k bir \u00f6rnek olarak, bir bilgisayar\u0131 ve onun bile\u015fenlerini ele alal\u0131m. Bir bilgisayar genellikle bir \u0130\u015flemci (CPU), Bellek (RAM) ve Depolama birimine (SSD\/HDD) sahiptir. Bu, bir\u00e7ok \"Has-A\" ili\u015fkisinin bir araya geldi\u011fi g\u00fczel bir \u00f6rnektir.<\/p>\n<pre><code class=\"language-javascript\">\nclass CPU {\n    constructor(model) {\n        this.model = model;\n    }\n    islemYap() {\n        console.log(<code>${this.model} i\u015flemci hesaplamalar yap\u0131yor.<\/code>);\n    }\n}\n\nclass RAM {\n    constructor(boyutGB) {\n        this.boyutGB = boyutGB;\n    }\n    veriDepola() {\n        console.log(<code>${this.boyutGB}GB RAM verileri depoluyor.<\/code>);\n    }\n}\n\nclass Depolama {\n    constructor(tip, kapasiteGB) {\n        this.tip = tip; \/\/ SSD, HDD\n        this.kapasiteGB = kapasiteGB;\n    }\n    veriYazOku() {\n        console.log(<code>${this.tip} (${this.kapasiteGB}GB) veri yaz\u0131p okuyor.<\/code>);\n    }\n}\n\nclass Bilgisayar {\n    constructor(marka, cpuModeli, ramBoyutu, depolamaTipi, depolamaKapasitesi) {\n        this.marka = marka;\n        \/\/ Birden \u00e7ok \"Has-A\" ili\u015fkisi\n        this.cpu = new CPU(cpuModeli);\n        this.ram = new RAM(ramBoyutu);\n        this.depolama = new Depolama(depolamaTipi, depolamaKapasitesi);\n    }\n\n    baslat() {\n        console.log(<code>${this.marka} Bilgisayar ba\u015flat\u0131l\u0131yor...<\/code>);\n        this.cpu.islemYap();\n        this.ram.veriDepola();\n        this.depolama.veriYazOku();\n        console.log(\"Sistem haz\u0131r!\");\n    }\n\n    uygulamayiCalistir(uygulamaAdi) {\n        console.log(<code>${uygulamaAdi} uygulamas\u0131 \u00e7al\u0131\u015ft\u0131r\u0131l\u0131yor.<\/code>);\n        this.cpu.islemYap(); \/\/ Uygulama \u00e7al\u0131\u015f\u0131rken CPU kullan\u0131r\n        this.ram.veriDepola(); \/\/ Uygulama \u00e7al\u0131\u015f\u0131rken RAM kullan\u0131r\n    }\n}\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi\nconst benimBilgisayarim = new Bilgisayar(\"HP\", \"Intel i7\", 16, \"SSD\", 512);\nbenimBilgisayarim.baslat();\nbenimBilgisayarim.uygulamayiCalistir(\"Foto\u011fraf D\u00fczenleyici\");\n\nconst oyunBilgisayari = new Bilgisayar(\"MSI\", \"AMD Ryzen 9\", 32, \"NVMe SSD\", 1024);\noyunBilgisayari.baslat();\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>Bilgisayar<\/code> s\u0131n\u0131f\u0131, <code>CPU<\/code>, <code>RAM<\/code> ve <code>Depolama<\/code> s\u0131n\u0131flar\u0131n\u0131n \u00f6rneklerini i\u00e7erir. Her bile\u015fen kendi i\u015flevselli\u011finden sorumludur ve <code>Bilgisayar<\/code> s\u0131n\u0131f\u0131 bu bile\u015fenlerin i\u015flevlerini bir araya getirerek daha b\u00fcy\u00fck bir i\u015flevsellik (bilgisayar\u0131 ba\u015flatma, uygulama \u00e7al\u0131\u015ft\u0131rma) sunar. Bu tasar\u0131m, her bir bile\u015fenin ba\u011f\u0131ms\u0131z olarak geli\u015ftirilip test edilmesine olanak tan\u0131r ve bilgisayar\u0131n \u00f6zelliklerini de\u011fi\u015ftirmek istedi\u011fimizde (\u00f6rne\u011fin daha b\u00fcy\u00fck bir RAM eklemek) yaln\u0131zca ilgili bile\u015fen s\u0131n\u0131f\u0131n\u0131 veya <code>Bilgisayar<\/code> s\u0131n\u0131f\u0131n\u0131n constructor'\u0131n\u0131 de\u011fi\u015ftirmemiz yeterli olur.<\/p>\n<p>Bu iki \u00f6rnek, \"Has-A\" ili\u015fkilerinin kodunuzu nas\u0131l daha mod\u00fcler, anla\u015f\u0131l\u0131r ve bak\u0131m\u0131 kolay hale getirdi\u011fini a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Bu yakla\u015f\u0131m, yaz\u0131l\u0131m\u0131n farkl\u0131 par\u00e7alar\u0131n\u0131 birbirinden izole ederek, b\u00fcy\u00fck \u00f6l\u00e7ekli projelerde geli\u015ftirme h\u0131z\u0131n\u0131 ve sistemin genel stabilitesini art\u0131r\u0131r.<\/p>\n<h2 id=\"has-a-ve-is-a-arasindaki-farki-anlamak-ne-zaman-hangisini-kullanmaliyiz\">\"Has-A\" ve \"Is-A\" Aras\u0131ndaki Fark\u0131 Anlamak: Ne Zaman Hangisini Kullanmal\u0131y\u0131z?<\/h2>\n<p>Nesne tabanl\u0131 programlamada, nesneler aras\u0131 ili\u015fkileri kurman\u0131n iki temel yolu vard\u0131r: Kompozisyon (\"Has-A\") ve Kal\u0131t\u0131m (\"Is-A\"). Her ikisinin de kendine \u00f6zg\u00fc avantajlar\u0131 ve dezavantajlar\u0131 bulunur ve do\u011fru senaryoda do\u011fru ili\u015fkiyi kullanmak, sa\u011flam bir yaz\u0131l\u0131m mimarisi olu\u015fturman\u0131n anahtar\u0131d\u0131r. \"Is-A\" ili\u015fkisi, bir nesnenin ba\u015fka bir nesnenin \u00f6zelle\u015fmi\u015f bir t\u00fcr\u00fc oldu\u011funu ifade eder. \u00d6rne\u011fin, \"Kedi bir Hayvan'd\u0131r.\" Bu durumda <code>Kedi<\/code> s\u0131n\u0131f\u0131 <code>Hayvan<\/code> s\u0131n\u0131f\u0131ndan miras al\u0131r. Kal\u0131t\u0131m, kod tekrar\u0131n\u0131 azaltmak ve hiyerar\u015fik bir yap\u0131 olu\u015fturmak i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Ancak, fazla kullan\u0131ld\u0131\u011f\u0131nda veya yanl\u0131\u015f senaryolarda uyguland\u0131\u011f\u0131nda \"miras hiyerar\u015fisi patlamas\u0131\" gibi sorunlara yol a\u00e7abilir, bu da kodu esnek olmayan ve de\u011fi\u015ftirmesi zor bir hale getirebilir.<\/p>\n<p>\u00d6te yandan, daha \u00f6nce de bahsetti\u011fimiz gibi, \"Has-A\" ili\u015fkisi, bir nesnenin ba\u015fka bir nesneyi kendi i\u00e7inde bir bile\u015fen olarak bar\u0131nd\u0131rmas\u0131n\u0131 ifade eder. \u00d6rne\u011fin, \"Bir Araba bir Motora sahiptir.\" Kompozisyon, nesneler aras\u0131ndaki ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 gev\u015fetir ve sistemin daha mod\u00fcler olmas\u0131n\u0131 sa\u011flar. Bu yakla\u015f\u0131m, genellikle \"Kal\u0131t\u0131m yerine Kompozisyonu tercih et\" (Favor Composition over Inheritance) prensibiyle \u00f6zetlenir, \u00e7\u00fcnk\u00fc daha fazla esneklik ve s\u00fcrd\u00fcr\u00fclebilirlik sunar.<\/p>\n<p>Peki, ne zaman hangisini kullanmal\u0131y\u0131z? \u0130\u015fte size yol g\u00f6sterici birka\u00e7 ilke:<\/p>\n<ol>\n<li><strong>\"Is-A\" (Kal\u0131t\u0131m) Kullan\u0131m Senaryolar\u0131:<\/strong>\n<ul>\n<li><strong>Ger\u00e7ekten bir \"tip\" ili\u015fkisi oldu\u011funda:<\/strong> E\u011fer alt s\u0131n\u0131f, \u00fcst s\u0131n\u0131f\u0131n t\u00fcm \u00f6zelliklerini ve davran\u0131\u015flar\u0131n\u0131 mant\u0131ksal olarak devral\u0131yorsa. \u00d6rne\u011fin, <code>Kare<\/code> bir <code>\u015eekil<\/code>dir, <code>\u00d6\u011fretmen<\/code> bir <code>\u00c7al\u0131\u015fan<\/code>d\u0131r.<\/li>\n<li><strong>Davran\u0131\u015f payla\u015f\u0131m\u0131 \u00f6ncelikli oldu\u011funda:<\/strong> Ortak bir temel davran\u0131\u015f setinin t\u00fcm t\u00fcretilmi\u015f s\u0131n\u0131flar taraf\u0131ndan kullan\u0131lmas\u0131 gerekti\u011finde.<\/li>\n<li><strong>S\u0131n\u0131rl\u0131 hiyerar\u015filerde:<\/strong> Derin kal\u0131t\u0131m hiyerar\u015filerinden ka\u00e7\u0131nmak \u00f6nemlidir, \u00e7\u00fcnk\u00fc bu durum kodu karma\u015f\u0131kla\u015ft\u0131r\u0131r ve bak\u0131m\u0131 zorla\u015ft\u0131r\u0131r. Genellikle 2-3 seviyeden fazla derinli\u011fe inmemeye \u00e7al\u0131\u015f\u0131n.<\/li>\n<\/ul>\n<\/li>\n<li><strong>\"Has-A\" (Kompozisyon) Kullan\u0131m Senaryolar\u0131:<\/strong>\n<ul>\n<li><strong>Bile\u015fen ili\u015fkisi oldu\u011funda:<\/strong> Bir nesnenin i\u015flevselli\u011fini ba\u015fka bir nesnenin yeteneklerini kullanarak tamamlad\u0131\u011f\u0131 durumlarda. \u00d6rne\u011fin, <code>Araba<\/code>n\u0131n <code>Motor<\/code>a sahip olmas\u0131.<\/li>\n<li><strong>Esneklik ve de\u011fi\u015ftirilebilirlik \u00f6nemli oldu\u011funda:<\/strong> Bir bile\u015fenin, ana nesnenin di\u011fer bile\u015fenlerini etkilemeden de\u011fi\u015ftirilebilmesini istedi\u011finizde.<\/li>\n<li><strong>Davran\u0131\u015flar\u0131 dinamik olarak de\u011fi\u015ftirmek istedi\u011finizde:<\/strong> Bir nesnenin davran\u0131\u015flar\u0131n\u0131 \u00e7al\u0131\u015fma zaman\u0131nda de\u011fi\u015ftirmek istedi\u011finizde (strateji deseni gibi).<\/li>\n<li><strong>Birden \u00e7ok kaynaktan \u00f6zellik sa\u011flamak gerekti\u011finde:<\/strong> Java'daki \"Mixins\" veya C#'daki \"Extension Methods\" gibi konseptler, kal\u0131t\u0131m\u0131n s\u0131n\u0131rlamalar\u0131n\u0131 a\u015farak kompozisyon ile benzer faydalar sa\u011flar.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Karar verirken kendinize \"X bir Y midir?\" veya \"X bir Y'ye sahip midir?\" sorular\u0131n\u0131 sorun. \"Is-A\" i\u00e7in ilk soru, \"Has-A\" i\u00e7in ikinci soru daha uygun yan\u0131tlar\u0131 verecektir. Genellikle \"Has-A\" daha esnek bir \u00e7\u00f6z\u00fcm sunar.\n<\/div>\n<p>\u00d6zetle, kal\u0131t\u0131m g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r, ancak dikkatli kullan\u0131lmal\u0131d\u0131r. Kompozisyon ise \u00e7o\u011fu durumda daha esnek, mod\u00fcler ve bak\u0131m\u0131 kolay sistemler olu\u015fturman\u0131z\u0131 sa\u011flar. Modern yaz\u0131l\u0131m geli\u015ftirme pratikleri, genellikle \"Has-A\" ili\u015fkilerine daha fazla a\u011f\u0131rl\u0131k verilmesini tavsiye eder. Bu sayede, gelecekteki de\u011fi\u015fikliklere daha a\u00e7\u0131k, geni\u015fletilebilir ve sa\u011flam bir kod taban\u0131na sahip olabilirsiniz.<\/p>\n<h2 id=\"gercek-dunya-senaryolari-buyuk-projelerde-kompozisyonun-gucu\">Ger\u00e7ek D\u00fcnya Senaryolar\u0131: B\u00fcy\u00fck Projelerde Kompozisyonun G\u00fcc\u00fc<\/h2>\n<p>Teorik bilgiler ve basit \u00f6rnekler \"Has-A\" ili\u015fkilerinin temellerini anlamam\u0131za yard\u0131mc\u0131 olsa da, kompozisyonun ger\u00e7ek g\u00fcc\u00fc b\u00fcy\u00fck \u00f6l\u00e7ekli ve karma\u015f\u0131k yaz\u0131l\u0131m projelerinde ortaya \u00e7\u0131kar. Bu b\u00f6l\u00fcmde, kompozisyonun pratik uygulamalar\u0131n\u0131 ve kar\u015f\u0131la\u015f\u0131lan yayg\u0131n sorunlara nas\u0131l \u00e7\u00f6z\u00fcmler sundu\u011funu ger\u00e7ek d\u00fcnya senaryolar\u0131 \u00fczerinden inceleyece\u011fiz.<\/p>\n<h3>Vaka Analizi: E-Ticaret Uygulamas\u0131nda Sipari\u015f Y\u00f6netimi<\/h3>\n<p>Bir e-ticaret uygulamas\u0131n\u0131 d\u00fc\u015f\u00fcnelim. Bu uygulamada \"Sipari\u015f\" ad\u0131nda merkezi bir nesnemiz var. Bir sipari\u015fin bir\u00e7ok farkl\u0131 y\u00f6n\u00fc bulunur: \u00fcr\u00fcnler, m\u00fc\u015fteri bilgileri, \u00f6deme bilgileri, kargo bilgileri, indirimler ve sipari\u015f durumu gibi. E\u011fer bu bilgilerin hepsini tek bir <code>Sipari\u015f<\/code> s\u0131n\u0131f\u0131n\u0131n i\u00e7ine s\u0131k\u0131\u015ft\u0131rmaya \u00e7al\u0131\u015f\u0131rsak, s\u0131n\u0131f\u0131m\u0131z devasa ve y\u00f6netilemez bir hale gelir. \u0130\u015fte bu noktada kompozisyon devreye girer.<\/p>\n<p><strong>Kompozisyon Yakla\u015f\u0131m\u0131:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\n\/\/ Sipari\u015fin her bir bile\u015feni ayr\u0131 bir s\u0131n\u0131f olarak modellenir\nclass Urun {\n    constructor(id, ad, fiyat) {\n        this.id = id;\n        this.ad = ad;\n        this.fiyat = fiyat;\n    }\n}\n\nclass SepetItem {\n    constructor(urun, miktar) {\n        this.urun = urun; \/\/ Has-A: SepetItem bir Urune sahiptir\n        this.miktar = miktar;\n    }\n    toplamFiyat() {\n        return this.urun.fiyat * this.miktar;\n    }\n}\n\nclass MusteriBilgileri {\n    constructor(ad, soyad, eposta) {\n        this.ad = ad;\n        this.soyad = soyad;\n        this.eposta = eposta;\n    }\n}\n\nclass OdemeBilgileri {\n    constructor(odemeTipi, tutar) {\n        this.odemeTipi = odemeTipi;\n        this.tutar = tutar;\n    }\n    odemeYap() {\n        console.log(<code>${this.odemeTipi} ile ${this.tutar} TL \u00f6deme yap\u0131ld\u0131.<\/code>);\n        \/\/ Ger\u00e7ek bir \u00f6deme i\u015fleme mant\u0131\u011f\u0131 buraya gelir\n    }\n}\n\nclass KargoBilgileri {\n    constructor(adres, kargoSirketi) {\n        this.adres = adres;\n        this.kargoSirketi = kargoSirketi;\n    }\n    kargoyuTakipEt() {\n        console.log(<code>${this.kargoSirketi} ile ${this.adres} adresine kargo takip ediliyor.<\/code>);\n    }\n}\n\nclass Siparis {\n    constructor(siparisId, musteri, sepetItems, odeme, kargo) {\n        this.siparisId = siparisId;\n        this.musteri = musteri;     \/\/ Has-A: Siparis bir MusteriBilgilerine sahiptir\n        this.sepetItems = sepetItems; \/\/ Has-A: Siparis bir SepetItem listesine sahiptir\n        this.odeme = odeme;         \/\/ Has-A: Siparis bir OdemeBilgilerine sahiptir\n        this.kargo = kargo;         \/\/ Has-A: Siparis bir KargoBilgilerine sahiptir\n        this.durum = \"Beklemede\";\n    }\n\n    toplamSiparisTutari() {\n        return this.sepetItems.reduce((acc, item) => acc + item.toplamFiyat(), 0);\n    }\n\n    siparisOnayla() {\n        if (this.odeme.odemeYap()) { \/\/ \u00d6deme ba\u015far\u0131l\u0131ysa\n            this.durum = \"Onayland\u0131\";\n            console.log(<code>Sipari\u015f ${this.siparisId} onayland\u0131.<\/code>);\n            \/\/ Kargo i\u015flemlerini ba\u015flat\n            this.kargo.kargoyuTakipEt();\n        } else {\n            console.log(<code>Sipari\u015f ${this.siparisId} \u00f6deme hatas\u0131 nedeniyle onaylanamad\u0131.<\/code>);\n        }\n    }\n}\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi\nconst urun1 = new Urun(\"P001\", \"Laptop\", 12000);\nconst urun2 = new Urun(\"P002\", \"Mouse\", 250);\n\nconst sepet = [\n    new SepetItem(urun1, 1),\n    new SepetItem(urun2, 2)\n];\n\nconst musteri = new MusteriBilgileri(\"Ahmet\", \"Y\u0131lmaz\", \"ahmet@example.com\");\nconst odeme = new OdemeBilgileri(\"Kredi Kart\u0131\", 12500); \/\/ Sepet toplam\u0131 + kargo\/indirim\nconst kargo = new KargoBilgileri(\"\u0130stanbul, T\u00fcrkiye\", \"H\u0131zl\u0131 Kargo A.\u015e.\");\n\nconst yeniSiparis = new Siparis(\"S001\", musteri, sepet, odeme, kargo);\nconsole.log(<code>Sipari\u015f ${yeniSiparis.siparisId} Toplam Tutar\u0131: ${yeniSiparis.toplamSiparisTutari()} TL<\/code>);\nyeniSiparis.siparisOnayla();\nconsole.log(<code>Sipari\u015f Durumu: ${yeniSiparis.durum}<\/code>);\n<\/pre>\n<p><\/code><\/p>\n<p>Bu vaka analizinde, <code>Sipari\u015f<\/code> s\u0131n\u0131f\u0131 tek bir b\u00fcy\u00fck nesne olmaktan ziyade, <code>MusteriBilgileri<\/code>, <code>OdemeBilgileri<\/code>, <code>KargoBilgileri<\/code> ve <code>SepetItem<\/code> gibi daha k\u00fc\u00e7\u00fck ve \u00f6zel nesnelerin bir koleksiyonudur. Her bir k\u00fc\u00e7\u00fck nesne kendi sorumlulu\u011funu \u00fcstlenir ve <code>Sipari\u015f<\/code> s\u0131n\u0131f\u0131 bu bile\u015fenlerin i\u015flevselli\u011fini bir araya getirerek genel bir sipari\u015f y\u00f6netim ak\u0131\u015f\u0131 olu\u015fturur.<\/p>\n<p><strong>Kompozisyonun Faydalar\u0131 Bu Senaryoda:<\/strong><\/p>\n<ul>\n<li><strong>Mod\u00fclerlik:<\/strong> Her bile\u015fen ba\u011f\u0131ms\u0131zd\u0131r. <code>OdemeBilgileri<\/code> s\u0131n\u0131f\u0131 sadece \u00f6deme ile ilgili detaylar\u0131 ve i\u015flemleri bilir. <code>KargoBilgileri<\/code> sadece kargo detaylar\u0131n\u0131 y\u00f6netir.<\/li>\n<li><strong>Esneklik:<\/strong> E\u011fer yeni bir \u00f6deme y\u00f6ntemi (\u00f6rne\u011fin PayPal) veya kargo \u015firketi eklemek istersek, sadece ilgili s\u0131n\u0131f\u0131 (veya ona uygun bir aray\u00fcz\u00fc) de\u011fi\u015ftirmemiz veya yeni bir tane eklememiz yeterlidir. <code>Sipari\u015f<\/code> s\u0131n\u0131f\u0131nda b\u00fcy\u00fck bir de\u011fi\u015fiklik yapmaya gerek kalmaz.<\/li>\n<li><strong>Yeniden Kullan\u0131labilirlik:<\/strong> <code>MusteriBilgileri<\/code> veya <code>Urun<\/code> s\u0131n\u0131flar\u0131, uygulaman\u0131n farkl\u0131 b\u00f6l\u00fcmlerinde (\u00f6rne\u011fin m\u00fc\u015fteri profili sayfas\u0131nda veya \u00fcr\u00fcn katalo\u011funda) kolayca yeniden kullan\u0131labilir.<\/li>\n<li><strong>Test Edilebilirlik:<\/strong> Her bir bile\u015fen ba\u011f\u0131ms\u0131z olarak test edilebilir. \u00d6rne\u011fin, <code>OdemeBilgileri<\/code> s\u0131n\u0131f\u0131n\u0131n <code>odemeYap()<\/code> metodunu, <code>Sipari\u015f<\/code> s\u0131n\u0131f\u0131n\u0131n karma\u015f\u0131k bir \u00f6rne\u011fini olu\u015fturmaya gerek kalmadan test edebiliriz.<\/li>\n<li><strong>Bak\u0131m Kolayl\u0131\u011f\u0131:<\/strong> Bir hata olu\u015ftu\u011funda veya bir \u00f6zellik g\u00fcncellenmesi gerekti\u011finde, sadece ilgili bile\u015fen s\u0131n\u0131f\u0131na odaklanmak yeterlidir, bu da hata ay\u0131klama ve geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Bu \u00f6rnek, kompozisyonun sadece teorik bir konsept olmad\u0131\u011f\u0131n\u0131, ayn\u0131 zamanda ger\u00e7ek d\u00fcnya yaz\u0131l\u0131m projelerinde kar\u015f\u0131la\u015f\u0131lan karma\u015f\u0131kl\u0131\u011f\u0131 y\u00f6netmek i\u00e7in ne kadar g\u00fc\u00e7l\u00fc ve pratik bir ara\u00e7 oldu\u011funu a\u00e7\u0131k\u00e7a g\u00f6stermektedir. B\u00fcy\u00fck sistemleri daha k\u00fc\u00e7\u00fck, y\u00f6netilebilir ve esnek par\u00e7alara ay\u0131rarak, geli\u015ftirme s\u00fcrecini optimize eder ve uzun vadede kod taban\u0131n\u0131n sa\u011fl\u0131\u011f\u0131n\u0131 korur.<\/p>\n<h2 id=\"ileri-duzey-teknikler-dinamik-kompozisyon-ve-bagimlilik-enjeksiyonu\">\u0130leri D\u00fczey Teknikler: Dinamik Kompozisyon ve Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu<\/h2>\n<p>\"Has-A\" ili\u015fkileri, yani kompozisyon, temel bir prensip olsa da, modern yaz\u0131l\u0131m geli\u015ftirmede bu prensibi daha da g\u00fc\u00e7l\u00fc k\u0131lan ileri d\u00fczey teknikler bulunmaktad\u0131r. \u00d6zellikle dinamik kompozisyon ve ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu (Dependency Injection - DI), esnek ve test edilebilir uygulamalar olu\u015fturmak i\u00e7in vazge\u00e7ilmez ara\u00e7lard\u0131r. Bu teknikler, nesnelerin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 \u00e7al\u0131\u015fma zaman\u0131nda y\u00f6netmemize ve b\u00f6ylece daha adaptif sistemler kurmam\u0131za olanak tan\u0131r.<\/p>\n<h3>Dinamik Kompozisyon Nedir?<\/h3>\n<p>\u00d6nceki \u00f6rneklerimizde, bir nesnenin sahip oldu\u011fu di\u011fer nesneler genellikle yap\u0131c\u0131 (constructor) metot i\u00e7inde do\u011frudan olu\u015fturuluyordu. \u00d6rne\u011fin, <code>Araba<\/code> s\u0131n\u0131f\u0131n\u0131n <code>Motor<\/code> nesnesini do\u011frudan <code>new Motor()<\/code> ile olu\u015fturmas\u0131 gibi. Bu, basit senaryolar i\u00e7in yeterli olsa da, bazen bir nesnenin hangi bile\u015fenlere sahip olaca\u011f\u0131na \u00e7al\u0131\u015fma zaman\u0131nda (runtime) karar vermek isteyebiliriz. \u0130\u015fte bu, dinamik kompozisyondur.<\/p>\n<p>Dinamik kompozisyon, bir nesnenin sahip oldu\u011fu bile\u015fenleri ko\u015fullara veya kullan\u0131c\u0131n\u0131n se\u00e7imine g\u00f6re de\u011fi\u015ftirebilme yetene\u011fini ifade eder. Bu, genellikle strateji deseni (Strategy Pattern) veya dekorat\u00f6r deseni (Decorator Pattern) gibi tasar\u0131m kal\u0131plar\u0131 ile birlikte kullan\u0131l\u0131r. \u00d6rne\u011fin, bir \"Bildirim Sistemi\" d\u00fc\u015f\u00fcnelim. Bu sistem, duruma g\u00f6re e-posta, SMS veya anl\u0131k bildirim g\u00f6nderebilir. <code>Bildirim<\/code> s\u0131n\u0131f\u0131, hangi <code>BildirimGonderici<\/code> bile\u015fenini kullanaca\u011f\u0131na \u00e7al\u0131\u015fma zaman\u0131nda karar verebilir.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ \u00d6rnek bir aray\u00fcz (JavaScript'te soyut aray\u00fczler do\u011frudan yoktur,\n\/\/ ancak duck typing ile bu sa\u011flanabilir)\nclass IBildirimGonderici {\n    gonder(mesaj) {\n        throw new Error(\"Bu metot uygulanmal\u0131d\u0131r!\");\n    }\n}\n\nclass EpostaGonderici extends IBildirimGonderici {\n    gonder(mesaj) {\n        console.log(<code>E-posta ile g\u00f6nderildi: ${mesaj}<\/code>);\n    }\n}\n\nclass SMSGonderici extends IBildirimGonderici {\n    gonder(mesaj) {\n        console.log(<code>SMS ile g\u00f6nderildi: ${mesaj}<\/code>);\n    }\n}\n\nclass BildirimSistemi {\n    \/\/ constructor ile ba\u011f\u0131ml\u0131l\u0131k enjekte ediliyor\n    constructor(gonderici) { \n        this.gonderici = gonderici; \/\/ Dinamik olarak belirlenen g\u00f6nderici\n    }\n\n    \/\/ \u00c7al\u0131\u015fma zaman\u0131nda g\u00f6nderici de\u011fi\u015ftirilebilir\n    setGonderici(yeniGonderici) {\n        this.gonderici = yeniGonderici;\n    }\n\n    bildirimGonder(mesaj) {\n        this.gonderici.gonder(mesaj);\n    }\n}\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi\nconst epostaGonderici = new EpostaGonderici();\nconst smsGonderici = new SMSGonderici();\n\nconst bildirimSistemi = new BildirimSistemi(epostaGonderici);\nbildirimSistemi.bildirimGonder(\"Ho\u015f geldiniz mesaj\u0131!\"); \/\/ E-posta ile gider\n\nbildirimSistemi.setGonderici(smsGonderici); \/\/ G\u00f6ndericiyi \u00e7al\u0131\u015fma zaman\u0131nda de\u011fi\u015ftir\nbildirimSistemi.bildirimGonder(\"Hesab\u0131n\u0131z aktive edildi.\"); \/\/ SMS ile gider\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte <code>BildirimSistemi<\/code>, hangi <code>IBildirimGonderici<\/code> implementasyonunu kullanaca\u011f\u0131na karar verebilir ve hatta \u00e7al\u0131\u015fma zaman\u0131nda bunu de\u011fi\u015ftirebilir. Bu, sistemin \u00e7ok daha esnek olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (Dependency Injection - DI)<\/h3>\n<p>Dinamik kompozisyonun en yayg\u0131n ve etkili uygulama bi\u00e7imlerinden biri Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonudur. Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu, bir nesnenin ihtiya\u00e7 duydu\u011fu di\u011fer nesneleri (ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131) kendi i\u00e7inde olu\u015fturmak yerine, d\u0131\u015far\u0131dan almas\u0131 prensibine dayan\u0131r. Bu, yukar\u0131daki <code>BildirimSistemi<\/code> \u00f6rne\u011finde constructor \u00fczerinden <code>gonderici<\/code> parametresini almam\u0131zla zaten bir miktar uyguland\u0131.<\/p>\n<p>DI'nin temel faydalar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Test Edilebilirlik:<\/strong> Ba\u011f\u0131ml\u0131l\u0131klar d\u0131\u015far\u0131dan verildi\u011fi i\u00e7in, bir s\u0131n\u0131f\u0131 test ederken ger\u00e7ek ba\u011f\u0131ml\u0131l\u0131klar\u0131 yerine \"sahte\" (mock) ba\u011f\u0131ml\u0131l\u0131klar enjekte edebiliriz. Bu, birim testlerin daha kolay ve g\u00fcvenilir olmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>Gev\u015fek Ba\u011fl\u0131l\u0131k (Loose Coupling):<\/strong> Bir s\u0131n\u0131f, ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 nas\u0131l olu\u015fturuldu\u011funu bilmek zorunda kalmaz. Sadece ihtiyac\u0131 olan aray\u00fcz\u00fc veya tipi bilir. Bu, bile\u015fenler aras\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar\u0131 minimuma indirir.<\/li>\n<li><strong>Esneklik ve Geni\u015fletilebilirlik:<\/strong> Bir ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n implementasyonu kolayca de\u011fi\u015ftirilebilir veya farkl\u0131 bir versiyonu ile de\u011fi\u015ftirilebilir, ana s\u0131n\u0131f\u0131n kodunda herhangi bir de\u011fi\u015fiklik yapmaya gerek kalmaz.<\/li>\n<\/ul>\n<p>DI genellikle \u00fc\u00e7 ana \u015fekilde uygulan\u0131r:<\/p>\n<ol>\n<li><strong>Constructor Injection (Yap\u0131c\u0131 Enjeksiyonu):<\/strong> Ba\u011f\u0131ml\u0131l\u0131klar, s\u0131n\u0131f\u0131n yap\u0131c\u0131 metoduna parametre olarak verilir. (Yukar\u0131daki <code>BildirimSistemi<\/code> \u00f6rne\u011fi gibi).<\/li>\n<li><strong>Setter Injection (Ayarlay\u0131c\u0131 Enjeksiyonu):<\/strong> Ba\u011f\u0131ml\u0131l\u0131klar, s\u0131n\u0131f\u0131n bir public metodu (setter) arac\u0131l\u0131\u011f\u0131yla atan\u0131r.<\/li>\n<li><strong>Interface Injection (Aray\u00fcz Enjeksiyonu):<\/strong> Ba\u011f\u0131ml\u0131l\u0131klar, bir aray\u00fcz\u00fcn uygulanmas\u0131 yoluyla enjekte edilir.<\/li>\n<\/ol>\n<pre><code class=\"language-javascript\">\n\/\/ Setter Injection \u00d6rne\u011fi\nclass DatabaseService {\n    kaydet(veri) {\n        console.log(<code>Veritaban\u0131na kaydedildi: ${veri}<\/code>);\n    }\n}\n\nclass RaporlamaServisi {\n    constructor() {\n        this.dbService = null; \/\/ Ba\u015flang\u0131\u00e7ta ba\u011f\u0131ml\u0131l\u0131k yok\n    }\n\n    setDatabaseService(service) {\n        this.dbService = service; \/\/ Setter ile enjekte ediliyor\n    }\n\n    raporOlustur(veri) {\n        if (!this.dbService) {\n            console.error(\"Veritaban\u0131 servisi atanmad\u0131!\");\n            return;\n        }\n        console.log(\"Rapor olu\u015fturuluyor...\");\n        this.dbService.kaydet(<code>Rapor verisi: ${veri}<\/code>);\n    }\n}\n\nconst raporServisi = new RaporlamaServisi();\n\/\/ raporServisi.raporOlustur(\"Analiz verisi\"); \/\/ Hata verir \u00e7\u00fcnk\u00fc dbService atanmad\u0131\n\nconst gercekDb = new DatabaseService();\nraporServisi.setDatabaseService(gercekDb);\nraporServisi.raporOlustur(\"Haftal\u0131k sat\u0131\u015f raporu\");\n\n\/\/ Test ortam\u0131nda mock bir servis enjekte edebiliriz\nclass MockDatabaseService {\n    kaydet(veri) {\n        console.log(<code>MOCK Veritaban\u0131na kaydedildi (TEST): ${veri}<\/code>);\n    }\n}\nconst testRaporServisi = new RaporlamaServisi();\ntestRaporServisi.setDatabaseService(new MockDatabaseService());\ntestRaporServisi.raporOlustur(\"Test raporu\"); \/\/ Test ortam\u0131nda farkl\u0131 bir davran\u0131\u015f\n<\/pre>\n<p><\/code><\/p>\n<p>Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu ve dinamik kompozisyon, yaz\u0131l\u0131m tasar\u0131m\u0131nda \"kontrolleri tersine \u00e7evirme\" (Inversion of Control - IoC) prensibini uygulamam\u0131z\u0131 sa\u011flar. Yani, bir nesnenin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kendisinin olu\u015fturmas\u0131 yerine, bu ba\u011f\u0131ml\u0131l\u0131klar d\u0131\u015far\u0131dan sa\u011flan\u0131r. Bu, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k kurumsal uygulamalarda, bile\u015fenlerin y\u00f6netimini ve test edilebilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Bu teknikleri ustaca kullanmak, ger\u00e7ekten esnek, s\u00fcrd\u00fcr\u00fclebilir ve y\u00fcksek kaliteli yaz\u0131l\u0131mlar geli\u015ftirmenin yolunu a\u00e7ar.<\/p>\n<h2 id=\"mobil-uyumluluk-kompozisyon-ve-responsive-tasarim\">Mobil Uyumluluk: Kompozisyon ve Responsive Tasar\u0131m<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz d\u00fcnyas\u0131nda, bir web uygulamas\u0131n\u0131n veya aray\u00fcz\u00fcn\u00fcn mobil cihazlarda da sorunsuz \u00e7al\u0131\u015fmas\u0131 kritik \u00f6nem ta\u015f\u0131r. Responsive tasar\u0131m (duyarl\u0131 tasar\u0131m), i\u00e7eri\u011fin farkl\u0131 ekran boyutlar\u0131na ve \u00e7\u00f6z\u00fcn\u00fcrl\u00fcklere otomatik olarak uyum sa\u011flamas\u0131 prensibine dayan\u0131r. Peki, yaz\u0131l\u0131m tasar\u0131m\u0131ndaki \"Has-A\" ili\u015fkileri, yani kompozisyon, mobil uyumlu ve responsive tasar\u0131mlarla nas\u0131l bir araya gelir?<\/p>\n<p>Kompozisyon prensibi, UI (Kullan\u0131c\u0131 Aray\u00fcz\u00fc) bile\u015fenlerinin tasar\u0131m\u0131nda da b\u00fcy\u00fck rol oynar. Modern frontend \u00e7at\u0131lar\u0131nda (React, Vue, Angular gibi), UI'lar genellikle k\u00fc\u00e7\u00fck, yeniden kullan\u0131labilir ve ba\u011f\u0131ms\u0131z bile\u015fenlerden (component) olu\u015fur. Bu bile\u015fenler, daha b\u00fcy\u00fck ve karma\u015f\u0131k UI yap\u0131lar\u0131n\u0131 olu\u015fturmak i\u00e7in bir araya getirilir; bu da asl\u0131nda bir kompozisyon \u00f6rne\u011fidir. \u00d6rne\u011fin, bir \"Kart\" bile\u015feni, bir \"Ba\u015fl\u0131k\", bir \"G\u00f6rsel\", bir \"A\u00e7\u0131klama\" ve bir \"Buton\" bile\u015fenine sahip olabilir. Her biri kendi stil ve davran\u0131\u015f\u0131na sahip ayr\u0131 birer \"Has-A\" ili\u015fkisiyle Kart bile\u015fenine eklenir.<\/p>\n<p>Responsive tasar\u0131m, bu bile\u015fenlerin farkl\u0131 ekran boyutlar\u0131nda nas\u0131l g\u00f6r\u00fcnece\u011fini ve davranaca\u011f\u0131n\u0131 belirlemek i\u00e7in CSS medya sorgular\u0131n\u0131 (media queries) kullan\u0131r. Kompozisyon sayesinde, her bir UI bile\u015feni kendi responsive davran\u0131\u015f\u0131n\u0131 kaps\u00fclleyebilir veya ana bile\u015fen (\u00f6rne\u011fin <code>Kart<\/code>) kendi alt bile\u015fenlerinin responsive davran\u0131\u015flar\u0131n\u0131 koordine edebilir. Bu, her bir par\u00e7an\u0131n kendi i\u00e7inde responsive olmas\u0131n\u0131 veya responsiveli\u011fi ebeveyninden devralmas\u0131n\u0131 sa\u011flayarak daha y\u00f6netilebilir bir kod taban\u0131 olu\u015fturur.<\/p>\n<p><strong>Kompozisyon ve Responsive Tasar\u0131m\u0131n Birle\u015fimi \u0130\u00e7in \u0130pu\u00e7lar\u0131:<\/strong><\/p>\n<ol>\n<li><strong>K\u00fc\u00e7\u00fck, Odaklanm\u0131\u015f Bile\u015fenler:<\/strong> Her UI bile\u015fenini k\u00fc\u00e7\u00fck ve tek bir sorumlulu\u011fa sahip olacak \u015fekilde tasarlay\u0131n. \u00d6rne\u011fin, bir <code>Navbar<\/code> bile\u015feni, <code>Logo<\/code>, <code>NavMenuItem<\/code> ve <code>HamburgerMenuIcon<\/code> gibi bile\u015fenlere sahip olabilir. Her bir alt bile\u015fen kendi responsive stilini y\u00f6netebilir.<\/li>\n<li><strong>Medya Sorgular\u0131n\u0131 Kaps\u00fclle:<\/strong> Bile\u015fenlerin responsive stillerini m\u00fcmk\u00fcn oldu\u011funca kendi CSS'leri i\u00e7inde tutmaya \u00e7al\u0131\u015f\u0131n. Bu, bile\u015fenin ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r ve onu ba\u015fka bir yerde kulland\u0131\u011f\u0131n\u0131zda responsive davran\u0131\u015f\u0131n\u0131 da beraberinde ta\u015f\u0131mas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>CSS Grid ve Flexbox Kullan\u0131m\u0131:<\/strong> Bu modern CSS layout teknikleri, bile\u015fenlerin ekran boyutuna g\u00f6re otomatik olarak yeniden d\u00fczenlenmesini kolayla\u015ft\u0131r\u0131r. Kompozisyonla birle\u015fti\u011finde, esnek ve uyarlanabilir aray\u00fczler olu\u015fturmak \u00e7ok daha basit hale gelir.<\/li>\n<li><strong>Tasar\u0131m Tokenlar\u0131 ve Temalar:<\/strong> Renkler, yaz\u0131 tipleri, bo\u015fluklar gibi tasar\u0131m elemanlar\u0131n\u0131 merkezi token'lar olarak tan\u0131mlay\u0131n. Bu token'lar\u0131 bile\u015fenlerinizde kullanarak, tema de\u011fi\u015fikliklerini veya responsive ayarlamalar\u0131 (\u00f6rne\u011fin k\u00fc\u00e7\u00fck ekranlarda daha az bo\u015fluk) kolayca yapabilirsiniz.<\/li>\n<\/ol>\n<p><strong>Mobil Uyumlu Bir HTML ve CSS Kompozisyonu \u00d6rne\u011fi:<\/strong><\/p>\n<p>A\u015fa\u011f\u0131da, bir \u00fcr\u00fcn kart\u0131 bile\u015feninin nas\u0131l kompozisyon ve responsive tasar\u0131m ilkeleriyle olu\u015fturulabilece\u011fine dair basit bir \u00f6rnek bulunmaktad\u0131r. Bu \u00f6rnekte <code>UrunKarti<\/code> bir <code>Resim<\/code>, <code>Baslik<\/code>, <code>Fiyat<\/code> ve <code>Buton<\/code>a sahiptir.<\/p>\n<pre><code class=\"language-html\">\n<style>\n    \/* Genel Reset veya Temel Stiller *\/\n    body {\n        font-family: sans-serif;\n        margin: 20px;\n        background-color: #f4f4f4;\n    }\n\n    \/* UrunKarti ana bile\u015feni *\/\n    .urun-karti {\n        display: flex; \/* K\u00fc\u00e7\u00fck ekranlarda dikey s\u0131ralama i\u00e7in varsay\u0131lan *\/\n        flex-direction: column;\n        border: 1px solid #ddd;\n        border-radius: 8px;\n        background-color: #fff;\n        margin-bottom: 20px;\n        overflow: hidden;\n        box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n        max-width: 300px; \/* Varsay\u0131lan maksimum geni\u015flik *\/\n        margin-left: auto;\n        margin-right: auto;\n    }\n\n    \/* Alt bile\u015fen: Resim *\/\n    .urun-resmi img {\n        width: 100%;\n        height: auto;\n        display: block;\n    }\n\n    \/* Alt bile\u015fen: \u0130\u00e7erik B\u00f6l\u00fcm\u00fc *\/\n    .urun-icerik {\n        padding: 15px;\n        text-align: center;\n    }\n\n    \/* Alt bile\u015fen: Ba\u015fl\u0131k *\/\n    .urun-baslik {\n        font-size: 1.2em;\n        margin-top: 0;\n        margin-bottom: 10px;\n        color: #333;\n    }\n\n    \/* Alt bile\u015fen: Fiyat *\/\n    .urun-fiyat {\n        font-size: 1.5em;\n        font-weight: bold;\n        color: #007bff;\n        margin-bottom: 15px;\n    }\n\n    \/* Alt bile\u015fen: Buton *\/\n    .urun-sepete-ekle-btn {\n        background-color: #28a745;\n        color: white;\n        border: none;\n        padding: 10px 20px;\n        border-radius: 5px;\n        cursor: pointer;\n        font-size: 1em;\n        transition: background-color 0.3s ease;\n        width: 100%; \/* Mobil g\u00f6r\u00fcn\u00fcmde tam geni\u015flik *\/\n    }\n\n    .urun-sepete-ekle-btn:hover {\n        background-color: #218838;\n    }\n\n    \/* Medya Sorgusu: Daha geni\u015f ekranlar i\u00e7in responsive ayarlar *\/\n    @media (min-width: 768px) {\n        .urun-karti {\n            flex-direction: row; \/* Geni\u015f ekranlarda yatay s\u0131ralama *\/\n            max-width: 600px; \/* Geni\u015f ekranlarda daha b\u00fcy\u00fck kart geni\u015fli\u011fi *\/\n            text-align: left;\n        }\n\n        .urun-resmi {\n            flex: 1; \/* Resim geni\u015fli\u011finin yar\u0131s\u0131n\u0131 kaplas\u0131n *\/\n            min-width: 200px;\n        }\n\n        .urun-icerik {\n            flex: 2; \/* \u0130\u00e7erik geni\u015fli\u011finin di\u011fer yar\u0131s\u0131n\u0131 kaplas\u0131n *\/\n            padding: 20px;\n            text-align: left;\n        }\n\n        .urun-baslik {\n            font-size: 1.5em;\n        }\n        \n        .urun-sepete-ekle-btn {\n            width: auto; \/* Otomatik geni\u015flik, tam geni\u015flik de\u011fil *\/\n        }\n    }\n<\/style>\n\n<div class=\"urun-karti\">\n    <div class=\"urun-resmi\">\n        <img decoding=\"async\" src=\"https:\/\/via.placeholder.com\/200\" alt=\"\u00dcr\u00fcn Resmi\">\n    <\/div>\n    <div class=\"urun-icerik\">\n        <h3 class=\"urun-baslik\">Harika Bir \u00dcr\u00fcn Ba\u015fl\u0131\u011f\u0131<\/h3>\n        <p>Bu \u00fcr\u00fcn, ihtiya\u00e7lar\u0131n\u0131z\u0131 kar\u015f\u0131lamak i\u00e7in \u00f6zel olarak tasarland\u0131.<\/p>\n        <div class=\"urun-fiyat\">199.99 TL<\/div>\n        <button class=\"urun-sepete-ekle-btn\">Sepete Ekle<\/button>\n    <\/div>\n<\/div>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnek, <code>urun-karti<\/code> ana bile\u015feninin nas\u0131l <code>urun-resmi<\/code>, <code>urun-icerik<\/code> (ki bu da <code>urun-baslik<\/code>, <code>urun-fiyat<\/code>, <code>urun-sepete-ekle-btn<\/code> gibi alt bile\u015fenlere sahip) bile\u015fenlerini bir araya getirdi\u011fini g\u00f6sterir. CSS i\u00e7inde, <code>@media<\/code> sorgular\u0131 kullan\u0131larak 768px geni\u015fli\u011fin \u00fczerindeki ekranlarda kart\u0131n d\u00fczeni (<code>flex-direction: row<\/code>) ve di\u011fer stilleri nas\u0131l de\u011fi\u015fti\u011fi belirtilmi\u015ftir. Bu sayede, \"Has-A\" ili\u015fkileriyle olu\u015fturulmu\u015f bile\u015fenler, farkl\u0131 cihazlarda en iyi kullan\u0131c\u0131 deneyimini sunacak \u015fekilde adapte olabilir.<\/p>\n<h2 id=\"sonuc-has-a-iliskilerinin-yazilim-tasarimindaki-yeri-ve-sikca-sorulan-sorular\">Sonu\u00e7: 'Has-A' \u0130li\u015fkilerinin Yaz\u0131l\u0131m Tasar\u0131m\u0131ndaki Yeri ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu at\u00f6lye \u00e7al\u0131\u015fmas\u0131 boyunca, nesne tabanl\u0131 programlaman\u0131n temel ta\u015flar\u0131ndan biri olan \"Has-A\" ili\u015fkilerini veya di\u011fer ad\u0131yla kompozisyonu derinlemesine inceledik. Kompozisyonun, kal\u0131t\u0131m\u0131n aksine, yaz\u0131l\u0131m sistemlerimizi daha mod\u00fcler, esnek ve bak\u0131m\u0131 kolay hale getirmedeki kritik rol\u00fcn\u00fc kavrad\u0131k. Bir nesnenin di\u011fer nesneleri birer bile\u015fen olarak i\u00e7ermesi prensibi, kod tekrar\u0131n\u0131 azalt\u0131rken, bile\u015fenler aras\u0131 ba\u011f\u0131ml\u0131l\u0131klar\u0131 gev\u015feterek uygulaman\u0131n daha dayan\u0131kl\u0131 ve geni\u015fletilebilir olmas\u0131n\u0131 sa\u011fl\u0131yor.<\/p>\n<p>Ger\u00e7ek d\u00fcnya senaryolar\u0131nda, \u00f6zellikle e-ticaret uygulamalar\u0131ndaki sipari\u015f y\u00f6netimi gibi karma\u015f\u0131k sistemlerde, kompozisyonun sa\u011flad\u0131\u011f\u0131 avantajlar\u0131n ne kadar paha bi\u00e7ilmez oldu\u011funu g\u00f6rd\u00fck. Her bir sorumlulu\u011fun ayr\u0131 bir nesneye atanmas\u0131, hem geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131yor hem de hata ay\u0131klama ve s\u00fcrd\u00fcr\u00fclebilirlik maliyetlerini d\u00fc\u015f\u00fcr\u00fcyor. Ayr\u0131ca, dinamik kompozisyon ve ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu gibi ileri d\u00fczey tekniklerle, sistemlerimizi \u00e7al\u0131\u015fma zaman\u0131nda adapte edebilir, test edilebilirli\u011fi art\u0131rabilir ve \"kontrolleri tersine \u00e7evirme\" prensibini etkin bir \u015fekilde uygulayabiliriz.<\/p>\n<p>Son olarak, mobil uyumluluk ve responsive tasar\u0131m ba\u011flam\u0131nda da kompozisyonun \u00f6nemine de\u011findik. UI bile\u015fenlerini \"Has-A\" ili\u015fkileriyle tasarlamak, farkl\u0131 ekran boyutlar\u0131na uyum sa\u011flayan, yeniden kullan\u0131labilir ve y\u00f6netilebilir aray\u00fczler olu\u015fturman\u0131n temelini olu\u015fturuyor. CSS medya sorgular\u0131yla birle\u015fti\u011finde, kompozisyon, modern web uygulamalar\u0131n\u0131n esnek ve kullan\u0131c\u0131 dostu olmas\u0131n\u0131 sa\u011fl\u0131yor.<\/p>\n<p>\u00d6zetle, \"Has-A\" ili\u015fkileri, sadece bir tasar\u0131m prensibi olman\u0131n \u00f6tesinde, sa\u011flam, \u00f6l\u00e7eklenebilir ve s\u00fcrd\u00fcr\u00fclebilir yaz\u0131l\u0131m mimarileri in\u015fa etmek i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r. Geli\u015ftiriciler olarak, bu prensibi do\u011fru anlamak ve projelerimizde bilin\u00e7li bir \u015fekilde uygulamak, uzun vadede kod kalitemizi ve verimlili\u011fimizi art\u0131racakt\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<dl>\n<dt><strong>Kompozisyon ve Kal\u0131t\u0131m aras\u0131nda ne zaman se\u00e7im yapmal\u0131y\u0131m?<\/strong><\/dt>\n<dd>Genel kural, \"Kal\u0131t\u0131m yerine Kompozisyonu tercih et\" (Favor Composition over Inheritance) \u015feklindedir. E\u011fer \"X bir Y'ye sahip midir?\" (Has-A) sorusu mant\u0131kl\u0131 geliyorsa kompozisyonu, e\u011fer \"X bir Y midir?\" (Is-A) sorusu mant\u0131kl\u0131 geliyorsa ve t\u00fcm \u00f6zellikler mant\u0131ksal olarak devral\u0131n\u0131yorsa kal\u0131t\u0131m\u0131 kullan\u0131n. Kompozisyon, daha fazla esneklik ve gev\u015fek ba\u011fl\u0131l\u0131k sa\u011flar.<\/dd>\n<dt><strong>Kompozisyon, her zaman kal\u0131t\u0131mdan daha m\u0131 iyidir?<\/strong><\/dt>\n<dd>Hay\u0131r, her zaman daha iyi de\u011fildir, ancak \u00e7o\u011fu durumda daha esnek bir \u00e7\u00f6z\u00fcm sunar. Kal\u0131t\u0131m, g\u00fc\u00e7l\u00fc bir \"Is-A\" ili\u015fkisi oldu\u011funda ve kod tekrar\u0131n\u0131 azaltmak istedi\u011finizde hala ge\u00e7erli ve etkili bir tasar\u0131m arac\u0131d\u0131r. \u00d6nemli olan, her iki prensibin de avantajlar\u0131n\u0131 ve dezavantajlar\u0131n\u0131 anlayarak do\u011fru senaryoda do\u011fru olan\u0131 kullanmakt\u0131r. \u00c7ok fazla kal\u0131t\u0131m hiyerar\u015fisi, kodu karma\u015f\u0131kla\u015ft\u0131rabilir.<\/dd>\n<dt><strong>Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu, kompozisyonla nas\u0131l ili\u015fkilidir?<\/strong><\/dt>\n<dd>Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (DI), kompozisyonun pratik bir uygulama \u015feklidir. DI sayesinde, bir nesnenin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 (yani sahip oldu\u011fu di\u011fer nesneleri) kendi i\u00e7inde olu\u015fturmak yerine, d\u0131\u015far\u0131dan almas\u0131n\u0131 sa\u011flar\u0131z. Bu, nesneler aras\u0131 ba\u011f\u0131ml\u0131l\u0131klar\u0131 azalt\u0131r, test edilebilirli\u011fi art\u0131r\u0131r ve uygulaman\u0131n daha mod\u00fcler olmas\u0131n\u0131 sa\u011flar.<\/dd>\n<dt><strong>Kompozisyonun performans \u00fczerinde bir etkisi var m\u0131d\u0131r?<\/strong><\/dt>\n<dd>Genel olarak, kompozisyonun performans \u00fczerinde kayda de\u011fer olumsuz bir etkisi yoktur ve genellikle modern donan\u0131m ve yaz\u0131l\u0131m ortamlar\u0131nda ihmal edilebilir d\u00fczeydedir. Asl\u0131nda, daha k\u00fc\u00e7\u00fck, odaklanm\u0131\u015f nesneler ve daha az derin kal\u0131t\u0131m hiyerar\u015fileri, bazen performans\u0131 iyile\u015ftirebilir \u00e7\u00fcnk\u00fc \u00f6nbellek dostu olabilirler. \u00d6nemli olan, performans darbo\u011fazlar\u0131n\u0131 do\u011fru tespit etmek ve ona g\u00f6re optimizasyon yapmakt\u0131r, kompozisyon genellikle bir darbo\u011faz nedeni de\u011fildir.<\/dd>\n<dt><strong>B\u00fcy\u00fck bir projede kompozisyonu uygulamaya nereden ba\u015flamal\u0131y\u0131m?<\/strong><\/dt>\n<dd>B\u00fcy\u00fck bir projede kompozisyonu uygulamaya ba\u015flamak i\u00e7in, \u00f6ncelikle sisteminizi mant\u0131ksal olarak k\u00fc\u00e7\u00fck, ba\u011f\u0131ms\u0131z sorumluluklara sahip bile\u015fenlere ay\u0131r\u0131n. Her bir bile\u015feni kendi g\u00f6revini yapan bir s\u0131n\u0131f olarak modelleyin. Ard\u0131ndan, daha b\u00fcy\u00fck bir i\u015flevsellik olu\u015fturmak i\u00e7in bu bile\u015fenleri ana s\u0131n\u0131flar i\u00e7inde \"Has-A\" ili\u015fkileriyle bir araya getirin. Ba\u011f\u0131ml\u0131l\u0131k enjeksiyonunu kullanarak, bile\u015fenler aras\u0131ndaki ba\u011fl\u0131l\u0131\u011f\u0131 azaltabilir ve sistemin test edilebilirli\u011fini art\u0131rabilirsiniz. Mevcut bir projede ise, b\u00fcy\u00fck ve tek sorumlulu\u011fu olmayan s\u0131n\u0131flar\u0131 (God Objects) hedefleyerek refactoring (yeniden d\u00fczenleme) yapmaya ba\u015flayabilirsiniz.<\/dd>\n<\/dl>\n<p><\/body><br \/>\n<\/html><\/p>\n","protected":false},"excerpt":{"rendered":"Yaz\u0131l\u0131m d\u00fcnyas\u0131nda karma\u015f\u0131k sistemler in\u015fa ederken, kodunuzu anla\u015f\u0131l\u0131r, s\u00fcrd\u00fcr\u00fclebilir ve esnek tutmak her zaman b\u00fcy\u00fck bir meydan okumad\u0131r.&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":[1],"tags":[],"class_list":{"0":"post-32376","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","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>Kompozisyon At\u00f6lyesi: &#039;Has-A&#039; \u0130li\u015fkileriyle Sa\u011flam Yap\u0131lar \u0130n\u015fa Etmek<\/title>\n<meta name=\"description\" content=\"Yaz\u0131l\u0131m d\u00fcnyas\u0131nda karma\u015f\u0131k sistemler in\u015fa ederken, kodunuzu anla\u015f\u0131l\u0131r, s\u00fcrd\u00fcr\u00fclebilir ve esnek tutmak her zaman b\u00fcy\u00fck bir meydan okumad\u0131r. Peki, nesneleri bir araya getirerek g\u00fc\u00e7l\u00fc ve mod\u00fcler yap\u0131lar olu\u015fturman\u0131n en etkili yolu nedir? &quot;Has-A&quot; ili\u015fkileri, yani kompozisyon, tam da bu noktada devreye giriyor ve kodunuzu daha y\u00f6netilebilir, yeniden kullan\u0131labilir hale getirmenin anahtar\u0131n\u0131 sunuyor. Bu at\u00f6lye \u00e7al\u0131\u015fmas\u0131nda, kompozisyonun temellerinden ileri d\u00fczey uygulamalar\u0131na kadar her \u015feyi ke\u015ffedece\u011fiz.\" \/>\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\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kompozisyon At\u00f6lyesi: &#039;Has-A&#039; \u0130li\u015fkileriyle Sa\u011flam Yap\u0131lar \u0130n\u015fa Etmek\" \/>\n<meta property=\"og:description\" content=\"Yaz\u0131l\u0131m d\u00fcnyas\u0131nda karma\u015f\u0131k sistemler in\u015fa ederken, kodunuzu anla\u015f\u0131l\u0131r, s\u00fcrd\u00fcr\u00fclebilir ve esnek tutmak her zaman b\u00fcy\u00fck bir meydan okumad\u0131r. Peki, nesneleri bir araya getirerek g\u00fc\u00e7l\u00fc ve mod\u00fcler yap\u0131lar olu\u015fturman\u0131n en etkili yolu nedir? &quot;Has-A&quot; ili\u015fkileri, yani kompozisyon, tam da bu noktada devreye giriyor ve kodunuzu daha y\u00f6netilebilir, yeniden kullan\u0131labilir hale getirmenin anahtar\u0131n\u0131 sunuyor. Bu at\u00f6lye \u00e7al\u0131\u015fmas\u0131nda, kompozisyonun temellerinden ileri d\u00fczey uygulamalar\u0131na kadar her \u015feyi ke\u015ffedece\u011fiz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-20T23:01:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/via.placeholder.com\/200\" \/>\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=\"28 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Kompozisyon At\u00f6lyesi: &#8216;Has-A&#8217; \u0130li\u015fkileriyle Sa\u011flam Yap\u0131lar \u0130n\u015fa Etmek\",\"datePublished\":\"2025-10-20T23:01:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/\"},\"wordCount\":4553,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"image\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/via.placeholder.com\/200\",\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/\",\"name\":\"Kompozisyon At\u00f6lyesi: 'Has-A' \u0130li\u015fkileriyle Sa\u011flam Yap\u0131lar \u0130n\u015fa Etmek\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/via.placeholder.com\/200\",\"datePublished\":\"2025-10-20T23:01:26+00:00\",\"description\":\"Yaz\u0131l\u0131m d\u00fcnyas\u0131nda karma\u015f\u0131k sistemler in\u015fa ederken, kodunuzu anla\u015f\u0131l\u0131r, s\u00fcrd\u00fcr\u00fclebilir ve esnek tutmak her zaman b\u00fcy\u00fck bir meydan okumad\u0131r. Peki, nesneleri bir araya getirerek g\u00fc\u00e7l\u00fc ve mod\u00fcler yap\u0131lar olu\u015fturman\u0131n en etkili yolu nedir? \\\"Has-A\\\" ili\u015fkileri, yani kompozisyon, tam da bu noktada devreye giriyor ve kodunuzu daha y\u00f6netilebilir, yeniden kullan\u0131labilir hale getirmenin anahtar\u0131n\u0131 sunuyor. Bu at\u00f6lye \u00e7al\u0131\u015fmas\u0131nda, kompozisyonun temellerinden ileri d\u00fczey uygulamalar\u0131na kadar her \u015feyi ke\u015ffedece\u011fiz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/#primaryimage\",\"url\":\"https:\/\/via.placeholder.com\/200\",\"contentUrl\":\"https:\/\/via.placeholder.com\/200\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kompozisyon At\u00f6lyesi: &#8216;Has-A&#8217; \u0130li\u015fkileriyle Sa\u011flam Yap\u0131lar \u0130n\u015fa Etmek\"}]},{\"@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":"Kompozisyon At\u00f6lyesi: 'Has-A' \u0130li\u015fkileriyle Sa\u011flam Yap\u0131lar \u0130n\u015fa Etmek","description":"Yaz\u0131l\u0131m d\u00fcnyas\u0131nda karma\u015f\u0131k sistemler in\u015fa ederken, kodunuzu anla\u015f\u0131l\u0131r, s\u00fcrd\u00fcr\u00fclebilir ve esnek tutmak her zaman b\u00fcy\u00fck bir meydan okumad\u0131r. Peki, nesneleri bir araya getirerek g\u00fc\u00e7l\u00fc ve mod\u00fcler yap\u0131lar olu\u015fturman\u0131n en etkili yolu nedir? \"Has-A\" ili\u015fkileri, yani kompozisyon, tam da bu noktada devreye giriyor ve kodunuzu daha y\u00f6netilebilir, yeniden kullan\u0131labilir hale getirmenin anahtar\u0131n\u0131 sunuyor. Bu at\u00f6lye \u00e7al\u0131\u015fmas\u0131nda, kompozisyonun temellerinden ileri d\u00fczey uygulamalar\u0131na kadar her \u015feyi ke\u015ffedece\u011fiz.","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\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/","og_locale":"tr_TR","og_type":"article","og_title":"Kompozisyon At\u00f6lyesi: 'Has-A' \u0130li\u015fkileriyle Sa\u011flam Yap\u0131lar \u0130n\u015fa Etmek","og_description":"Yaz\u0131l\u0131m d\u00fcnyas\u0131nda karma\u015f\u0131k sistemler in\u015fa ederken, kodunuzu anla\u015f\u0131l\u0131r, s\u00fcrd\u00fcr\u00fclebilir ve esnek tutmak her zaman b\u00fcy\u00fck bir meydan okumad\u0131r. Peki, nesneleri bir araya getirerek g\u00fc\u00e7l\u00fc ve mod\u00fcler yap\u0131lar olu\u015fturman\u0131n en etkili yolu nedir? \"Has-A\" ili\u015fkileri, yani kompozisyon, tam da bu noktada devreye giriyor ve kodunuzu daha y\u00f6netilebilir, yeniden kullan\u0131labilir hale getirmenin anahtar\u0131n\u0131 sunuyor. Bu at\u00f6lye \u00e7al\u0131\u015fmas\u0131nda, kompozisyonun temellerinden ileri d\u00fczey uygulamalar\u0131na kadar her \u015feyi ke\u015ffedece\u011fiz.","og_url":"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-20T23:01:26+00:00","og_image":[{"url":"https:\/\/via.placeholder.com\/200","type":"","width":"","height":""}],"author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"28 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Kompozisyon At\u00f6lyesi: &#8216;Has-A&#8217; \u0130li\u015fkileriyle Sa\u011flam Yap\u0131lar \u0130n\u015fa Etmek","datePublished":"2025-10-20T23:01:26+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/"},"wordCount":4553,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"image":{"@id":"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/#primaryimage"},"thumbnailUrl":"https:\/\/via.placeholder.com\/200","inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/","url":"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/","name":"Kompozisyon At\u00f6lyesi: 'Has-A' \u0130li\u015fkileriyle Sa\u011flam Yap\u0131lar \u0130n\u015fa Etmek","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/#primaryimage"},"image":{"@id":"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/#primaryimage"},"thumbnailUrl":"https:\/\/via.placeholder.com\/200","datePublished":"2025-10-20T23:01:26+00:00","description":"Yaz\u0131l\u0131m d\u00fcnyas\u0131nda karma\u015f\u0131k sistemler in\u015fa ederken, kodunuzu anla\u015f\u0131l\u0131r, s\u00fcrd\u00fcr\u00fclebilir ve esnek tutmak her zaman b\u00fcy\u00fck bir meydan okumad\u0131r. Peki, nesneleri bir araya getirerek g\u00fc\u00e7l\u00fc ve mod\u00fcler yap\u0131lar olu\u015fturman\u0131n en etkili yolu nedir? \"Has-A\" ili\u015fkileri, yani kompozisyon, tam da bu noktada devreye giriyor ve kodunuzu daha y\u00f6netilebilir, yeniden kullan\u0131labilir hale getirmenin anahtar\u0131n\u0131 sunuyor. Bu at\u00f6lye \u00e7al\u0131\u015fmas\u0131nda, kompozisyonun temellerinden ileri d\u00fczey uygulamalar\u0131na kadar her \u015feyi ke\u015ffedece\u011fiz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/"]}]},{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/#primaryimage","url":"https:\/\/via.placeholder.com\/200","contentUrl":"https:\/\/via.placeholder.com\/200"},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/kompozisyon-atolyesi-has-a-iliskileriyle-saglam-yapilar-insa-etmek\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Kompozisyon At\u00f6lyesi: &#8216;Has-A&#8217; \u0130li\u015fkileriyle Sa\u011flam Yap\u0131lar \u0130n\u015fa Etmek"}]},{"@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\/32376","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=32376"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32376\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32376"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32376"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32376"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}