{"id":32694,"date":"2025-10-24T23:01:24","date_gmt":"2025-10-24T20:01:24","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/"},"modified":"2025-10-24T23:01:24","modified_gmt":"2025-10-24T20:01:24","slug":"decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/","title":{"rendered":"Decorators: Kodunuzun Hak Etti\u011fi Makyaj\u0131 Nas\u0131l Yapars\u0131n\u0131z?"},"content":{"rendered":"<p><body><\/p>\n<p>Kodunuzun daha okunakl\u0131, daha bak\u0131m\u0131 kolay ve daha g\u00fc\u00e7l\u00fc olmas\u0131n\u0131 m\u0131 istiyorsunuz? Fonksiyonlar\u0131n\u0131za yeni yetenekler eklerken mevcut yap\u0131s\u0131n\u0131 de\u011fi\u015ftirmemek kula\u011fa harika gelmiyor mu? \u0130\u015fte tam da bu noktada, programlama d\u00fcnyas\u0131n\u0131n \u201cs\u00fcsl\u00fc sarg\u0131lar\u0131\u201d olarak adland\u0131rabilece\u011fimiz decorator\u2019lar devreye giriyor ve kodunuza ihtiyac\u0131 olan makyaj\u0131 yaparak onu ba\u015ftan yarat\u0131yor.<\/p>\n<p>Hi\u00e7 var olan bir fonksiyonun davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirmek, ona yeni \u00f6zellikler eklemek ya da belirli bir mant\u0131\u011f\u0131 bir\u00e7ok fonksiyona uygulamak istedi\u011finiz oldu mu? \u00d6rne\u011fin, bir fonksiyonun \u00e7al\u0131\u015fma s\u00fcresini \u00f6l\u00e7mek, \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda bir log kayd\u0131 olu\u015fturmak veya sadece belirli kullan\u0131c\u0131lar\u0131n eri\u015fimine izin vermek gibi. Bu t\u00fcr durumlarda, her fonksiyonun i\u00e7ine ayn\u0131 kod blo\u011funu tekrar tekrar yazmak, hem kod tekrar\u0131na (DRY \u2013 Don\u2019t Repeat Yourself prensibine ayk\u0131r\u0131) yol a\u00e7ar hem de kodunuzun okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 zorla\u015ft\u0131r\u0131r. \u0130\u015fte tam da bu soruna zarif bir \u00e7\u00f6z\u00fcm sunan yap\u0131lar, decorator&#8217;lard\u0131r.<\/p>\n<p>Decorator, esasen, ba\u015fka bir fonksiyonu arg\u00fcman olarak alan ve i\u015flevselli\u011fini geni\u015fleterek yeni bir fonksiyon d\u00f6nd\u00fcren bir t\u00fcr fonksiyondur. K\u0131sacas\u0131, bir fonksiyonu &#8220;saran&#8221; ve ona ek \u00f6zellikler kazand\u0131ran bir sarmalay\u0131c\u0131 (wrapper) gibidir. T\u0131pk\u0131 bir hediye paketinin i\u00e7indeki hediyenin \u00f6z\u00fcn\u00fc de\u011fi\u015ftirmeden ona \u00e7ekici bir g\u00f6r\u00fcn\u00fcm katmas\u0131 veya ekstra bir koruma sa\u011flamas\u0131 gibi, decorator&#8217;lar da fonksiyonlar\u0131n temel mant\u0131\u011f\u0131n\u0131 bozmadan onlara ek i\u015flevsellik katmanlar\u0131 ekler. Bu sayede, fonksiyonlar\u0131n\u0131z\u0131n \u00e7ekirdek g\u00f6revi net kal\u0131rken, \u00e7evresel i\u015flevler (loglama, yetkilendirme, zamanlama vb.) ayr\u0131 bir yerde, mod\u00fcler bir \u015fekilde y\u00f6netilebilir hale gelir. Bu yakla\u015f\u0131m, kodunuzun daha temiz, daha anla\u015f\u0131l\u0131r ve s\u00fcrd\u00fcr\u00fclebilir olmas\u0131na b\u00fcy\u00fck katk\u0131 sa\u011flar. Ayn\u0131 zamanda, fonksiyonel programlama prensiplerini benimseyerek kodunuzu daha esnek ve test edilebilir k\u0131lar. Bu y\u00fczden, modern yaz\u0131l\u0131m geli\u015ftirmede decorator&#8217;lar, \u00f6zellikle Python gibi dillerde, vazge\u00e7ilmez bir ara\u00e7 haline gelmi\u015ftir. Onlar sayesinde, karma\u015f\u0131k sistemlerde bile kodun mod\u00fclerli\u011fini ve okunabilirli\u011fini korumak m\u00fcmk\u00fcn olur.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Decorator&#8217;lar, &#8220;concern separation&#8221; (ilgi alanlar\u0131n\u0131n ayr\u0131lmas\u0131) prensibini uygulamak i\u00e7in m\u00fckemmel bir yoldur. \u00c7ekirdek i\u015f mant\u0131\u011f\u0131n\u0131 \u00e7evresel endi\u015felerden (cross-cutting concerns) ay\u0131rarak kodunuzun mod\u00fclerli\u011fini ve test edilebilirli\u011fini art\u0131r\u0131rs\u0131n\u0131z.\n<\/div>\n<h3>Decorator&#8217;lar\u0131n Temel Yap\u0131s\u0131: Fonksiyonlar Fonksiyonlar\u0131 Nas\u0131l Sarar?<\/h3>\n<p>Decorator&#8217;lar, Python&#8217;da &#8220;fonksiyonlar birinci s\u0131n\u0131f vatanda\u015flard\u0131r&#8221; (first-class citizens) ilkesinin bir sonucudur. Bu, fonksiyonlar\u0131n t\u0131pk\u0131 say\u0131lar veya dizeler gibi de\u011fi\u015fkenlere atanabilece\u011fi, ba\u015fka fonksiyonlara arg\u00fcman olarak g\u00f6nderilebilece\u011fi ve fonksiyonlardan d\u00f6nd\u00fcr\u00fclebilece\u011fi anlam\u0131na gelir. Bir decorator yazarken, bu yetenekten faydalan\u0131r\u0131z. Temel olarak, bir decorator \u00fc\u00e7 katmanl\u0131 bir yap\u0131y\u0131 i\u00e7erir:<\/p>\n<ol>\n<li><strong>D\u0131\u015f Decorator Fonksiyonu:<\/strong> Bu fonksiyon, as\u0131l decorate edilecek fonksiyonu arg\u00fcman olarak al\u0131r.<\/li>\n<li><strong>\u0130\u00e7 Wrapper Fonksiyonu:<\/strong> D\u0131\u015f fonksiyon i\u00e7inde tan\u0131mlan\u0131r. Bu fonksiyon, decorate edilecek as\u0131l fonksiyonu sarar ve onun \u00e7a\u011fr\u0131lmas\u0131 \u00f6ncesinde veya sonras\u0131nda ek i\u015flemler yapar.<\/li>\n<li><strong>As\u0131l Fonksiyonun \u00c7a\u011fr\u0131lmas\u0131:<\/strong> Wrapper fonksiyonun i\u00e7inde, decorate edilen as\u0131l fonksiyon \u00e7a\u011fr\u0131l\u0131r ve sonu\u00e7 d\u00f6nd\u00fcr\u00fcl\u00fcr.<\/li>\n<\/ol>\n<p>Python, bu yap\u0131y\u0131 daha kolay ve okunakl\u0131 hale getirmek i\u00e7in \u00f6zel bir &#8220;s\u00f6zdizimsel \u015feker&#8221; (syntactic sugar) sunar: <code>@<\/code> sembol\u00fc. Bir fonksiyonun \u00fczerine <code>@decorator_ad\u0131<\/code> yazmak, asl\u0131nda o fonksiyonu <code>decorator_ad\u0131(fonksiyon)<\/code> \u015feklinde \u00e7a\u011f\u0131rmak ve sonucu orijinal fonksiyonun \u00fczerine atamakla e\u015fde\u011ferdir. Bu, kodu inan\u0131lmaz derecede temiz ve anla\u015f\u0131l\u0131r hale getirir. \u00d6rne\u011fin, bir fonksiyonun ka\u00e7 kez \u00e7a\u011fr\u0131ld\u0131\u011f\u0131n\u0131 saymak i\u00e7in basit bir decorator&#8217;\u0131 ele alal\u0131m. Bu decorator, her \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda bir sayac\u0131 art\u0131racak ve ard\u0131ndan as\u0131l fonksiyonu \u00e7al\u0131\u015ft\u0131racakt\u0131r. B\u00f6ylece, as\u0131l fonksiyonun kodunu de\u011fi\u015ftirmeden ona ek bir saya\u00e7 \u00f6zelli\u011fi kazand\u0131rm\u0131\u015f oluruz. Bu temel yap\u0131, decorator&#8217;lar\u0131n g\u00fcc\u00fcn\u00fc anlamak i\u00e7in kritik bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r ve daha karma\u015f\u0131k uygulamalar\u0131n temelini olu\u015fturur.<\/p>\n<pre><code>\ndef cagir_sayaci(func):\n    def wrapper(*args, **kwargs):\n        wrapper.calls += 1\n        print(f\"{func.__name__} {wrapper.calls}. kez \u00e7a\u011fr\u0131ld\u0131.\")\n        return func(*args, **kwargs)\n    wrapper.calls = 0\n    return wrapper\n\n@cagir_sayaci\ndef merhaba_de(isim):\n    return f\"Merhaba, {isim}!\"\n\nprint(merhaba_de(\"Ay\u015fe\"))\nprint(merhaba_de(\"Mehmet\"))\nprint(merhaba_de(\"Zeynep\"))\nprint(f\"Toplamda merhaba_de fonksiyonu {merhaba_de.calls} kez \u00e7a\u011fr\u0131ld\u0131.\")\n\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>cagir_sayaci<\/code> decorator'\u0131, <code>merhaba_de<\/code> fonksiyonunun her \u00e7a\u011fr\u0131l\u0131\u015f\u0131n\u0131 sayar ve bu bilgiyi ekrana basar. Dikkat ederseniz, <code>merhaba_de<\/code> fonksiyonunun i\u00e7ine saya\u00e7la ilgili hi\u00e7bir kod eklemedik. \u0130\u015fte decorator'lar\u0131n g\u00fczelli\u011fi tam da burada yat\u0131yor: i\u015f mant\u0131\u011f\u0131n\u0131 \u00e7evresel endi\u015felerden ay\u0131rmak.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131nda Decorator G\u00fcc\u00fc: Pratik Uygulamalar Nelerdir?<\/h2>\n<p>Decorator'lar sadece teorik bir kavram olman\u0131n \u00f6tesinde, yaz\u0131l\u0131m geli\u015ftirmenin bir\u00e7ok alan\u0131nda pratik ve g\u00fc\u00e7l\u00fc \u00e7\u00f6z\u00fcmler sunar. Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda, kodun kalitesini art\u0131rmak, tekrar\u0131 \u00f6nlemek ve sistemleri daha y\u00f6netilebilir k\u0131lmak i\u00e7in s\u0131k\u00e7a kullan\u0131l\u0131rlar. \u0130\u015fte decorator'lar\u0131n en yayg\u0131n ve etkili kullan\u0131m senaryolar\u0131ndan baz\u0131lar\u0131:<\/p>\n<h3>Performans \u0130zleme ve Loglama: Uygulaman\u0131z\u0131n Kalbi Nas\u0131l At\u0131yor?<\/h3>\n<p>Uygulamalar\u0131n performans\u0131n\u0131 anlamak ve sorunlar\u0131 gidermek i\u00e7in loglama ve zamanlama hayati \u00f6neme sahiptir. Hangi fonksiyonlar\u0131n ne kadar s\u00fcrd\u00fc\u011f\u00fcn\u00fc bilmek, darbo\u011fazlar\u0131 tespit etmede ilk ad\u0131md\u0131r. Decorator'lar, bu t\u00fcr \"\u00e7apraz kesen ilgileri\" (cross-cutting concerns) fonksiyonlar\u0131n\u0131z\u0131n as\u0131l mant\u0131\u011f\u0131ndan ay\u0131rmak i\u00e7in m\u00fckemmel bir ara\u00e7t\u0131r. Bir fonksiyonun her \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda \u00e7al\u0131\u015fma s\u00fcresini \u00f6l\u00e7en veya fonksiyonun giri\u015f-\u00e7\u0131k\u0131\u015flar\u0131n\u0131 kaydeden bir decorator yazmak, kodunuzun \u00e7ekirdek i\u015flevselli\u011fini de\u011fi\u015ftirmeden de\u011ferli metrikler toplaman\u0131za olanak tan\u0131r. \u00d6rne\u011fin, karma\u015f\u0131k bir veritaban\u0131 sorgusunun veya yo\u011fun bir hesaplama i\u015fleminin ne kadar s\u00fcrd\u00fc\u011f\u00fcn\u00fc izlemek i\u00e7in, ilgili fonksiyona sadece tek bir <code>@zaman_olc<\/code> decorator'\u0131 eklemek yeterli olacakt\u0131r. Bu, hem geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r hem de gelecekteki bak\u0131m s\u00fcre\u00e7lerinde b\u00fcy\u00fck kolayl\u0131k sa\u011flar. Loglama decorator'lar\u0131 ise, fonksiyon \u00e7a\u011fr\u0131lar\u0131n\u0131, arg\u00fcmanlar\u0131 ve d\u00f6n\u00fc\u015f de\u011ferlerini otomatik olarak belirli bir log dosyas\u0131na veya konsola yazarak uygulaman\u0131z\u0131n davran\u0131\u015f\u0131n\u0131 ad\u0131m ad\u0131m takip etmenizi sa\u011flar. Bu sayede, hata ay\u0131klama s\u00fcre\u00e7leri basitle\u015fir ve sistemdeki olas\u0131 anormallikler daha h\u0131zl\u0131 tespit edilebilir. Bu iki kullan\u0131m alan\u0131, decorator'lar\u0131n mod\u00fclerlik ve bak\u0131m kolayl\u0131\u011f\u0131 a\u00e7\u0131s\u0131ndan sundu\u011fu avantajlar\u0131 net bir \u015fekilde ortaya koymaktad\u0131r. Daha da \u00f6nemlisi, bu t\u00fcr yard\u0131mc\u0131 kodlar\u0131 merkezi bir yerde tutarak, uygulaman\u0131n genelinde tutarl\u0131 bir performans izleme ve loglama stratejisi uygulaman\u0131za olanak tan\u0131r.<\/p>\n<pre><code>\nimport time\nimport logging\n\n# Loglama ayarlar\u0131 (Basit bir \u00f6rnek)\nlogging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')\n\ndef zaman_olc(func):\n    def wrapper(*args, **kwargs):\n        start_time = time.time()\n        result = func(*args, **kwargs)\n        end_time = time.time()\n        logging.info(f\"{func.__name__} fonksiyonu {end_time - start_time:.4f} saniyede tamamland\u0131.\")\n        return result\n    return wrapper\n\ndef logla_cagir(func):\n    def wrapper(*args, **kwargs):\n        logging.info(f\"{func.__name__} \u00e7a\u011fr\u0131ld\u0131. Arg\u00fcmanlar: {args}, Keyword Arg\u00fcmanlar: {kwargs}\")\n        result = func(*args, **kwargs)\n        logging.info(f\"{func.__name__} tamamland\u0131. D\u00f6n\u00fc\u015f de\u011feri: {result}\")\n        return result\n    return wrapper\n\n@zaman_olc\n@logla_cagir\ndef uzun_islem(saniye):\n    \"\"\"Belirtilen saniye kadar uyuyan bir fonksiyon.\"\"\"\n    time.sleep(saniye)\n    return f\"{saniye} saniye uyunuldu.\"\n\nprint(uzun_islem(2))\nprint(uzun_islem(0.5))\n\n<\/pre>\n<p><\/code><\/p>\n<h3>Yetkilendirme ve Eri\u015fim Kontrol\u00fc: Kim Nereye Girebilir?<\/h3>\n<p>Web uygulamalar\u0131 ve API'lerde g\u00fcvenlik, en kritik konulardan biridir. Belirli kaynaklara veya fonksiyonlara yaln\u0131zca yetkili kullan\u0131c\u0131lar\u0131n eri\u015febilmesini sa\u011flamak, uygulaman\u0131z\u0131n b\u00fct\u00fcnl\u00fc\u011f\u00fc i\u00e7in elzemdir. Bu t\u00fcr yetkilendirme kontrollerini her fonksiyonun ba\u015f\u0131nda manuel olarak yapmak, hem hataya a\u00e7\u0131k bir s\u00fcre\u00e7tir hem de kod tekrar\u0131na neden olur. \u0130\u015fte burada decorator'lar devreye girer ve yetkilendirme mant\u0131\u011f\u0131n\u0131 merkezi ve yeniden kullan\u0131labilir bir yap\u0131ya d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Bir <code>yetkili_kullanici_gerekiyor<\/code> veya <code>admin_rolu_gerekiyor<\/code> gibi bir decorator tan\u0131mlayarak, bu kontrolleri hedef fonksiyonlara kolayca uygulayabilirsiniz. Decorator, as\u0131l fonksiyon \u00e7a\u011fr\u0131lmadan \u00f6nce kullan\u0131c\u0131n\u0131n kimlik do\u011frulama durumunu, sahip oldu\u011fu rolleri veya izinlerini kontrol eder. E\u011fer kullan\u0131c\u0131 gerekli kriterleri kar\u015f\u0131lam\u0131yorsa, fonksiyonu \u00e7al\u0131\u015ft\u0131rmaz ve bunun yerine bir hata (\u00f6rne\u011fin, <code>AccessDeniedError<\/code>) f\u0131rlat\u0131r veya bir HTTP yan\u0131t\u0131 (\u00f6rne\u011fin, 403 Forbidden) d\u00f6nd\u00fcr\u00fcr. Bu sayede, i\u015f mant\u0131\u011f\u0131 kodunuz temiz kal\u0131r ve g\u00fcvenlik kontrolleri ayr\u0131 bir katmanda ele al\u0131n\u0131r. Bu yakla\u015f\u0131m, sadece kodu d\u00fczenli tutmakla kalmaz, ayn\u0131 zamanda g\u00fcvenlik politikalar\u0131n\u0131z\u0131 merkezi bir yerden y\u00f6netmenize olanak tan\u0131r. G\u00fcvenlik kurallar\u0131nda bir de\u011fi\u015fiklik oldu\u011funda, sadece decorator'\u0131 g\u00fcncellemeniz yeterli olur; bu da t\u00fcm ilgili fonksiyonlara otomatik olarak yans\u0131r. Bu mod\u00fclerlik, b\u00fcy\u00fck ve karma\u015f\u0131k sistemlerde g\u00fcvenlik y\u00f6netimini son derece kolayla\u015ft\u0131r\u0131r.<\/p>\n<pre><code>\nclass Kullanici:\n    def __init__(self, username, roles):\n        self.username = username\n        self.roles = roles\n\nmevcut_kullanici = Kullanici(\"admin\", [\"admin\", \"editor\"])\n# mevcut_kullanici = Kullanici(\"guest\", [\"viewer\"])\n\ndef rol_gerekiyor(gerekli_rol):\n    def decorator(func):\n        def wrapper(*args, **kwargs):\n            if gerekli_rol not in mevcut_kullanici.roles:\n                raise PermissionError(f\"Bu i\u015flem i\u00e7in '{gerekli_rol}' rol\u00fc gereklidir.\")\n            return func(*args, **kwargs)\n        return wrapper\n    return decorator\n\n@rol_gerekiyor(\"admin\")\ndef yonetici_paneli_goster():\n    return \"Y\u00f6netici Paneline Ho\u015f Geldiniz!\"\n\n@rol_gerekiyor(\"editor\")\ndef makale_duzenle(makale_id):\n    return f\"{makale_id} numaral\u0131 makale d\u00fczenleniyor.\"\n\ntry:\n    print(yonetici_paneli_goster())\nexcept PermissionError as e:\n    print(e)\n\ntry:\n    print(makale_duzenle(123))\nexcept PermissionError as e:\n    print(e)\n\n<\/pre>\n<p><\/code><\/p>\n<h3>\u00d6nbellekleme (Caching) ile H\u0131zland\u0131rma: Ayn\u0131 \u0130\u015fi \u0130ki Kez Yapmay\u0131n!<\/h3>\n<p>Performans optimizasyonu, \u00f6zellikle tekrarlayan ve maliyetli i\u015flemler i\u00e7eren uygulamalarda hayati \u00f6neme sahiptir. Bir fonksiyonun ayn\u0131 girdilerle her \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda ayn\u0131 sonucu \u00fcretmesi durumunda, bu sonucu tekrar tekrar hesaplamak yerine bir kez hesaplay\u0131p saklamak ve sonraki \u00e7a\u011fr\u0131larda \u00f6nbellekten sunmak, uygulaman\u0131n tepki s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131rabilir. Decorator'lar, \u00f6nbellekleme mant\u0131\u011f\u0131n\u0131 fonksiyonun as\u0131l i\u015flevinden ay\u0131rmak i\u00e7in ideal bir mekanizma sunar. Python'\u0131n standart k\u00fct\u00fcphanesinde yer alan <code>functools.lru_cache<\/code> gibi haz\u0131r decorator'lar bu i\u015fi \u00e7ok kolay hale getirir. <code>lru_cache<\/code>, en son kullan\u0131lanlar\u0131 (Least Recently Used) tutarak \u00f6nbellek boyutunu y\u00f6netir ve haf\u0131za kullan\u0131m\u0131n\u0131 optimize eder. Kendi \u00f6zel \u00f6nbellekleme decorator'\u0131n\u0131z\u0131 yazarken de, fonksiyonun ald\u0131\u011f\u0131 arg\u00fcmanlar\u0131 bir anahtar olarak kullanarak sonu\u00e7lar\u0131 bir s\u00f6zl\u00fckte saklayabilir ve ayn\u0131 anahtar ile tekrar \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda do\u011frudan bu saklanm\u0131\u015f de\u011feri d\u00f6nd\u00fcrebilirsiniz. Bu y\u00f6ntem, \u00f6zellikle yo\u011fun hesaplamal\u0131 algoritmalar, veritaban\u0131 sorgular\u0131 veya harici API \u00e7a\u011fr\u0131lar\u0131 gibi zaman al\u0131c\u0131 operasyonlar i\u00e7in b\u00fcy\u00fck bir performans kazanc\u0131 sa\u011flar. \u00d6rne\u011fin, bir d\u00f6viz kuru API'sinden veri \u00e7eken bir fonksiyonunuz varsa, bu fonksiyonu bir \u00f6nbellekleme decorator'\u0131 ile sararak, belirli bir s\u00fcre i\u00e7inde ayn\u0131 kur bilgisi istendi\u011finde API'ye tekrar istek g\u00f6ndermeyi engelleyebilir ve hem a\u011f trafi\u011fini azaltabilir hem de kullan\u0131c\u0131n\u0131n bekleme s\u00fcresini k\u0131saltabilirsiniz. Bu, uygulaman\u0131z\u0131n genel kullan\u0131c\u0131 deneyimini do\u011frudan iyile\u015ftiren somut bir fayda sa\u011flar. B\u00f6ylece, kodunuz sadece daha h\u0131zl\u0131 olmakla kalmaz, ayn\u0131 zamanda daha verimli ve kaynak dostu hale gelir.<\/p>\n<pre><code>\nfrom functools import lru_cache\nimport time\n\n@lru_cache(maxsize=None)  # \u00d6nbellek boyutu s\u0131n\u0131rs\u0131z\ndef fibonacci(n):\n    \"\"\"Pahal\u0131 bir Fibonacci hesaplama fonksiyonu.\"\"\"\n    if n <= 1:\n        return n\n    return fibonacci(n - 1) + fibonacci(n - 2)\n\n@lru_cache(maxsize=3) # En fazla 3 farkl\u0131 sonucu \u00f6nbelle\u011fe al\ndef agirlik_hesapla(malzeme, miktar):\n    print(f\"{malzeme} i\u00e7in a\u011f\u0131rl\u0131k hesaplan\u0131yor...\")\n    time.sleep(1) # Ger\u00e7ek bir API \u00e7a\u011fr\u0131s\u0131 veya yo\u011fun hesaplama sim\u00fclasyonu\n    return f\"{miktar * 100} gram {malzeme}\"\n\nprint(\"Fibonacci(30) hesaplan\u0131yor (ilk kez)...\")\nstart = time.perf_counter()\nfibonacci(30)\nend = time.perf_counter()\nprint(f\"S\u00fcre: {end - start:.4f} saniye\")\n\nprint(\"Fibonacci(30) hesaplan\u0131yor (\u00f6nbellekten)...\")\nstart = time.perf_counter()\nfibonacci(30)\nend = time.perf_counter()\nprint(f\"S\u00fcre: {end - start:.4f} saniye (\u00f6nbellekten okundu)\")\n\nprint(\"\\nA\u011f\u0131rl\u0131k hesaplamalar\u0131:\")\nprint(agirlik_hesapla(\"demir\", 5))\nprint(agirlik_hesapla(\"alt\u0131n\", 2))\nprint(agirlik_hesapla(\"bak\u0131r\", 10))\nprint(agirlik_hesapla(\"demir\", 5)) # \u00d6nbellekten gelir\nprint(agirlik_hesapla(\"g\u00fcm\u00fc\u015f\", 1)) # \"demir\" \u00f6nbellekten at\u0131l\u0131r\n\n<\/pre>\n<p><\/code><\/p>\n<h2>Arg\u00fcman Alan Decorator'lar Nas\u0131l Yaz\u0131l\u0131r ve Ne \u0130\u015fe Yarar?<\/h2>\n<p>\u015eimdiye kadar g\u00f6rd\u00fc\u011f\u00fcm\u00fcz decorator'lar, do\u011frudan bir fonksiyonu sarmalayan basit yap\u0131lard\u0131. Ancak bir\u00e7ok durumda, decorator'lar\u0131n kendilerinin de baz\u0131 yap\u0131land\u0131rma parametrelerine veya se\u00e7eneklere ihtiyac\u0131 olabilir. \u00d6rne\u011fin, bir yetkilendirme decorator'\u0131 yazd\u0131\u011f\u0131m\u0131zda, hangi rol\u00fcn gerekli oldu\u011funu decorator'a s\u00f6ylemek isteyebiliriz (<code>@rol_gerekiyor(\"admin\")<\/code> gibi). \u0130\u015fte bu t\u00fcr senaryolar i\u00e7in arg\u00fcman alan decorator'lar devreye girer. Bu decorator'lar, temelde ekstra bir sarma katman\u0131 ekleyerek \u00e7al\u0131\u015f\u0131r. Yani, bir decorator fabrikas\u0131 gibi d\u00fc\u015f\u00fcnebilirsiniz.<\/p>\n<p>Arg\u00fcman alan bir decorator yazmak i\u00e7in, asl\u0131nda \u00fc\u00e7 i\u00e7 i\u00e7e ge\u00e7mi\u015f fonksiyon yap\u0131s\u0131na ihtiyac\u0131m\u0131z vard\u0131r:<\/p>\n<ol>\n<li><strong>En D\u0131\u015f Fonksiyon:<\/strong> Bu fonksiyon, decorator'\u0131n alaca\u011f\u0131 arg\u00fcmanlar\u0131 (\u00f6rne\u011fin, <code>gerekli_rol<\/code>) kabul eder. Bu fonksiyonun d\u00f6n\u00fc\u015f de\u011feri, as\u0131l decorator fonksiyonu olacakt\u0131r.<\/li>\n<li><strong>Orta Fonksiyon (As\u0131l Decorator):<\/strong> Bu fonksiyon, decorate edilecek hedef fonksiyonu (\u00f6rne\u011fin, <code>yonetici_paneli_goster<\/code>) arg\u00fcman olarak al\u0131r. Bu, daha \u00f6nce g\u00f6rd\u00fc\u011f\u00fcm\u00fcz standart decorator yap\u0131s\u0131n\u0131n kendisidir.<\/li>\n<li><strong>En \u0130\u00e7 Wrapper Fonksiyonu:<\/strong> Bu fonksiyon, hedef fonksiyonu sarar ve \u00e7a\u011fr\u0131 \u00f6ncesi\/sonras\u0131 mant\u0131\u011f\u0131 i\u00e7erir.<\/li>\n<\/ol>\n<p>Bu \u00fc\u00e7 katmanl\u0131 yap\u0131, decorator'\u0131n ilk \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda arg\u00fcmanlar\u0131 almas\u0131n\u0131, ard\u0131ndan bu arg\u00fcmanlar\u0131 kapatma (closure) \u00f6zelli\u011fi arac\u0131l\u0131\u011f\u0131yla saklamas\u0131n\u0131 ve daha sonra ger\u00e7ek fonksiyon sarmalama i\u015flemini ger\u00e7ekle\u015ftirmesini sa\u011flar. Bu, decorator'lar\u0131n\u0131za esneklik ve yeniden kullan\u0131labilirlik katarak, farkl\u0131 ba\u011flamlarda farkl\u0131 davran\u0131\u015flar sergilemelerine olanak tan\u0131r. \u00d6rne\u011fin, bir loglama decorator'\u0131 yazarken, log seviyesini (<code>INFO<\/code>, <code>DEBUG<\/code>, <code>WARNING<\/code>) bir arg\u00fcman olarak ge\u00e7erek, farkl\u0131 fonksiyonlar i\u00e7in farkl\u0131 detay seviyelerinde loglama yapabilirsiniz. Bu, kodunuzu daha dinamik ve yap\u0131land\u0131r\u0131labilir hale getirir. Arg\u00fcman alan decorator'lar, \u00f6zellikle framework'ler ve k\u00fct\u00fcphanelerde (\u00f6rne\u011fin, Flask veya Django'daki rota tan\u0131mlamalar\u0131) yayg\u0131n olarak kullan\u0131l\u0131r ve geli\u015ftiricilere g\u00fc\u00e7l\u00fc ve esnek bir soyutlama katman\u0131 sunar.<\/p>\n<pre><code>\ndef tekrarlama_sayisi(sayi):\n    def decorator(func):\n        def wrapper(*args, **kwargs):\n            results = []\n            for _ in range(sayi):\n                results.append(func(*args, **kwargs))\n            return results # T\u00fcm sonu\u00e7lar\u0131 liste olarak d\u00f6nd\u00fcr\u00fcyoruz\n        return wrapper\n    return decorator\n\n@tekrarlama_sayisi(3)\ndef merhaba_de_tekrarl\u0131(isim):\n    import random\n    return f\"Merhaba {isim}! (Rastgele Say\u0131: {random.randint(1, 100)})\"\n\nprint(merhaba_de_tekrarl\u0131(\"Ali\"))\n\n@tekrarlama_sayisi(2)\ndef kare_al(x):\n    return x * x\n\nprint(kare_al(5))\n\n<\/pre>\n<p><\/code><\/p>\n<h2>S\u0131n\u0131flarla Decorator Kullan\u0131m\u0131: Nesne Y\u00f6nelimli Yakla\u015f\u0131m Nas\u0131l Entegre Edilir?<\/h2>\n<p>Python'da decorator'lar genellikle fonksiyon tabanl\u0131 olarak yaz\u0131lsa da, bazen daha karma\u015f\u0131k durum y\u00f6netimi veya konfig\u00fcrasyon gerektiren senaryolar i\u00e7in s\u0131n\u0131f tabanl\u0131 decorator'lar kullanmak daha mant\u0131kl\u0131 olabilir. S\u0131n\u0131f tabanl\u0131 bir decorator, state (durum) tutabilme yetene\u011fi sayesinde daha geli\u015fmi\u015f \u00f6zellikler sunar. \u00d6rne\u011fin, bir decorator'\u0131n birden fazla fonksiyonda ortak bir durumu y\u00f6netmesi veya decorator'\u0131n kendi i\u00e7inde karma\u015f\u0131k bir mant\u0131\u011f\u0131 bar\u0131nd\u0131rmas\u0131 gerekti\u011finde s\u0131n\u0131flar devreye girer. Bir s\u0131n\u0131f\u0131 decorator olarak kullanabilmek i\u00e7in, o s\u0131n\u0131f\u0131n <code>__call__<\/code> metodunu uygulamas\u0131 gerekir. <code>__call__<\/code> metodu, bir s\u0131n\u0131f \u00f6rne\u011fini sanki bir fonksiyonmu\u015f gibi \u00e7a\u011fr\u0131labilir k\u0131lar. Yani, <code>my_instance()<\/code> yazd\u0131\u011f\u0131n\u0131zda asl\u0131nda <code>my_instance.__call__()<\/code> metodunu \u00e7a\u011f\u0131rm\u0131\u015f olursunuz.<\/p>\n<p>S\u0131n\u0131f tabanl\u0131 bir decorator yazarken iki ana yakla\u015f\u0131m vard\u0131r:<\/p>\n<ol>\n<li><strong>S\u0131n\u0131f\u0131 do\u011frudan bir fonksiyon decorator'\u0131 olarak kullanmak:<\/strong> Bu durumda, decorator s\u0131n\u0131f\u0131n\u0131n <code>__init__<\/code> metodu decorate edilecek fonksiyonu al\u0131r ve <code>__call__<\/code> metodu ise wrapper fonksiyonu gibi davran\u0131r. Bu, decorator'\u0131n her \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda state'i korumas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>S\u0131n\u0131f\u0131 bir arg\u00fcman alan decorator fabrikas\u0131 olarak kullanmak:<\/strong> Bu yakla\u015f\u0131m, arg\u00fcman alan fonksiyon decorator'lar\u0131na benzer. En d\u0131\u015ftaki fonksiyon yerine, decorator s\u0131n\u0131f\u0131n\u0131n bir \u00f6rne\u011fi olu\u015fturulur ve bu \u00f6rnek daha sonra decorate edilecek fonksiyonu al\u0131r.<\/li>\n<\/ol>\n<p>S\u0131n\u0131f tabanl\u0131 decorator'lar, \u00f6zellikle b\u00fcy\u00fck framework'lerde ve mod\u00fcler uygulamalarda, decorator'lara daha fazla esneklik ve nesne y\u00f6nelimli tasar\u0131m desenlerini entegre etme olana\u011f\u0131 sundu\u011fu i\u00e7in tercih edilebilir. \u00d6rne\u011fin, bir API rate-limiting (istek s\u0131n\u0131rlama) decorator'\u0131, her bir API u\u00e7 noktas\u0131 i\u00e7in ayr\u0131 ayr\u0131 kalan istek hakk\u0131 gibi durum bilgilerini tutmak zorunda kalabilir. Bu durumda, bir s\u0131n\u0131f decorator'\u0131, bu state'i kolayca y\u00f6netebilir ve her fonksiyon \u00e7a\u011fr\u0131s\u0131nda g\u00fcncelleyebilir. Bu, fonksiyonel yakla\u015f\u0131mla yaz\u0131lmas\u0131 daha zor veya daha karma\u015f\u0131k olabilecek durum tabanl\u0131 i\u015flemleri basitle\u015ftirir. B\u00f6ylece, hem kodunuzun yap\u0131s\u0131 daha d\u00fczenli olur hem de karma\u015f\u0131k i\u015f ak\u0131\u015flar\u0131n\u0131 daha anla\u015f\u0131l\u0131r bir \u015fekilde modelleyebilirsiniz.<\/p>\n<pre><code>\nclass CalismaSayaci:\n    def __init__(self, func):\n        self.func = func\n        self.sayac = 0\n\n    def __call__(self, *args, **kwargs):\n        self.sayac += 1\n        print(f\"'{self.func.__name__}' fonksiyonu {self.sayac}. kez \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131.\")\n        return self.func(*args, **kwargs)\n\n@CalismaSayaci\ndef merhaba_de_sinif(isim):\n    return f\"Merhaba {isim}!\"\n\n@CalismaSayaci\ndef topla_sinif(a, b):\n    return a + b\n\nprint(merhaba_de_sinif(\"Deniz\"))\nprint(merhaba_de_sinif(\"Can\"))\nprint(topla_sinif(5, 7))\nprint(topla_sinif(10, 20))\n\n<\/pre>\n<p><\/code><\/p>\n<h2>\u0130leri Seviye \u0130pu\u00e7lar\u0131 ve P\u00fcf Noktalar\u0131: Decorator Sihirbaz\u0131 Olmaya Haz\u0131r M\u0131s\u0131n\u0131z?<\/h2>\n<p>Decorator'lar\u0131n temellerini ve pratik kullan\u0131mlar\u0131n\u0131 kavrad\u0131ktan sonra, onlar\u0131 daha verimli ve sorunsuz bir \u015fekilde kullanman\u0131z\u0131 sa\u011flayacak baz\u0131 ileri seviye tekniklere ve ipu\u00e7lar\u0131na g\u00f6z atabiliriz. Bu p\u00fcf noktalar\u0131, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k projelerde decorator'larla \u00e7al\u0131\u015f\u0131rken kar\u015f\u0131la\u015fabilece\u011finiz yayg\u0131n sorunlar\u0131 \u00f6nlemenize ve kodunuzun kalitesini art\u0131rman\u0131za yard\u0131mc\u0131 olacakt\u0131r. Unutmay\u0131n, iyi yaz\u0131lm\u0131\u015f bir decorator, sadece i\u015flevsellik katmakla kalmaz, ayn\u0131 zamanda kodun okunabilirli\u011fini ve bak\u0131m\u0131 kolayl\u0131\u011f\u0131n\u0131 da art\u0131r\u0131r.<\/p>\n<ul>\n<li>\n<div class=\"expert-tip\">\n            <strong>functools.wraps Kullan\u0131m\u0131:<\/strong> Bu, decorator'larla \u00e7al\u0131\u015f\u0131rken en \u00f6nemli ipu\u00e7lar\u0131ndan biridir. Bir fonksiyonu bir decorator ile sard\u0131\u011f\u0131n\u0131zda, orijinal fonksiyonun ad\u0131 (<code>__name__<\/code>), dok\u00fcmantasyon dizisi (<code>__doc__<\/code>) ve di\u011fer meta verileri kaybolur. Bu, hata ay\u0131klama ve dok\u00fcmantasyon i\u00e7in ciddi sorunlara yol a\u00e7abilir. <code>functools.wraps<\/code> decorator'\u0131, sar\u0131lm\u0131\u015f fonksiyonun meta verilerini wrapper fonksiyona otomatik olarak kopyalayarak bu sorunu \u00e7\u00f6zer. Her decorator yazd\u0131\u011f\u0131n\u0131zda, wrapper fonksiyonunuzu <code>@functools.wraps(func)<\/code> ile sarmalad\u0131\u011f\u0131n\u0131zdan emin olun. Bu k\u00fc\u00e7\u00fck detay, kodunuzun profesyonelli\u011fini ve bak\u0131m kolayl\u0131\u011f\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.\n        <\/div>\n<pre><code>\nfrom functools import wraps\n\ndef logla(func):\n    @wraps(func) # \u00d6nemli! Meta verileri korur.\n    def wrapper(*args, **kwargs):\n        print(f\"'{func.__name__}' \u00e7a\u011fr\u0131ld\u0131.\")\n        return func(*args, **kwargs)\n    return wrapper\n\n@logla\ndef toplama(a, b):\n    \"\"\"\u0130ki say\u0131y\u0131 toplar.\"\"\"\n    return a + b\n\nprint(toplama.__name__) # 'toplama' d\u00f6nd\u00fcr\u00fcr (wraps kullan\u0131ld\u0131\u011f\u0131nda)\nprint(toplama.__doc__)  # '\u0130ki say\u0131y\u0131 toplar.' d\u00f6nd\u00fcr\u00fcr (wraps kullan\u0131ld\u0131\u011f\u0131nda)\n\n        <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n<div class=\"expert-tip\">\n            <strong>Decorator Zincirleme (Chaining):<\/strong> Bir fonksiyona birden fazla decorator uygulayabilirsiniz. Decorator'lar, \u00fcstten alta do\u011fru uygulan\u0131r. Yani, en \u00fcstteki decorator \u00f6nce \u00e7a\u011fr\u0131l\u0131r ve en alttaki fonksiyonu sarmalar. Ard\u0131ndan, bir sonraki decorator bu sarmalanm\u0131\u015f fonksiyonu sarmalar ve bu b\u00f6yle devam eder. Bu, mod\u00fclerli\u011fi art\u0131rarak, farkl\u0131 i\u015flevsellikleri ayr\u0131 decorator'larla y\u00f6netmenize olanak tan\u0131r. \u00d6rne\u011fin, bir fonksiyonun hem \u00e7al\u0131\u015fma s\u00fcresini \u00f6l\u00e7mek hem de eri\u015fimini kontrol etmek i\u00e7in <code>@zaman_olc<\/code> ve <code>@rol_gerekiyor(\"admin\")<\/code> decorator'lar\u0131n\u0131 ayn\u0131 anda kullanabilirsiniz. Zincirleme s\u0131ras\u0131 \u00f6nemlidir; genellikle g\u00fcvenlik ve do\u011frulama decorator'lar\u0131 daha yukar\u0131da, yani daha \u00f6nce \u00e7al\u0131\u015facak \u015fekilde konumland\u0131r\u0131l\u0131r.\n        <\/div>\n<pre><code>\n@zaman_olc # Bu \u00f6nce \u00e7al\u0131\u015f\u0131r\n@logla_cagir # Bu ikinci \u00e7al\u0131\u015f\u0131r\ndef veritabanindan_veri_cek():\n    time.sleep(1.5)\n    return \"Veri \u00e7ekme ba\u015far\u0131l\u0131.\"\n\nprint(veritabanindan_veri_cek())\n\n        <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n<div class=\"expert-tip\">\n            <strong>Parametreli Decorator'lar ve S\u0131n\u0131f Decorator'lar Aras\u0131ndaki Se\u00e7im:<\/strong> Bir decorator'\u0131n durum tutmas\u0131 (stateful) gerekti\u011finde veya karma\u015f\u0131k konfig\u00fcrasyonlara sahip olmas\u0131 durumunda s\u0131n\u0131f tabanl\u0131 decorator'lar daha uygun olabilir. Fonksiyon tabanl\u0131 parametreli decorator'lar (\u00fc\u00e7 i\u00e7 i\u00e7e fonksiyon yap\u0131s\u0131), daha basit durumsuz veya az durumlu senaryolar i\u00e7in yeterlidir. Karar verirken, decorator'\u0131n ne kadar durum y\u00f6netti\u011fini ve ne kadar esnek olmas\u0131 gerekti\u011fini g\u00f6z \u00f6n\u00fcnde bulundurun.\n        <\/div>\n<\/li>\n<li>\n<div class=\"expert-tip\">\n            <strong>Hata Ay\u0131klama (Debugging) Kolayl\u0131\u011f\u0131:<\/strong> Decorator'lar, \u00e7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131n\u0131 (call stack) de\u011fi\u015ftirdi\u011fi i\u00e7in hata ay\u0131klamay\u0131 bazen zorla\u015ft\u0131rabilir. <code>functools.wraps<\/code> kullanmak bu sorunu b\u00fcy\u00fck \u00f6l\u00e7\u00fcde hafifletir. Ayr\u0131ca, decorator i\u00e7indeki print ifadeleri veya bir debugger kullanmak, ak\u0131\u015f\u0131 anlaman\u0131za yard\u0131mc\u0131 olabilir. Karma\u015f\u0131k decorator'lar yazarken, onlar\u0131 k\u00fc\u00e7\u00fck, test edilebilir par\u00e7alara ay\u0131rmak da hata ay\u0131klamay\u0131 kolayla\u015ft\u0131r\u0131r.\n        <\/div>\n<\/li>\n<\/ul>\n<p>Bu ileri seviye ipu\u00e7lar\u0131 ve p\u00fcf noktalar\u0131yla, decorator'lar\u0131 sadece kullanmakla kalmayacak, ayn\u0131 zamanda onlar\u0131 ustaca tasarlayabilecek ve uygulayabileceksiniz. Decorator'lar, Python'\u0131n en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden biridir ve do\u011fru kullan\u0131ld\u0131\u011f\u0131nda kodunuzu daha mod\u00fcler, daha okunakl\u0131 ve daha s\u00fcrd\u00fcr\u00fclebilir hale getirir.<\/p>\n<style>\n  \/* Mobil uyumluluk i\u00e7in temel stil *\/\n  body {\n    font-family: Arial, sans-serif;\n    line-height: 1.6;\n    margin: 0;\n    padding: 20px;\n    background-color: #f4f4f4;\n    color: #333;\n  }\n  h2, h3 {\n    color: #2c3e50;\n    border-bottom: 2px solid #3498db;\n    padding-bottom: 5px;\n    margin-top: 30px;\n  }\n  pre {\n    background-color: #ecf0f1;\n    border: 1px solid #bdc3c7;\n    padding: 15px;\n    border-radius: 5px;\n    overflow-x: auto;\n    font-size: 0.9em;\n  }\n  code {\n    font-family: 'Courier New', Courier, monospace;\n    color: #c0392b; \/* K\u0131rm\u0131z\u0131ms\u0131 ton *\/\n    background-color: #f9f9f9;\n    padding: 2px 4px;\n    border-radius: 3px;\n  }\n  pre code {\n    color: #2c3e50; \/* Koyu gri *\/\n    background-color: transparent;\n    padding: 0;\n  }\n  ul, ol {\n    margin-left: 20px;\n  }\n  .expert-tip {\n    background-color: #dbe9f6; \/* A\u00e7\u0131k mavi *\/\n    border-left: 5px solid #3498db; \/* Koyu mavi kenarl\u0131k *\/\n    padding: 15px;\n    margin: 20px 0;\n    border-radius: 5px;\n    font-style: italic;\n    color: #2c3e50;\n  }\n  .expert-tip strong {\n    color: #2c3e50;\n  }\n  .faq-section {\n    margin-top: 40px;\n    border-top: 2px dashed #ccc;\n    padding-top: 20px;\n  }\n  .faq-section h3 {\n    border-bottom: none;\n    padding-bottom: 0;\n    font-size: 1.3em;\n  }\n  .faq-section strong {\n    color: #34495e;\n  }<\/p>\n<p>  \/* Mobil cihazlar i\u00e7in medya sorgular\u0131 *\/\n  @media (max-width: 768px) {\n    body {\n      padding: 15px;\n      font-size: 0.95em;\n    }\n    h2 {\n      font-size: 1.5em;\n    }\n    h3 {\n      font-size: 1.2em;\n    }\n    pre {\n      padding: 10px;\n      font-size: 0.85em;\n    }\n    .expert-tip {\n      padding: 10px;\n      font-size: 0.9em;\n    }\n  }<\/p>\n<p>  @media (max-width: 480px) {\n    body {\n      padding: 10px;\n      font-size: 0.9em;\n    }\n    h2 {\n      font-size: 1.3em;\n    }\n    h3 {\n      font-size: 1.1em;\n    }\n    pre {\n      padding: 8px;\n      font-size: 0.8em;\n    }\n    .expert-tip {\n      padding: 8px;\n      font-size: 0.85em;\n    }\n  }\n<\/style>\n<h2 class=\"faq-section\">Sonu\u00e7: Kodunuzun Gelece\u011fi Decorator'larla Parl\u0131yor mu?<\/h2>\n<p>Bu makalede, programlama d\u00fcnyas\u0131n\u0131n \u201cs\u00fcsl\u00fc sarg\u0131lar\u0131\u201d olan decorator\u2019lar\u0131n ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve kodunuza nas\u0131l inan\u0131lmaz bir makyaj yapabilece\u011fini detayl\u0131ca inceledik. Basit loglama i\u015flemlerinden karma\u015f\u0131k yetkilendirme mekanizmalar\u0131na, performans optimizasyonundan mod\u00fcler kod tasar\u0131m\u0131na kadar geni\u015f bir yelpazede decorator'lar\u0131n g\u00fcc\u00fcn\u00fc g\u00f6rd\u00fck. Onlar, kod tekrar\u0131n\u0131 azaltman\u0131n (DRY prensibi), ilgileri ay\u0131rman\u0131n (separation of concerns) ve fonksiyonel programlama paradigmalar\u0131n\u0131 benimsemenin g\u00fc\u00e7l\u00fc bir yoludur. Art\u0131k fonksiyonlar\u0131n\u0131za yeni yetenekler kazand\u0131r\u0131rken, onlar\u0131n \u00e7ekirdek mant\u0131\u011f\u0131n\u0131 de\u011fi\u015ftirmek zorunda kalmayacaks\u0131n\u0131z. Decorator'lar sayesinde, kodunuz daha okunakl\u0131, daha bak\u0131m\u0131 kolay ve \u00e7ok daha esnek hale gelecek. Unutmay\u0131n, iyi yaz\u0131lm\u0131\u015f bir decorator, bir fonksiyonun \u00f6mr\u00fcn\u00fc uzat\u0131r ve onu farkl\u0131 ba\u011flamlarda yeniden kullan\u0131labilir k\u0131lar. Bu y\u00fczden, bir sonraki projenizde veya mevcut kod taban\u0131n\u0131z\u0131 iyile\u015ftirirken, decorator'lar\u0131n sundu\u011fu bu sihirli dokunu\u015flar\u0131 kullanmaktan \u00e7ekinmeyin. Kodunuzu g\u00fczelle\u015ftirme ve g\u00fc\u00e7lendirme yolculu\u011funuzda decorator'lar size harika bir yol arkada\u015f\u0131 olacakt\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<dl>\n<dt><strong>Decorator kullanmak kodun performans\u0131n\u0131 d\u00fc\u015f\u00fcr\u00fcr m\u00fc?<\/strong><\/dt>\n<dd>Genel olarak, decorator'lar\u0131n ekledi\u011fi soyutlama katman\u0131 nedeniyle \u00e7ok k\u00fc\u00e7\u00fck bir performans d\u00fc\u015f\u00fc\u015f\u00fc olabilir. Ancak bu, \u00e7o\u011fu uygulama i\u00e7in ihmal edilebilir d\u00fczeydedir. Decorator'lar\u0131n sa\u011flad\u0131\u011f\u0131 kod okunabilirli\u011fi, bak\u0131m kolayl\u0131\u011f\u0131 ve mod\u00fclerlik avantajlar\u0131, bu k\u00fc\u00e7\u00fck performans fark\u0131ndan \u00e7ok daha de\u011ferlidir. Performans kritik uygulamalarda bile, <code>functools.lru_cache<\/code> gibi \u00f6nbellekleme decorator'lar\u0131 asl\u0131nda performans\u0131 art\u0131rabilir.<\/dd>\n<dt><strong>Her zaman decorator kullanmal\u0131 m\u0131y\u0131m?<\/strong><\/dt>\n<dd>Hay\u0131r, her zaman de\u011fil. Decorator'lar, ayn\u0131 i\u015flevselli\u011fi birden fazla fonksiyona uygulaman\u0131z gerekti\u011finde veya bir fonksiyonun davran\u0131\u015f\u0131n\u0131 d\u0131\u015far\u0131dan, temiz bir \u015fekilde de\u011fi\u015ftirmek istedi\u011finizde en etkilidir. E\u011fer bir i\u015flevsellik sadece tek bir fonksiyona \u00f6zg\u00fcyse ve basitse, do\u011frudan o fonksiyonun i\u00e7ine yazmak daha anla\u015f\u0131l\u0131r olabilir. Anahtar, kod tekrar\u0131n\u0131 \u00f6nlemek ve ilgileri ay\u0131rmak aras\u0131ndaki dengeyi bulmakt\u0131r.<\/dd>\n<dt><strong>Decorator'lar sadece Python'da m\u0131 var?<\/strong><\/dt>\n<dd>Hay\u0131r, decorator deseni ve benzeri yap\u0131lar di\u011fer programlama dillerinde de bulunur. \u00d6rne\u011fin, Java'da \"annotations\", C#'da \"attributes\", JavaScript'te ES7'den itibaren gelen \"decorators\" ve Ruby'deki \"modules\" ve \"mixins\" benzer ama\u00e7lara hizmet eder. Ancak Python'daki <code>@<\/code> s\u00f6zdizimi, onlar\u0131 \u00f6zellikle zarif ve kolay kullan\u0131labilir k\u0131lar.<\/dd>\n<dt><strong>Bir decorator'\u0131 nas\u0131l hata ay\u0131klar\u0131m?<\/strong><\/dt>\n<dd>Decorator'lar \u00e7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131n\u0131 de\u011fi\u015ftirdi\u011fi i\u00e7in hata ay\u0131klama bazen zorlay\u0131c\u0131 olabilir. Bu durumu kolayla\u015ft\u0131rmak i\u00e7in a\u015fa\u011f\u0131daki y\u00f6ntemleri kullanabilirsiniz:<\/dd>\n<ul>\n<li><code>functools.wraps<\/code> kullan\u0131n. Bu, fonksiyonun orijinal ad\u0131n\u0131 ve meta verilerini koruyarak hata izini daha okunur hale getirir.<\/li>\n<li>Decorator i\u00e7indeki <code>print<\/code> ifadeleri veya loglama mesajlar\u0131 ekleyerek ak\u0131\u015f\u0131 takip edin.<\/li>\n<li>Bir hata ay\u0131klay\u0131c\u0131 (debugger) kullan\u0131yorsan\u0131z, breakpoint'leri hem orijinal fonksiyonda hem de decorator'\u0131n <code>wrapper<\/code> fonksiyonunda ayarlayarak ad\u0131m ad\u0131m ilerleyin.<\/li>\n<li>Karma\u015f\u0131k decorator'lar\u0131 daha k\u00fc\u00e7\u00fck, test edilebilir par\u00e7alara ay\u0131r\u0131n ve her bir par\u00e7ay\u0131 ayr\u0131 ayr\u0131 test edin.<\/li>\n<\/ul>\n<dt><strong>S\u0131n\u0131f tabanl\u0131 decorator'lar ile fonksiyon tabanl\u0131 arg\u00fcman alan decorator'lar aras\u0131ndaki temel fark nedir?<\/strong><\/dt>\n<dd>Temel fark, \"durum (state) y\u00f6netimi\" kabiliyetindedir. Fonksiyon tabanl\u0131 arg\u00fcman alan decorator'lar (\u00fc\u00e7 i\u00e7 i\u00e7e fonksiyon yap\u0131s\u0131yla), decorator'a \u00f6zg\u00fc basit parametreleri kapatma (closure) ile saklayabilirken, s\u0131n\u0131f tabanl\u0131 decorator'lar daha karma\u015f\u0131k durumlar\u0131 (\u00f6rne\u011fin, bir sayac\u0131, bir \u00f6nbellek s\u00f6zl\u00fc\u011f\u00fcn\u00fc veya farkl\u0131 fonksiyonlar aras\u0131nda payla\u015f\u0131lan verileri) s\u0131n\u0131f\u0131n \u00f6rnek de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla y\u00f6netebilirler. Bu, s\u0131n\u0131f tabanl\u0131 decorator'lar\u0131 \u00f6zellikle karma\u015f\u0131k, durumu olan ve daha nesne y\u00f6nelimli bir yakla\u015f\u0131ma ihtiya\u00e7 duyan senaryolar i\u00e7in daha uygun hale getirir.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Kodunuzun daha okunakl\u0131, daha bak\u0131m\u0131 kolay ve daha g\u00fc\u00e7l\u00fc olmas\u0131n\u0131 m\u0131 istiyorsunuz? Fonksiyonlar\u0131n\u0131za yeni yetenekler eklerken mevcut yap\u0131s\u0131n\u0131&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-32694","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>Decorators: Kodunuzun Hak Etti\u011fi Makyaj\u0131 Nas\u0131l Yapars\u0131n\u0131z?<\/title>\n<meta name=\"description\" content=\"Kodunuzun daha okunakl\u0131, daha bak\u0131m\u0131 kolay ve daha g\u00fc\u00e7l\u00fc olmas\u0131n\u0131 m\u0131 istiyorsunuz? Fonksiyonlar\u0131n\u0131za yeni yetenekler eklerken mevcut yap\u0131s\u0131n\u0131 de\u011fi\u015ftirmemek kula\u011fa harika gelmiyor mu? \u0130\u015fte tam da bu noktada, programlama d\u00fcnyas\u0131n\u0131n \u201cs\u00fcsl\u00fc sarg\u0131lar\u0131\u201d olarak adland\u0131rabilece\u011fimiz decorator\u2019lar devreye giriyor ve kodunuza ihtiyac\u0131 olan makyaj\u0131 yaparak onu ba\u015ftan yarat\u0131yor.\" \/>\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\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Decorators: Kodunuzun Hak Etti\u011fi Makyaj\u0131 Nas\u0131l Yapars\u0131n\u0131z?\" \/>\n<meta property=\"og:description\" content=\"Kodunuzun daha okunakl\u0131, daha bak\u0131m\u0131 kolay ve daha g\u00fc\u00e7l\u00fc olmas\u0131n\u0131 m\u0131 istiyorsunuz? Fonksiyonlar\u0131n\u0131za yeni yetenekler eklerken mevcut yap\u0131s\u0131n\u0131 de\u011fi\u015ftirmemek kula\u011fa harika gelmiyor mu? \u0130\u015fte tam da bu noktada, programlama d\u00fcnyas\u0131n\u0131n \u201cs\u00fcsl\u00fc sarg\u0131lar\u0131\u201d olarak adland\u0131rabilece\u011fimiz decorator\u2019lar devreye giriyor ve kodunuza ihtiyac\u0131 olan makyaj\u0131 yaparak onu ba\u015ftan yarat\u0131yor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-24T20:01:24+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Decorators: Kodunuzun Hak Etti\u011fi Makyaj\u0131 Nas\u0131l Yapars\u0131n\u0131z?\",\"datePublished\":\"2025-10-24T20:01:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/\"},\"wordCount\":3576,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/\",\"name\":\"Decorators: Kodunuzun Hak Etti\u011fi Makyaj\u0131 Nas\u0131l Yapars\u0131n\u0131z?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-24T20:01:24+00:00\",\"description\":\"Kodunuzun daha okunakl\u0131, daha bak\u0131m\u0131 kolay ve daha g\u00fc\u00e7l\u00fc olmas\u0131n\u0131 m\u0131 istiyorsunuz? Fonksiyonlar\u0131n\u0131za yeni yetenekler eklerken mevcut yap\u0131s\u0131n\u0131 de\u011fi\u015ftirmemek kula\u011fa harika gelmiyor mu? \u0130\u015fte tam da bu noktada, programlama d\u00fcnyas\u0131n\u0131n \u201cs\u00fcsl\u00fc sarg\u0131lar\u0131\u201d olarak adland\u0131rabilece\u011fimiz decorator\u2019lar devreye giriyor ve kodunuza ihtiyac\u0131 olan makyaj\u0131 yaparak onu ba\u015ftan yarat\u0131yor.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Decorators: Kodunuzun Hak Etti\u011fi Makyaj\u0131 Nas\u0131l Yapars\u0131n\u0131z?\"}]},{\"@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":"Decorators: Kodunuzun Hak Etti\u011fi Makyaj\u0131 Nas\u0131l Yapars\u0131n\u0131z?","description":"Kodunuzun daha okunakl\u0131, daha bak\u0131m\u0131 kolay ve daha g\u00fc\u00e7l\u00fc olmas\u0131n\u0131 m\u0131 istiyorsunuz? Fonksiyonlar\u0131n\u0131za yeni yetenekler eklerken mevcut yap\u0131s\u0131n\u0131 de\u011fi\u015ftirmemek kula\u011fa harika gelmiyor mu? \u0130\u015fte tam da bu noktada, programlama d\u00fcnyas\u0131n\u0131n \u201cs\u00fcsl\u00fc sarg\u0131lar\u0131\u201d olarak adland\u0131rabilece\u011fimiz decorator\u2019lar devreye giriyor ve kodunuza ihtiyac\u0131 olan makyaj\u0131 yaparak onu ba\u015ftan yarat\u0131yor.","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\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/","og_locale":"tr_TR","og_type":"article","og_title":"Decorators: Kodunuzun Hak Etti\u011fi Makyaj\u0131 Nas\u0131l Yapars\u0131n\u0131z?","og_description":"Kodunuzun daha okunakl\u0131, daha bak\u0131m\u0131 kolay ve daha g\u00fc\u00e7l\u00fc olmas\u0131n\u0131 m\u0131 istiyorsunuz? Fonksiyonlar\u0131n\u0131za yeni yetenekler eklerken mevcut yap\u0131s\u0131n\u0131 de\u011fi\u015ftirmemek kula\u011fa harika gelmiyor mu? \u0130\u015fte tam da bu noktada, programlama d\u00fcnyas\u0131n\u0131n \u201cs\u00fcsl\u00fc sarg\u0131lar\u0131\u201d olarak adland\u0131rabilece\u011fimiz decorator\u2019lar devreye giriyor ve kodunuza ihtiyac\u0131 olan makyaj\u0131 yaparak onu ba\u015ftan yarat\u0131yor.","og_url":"https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-24T20:01:24+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"10 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Decorators: Kodunuzun Hak Etti\u011fi Makyaj\u0131 Nas\u0131l Yapars\u0131n\u0131z?","datePublished":"2025-10-24T20:01:24+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/"},"wordCount":3576,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/","url":"https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/","name":"Decorators: Kodunuzun Hak Etti\u011fi Makyaj\u0131 Nas\u0131l Yapars\u0131n\u0131z?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-24T20:01:24+00:00","description":"Kodunuzun daha okunakl\u0131, daha bak\u0131m\u0131 kolay ve daha g\u00fc\u00e7l\u00fc olmas\u0131n\u0131 m\u0131 istiyorsunuz? Fonksiyonlar\u0131n\u0131za yeni yetenekler eklerken mevcut yap\u0131s\u0131n\u0131 de\u011fi\u015ftirmemek kula\u011fa harika gelmiyor mu? \u0130\u015fte tam da bu noktada, programlama d\u00fcnyas\u0131n\u0131n \u201cs\u00fcsl\u00fc sarg\u0131lar\u0131\u201d olarak adland\u0131rabilece\u011fimiz decorator\u2019lar devreye giriyor ve kodunuza ihtiyac\u0131 olan makyaj\u0131 yaparak onu ba\u015ftan yarat\u0131yor.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/decorators-kodunuzun-hak-ettigi-makyaji-nasil-yaparsiniz\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Decorators: Kodunuzun Hak Etti\u011fi Makyaj\u0131 Nas\u0131l Yapars\u0131n\u0131z?"}]},{"@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\/32694","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=32694"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32694\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32694"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32694"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32694"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}