{"id":35982,"date":"2025-12-06T11:01:15","date_gmt":"2025-12-06T08:01:15","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/"},"modified":"2025-12-06T11:01:15","modified_gmt":"2025-12-06T08:01:15","slug":"modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/","title":{"rendered":"Mod\u00fcl Deseni: JavaScript Uygulamalar\u0131nda Temiz ve D\u00fczenli Kodlama Sanat\u0131"},"content":{"rendered":"<p>JavaScript projelerinde kod karma\u015fas\u0131yla m\u0131 m\u00fccadele ediyorsunuz? Mod\u00fcl Deseni, veri gizleme ve kaps\u00fclleme ilkeleriyle daha okunabilir, s\u00fcrd\u00fcr\u00fclebilir ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirmenize yard\u0131mc\u0131 olur. Bu desenin g\u00fcc\u00fcn\u00fc ke\u015ffedin ve projelerinizi bir \u00fcst seviyeye ta\u015f\u0131y\u0131n!<\/p>\n<p>Herhangi bir yaz\u0131l\u0131m projesinde, kod taban\u0131 b\u00fcy\u00fcd\u00fck\u00e7e kar\u015f\u0131la\u015faca\u011f\u0131m\u0131z en b\u00fcy\u00fck zorluklardan biri, \u015f\u00fcphesiz ki kodun d\u00fczenini ve y\u00f6netilebilirli\u011fini korumakt\u0131r. \u00d6zellikle dinamik ve esnek yap\u0131s\u0131yla dikkat \u00e7eken JavaScript d\u00fcnyas\u0131nda, bu sorunlar \u00e7ok daha belirgin hale gelebilir. Global kapsam\u0131n kolayca kirlenebilmesi, adland\u0131rma \u00e7ak\u0131\u015fmalar\u0131 ve kodun farkl\u0131 b\u00f6l\u00fcmleri aras\u0131ndaki istenmeyen etkile\u015fimler, geli\u015ftiricilerin kabusu olmaya adayd\u0131r. Bir\u00e7ok projede, uygulamalar ba\u015flang\u0131\u00e7ta basit birka\u00e7 dosyadan ibaret olsa da, zamanla i\u015flevsellik artt\u0131k\u00e7a ve yeni \u00f6zellikler eklendik\u00e7e, dosya say\u0131s\u0131 artar, fonksiyonlar ve de\u011fi\u015fkenler \u00e7o\u011fal\u0131r. Bu durum, global ad alan\u0131nda binlerce tan\u0131mlay\u0131c\u0131n\u0131n birikmesine yol a\u00e7ar ve ne yaz\u0131k ki hangi de\u011fi\u015fkenin veya fonksiyonun ne ama\u00e7la kullan\u0131ld\u0131\u011f\u0131n\u0131 takip etmek neredeyse imkans\u0131z hale gelir.<\/p>\n<p>Peki, bu durum neden bu kadar b\u00fcy\u00fck bir sorun te\u015fkil eder? \u00d6ncelikle, global kapsamda tan\u0131mlanan her \u015fey, uygulaman\u0131n herhangi bir yerinden eri\u015filebilir ve de\u011fi\u015ftirilebilir hale gelir. Bu durum, beklenmedik yan etkileri ve hatalar\u0131 beraberinde getirir. Bir geli\u015ftiricinin globalde tan\u0131mlad\u0131\u011f\u0131 bir de\u011fi\u015fken, ba\u015fka bir geli\u015ftiricinin ayn\u0131 isimde tan\u0131mlad\u0131\u011f\u0131 bir de\u011fi\u015fkenle \u00e7ak\u0131\u015fabilir ve bu da tahmin edilmesi zor hatalara yol a\u00e7abilir. Ayr\u0131ca, global de\u011fi\u015fkenlerin veya fonksiyonlar\u0131n nerede ve nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131 izlemek olduk\u00e7a zordur, bu da kod bak\u0131m\u0131 ve hata ay\u0131klama s\u00fcre\u00e7lerini \u00e7etrefilli bir hale sokar. Uzun vadede, bu t\u00fcr bir yap\u0131, kodun yeniden kullan\u0131labilirli\u011fini d\u00fc\u015f\u00fcr\u00fcr ve yeni \u00f6zelliklerin entegrasyonunu yava\u015flat\u0131r. Uygulaman\u0131n \u00f6l\u00e7eklenebilirli\u011fi ciddi \u00f6l\u00e7\u00fcde etkilenir ve projenin sa\u011fl\u0131kl\u0131 bir \u015fekilde b\u00fcy\u00fcmesi engellenir. Bu noktada, daha yap\u0131land\u0131r\u0131lm\u0131\u015f ve d\u00fczenli bir yakla\u015f\u0131m benimsemek ka\u00e7\u0131n\u0131lmaz hale gelir. \u0130\u015fte tam da bu noktada, Mod\u00fcl Deseni gibi tasar\u0131m desenleri devreye girerek, JavaScript projelerine d\u00fczen ve disiplin kazand\u0131r\u0131r.<\/p>\n<p>Mod\u00fcl Deseni, bahsetti\u011fimiz bu yayg\u0131n sorunlara zarif ve etkili bir \u00e7\u00f6z\u00fcm sunar. Temel amac\u0131, kodu mant\u0131ksal olarak ba\u011f\u0131ms\u0131z, kendi i\u00e7inde kapal\u0131 birimlere ay\u0131rmak ve bu birimlerin i\u00e7 detaylar\u0131n\u0131 d\u0131\u015f d\u00fcnyadan gizlemektir. Bu sayede, global kapsam kirlili\u011fi \u00f6nlenir, adland\u0131rma \u00e7ak\u0131\u015fmalar\u0131 ortadan kalkar ve her bir mod\u00fcl, kendi sorumluluklar\u0131n\u0131 yerine getiren izole bir bile\u015fen haline gelir. Kaps\u00fclleme ve veri gizleme prensipleri sayesinde, mod\u00fcl\u00fcn i\u00e7 i\u015fleyi\u015fi d\u0131\u015far\u0131dan m\u00fcdahalelere kapal\u0131 tutulur, sadece mod\u00fcl\u00fcn &#8220;public&#8221; olarak belirlenen aray\u00fcz\u00fc d\u0131\u015f d\u00fcnyaya a\u00e7\u0131l\u0131r. Bu durum, kodun daha g\u00fcvenli, daha \u00f6ng\u00f6r\u00fclebilir ve daha kolay y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flar. Ayr\u0131ca, bu yap\u0131da her bir mod\u00fcl\u00fcn belirli bir g\u00f6revi oldu\u011fu i\u00e7in, test edilebilirlik de \u00f6nemli \u00f6l\u00e7\u00fcde artar. Bir mod\u00fcldeki de\u011fi\u015fiklikler, uygulaman\u0131n di\u011fer b\u00f6l\u00fcmlerini do\u011frudan etkilemez, bu da hata ay\u0131klama s\u00fcrecini h\u0131zland\u0131r\u0131r ve genel geli\u015ftirme verimlili\u011fini art\u0131r\u0131r. Mod\u00fcl Deseni, karma\u015f\u0131k JavaScript uygulamalar\u0131n\u0131 daha k\u00fc\u00e7\u00fck, y\u00f6netilebilir par\u00e7alara b\u00f6lerek hem geli\u015ftirme s\u00fcrecini kolayla\u015ft\u0131r\u0131r hem de son \u00fcr\u00fcn\u00fcn kalitesini y\u00fckseltir.<\/p>\n<h2>Mod\u00fcl Deseni Nedir ve Temel Bile\u015fenleri Nelerdir?<\/h2>\n<p>Mod\u00fcl Deseni, JavaScript&#8217;te kodun organizasyonunu sa\u011flamak, global ad alan\u0131 kirlili\u011fini \u00f6nlemek ve veri gizleme (encapsulation) prensibini uygulamak i\u00e7in kullan\u0131lan g\u00fc\u00e7l\u00fc bir tasar\u0131m desenidir. Temelde, bir mod\u00fcl, kendi i\u00e7inde bir veya daha fazla i\u015flevi ve veriyi bar\u0131nd\u0131ran, d\u0131\u015f d\u00fcnyadan ba\u011f\u0131ms\u0131z \u00e7al\u0131\u015fan bir birimdir. Bu desenin temelinde, JavaScript&#8217;in i\u015flevsel kapsam (function scope) ve kapan\u0131m (closure) \u00f6zellikleri yatar. Mod\u00fcl Deseni sayesinde, bir kod blo\u011funun i\u00e7inde tan\u0131mlanan de\u011fi\u015fkenler ve i\u015flevler, d\u0131\u015far\u0131dan do\u011frudan eri\u015filemez hale gelir, bu da &#8220;private&#8221; \u00fcye olu\u015fturman\u0131n bir yolunu sunar. Sadece mod\u00fcl\u00fcn d\u0131\u015far\u0131ya a\u00e7t\u0131\u011f\u0131 belirli bir API (Application Programming Interface) arac\u0131l\u0131\u011f\u0131yla bu i\u00e7 i\u015fleyi\u015f ile etkile\u015fim kurulabilir.<\/p>\n<p>Mod\u00fcl Deseni&#8217;nin yap\u0131 ta\u015flar\u0131ndan ilki, hemen \u00e7a\u011fr\u0131lan i\u015flev ifadesi (Immediately Invoked Function Expression &#8211; IIFE) olarak bilinen yap\u0131d\u0131r. Bir IIFE, tan\u0131mland\u0131\u011f\u0131 anda otomatik olarak \u00e7al\u0131\u015fan bir JavaScript fonksiyonudur. Bu fonksiyonun en \u00f6nemli \u00f6zelli\u011fi, kendi \u00f6zel kapsam\u0131n\u0131 olu\u015fturmas\u0131d\u0131r. Yani, bir IIFE i\u00e7inde tan\u0131mlanan herhangi bir de\u011fi\u015fken veya fonksiyon, d\u0131\u015f global kapsam\u0131 etkilemez ve dolay\u0131s\u0131yla adland\u0131rma \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nler. IIFE&#8217;ler, JavaScript motoru taraf\u0131ndan okunup an\u0131nda y\u00fcr\u00fct\u00fcld\u00fc\u011f\u00fcnde, i\u00e7indeki de\u011fi\u015fkenler ve fonksiyonlar sadece o IIFE&#8217;nin yerel kapsam\u0131nda var olur. Ancak, bu IIFE bir de\u011fer (genellikle bir nesne) d\u00f6nd\u00fcrd\u00fc\u011f\u00fcnde, bu d\u00f6nd\u00fcr\u00fclen de\u011fer d\u0131\u015f d\u00fcnyaya a\u00e7\u0131lan mod\u00fcl aray\u00fcz\u00fcn\u00fc olu\u015fturur. Bu mekanizma, Mod\u00fcl Deseni&#8217;nin temelini olu\u015fturur \u00e7\u00fcnk\u00fc t\u00fcm mod\u00fcl mant\u0131\u011f\u0131 bu izole kapsam\u0131n i\u00e7inde yer al\u0131r ve d\u0131\u015far\u0131ya sadece kontrol edilen bir aray\u00fcz sunulur. Bu yap\u0131 sayesinde, global kapsam kirlili\u011finin \u00f6n\u00fcne ge\u00e7ilirken, ayn\u0131 zamanda mod\u00fcl\u00fcn kendi i\u00e7 dinamiklerini g\u00fcvenle y\u00f6netmesi sa\u011flan\u0131r. \u00d6rne\u011fin, bir veritaban\u0131 ba\u011flant\u0131 mod\u00fcl\u00fc d\u00fc\u015f\u00fcn\u00fcn; ba\u011flant\u0131 bilgileri ve i\u00e7 metotlar\u0131 IIFE i\u00e7inde gizlenir, d\u0131\u015far\u0131ya sadece &#8220;ba\u011flan&#8221; veya &#8220;sorguYap&#8221; gibi public metotlar sunulur. Bu, g\u00fcvenlik ve d\u00fczen a\u00e7\u0131s\u0131ndan hayati bir \u00f6nem ta\u015f\u0131r.<\/p>\n<p>Mod\u00fcl Deseni&#8217;nin ikinci ve belki de en kritik bile\u015feni ise kapan\u0131mlar (closures) kavram\u0131d\u0131r. Kapan\u0131m, bir i\u00e7 fonksiyonun, tan\u0131mland\u0131\u011f\u0131 d\u0131\u015f fonksiyonun kapsam\u0131ndaki de\u011fi\u015fkenlere eri\u015fmeye devam etmesidir, hatta d\u0131\u015f fonksiyon \u00e7al\u0131\u015fmas\u0131n\u0131 bitirmi\u015f olsa bile. Mod\u00fcl Deseni&#8217;nde, IIFE i\u00e7inde tan\u0131mlad\u0131\u011f\u0131m\u0131z &#8220;private&#8221; de\u011fi\u015fkenler ve fonksiyonlar, IIFE&#8217;nin d\u00f6nd\u00fcrd\u00fc\u011f\u00fc public bir nesnenin metotlar\u0131 taraf\u0131ndan kullan\u0131labilir. Bu public metotlar asl\u0131nda birer kapan\u0131md\u0131r; yani, IIFE&#8217;nin yerel kapsam\u0131ndaki &#8220;private&#8221; verilere ve metotlara eri\u015fim yeteneklerini s\u00fcrd\u00fcr\u00fcrler. Bu durum, d\u0131\u015far\u0131dan do\u011frudan eri\u015filemeyen verilere, mod\u00fcl\u00fcn kendi i\u00e7inden kontrol edilebilir bir \u015fekilde eri\u015filmesini ve manip\u00fcle edilmesini sa\u011flar. \u00d6rne\u011fin, bir sayac mod\u00fcl\u00fc olu\u015fturdu\u011fumuzda, sayac\u0131n mevcut de\u011ferini tutan de\u011fi\u015fkeni &#8220;private&#8221; olarak tan\u0131mlayabiliriz. Ancak, &#8220;artt\u0131r&#8221; veya &#8220;azalt&#8221; gibi public metotlar, kapan\u0131m sayesinde bu &#8220;private&#8221; sayac de\u011fi\u015fkenine eri\u015febilir ve onu g\u00fcncelleyebilir. D\u0131\u015f d\u00fcnyadan bu sayaca do\u011frudan eri\u015filemese de, mod\u00fcl\u00fcn sa\u011flad\u0131\u011f\u0131 aray\u00fcz \u00fczerinden dolayl\u0131 yoldan kontrol edilebilir. Bu \u00f6zellik, Mod\u00fcl Deseni&#8217;nin veri gizleme ve kaps\u00fclleme hedefine ula\u015fmas\u0131nda kilit rol oynar, \u00e7\u00fcnk\u00fc mod\u00fcl\u00fcn i\u00e7 durumunun d\u0131\u015far\u0131dan istenmeyen \u015fekillerde de\u011fi\u015ftirilmesini engeller ve mod\u00fcl\u00fcn davran\u0131\u015f\u0131n\u0131 \u00f6ng\u00f6r\u00fclebilir k\u0131lar.<\/p>\n<h2>Klasik Mod\u00fcl Deseni Nas\u0131l Uygulan\u0131r? Ad\u0131m Ad\u0131m Rehber<\/h2>\n<p>Klasik Mod\u00fcl Deseni&#8217;nin temel amac\u0131, JavaScript kodunu daha d\u00fczenli hale getirmek, global ad alan\u0131 kirlili\u011fini engellemek ve veri gizleme (encapsulation) prensibini uygulamakt\u0131r. Bu deseni ad\u0131m ad\u0131m uygulamak, projelerinizde daha s\u00fcrd\u00fcr\u00fclebilir ve okunabilir bir yap\u0131 kurman\u0131z\u0131 sa\u011flayacakt\u0131r. Temelde, bir Mod\u00fcl Deseni uygulamas\u0131, bir IIFE (Immediately Invoked Function Expression &#8211; Hemen \u00c7a\u011fr\u0131lan Fonksiyon \u0130fadesi) ve bu IIFE&#8217;nin d\u00f6nd\u00fcrd\u00fc\u011f\u00fc bir nesne veya fonksiyon k\u00fcmesi \u00fczerine kuruludur. \u015eimdi, bu yap\u0131y\u0131 basit bir saya\u00e7 mod\u00fcl\u00fc \u00fczerinden inceleyelim.<\/p>\n<p>\u0130lk ad\u0131m olarak, t\u00fcm mod\u00fcl mant\u0131\u011f\u0131n\u0131 kapsayacak bir IIFE olu\u015fturmal\u0131y\u0131z. Bu IIFE, kendi \u00f6zel kapsam\u0131n\u0131 olu\u015fturarak i\u00e7inde tan\u0131mlanan her \u015feyin globalden izole olmas\u0131n\u0131 sa\u011flar. \u0130\u00e7erisinde mod\u00fcl\u00fcn &#8220;private&#8221; (\u00f6zel) de\u011fi\u015fkenlerini ve fonksiyonlar\u0131n\u0131 tan\u0131mlayaca\u011f\u0131z. Bu \u00f6zel \u00fcyeler, mod\u00fcl\u00fcn d\u0131\u015f\u0131ndan do\u011frudan eri\u015filemeyen, sadece mod\u00fcl\u00fcn kendi i\u00e7inde kullan\u0131lan elemanlard\u0131r. \u00d6rne\u011fin, bir saya\u00e7 mod\u00fcl\u00fc olu\u015fturuyorsak, sayac\u0131n mevcut de\u011ferini tutan de\u011fi\u015fkeni ve bu de\u011feri manip\u00fcle eden yard\u0131mc\u0131 fonksiyonlar\u0131 \u00f6zel olarak tan\u0131mlar\u0131z. IIFE&#8217;nin sonunda ise, d\u0131\u015f d\u00fcnyaya a\u00e7mak istedi\u011fimiz &#8220;public&#8221; (genel) aray\u00fcz\u00fc temsil eden bir nesne d\u00f6nd\u00fcr\u00fcr\u00fcz. Bu nesne, mod\u00fcl\u00fcn d\u0131\u015far\u0131dan \u00e7a\u011fr\u0131labilen metotlar\u0131n\u0131 veya eri\u015filebilen \u00f6zelliklerini i\u00e7erir. \u0130\u015fte basit bir saya\u00e7 mod\u00fcl\u00fc \u00f6rne\u011fi:<\/p>\n<pre><code>\nvar SayacModulu = (function() {\n    \/\/ Bu k\u0131s\u0131m mod\u00fcl\u00fcn private (\u00f6zel) alan\u0131d\u0131r.\n    var ozelDegisken = 0; \/\/ Bu, sadece mod\u00fcl i\u00e7inde eri\u015filebilen \u00f6zel bir de\u011fi\u015fkendir.\n\n    function ozelMetot() { \/\/ Bu, sadece mod\u00fcl i\u00e7inde \u00e7a\u011fr\u0131labilen \u00f6zel bir fonksiyondur.\n        console.log(\"\u00d6zel metot \u00e7al\u0131\u015ft\u0131. Mevcut saya\u00e7 de\u011feri: \" + ozelDegisken);\n    }\n\n    \/\/ Mod\u00fcl\u00fcn d\u0131\u015f d\u00fcnyaya a\u00e7\u0131lan (public) aray\u00fcz\u00fc.\n    \/\/ Bu nesne, IIFE'nin d\u00f6nd\u00fcrd\u00fc\u011f\u00fc de\u011ferdir ve SayacModulu de\u011fi\u015fkenine atan\u0131r.\n    return {\n        \/\/ Public metot: Sayac\u0131 bir art\u0131r\u0131r ve \u00f6zel metodu \u00e7a\u011f\u0131r\u0131r.\n        arttir: function() {\n            ozelDegisken++;\n            ozelMetot(); \/\/ \u00d6zel metoda eri\u015fim, yaln\u0131zca mod\u00fcl\u00fcn i\u00e7inden m\u00fcmk\u00fcnd\u00fcr.\n        },\n        \/\/ Public metot: Sayac\u0131 bir azalt\u0131r ve \u00f6zel metodu \u00e7a\u011f\u0131r\u0131r.\n        azalt: function() {\n            ozelDegisken--;\n            ozelMetot();\n        },\n        \/\/ Public metot: Sayac\u0131n mevcut de\u011ferini d\u0131\u015f d\u00fcnyaya d\u00f6nd\u00fcr\u00fcr.\n        degeriAl: function() {\n            return ozelDegisken;\n        },\n        \/\/ Public \u00f6zellik: D\u0131\u015far\u0131dan eri\u015filebilir ama de\u011fi\u015ftirilemez.\n        modulAdi: \"Basit Saya\u00e7 Mod\u00fcl\u00fc\"\n    };\n})();\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kod blo\u011funu inceledi\u011fimizde, <code>SayacModulu<\/code> ad\u0131nda bir de\u011fi\u015fken tan\u0131mlad\u0131k ve de\u011fer olarak bir IIFE'nin d\u00f6nd\u00fcrd\u00fc\u011f\u00fc nesneyi atad\u0131k. Bu IIFE'nin i\u00e7inde, <code>ozelDegisken<\/code> ve <code>ozelMetot<\/code> ad\u0131nda iki \"private\" \u00fcye bulunmaktad\u0131r. Bu \u00fcyeler, <code>SayacModulu<\/code> d\u0131\u015f\u0131ndan do\u011frudan eri\u015filemezler. \u00d6rne\u011fin, <code>SayacModulu.ozelDegisken<\/code> veya <code>SayacModulu.ozelMetot()<\/code> demeye \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131zda, bu \u00fcyelerin tan\u0131ms\u0131z oldu\u011funu g\u00f6r\u00fcrs\u00fcn\u00fcz. Bu, veri gizleme prensibinin uygulamas\u0131d\u0131r. Mod\u00fcl, yaln\u0131zca <code>arttir<\/code>, <code>azalt<\/code> ve <code>degeriAl<\/code> ad\u0131nda \u00fc\u00e7 adet \"public\" metot sunmaktad\u0131r. Bu metotlar, kapan\u0131m \u00f6zelli\u011fi sayesinde, IIFE'nin kapsam\u0131 i\u00e7inde tan\u0131mlanm\u0131\u015f olan <code>ozelDegisken<\/code> ve <code>ozelMetot<\/code>'a eri\u015febilirler. \u00d6rne\u011fin, <code>arttir<\/code> metodu, <code>ozelDegisken<\/code>'i art\u0131r\u0131r ve ard\u0131ndan <code>ozelMetot<\/code>'u \u00e7a\u011f\u0131r\u0131r. D\u0131\u015far\u0131dan bu metotlar\u0131 \u00e7a\u011f\u0131rarak mod\u00fcl\u00fcn i\u00e7 i\u015fleyi\u015fiyle g\u00fcvenli bir \u015fekilde etkile\u015fime ge\u00e7ebiliriz.<\/p>\n<p>\u015eimdi bu mod\u00fcl\u00fc nas\u0131l kullanaca\u011f\u0131m\u0131za bakal\u0131m:<\/p>\n<pre><code>\nSayacModulu.arttir(); \/\/ \u00c7\u0131kt\u0131: \"\u00d6zel metot \u00e7al\u0131\u015ft\u0131. Mevcut saya\u00e7 de\u011feri: 1\"\nSayacModulu.arttir(); \/\/ \u00c7\u0131kt\u0131: \"\u00d6zel metot \u00e7al\u0131\u015ft\u0131. Mevcut saya\u00e7 de\u011feri: 2\"\nconsole.log(SayacModulu.degeriAl()); \/\/ \u00c7\u0131kt\u0131: 2\nconsole.log(SayacModulu.modulAdi); \/\/ \u00c7\u0131kt\u0131: \"Basit Saya\u00e7 Mod\u00fcl\u00fc\"\n\nSayacModulu.azalt(); \/\/ \u00c7\u0131kt\u0131: \"\u00d6zel metot \u00e7al\u0131\u015ft\u0131. Mevcut saya\u00e7 de\u011feri: 1\"\nconsole.log(SayacModulu.degeriAl()); \/\/ \u00c7\u0131kt\u0131: 1\n\n\/\/ Mod\u00fcl\u00fcn \u00f6zel \u00fcyelerine do\u011frudan eri\u015fim m\u00fcmk\u00fcn de\u011fildir:\n\/\/ console.log(SayacModulu.ozelDegisken); \/\/ undefined\n\/\/ SayacModulu.ozelMetot(); \/\/ TypeError: SayacModulu.ozelMetot is not a function\n<\/pre>\n<p><\/code><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, <code>SayacModulu<\/code>'nun public aray\u00fcz\u00fc \u00fczerinden sayac\u0131 art\u0131r\u0131p azaltabiliyor ve mevcut de\u011ferini alabiliyoruz. Ancak, mod\u00fcl\u00fcn i\u00e7indeki \u00f6zel de\u011fi\u015fkenlere veya metotlara d\u0131\u015far\u0131dan m\u00fcdahale edemiyoruz. Bu yap\u0131, kodun daha g\u00fcvenli, d\u00fczenli ve y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flar. \u00d6zellikle b\u00fcy\u00fck projelerde, farkl\u0131 geli\u015ftiricilerin ayn\u0131 isimde de\u011fi\u015fkenler kullanma olas\u0131l\u0131\u011f\u0131na kar\u015f\u0131 koruma sa\u011flar ve her bir mod\u00fcl\u00fcn kendi i\u015fini izole bir \u015fekilde yapmas\u0131n\u0131 garanti eder. Klasik Mod\u00fcl Deseni, JavaScript'in temel prensiplerini kullanarak kaps\u00fclleme ve veri gizleme konusunda g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<h3>Mod\u00fcl Deseni Varyasyonlar\u0131 ve Geli\u015fmi\u015f Kullan\u0131m Senaryolar\u0131 Nelerdir?<\/h3>\n<p>Klasik Mod\u00fcl Deseni, JavaScript uygulamalar\u0131nda d\u00fczeni sa\u011flamak i\u00e7in g\u00fc\u00e7l\u00fc bir temel sunsa da, ger\u00e7ek d\u00fcnya senaryolar\u0131n\u0131n karma\u015f\u0131kl\u0131\u011f\u0131 bazen bu desenin farkl\u0131 varyasyonlar\u0131n\u0131 kullanmay\u0131 gerektirebilir. Mod\u00fcl Deseni'nin sundu\u011fu esneklik sayesinde, ihtiya\u00e7lara g\u00f6re geni\u015fletilebilen, okunabilirli\u011fi art\u0131r\u0131lan veya ba\u011f\u0131ml\u0131l\u0131klar\u0131 daha iyi y\u00f6netilebilen \u00e7e\u015fitli varyasyonlar geli\u015ftirilmi\u015ftir. Bu b\u00f6l\u00fcmde, mod\u00fcl geni\u015fletme, gev\u015fek geni\u015fletme ve a\u00e7\u0131\u011fa \u00e7\u0131karan mod\u00fcl deseni gibi ileri d\u00fczey kullan\u0131m senaryolar\u0131n\u0131 ele alaca\u011f\u0131z.<\/p>\n<h4>Mod\u00fcl Geni\u015fletme (Module Augmentation)<\/h4>\n<p>Bazen mevcut bir mod\u00fcl\u00fcn i\u015flevselli\u011fini de\u011fi\u015ftirmeden, ona yeni \u00f6zellikler veya metotlar eklemek isteyebiliriz. \u00d6rne\u011fin, birincil mod\u00fcl temel i\u015flevleri sa\u011flarken, daha sonra gelen ba\u015fka bir betik bu mod\u00fcle ek \u00f6zellikler katabilir. Bu duruma \"Mod\u00fcl Geni\u015fletme\" denir. Geni\u015fletme, \u00f6zellikle mod\u00fcl\u00fcn farkl\u0131 b\u00f6l\u00fcmlerini ayr\u0131 dosyalarda tutmak veya eklenti benzeri yap\u0131lar olu\u015fturmak istedi\u011fimizde faydal\u0131d\u0131r. Mod\u00fcl\u00fc geni\u015fletmek i\u00e7in, mevcut mod\u00fcl\u00fc bir IIFE'ye parametre olarak ge\u00e7irir ve bu IIFE i\u00e7inde orijinal mod\u00fcl nesnesine yeni \u00f6zellikler ekleyip, geni\u015fletilmi\u015f nesneyi geri d\u00f6nd\u00fcr\u00fcr\u00fcz. Bu sayede, orijinal mod\u00fcl\u00fcn referans\u0131 g\u00fcncellenmi\u015f olur.<\/p>\n<pre><code>\nvar SayacModulu = (function() {\n    var ozelDegisken = 0;\n    return {\n        arttir: function() { ozelDegisken++; console.log(\"Saya\u00e7 artt\u0131: \" + ozelDegisken); },\n        degeriAl: function() { return ozelDegisken; }\n    };\n})();\n\n\/\/ SayacModulu'nu geni\u015fletiyoruz\nvar GenisletilmisSayacModulu = (function(modul) {\n    modul.sifirla = function() {\n        \/\/ ozelDegisken'e do\u011frudan eri\u015fim yok, ancak public metotlar \u00fczerinden\n        \/\/ bir s\u0131f\u0131rlama mekanizmas\u0131 sa\u011flanabilirdi. Buradaki ama\u00e7 public bir metot eklemek.\n        console.log(\"Saya\u00e7 s\u0131f\u0131rlama metodu eklendi.\");\n        \/\/ Ger\u00e7ek bir s\u0131f\u0131rlama i\u00e7in ozelDegisken'i manip\u00fcle eden bir public metot olmal\u0131yd\u0131.\n        \/\/ Veya ozelDegisken'i public hale getirmeliydik, ancak bu veri gizlemeyi bozar.\n        \/\/ Genellikle, bu t\u00fcr durumlarda public bir 'setDeger' metodu eklenebilir.\n    };\n    modul.modulVersiyon = \"1.1\";\n    return modul;\n})(SayacModulu); \/\/ Mevcut mod\u00fcl\u00fc parametre olarak ge\u00e7iriyoruz\n\nGenisletilmisSayacModulu.arttir(); \/\/ \u00c7\u0131kt\u0131: \"Saya\u00e7 artt\u0131: 1\"\nGenisletilmisSayacModulu.sifirla(); \/\/ \u00c7\u0131kt\u0131: \"Saya\u00e7 s\u0131f\u0131rlama metodu eklendi.\"\nconsole.log(GenisletilmisSayacModulu.modulVersiyon); \/\/ \u00c7\u0131kt\u0131: \"1.1\"\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>SayacModulu<\/code>'na <code>sifirla<\/code> metodu ve <code>modulVersiyon<\/code> \u00f6zelli\u011fi ekledik. Dikkat edilmesi gereken nokta, geni\u015fletilen mod\u00fcl\u00fcn \u00f6zel \u00fcyelerine do\u011frudan eri\u015fim sa\u011flanamamas\u0131d\u0131r. Geni\u015fletme, daha \u00e7ok mevcut mod\u00fcl\u00fcn public aray\u00fcz\u00fcne yeni i\u015flevsellikler eklemek i\u00e7in kullan\u0131l\u0131r. E\u011fer \u00f6zel verilere eri\u015fim gerekiyorsa, mod\u00fcl\u00fcn orijinal tasar\u0131m\u0131nda bu durum d\u00fc\u015f\u00fcn\u00fclerek bir \"setter\" veya \"getter\" metodu sa\u011flanmas\u0131 gerekebilir.<\/p>\n<h4>A\u00e7\u0131\u011fa \u00c7\u0131karan Mod\u00fcl Deseni (Revealing Module Pattern)<\/h4>\n<p>A\u00e7\u0131\u011fa \u00c7\u0131karan Mod\u00fcl Deseni, klasik Mod\u00fcl Deseni'nin okunabilirli\u011fini art\u0131rmak amac\u0131yla ortaya \u00e7\u0131km\u0131\u015ft\u0131r. Temel fark\u0131, t\u00fcm \"private\" metotlar\u0131 ve de\u011fi\u015fkenleri IIFE i\u00e7inde tan\u0131mlad\u0131ktan sonra, d\u00f6nd\u00fcr\u00fclen nesnede sadece bu \"private\" \u00fcyelerin public takma isimlerini (alias) belirtmesidir. Bu yakla\u015f\u0131m, mod\u00fcl\u00fcn public aray\u00fcz\u00fcn\u00fcn bir bak\u0131\u015fta anla\u015f\u0131lmas\u0131n\u0131 sa\u011flar ve hangi i\u00e7 fonksiyonun veya de\u011fi\u015fkenin d\u0131\u015far\u0131ya a\u00e7\u0131ld\u0131\u011f\u0131n\u0131 netle\u015ftirir. Kodun \u00fcst k\u0131sm\u0131nda t\u00fcm i\u015flevsellik tan\u0131mlan\u0131r, alt k\u0131sm\u0131nda ise d\u0131\u015far\u0131ya sunulacak API belirlenir.<\/p>\n<pre><code>\nvar GosterenModul = (function () {\n    var ozelMesaj = \"Merhaba d\u00fcnya!\"; \/\/ Private de\u011fi\u015fken\n\n    function ozelIslem() { \/\/ Private metot\n        console.log(\"\u00d6zel i\u015flem: \" + ozelMesaj);\n    }\n\n    function genelSelamla() { \/\/ Bu, public hale getirilecek metot\n        ozelIslem(); \/\/ \u00d6zel metodu \u00e7a\u011f\u0131rabilir\n        console.log(\"Genel selam: \" + ozelMesaj);\n    }\n\n    function ozelDegerGuncelle(yeniMesaj) { \/\/ Bir ba\u015fka private metot\n        ozelMesaj = yeniMesaj;\n        console.log(\"\u00d6zel mesaj g\u00fcncellendi.\");\n    }\n\n    \/\/ Public aray\u00fcz\u00fc d\u00f6nd\u00fcren k\u0131s\u0131m\n    return {\n        selamla: genelSelamla, \/\/ genelSelamla fonksiyonunu 'selamla' ad\u0131yla d\u0131\u015far\u0131ya a\u00e7ar\n        mesaj: ozelMesaj,      \/\/ ozelMesaj'\u0131 'mesaj' ad\u0131yla d\u0131\u015far\u0131ya a\u00e7ar (okunabilir)\n        \/\/ updateMesaj: ozelDegerGuncelle \/\/ E\u011fer d\u0131\u015far\u0131dan g\u00fcncellenmesini istersek\n    };\n})();\n\nGosterenModul.selamla(); \/\/ \u00c7\u0131kt\u0131: \"\u00d6zel i\u015flem: Merhaba d\u00fcnya!\", \"Genel selam: Merhaba d\u00fcnya!\"\nconsole.log(GosterenModul.mesaj); \/\/ \u00c7\u0131kt\u0131: \"Merhaba d\u00fcnya!\"\n\n\/\/ D\u0131\u015far\u0131dan mesaj\u0131 de\u011fi\u015ftirmeye \u00e7al\u0131\u015fmak do\u011frudan ba\u015far\u0131l\u0131 olmaz\nGosterenModul.mesaj = \"Yeni mesaj\";\nconsole.log(GosterenModul.mesaj); \/\/ \u00c7\u0131kt\u0131: \"Yeni mesaj\" (Ancak ozelMesaj hala \"Merhaba d\u00fcnya!\"d\u0131r)\n                                  \/\/ Bu durumda, sadece 'mesaj' ad\u0131ndaki public property de\u011fi\u015fir,\n                                  \/\/ ozelMesaj de\u011fi\u015fmez. Bu nedenle \"get\" ve \"set\" metotlar\u0131 daha g\u00fcvenlidir.\n\n\/\/ E\u011fer ozelDegerGuncelle'yi public yapsayd\u0131k:\n\/\/ GosterenModul.updateMesaj(\"Yeni D\u00fcnya\");\n\/\/ GosterenModul.selamla(); \/\/ \"\u00d6zel i\u015flem: Yeni D\u00fcnya\", \"Genel selam: Yeni D\u00fcnya\"\n<\/pre>\n<p><\/code><\/p>\n<p>A\u00e7\u0131\u011fa \u00c7\u0131karan Mod\u00fcl Deseni, \u00f6zellikle mod\u00fcl\u00fcn i\u00e7 mant\u0131\u011f\u0131 karma\u015f\u0131kla\u015ft\u0131\u011f\u0131nda, d\u0131\u015far\u0131ya sunulan API'nin ne oldu\u011funu daha net g\u00f6rmemizi sa\u011flar. Public ve private \u00fcyeler aras\u0131ndaki ayr\u0131m, kodun \u00fcst k\u0131sm\u0131nda tan\u0131mlan\u0131p, return ifadesinde a\u00e7\u0131k\u00e7a belirtilmesiyle daha belirgin hale gelir. Ancak, dikkatli olmak gerekir: e\u011fer bir private de\u011fi\u015fkeni do\u011frudan bir public \u00f6zellik olarak d\u00f6nd\u00fcr\u00fcrseniz (yukar\u0131daki <code>mesaj: ozelMesaj<\/code> \u00f6rne\u011finde oldu\u011fu gibi), bu \u00f6zellik d\u0131\u015far\u0131dan de\u011fi\u015ftirilebilir hale gelir. Fakat bu de\u011fi\u015fiklik, mod\u00fcl\u00fcn i\u00e7indeki orijinal private de\u011fi\u015fkene etki etmez. Bu t\u00fcr durumlarda, veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc korumak i\u00e7in genellikle \"getter\" ve \"setter\" metotlar\u0131 kullanmak daha g\u00fcvenli bir yakla\u015f\u0131md\u0131r.<\/p>\n<div class=\"info-box\">\n  Uzman \u0130pucu: A\u00e7\u0131\u011fa \u00c7\u0131karan Mod\u00fcl Deseni'nde public bir \u00f6zelli\u011fin de\u011ferini bir private de\u011fi\u015fkene e\u015fitledi\u011finizde, asl\u0131nda o anki de\u011ferin bir kopyas\u0131n\u0131 olu\u015fturmu\u015f olursunuz. D\u0131\u015far\u0131dan yap\u0131lan de\u011fi\u015fiklikler, mod\u00fcl\u00fcn private durumunu etkilemez. E\u011fer private durumu d\u0131\u015far\u0131dan kontroll\u00fc bir \u015fekilde de\u011fi\u015ftirmek istiyorsan\u0131z, bir \"setter\" metodu sa\u011flamal\u0131s\u0131n\u0131z.\n<\/div>\n<p>Bu varyasyonlar, Mod\u00fcl Deseni'nin temel prensiplerini korurken, farkl\u0131 ihtiya\u00e7lara ve geli\u015ftirme yakla\u015f\u0131mlar\u0131na uyum sa\u011flayacak esneklik sunar. Hangi varyasyonun kullan\u0131laca\u011f\u0131, projenin \u00f6l\u00e7e\u011fi, tak\u0131m\u0131n tercihleri ve performans gereksinimleri gibi fakt\u00f6rlere ba\u011fl\u0131d\u0131r. Modern JavaScript'te ES6 mod\u00fclleri (import\/export) yayg\u0131nla\u015fsa da, bu desenleri anlamak, JavaScript'in temel mekaniklerini kavramak ve eski projelerde \u00e7al\u0131\u015f\u0131rken veya build ara\u00e7lar\u0131 kullanmadan geli\u015ftirme yaparken hala b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Uygulamalar\u0131nda Mod\u00fcl Deseni: Vaka Analizi<\/h2>\n<p>Mod\u00fcl Deseni'nin teorik faydalar\u0131n\u0131 anlamak bir \u015fey, bu faydalar\u0131n ger\u00e7ek bir projede nas\u0131l somutla\u015ft\u0131\u011f\u0131n\u0131 g\u00f6rmek ise bamba\u015fka bir \u015feydir. B\u00fcy\u00fck \u00f6l\u00e7ekli bir web uygulamas\u0131, \u00f6rne\u011fin karma\u015f\u0131k bir e-ticaret platformu veya tek sayfal\u0131k bir y\u00f6netim paneli (SPA - Single Page Application) geli\u015ftirirken, Mod\u00fcl Deseni'nin sa\u011flad\u0131\u011f\u0131 d\u00fczen ve y\u00f6netilebilirlik kritik hale gelir. Bu t\u00fcr uygulamalarda onlarca, hatta y\u00fczlerce farkl\u0131 bile\u015fen ve i\u015flevsellik bir araya gelir. Bu karma\u015f\u0131k yap\u0131y\u0131 Mod\u00fcl Deseni olmadan y\u00f6netmeye \u00e7al\u0131\u015fmak, k\u0131sa s\u00fcrede bir kabusa d\u00f6n\u00fc\u015febilir.<\/p>\n<p>Hayal edin ki, bir e-ticaret sitesi geli\u015ftiriyorsunuz. Bu sitede kullan\u0131c\u0131 sepeti y\u00f6netimi, \u00fcr\u00fcn listeleme ve filtreleme, kullan\u0131c\u0131 profili g\u00f6r\u00fcnt\u00fcleme ve g\u00fcncelleme, sipari\u015f takibi gibi bir\u00e7ok farkl\u0131 i\u015flevsellik bulunmaktad\u0131r. E\u011fer bu i\u015flevselliklerin her birini global kapsamda tan\u0131mlanan de\u011fi\u015fkenler ve fonksiyonlarla y\u00f6netmeye kalksayd\u0131k, k\u0131sa s\u00fcrede a\u015fa\u011f\u0131daki sorunlarla kar\u015f\u0131la\u015f\u0131rd\u0131k:<\/p>\n<ul>\n<li><strong>Ad Alan\u0131 \u00c7ak\u0131\u015fmalar\u0131:<\/strong> Hem sepet mod\u00fcl\u00fc hem de \u00fcr\u00fcn mod\u00fcl\u00fc i\u00e7in 'addItem' ad\u0131nda bir fonksiyon tan\u0131mlam\u0131\u015f olabilirdik. Bu durumda, hangi 'addItem'\u0131n \u00e7a\u011fr\u0131laca\u011f\u0131 belirsizle\u015fir veya biri di\u011ferini ezerdi.<\/li>\n<li><strong>Veri G\u00fcvenli\u011fi:<\/strong> Sepet toplam\u0131n\u0131 tutan bir de\u011fi\u015fken, yanl\u0131\u015fl\u0131kla veya k\u00f6t\u00fc niyetle d\u0131\u015far\u0131dan de\u011fi\u015ftirilebilir ve bu da sipari\u015f hatalar\u0131na yol a\u00e7abilirdi.<\/li>\n<li><strong>Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi:<\/strong> Bir bile\u015fenin hangi di\u011fer bile\u015fenlere ba\u011fl\u0131 oldu\u011funu anlamak zorla\u015f\u0131r, bu da kodun okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 zorla\u015ft\u0131r\u0131rd\u0131.<\/li>\n<li><strong>Test Edilebilirlik:<\/strong> T\u00fcm kodun birbirine s\u0131k\u0131ca ba\u011fl\u0131 oldu\u011fu bir senaryoda, ba\u011f\u0131ms\u0131z birim testleri yazmak neredeyse imkans\u0131z hale gelirdi.<\/li>\n<\/ul>\n<p>\u0130\u015fte bu noktada Mod\u00fcl Deseni, kurtar\u0131c\u0131 rol oynar. Her bir i\u015flevselli\u011fi ayr\u0131 bir mod\u00fcl olarak tasarlayabiliriz. \u00d6rne\u011fin:<\/p>\n<ol>\n<li><strong>Sepet Mod\u00fcl\u00fc (<code>CartModule<\/code>):<\/strong> Bu mod\u00fcl, kullan\u0131c\u0131n\u0131n sepetindeki \u00fcr\u00fcnleri, sepet toplam\u0131n\u0131 ve sepetle ilgili t\u00fcm i\u015flemleri (\u00fcr\u00fcn ekleme, \u00e7\u0131karma, miktar g\u00fcncelleme, sepeti bo\u015faltma, toplam\u0131 hesaplama) kaps\u00fcller. Sepet i\u00e7indeki \u00fcr\u00fcn listesi gibi veriler \u00f6zel (private) tutulur, d\u0131\u015f d\u00fcnyaya sadece <code>addItem(item)<\/code>, <code>removeItem(itemId)<\/code>, <code>getCartTotal()<\/code>, <code>getCartItems()<\/code> gibi public metotlar sunulur. Bu sayede, sepetin i\u00e7 i\u015fleyi\u015fi d\u0131\u015far\u0131dan g\u00fcvende tutulur ve sepetin durumu sadece kendi metotlar\u0131 arac\u0131l\u0131\u011f\u0131yla de\u011fi\u015ftirilebilir.<\/li>\n<pre><code>\nvar CartModule = (function() {\n    var items = []; \/\/ Private: Sepet i\u00e7indeki \u00fcr\u00fcnler\n    var TAX_RATE = 0.08; \/\/ Private: Vergi oran\u0131\n\n    function calculateTotal() { \/\/ Private: Toplam\u0131 hesaplama metodu\n        var total = items.reduce((sum, item) => sum + item.price * item.quantity, 0);\n        return total * (1 + TAX_RATE);\n    }\n\n    return {\n        addItem: function(item) {\n            items.push(item);\n            console.log(item.name + \" sepete eklendi.\");\n        },\n        removeItem: function(itemId) {\n            items = items.filter(item => item.id !== itemId);\n            console.log(\"\u00dcr\u00fcn sepetten \u00e7\u0131kar\u0131ld\u0131.\");\n        },\n        getCartTotal: function() {\n            return calculateTotal(); \/\/ Private metodu \u00e7a\u011f\u0131r\u0131r\n        },\n        getCartItems: function() {\n            return [...items]; \/\/ Items dizisinin kopyas\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr, orijinali korur\n        }\n    };\n})();\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi\nCartModule.addItem({ id: 1, name: \"Laptop\", price: 1200, quantity: 1 });\nCartModule.addItem({ id: 2, name: \"Mouse\", price: 25, quantity: 2 });\nconsole.log(\"Sepet Toplam\u0131: \" + CartModule.getCartTotal().toFixed(2)); \/\/ \u00d6rn: 1350.00 (vergi dahil)\nconsole.log(CartModule.getCartItems()); \/\/ Sepet i\u00e7eri\u011fini g\u00f6sterir\n\/\/ CartModule.items; \/\/ undefined - private oldu\u011fu i\u00e7in eri\u015filemez\n    <\/pre>\n<p><\/code><\/p>\n<li><strong>\u00dcr\u00fcn Mod\u00fcl\u00fc (<code>ProductModule<\/code>):<\/strong> \u00dcr\u00fcn listesi verilerini, \u00fcr\u00fcn detaylar\u0131n\u0131 getirme, \u00fcr\u00fcnleri filtreleme gibi i\u015flevleri bar\u0131nd\u0131r\u0131r. \u00dcr\u00fcn verileri bir API'den gelebilir veya statik olarak tan\u0131mlanabilir. Bu mod\u00fcl\u00fcn <code>getProducts()<\/code>, <code>getProductById(id)<\/code>, <code>filterProducts(criteria)<\/code> gibi public metotlar\u0131 olur.<\/li>\n<li><strong>Kullan\u0131c\u0131 Mod\u00fcl\u00fc (<code>UserModule<\/code>):<\/strong> Kullan\u0131c\u0131 oturumunu y\u00f6netir, kullan\u0131c\u0131 bilgilerini al\u0131r\/g\u00fcnceller, giri\u015f\/\u00e7\u0131k\u0131\u015f i\u015flemlerini yapar. <code>login(username, password)<\/code>, <code>logout()<\/code>, <code>getUserInfo()<\/code> gibi metotlar\u0131 olabilir.<\/li>\n<\/ol>\n<p>Bu mod\u00fcler yap\u0131land\u0131rman\u0131n say\u0131s\u0131z faydas\u0131 vard\u0131r:<\/p>\n<ul>\n<li><strong>Kolay Test Edilebilirlik:<\/strong> Her mod\u00fcl ba\u011f\u0131ms\u0131z oldu\u011fu i\u00e7in, di\u011fer mod\u00fcllere ihtiya\u00e7 duymadan kendi ba\u015f\u0131na test edilebilir. Bu, birim testlerinin yaz\u0131lmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r ve hata ay\u0131klama s\u00fcrecini h\u0131zland\u0131r\u0131r.<\/li>\n<li><strong>Tak\u0131m \u00c7al\u0131\u015fmas\u0131na Uygunluk:<\/strong> Farkl\u0131 geli\u015ftiriciler, birbirlerinin koduna m\u00fcdahale etme riski olmadan farkl\u0131 mod\u00fcller \u00fczerinde e\u015f zamanl\u0131 \u00e7al\u0131\u015fabilirler. Her mod\u00fcl\u00fcn sorumluluk alan\u0131 net bir \u015fekilde belirlenmi\u015ftir.<\/li>\n<li><strong>Ad Alan\u0131 \u00c7ak\u0131\u015fmalar\u0131n\u0131n \u00d6nlenmesi:<\/strong> Her mod\u00fcl\u00fcn kendi \u00f6zel kapsam\u0131 oldu\u011fundan, global ad alan\u0131 kirlili\u011finin \u00f6n\u00fcne ge\u00e7ilir ve isim \u00e7ak\u0131\u015fmalar\u0131 riski ortadan kalkar.<\/li>\n<li><strong>Kodun Yeniden Kullan\u0131labilirli\u011fi:<\/strong> \u0130yi tasarlanm\u0131\u015f mod\u00fcller, farkl\u0131 projelerde veya uygulaman\u0131n farkl\u0131 b\u00f6l\u00fcmlerinde kolayca yeniden kullan\u0131labilir. \u00d6rne\u011fin, ayn\u0131 <code>CartModule<\/code>'u hem ana e-ticaret sitesinde hem de mobil uygulamas\u0131n\u0131n web s\u00fcr\u00fcm\u00fcnde kullanabiliriz.<\/li>\n<li><strong>Bak\u0131m Kolayl\u0131\u011f\u0131:<\/strong> Bir mod\u00fcldeki bir hatay\u0131 d\u00fczeltmek veya bir \u00f6zelli\u011fi g\u00fcncellemek istedi\u011fimizde, sadece o mod\u00fcle odaklanabiliriz. De\u011fi\u015fikliklerin uygulaman\u0131n di\u011fer b\u00f6l\u00fcmlerine istenmeyen etkileri olma olas\u0131l\u0131\u011f\u0131 azal\u0131r.<\/li>\n<li><strong>\u00d6l\u00e7eklenebilirlik:<\/strong> Uygulama b\u00fcy\u00fcd\u00fck\u00e7e, yeni i\u015flevsellikler kolayca yeni mod\u00fcller olarak eklenebilir veya mevcut mod\u00fcller geni\u015fletilebilir, bu da projenin uzun vadede s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131r\u0131r.<\/li>\n<\/ul>\n<p>K\u0131sacas\u0131, Mod\u00fcl Deseni, karma\u015f\u0131k JavaScript projelerini k\u00fc\u00e7\u00fck, y\u00f6netilebilir ve i\u015f birli\u011fine a\u00e7\u0131k par\u00e7alara ay\u0131rarak geli\u015ftirme s\u00fcrecini basitle\u015ftirir ve daha sa\u011flam, hatas\u0131z uygulamalar in\u015fa etmenin yolunu a\u00e7ar. Bu, \u00f6zellikle b\u00fcy\u00fck ekiplerde ve s\u00fcrekli b\u00fcy\u00fcyen projelerde vazge\u00e7ilmez bir yakla\u015f\u0131md\u0131r.<\/p>\n<h2>Modern JavaScript ve Mod\u00fcl Deseni Aras\u0131ndaki \u0130li\u015fki Nedir?<\/h2>\n<p>JavaScript ekosistemi, ES6 (ECMAScript 2015) ile birlikte \u00f6nemli bir d\u00f6n\u00fc\u015f\u00fcm ge\u00e7irdi ve bu d\u00f6n\u00fc\u015f\u00fcm\u00fcn en dikkat \u00e7ekici y\u00f6nlerinden biri de yerle\u015fik mod\u00fcl sisteminin (<code>import<\/code>\/<code>export<\/code>) getirilmesiydi. Bu modern yakla\u015f\u0131m, geli\u015ftiricilere do\u011fal ve standart bir yol sunarak kodu mod\u00fcler hale getirme imkan\u0131 tan\u0131d\u0131. Peki, ES6 mod\u00fclleri varken Klasik Mod\u00fcl Deseni hala ge\u00e7erli mi, yoksa tamamen mi demode oldu? Bu soruya verilecek yan\u0131t, hem JavaScript'in tarihsel geli\u015fimini anlamay\u0131 hem de farkl\u0131 kullan\u0131m senaryolar\u0131n\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmay\u0131 gerektirir.<\/p>\n<p>\u00d6ncelikle, ES6 mod\u00fcllerinin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131na k\u0131saca de\u011finelim. ES6, <code>import<\/code> ve <code>export<\/code> anahtar kelimeleriyle dosyalar aras\u0131 ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmeyi ve kodu mod\u00fcler par\u00e7alara ay\u0131rmay\u0131 m\u00fcmk\u00fcn k\u0131ld\u0131. Her bir JavaScript dosyas\u0131, kendili\u011finden bir mod\u00fcl gibi davranabilir ve i\u00e7indeki fonksiyonlar\u0131, de\u011fi\u015fkenleri veya s\u0131n\u0131flar\u0131 <code>export<\/code> ederek d\u0131\u015f d\u00fcnyaya a\u00e7abilir. Ba\u015fka bir dosya ise <code>import<\/code> anahtar kelimesiyle bu d\u0131\u015fa aktar\u0131lan \u00fcyeleri kendi i\u00e7ine dahil edebilir. Bu sistem, Node.js'teki CommonJS veya RequireJS'teki AMD gibi \u00fc\u00e7\u00fcnc\u00fc taraf mod\u00fcl y\u00fckleyicilerine olan ihtiyac\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde ortadan kald\u0131rd\u0131. ES6 mod\u00fclleri, statik analize imkan tan\u0131r (yani, kod \u00e7al\u0131\u015fmadan \u00f6nce ba\u011f\u0131ml\u0131l\u0131klar belirlenebilir), \u00e7ak\u0131\u015fma riski olmadan isim uzaylar\u0131n\u0131 izole eder ve hatta a\u011f \u00fczerinden mod\u00fcllerin verimli bir \u015fekilde y\u00fcklenmesini sa\u011flayacak mekanizmalar sunar. Bu modern mod\u00fcl sistemi, \u00f6zellikle taray\u0131c\u0131larda <code>type=\"module\"<\/code> \u00f6zelli\u011fi sayesinde ve Node.js ortam\u0131nda sorunsuz bir \u015fekilde \u00e7al\u0131\u015f\u0131r.<\/p>\n<pre><code>\n\/\/ myModule.js dosyas\u0131\nexport const PI = 3.14;\n\nexport function topla(a, b) {\n  return a + b;\n}\n\nexport default class Hesaplayici {\n  constructor(deger) {\n    this.deger = deger;\n  }\n  carp(carpan) {\n    return this.deger * carpan;\n  }\n}\n\n\/\/ app.js dosyas\u0131\nimport { PI, topla } from '.\/myModule.js';\nimport Hesaplayici from '.\/myModule.js';\n\nconsole.log(PI); \/\/ 3.14\nconsole.log(topla(5, 3)); \/\/ 8\n\nconst calc = new Hesaplayici(10);\nconsole.log(calc.carp(5)); \/\/ 50\n<\/pre>\n<p><\/code><\/p>\n<p>Peki, ES6 mod\u00fcllerinin bu kadar avantajl\u0131 oldu\u011fu bir ortamda, Klasik Mod\u00fcl Deseni neden hala \u00f6nemini koruyor olabilir? Cevap, esasen uyumluluk, geli\u015fim s\u00fcreci ve bazen de belirli mimari tercihlerde yatar. Klasik Mod\u00fcl Deseni, ES6 \u00f6ncesi JavaScript d\u00fcnyas\u0131nda ortaya \u00e7\u0131km\u0131\u015f ve y\u0131llarca projelerde ba\u015far\u0131yla kullan\u0131lm\u0131\u015ft\u0131r. Bu nedenle, h\u00e2l\u00e2 bir\u00e7ok eski kod taban\u0131nda (legacy projects) bu desenle kar\u015f\u0131la\u015fmak m\u00fcmk\u00fcnd\u00fcr. Eski taray\u0131c\u0131lar\u0131n ES6 mod\u00fcllerini do\u011frudan desteklememesi veya projenin bir derleme (build) s\u00fcrecine sahip olmamas\u0131 durumlar\u0131nda, Klasik Mod\u00fcl Deseni hala pratik bir \u00e7\u00f6z\u00fcm sunar. \u00d6rne\u011fin, \u00e7ok basit bir web sitesi geli\u015ftiriyorsan\u0131z ve karma\u015f\u0131k bir build arac\u0131 (Webpack, Rollup vb.) kurmak istemiyorsan\u0131z, Mod\u00fcl Deseni ile global ad alan\u0131 kirlili\u011fini \u00f6nleyebilir ve kodunuzu d\u00fczenli tutabilirsiniz. Ayr\u0131ca, Mod\u00fcl Deseni'nin temelini olu\u015fturan IIFE ve closure kavramlar\u0131, JavaScript'in derinlemesine anla\u015f\u0131lmas\u0131 i\u00e7in hayati \u00f6neme sahiptir. Bu temel prensipleri kavramak, modern ES6 mod\u00fcllerini de daha etkili ve bilin\u00e7li kullanman\u0131za yard\u0131mc\u0131 olur, \u00e7\u00fcnk\u00fc asl\u0131nda ES6 mod\u00fclleri de perde arkas\u0131nda benzer kaps\u00fclleme ve kapsam mekanizmalar\u0131n\u0131 kullan\u0131r.<\/p>\n<div class=\"info-box\">\n  Uzman \u0130pucu: Klasik Mod\u00fcl Deseni, \u00f6zellikle ES6 \u00f6ncesi JavaScript ortamlar\u0131 i\u00e7in geli\u015ftirilmi\u015f olsa da, JavaScript'in temel ta\u015f\u0131 olan closure mekanizmas\u0131n\u0131 ve veri gizleme prensiplerini m\u00fckemmel bir \u015fekilde g\u00f6sterir. Bu prensipleri anlamak, modern ES6 mod\u00fclleriyle \u00e7al\u0131\u015f\u0131rken de daha bilin\u00e7li ve sa\u011flam kod yazman\u0131za yard\u0131mc\u0131 olur.\n<\/div>\n<p>\u00d6zetle, modern JavaScript projelerinde genellikle ES6 mod\u00fclleri (<code>import<\/code>\/<code>export<\/code>) tercih edilmelidir \u00e7\u00fcnk\u00fc bunlar dilin do\u011fal mod\u00fcl sistemi olup daha iyi statik analiz, optimize edilmi\u015f y\u00fckleme ve daha temiz bir s\u00f6zdizimi sunarlar. Ancak, Klasik Mod\u00fcl Deseni'nin de belirli durumlarda (eski taray\u0131c\u0131 deste\u011fi, build arac\u0131 olmadan geli\u015ftirme veya mevcut legacy kod tabanlar\u0131yla \u00e7al\u0131\u015f\u0131rken) hala ge\u00e7erlili\u011fini korudu\u011funu unutmamak gerekir. Dahas\u0131, Mod\u00fcl Deseni'nin alt\u0131nda yatan kaps\u00fclleme, veri gizleme ve closure gibi temel kavramlar\u0131 anlamak, herhangi bir JavaScript geli\u015ftiricisi i\u00e7in paha bi\u00e7ilmez bir beceridir ve modern mod\u00fcl sistemleriyle dahi bu prensiplerin \u00f6nemini s\u00fcrd\u00fcrd\u00fc\u011f\u00fcn\u00fc g\u00f6sterir. Dolay\u0131s\u0131yla, her iki yakla\u015f\u0131m\u0131 da bilmek, bir JavaScript geli\u015ftiricisinin ara\u00e7 setini zenginle\u015ftiren de\u011ferli bir yetenektir.<\/p>\n<h2>Mod\u00fcl Desenini Kullan\u0131rken Nelere Dikkat Etmeliyiz? \u0130pu\u00e7lar\u0131 ve P\u00fcf Noktalar\u0131<\/h2>\n<p>Mod\u00fcl Deseni, kod organizasyonu ve veri gizleme a\u00e7\u0131s\u0131ndan bir\u00e7ok avantaj sunsa da, her tasar\u0131m deseni gibi kendine \u00f6zg\u00fc zorluklar\u0131 ve dikkat edilmesi gereken noktalar\u0131 vard\u0131r. Bu desenin potansiyelini tam olarak kullanmak ve olas\u0131 sorunlardan ka\u00e7\u0131nmak i\u00e7in baz\u0131 ipu\u00e7lar\u0131 ve p\u00fcf noktalar\u0131na hakim olmak \u00f6nemlidir. Do\u011fru kullan\u0131ld\u0131\u011f\u0131nda, Mod\u00fcl Deseni uygulamalar\u0131n\u0131z\u0131n kalitesini art\u0131r\u0131rken, yanl\u0131\u015f kullan\u0131ld\u0131\u011f\u0131nda baz\u0131 beklenmedik sonu\u00e7lara yol a\u00e7abilir.<\/p>\n<p>\u00d6ncelikle, <strong>performans ve bellek y\u00f6netimi<\/strong> konusunda dikkatli olmak gerekir. Mod\u00fcl Deseni, kapan\u0131mlar (closures) \u00fczerine kurulu oldu\u011fundan, her bir mod\u00fcl \u00f6rne\u011fi kendi \u00f6zel kapsam\u0131ndaki de\u011fi\u015fkenleri canl\u0131 tutar. Bu durum, mod\u00fcllerin gerekti\u011finden daha fazla say\u0131da veya gereksiz yere b\u00fcy\u00fck veri setleriyle olu\u015fturulmas\u0131 halinde, bellekte gereksiz yer kaplamas\u0131na yol a\u00e7abilir. \u00d6zellikle, bir mod\u00fcl\u00fcn i\u00e7inde tan\u0131mlanan b\u00fcy\u00fck nesnelerin veya dizilerin uzun s\u00fcre bellekte kalmas\u0131, bellek s\u0131z\u0131nt\u0131lar\u0131na neden olabilir. Bu durumu \u00f6nlemek i\u00e7in, mod\u00fcl i\u00e7indeki \u00f6zel de\u011fi\u015fkenlerin \u00f6mr\u00fcn\u00fc ve boyutunu g\u00f6z \u00f6n\u00fcnde bulundurmal\u0131y\u0131z. E\u011fer bir veri sadece belirli bir i\u015flem i\u00e7in gerekiyorsa, onu mod\u00fcl\u00fcn \u00f6zel kapsam\u0131ndan ziyade, ilgili metodun yerel kapsam\u0131na dahil etmek daha iyi bir yakla\u015f\u0131md\u0131r. Ayr\u0131ca, mod\u00fcl\u00fcn i\u015fi bitti\u011finde, e\u011fer garbage collector'\u0131n onu temizleyebilmesi gerekiyorsa, global referanslar\u0131n\u0131 null'a e\u015fitleyerek bu s\u00fcreci h\u0131zland\u0131rabiliriz.<\/p>\n<p>\u0130kinci \u00f6nemli nokta <strong>ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimi<\/strong>dir. B\u00fcy\u00fck uygulamalarda mod\u00fcller birbirine ba\u011f\u0131ml\u0131 olabilir. \u00d6rne\u011fin, bir \"Sepet Mod\u00fcl\u00fc\", \"\u00dcr\u00fcn Mod\u00fcl\u00fc\"nden \u00fcr\u00fcn detaylar\u0131n\u0131 almak isteyebilir. Klasik Mod\u00fcl Deseni'nde bu ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmek, \u00f6zellikle birden fazla dosyan\u0131z varsa biraz daha karma\u015f\u0131k olabilir. Bir \u00e7\u00f6z\u00fcm, ba\u011f\u0131ml\u0131l\u0131klar\u0131 mod\u00fcl\u00fcn IIFE'sine parametre olarak ge\u00e7irmektir. Bu, mod\u00fcl\u00fcn hangi di\u011fer mod\u00fcllere ba\u011fl\u0131 oldu\u011funu a\u00e7\u0131k\u00e7a belirtir ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n daha kolay y\u00f6netilmesini sa\u011flar. \u00d6rne\u011fin: <code>(function(ProductModule) { ... })(ProductModule);<\/code>. Bir di\u011fer yakla\u015f\u0131m ise RequireJS gibi bir mod\u00fcl y\u00fckleyici kullanmakt\u0131r, ancak bu modern ES6 mod\u00fcllerinin yayg\u0131nla\u015fmas\u0131yla daha az tercih edilir hale gelmi\u015ftir. Ba\u011f\u0131ml\u0131l\u0131klar\u0131 a\u00e7\u0131k\u00e7a tan\u0131mlamak, kodun okunabilirli\u011fini art\u0131r\u0131r ve mod\u00fcller aras\u0131ndaki ili\u015fkileri netle\u015ftirir.<\/p>\n<div class=\"info-box\">\n  Uzman \u0130pucu: Mod\u00fcl Deseni'nde ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmenin en temiz yollar\u0131ndan biri, ba\u011f\u0131ml\u0131 olunan mod\u00fclleri IIFE'ye parametre olarak ge\u00e7irmektir. Bu, mod\u00fcl\u00fcn d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 belirgin hale getirir ve test yazarken mock'lama yapmay\u0131 kolayla\u015ft\u0131r\u0131r.\n<\/div>\n<p>\u00dc\u00e7\u00fcnc\u00fc olarak, <strong>test edilebilirlik<\/strong> Mod\u00fcl Deseni'nin do\u011fal bir avantaj\u0131d\u0131r, ancak \u00f6zel (private) \u00fcyelerin test edilmesi zor olabilir. Bir mod\u00fcl\u00fcn i\u00e7indeki \u00f6zel bir fonksiyonun veya de\u011fi\u015fkenin davran\u0131\u015f\u0131n\u0131 test etmek i\u00e7in, genellikle o \u00f6zel \u00fcyeye ba\u011f\u0131ml\u0131 olan public metotlar arac\u0131l\u0131\u011f\u0131yla testler yazman\u0131z gerekir. Bu, baz\u0131 durumlarda dolayl\u0131 testlere yol a\u00e7abilir. E\u011fer ger\u00e7ekten bir private \u00fcyeyi do\u011frudan test etmeniz gerekiyorsa, test ortam\u0131nda mod\u00fcl\u00fcn i\u00e7 yap\u0131s\u0131n\u0131 de\u011fi\u015ftirecek (\u00f6rne\u011fin, \u00f6zel \u00fcyeleri public hale getirecek) ge\u00e7ici \u00e7\u00f6z\u00fcmler (\u00f6rne\u011fin, bir test helper'\u0131 arac\u0131l\u0131\u011f\u0131yla) d\u00fc\u015f\u00fcnebilirsiniz. Ancak genel kural, mod\u00fcl\u00fcn d\u0131\u015f aray\u00fcz\u00fcn\u00fc (public API) test etmeye odaklanmakt\u0131r, \u00e7\u00fcnk\u00fc kullan\u0131c\u0131lar\u0131n\u0131z\u0131n veya di\u011fer kod par\u00e7alar\u0131n\u0131n mod\u00fcl\u00fcn\u00fczle etkile\u015fim kuraca\u011f\u0131 tek yol budur.<\/p>\n<p>Son olarak, <strong>hata ay\u0131klama (debugging)<\/strong> \u00f6zel \u00fcyelerle \u00e7al\u0131\u015f\u0131rken biraz daha zorlay\u0131c\u0131 olabilir. Taray\u0131c\u0131lar\u0131n geli\u015ftirici ara\u00e7lar\u0131, genellikle closure i\u00e7inde saklanan \u00f6zel de\u011fi\u015fkenleri veya metotlar\u0131 do\u011frudan incelemenize izin vermez. <code>console.log<\/code> ifadeleri veya geli\u015ftirici ara\u00e7lar\u0131ndaki kesme noktalar\u0131 (breakpoints) ile mod\u00fcl\u00fcn i\u00e7 i\u015fleyi\u015fini izlemek m\u00fcmk\u00fcn olsa da, do\u011frudan bir denetim veya manip\u00fclasyon genellikle yap\u0131lamaz. Bu nedenle, mod\u00fcl\u00fcn\u00fcz\u00fc tasarlarken, kritik i\u00e7 durumlar\u0131 veya ara sonu\u00e7lar\u0131, gerekirse hata ay\u0131klama s\u0131ras\u0131nda eri\u015filebilecek \"getter\" metotlar\u0131 arac\u0131l\u0131\u011f\u0131yla d\u0131\u015far\u0131ya a\u00e7may\u0131 d\u00fc\u015f\u00fcnebilirsiniz. Ancak, bu t\u00fcr getter'lar\u0131n sadece hata ay\u0131klama ama\u00e7l\u0131 olmas\u0131 ve \u00fcretim ortam\u0131nda kullan\u0131lmas\u0131 gerekmeyen durumlarda dikkatli olunmas\u0131 \u00f6nemlidir. Mod\u00fcl\u00fcn API'sini m\u00fcmk\u00fcn oldu\u011funca basit ve odaklanm\u0131\u015f tutmak, hem kullan\u0131m\u0131n\u0131 hem de bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131racakt\u0131r. Bu dikkat noktalar\u0131yla, Mod\u00fcl Deseni'ni projelerinizde daha verimli ve sorunsuz bir \u015fekilde kullanabilirsiniz.<\/p>\n<h2>Sonu\u00e7: Temiz ve S\u00fcrd\u00fcr\u00fclebilir Kod \u0130\u00e7in Mod\u00fcl Deseni<\/h2>\n<p>JavaScript d\u00fcnyas\u0131nda kodun d\u00fczenini, y\u00f6netilebilirli\u011fini ve kalitesini art\u0131rmak, her geli\u015ftiricinin \u00f6ncelikli hedefidir. Mod\u00fcl Deseni, bu hedefe ula\u015fmak i\u00e7in geli\u015ftiricilere g\u00fc\u00e7l\u00fc ve zamanla kan\u0131tlanm\u0131\u015f bir ara\u00e7 sunar. Bu makale boyunca ele ald\u0131\u011f\u0131m\u0131z gibi, Mod\u00fcl Deseni'nin temelinde yatan IIFE (Immediately Invoked Function Expression) ve closure (kapan\u0131m) mekanizmalar\u0131 sayesinde, global ad alan\u0131 kirlili\u011fi \u00f6nlenir, adland\u0131rma \u00e7ak\u0131\u015fmalar\u0131 ortadan kalkar ve en \u00f6nemlisi, veri gizleme (encapsulation) prensibi etkin bir \u015fekilde uygulan\u0131r. Bu prensipler, mod\u00fcl\u00fcn i\u00e7 i\u015fleyi\u015finin d\u0131\u015far\u0131dan gelebilecek istenmeyen m\u00fcdahalelerden korunmas\u0131n\u0131 sa\u011flar ve yaln\u0131zca mod\u00fcl\u00fcn belirledi\u011fi bir public aray\u00fcz \u00fczerinden kontroll\u00fc etkile\u015fime izin verir.<\/p>\n<p>Mod\u00fcl Deseni'nin sundu\u011fu bu yap\u0131sal faydalar, b\u00fcy\u00fck \u00f6l\u00e7ekli ve karma\u015f\u0131k JavaScript uygulamalar\u0131nda kendini g\u00f6sterir. Ger\u00e7ek d\u00fcnya vaka analizlerimizde de g\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, bir e-ticaret platformunda sepet, \u00fcr\u00fcn veya kullan\u0131c\u0131 y\u00f6netimi gibi farkl\u0131 i\u015flevselliklerin ayr\u0131 mod\u00fcller halinde tasarlanmas\u0131, kodun daha kolay test edilebilir, daha az hatal\u0131 ve tak\u0131m \u00e7al\u0131\u015fmas\u0131na daha uygun olmas\u0131n\u0131 sa\u011flar. Her bir mod\u00fcl, kendi sorumluluk alan\u0131n\u0131 net bir \u015fekilde belirledi\u011fi i\u00e7in, bir mod\u00fcldeki de\u011fi\u015fiklikler di\u011fer mod\u00fclleri do\u011frudan etkilemez, bu da geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r ve bak\u0131m maliyetlerini d\u00fc\u015f\u00fcr\u00fcr. Mod\u00fcl geni\u015fletme ve a\u00e7\u0131\u011fa \u00e7\u0131karan mod\u00fcl deseni gibi varyasyonlar\u0131 ise, desenin farkl\u0131 ihtiya\u00e7lara g\u00f6re esnekli\u011fini ortaya koyarak geli\u015ftiricilere daha fazla se\u00e7enek sunar.<\/p>\n<p>Modern JavaScript d\u00fcnyas\u0131nda ES6 mod\u00fclleri (<code>import<\/code>\/<code>export<\/code>) yayg\u0131nla\u015fm\u0131\u015f olsa da, Klasik Mod\u00fcl Deseni'nin \u00f6\u011frenilmesi ve anla\u015f\u0131lmas\u0131 hala b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Eski taray\u0131c\u0131 uyumlulu\u011fu gerektiren projeler, build ara\u00e7lar\u0131 kullanmadan geli\u015ftirme yap\u0131lan ortamlar veya mevcut legacy kod tabanlar\u0131yla \u00e7al\u0131\u015f\u0131rken Mod\u00fcl Deseni hala ge\u00e7erli ve g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcmd\u00fcr. Daha da \u00f6nemlisi, Mod\u00fcl Deseni'nin temelini olu\u015fturan kaps\u00fclleme, veri gizleme ve closure gibi kavramlar, modern JavaScript'in de temel yap\u0131 ta\u015flar\u0131d\u0131r. Bu kavramlar\u0131 derinden anlamak, geli\u015ftiricilerin sadece Mod\u00fcl Deseni'ni de\u011fil, ayn\u0131 zamanda modern mod\u00fcl sistemlerini ve di\u011fer tasar\u0131m desenlerini de daha bilin\u00e7li ve etkili bir \u015fekilde kullanmas\u0131n\u0131 sa\u011flar. Dolay\u0131s\u0131yla, Mod\u00fcl Deseni, JavaScript geli\u015ftiricileri i\u00e7in sadece bir kodlama tekni\u011fi de\u011fil, ayn\u0131 zamanda temel programlama prensiplerini kavramak ad\u0131na da de\u011ferli bir ad\u0131md\u0131r. Uygulamalar\u0131n\u0131zda temiz, d\u00fczenli ve s\u00fcrd\u00fcr\u00fclebilir bir kod taban\u0131 olu\u015fturmak i\u00e7in Mod\u00fcl Deseni'ni mutlaka ara\u00e7 setinize dahil etmelisiniz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<ul>\n<li>\n        <strong>Mod\u00fcl Deseni sadece JavaScript'e mi \u00f6zeldir?<\/strong><\/p>\n<p>Hay\u0131r, mod\u00fclerlik ve veri gizleme prensipleri bir\u00e7ok programlama dilinde farkl\u0131 \u015fekillerde uygulan\u0131r. \u00d6rne\u011fin, C++, Java veya C# gibi nesne y\u00f6nelimli dillerde s\u0131n\u0131flar ve eri\u015fim belirleyiciler (public, private, protected) benzer bir kaps\u00fclleme ve veri gizleme amac\u0131 ta\u015f\u0131r. Ancak JavaScript'teki Mod\u00fcl Deseni'nin uygulan\u0131\u015f\u0131 (IIFE ve closure kullan\u0131m\u0131yla) dile \u00f6zg\u00fcd\u00fcr ve dinamik do\u011fas\u0131na uygun bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<\/li>\n<li>\n        <strong>ES6 mod\u00fclleri varken neden Mod\u00fcl Deseni \u00f6\u011frenmeliyim?<\/strong><\/p>\n<p>ES6 mod\u00fclleri (<code>import<\/code>\/<code>export<\/code>), modern JavaScript projelerinde tercih edilen standart mod\u00fcl sistemidir. Ancak Mod\u00fcl Deseni'ni \u00f6\u011frenmek, \u00f6zellikle eski taray\u0131c\u0131 uyumlulu\u011fu gerektiren projelerde, build ara\u00e7lar\u0131 olmadan geli\u015ftirme yaparken veya mevcut legacy kod tabanlar\u0131yla \u00e7al\u0131\u015f\u0131rken hala \u00e7ok de\u011ferlidir. Ayr\u0131ca, Mod\u00fcl Deseni, kaps\u00fclleme ve veri gizleme gibi temel programlama prensiplerini anlaman\u0131za yard\u0131mc\u0131 olur. Bu prensipler, modern ES6 mod\u00fclleri de dahil olmak \u00fczere di\u011fer tasar\u0131m desenlerini ve kod organizasyon tekniklerini daha iyi kavraman\u0131z i\u00e7in temel olu\u015fturur.<\/p>\n<\/li>\n<li>\n        <strong>Mod\u00fcl Deseni performans sorunlar\u0131na yol a\u00e7ar m\u0131?<\/strong><\/p>\n<p>A\u015f\u0131r\u0131 karma\u015f\u0131k veya yanl\u0131\u015f yap\u0131land\u0131r\u0131lm\u0131\u015f mod\u00fcller, \u00f6zellikle \u00e7ok fazla closure olu\u015fturulmas\u0131 durumunda veya b\u00fcy\u00fck veri yap\u0131lar\u0131n\u0131 gereksiz yere canl\u0131 tutmas\u0131 halinde bellek t\u00fcketimi a\u00e7\u0131s\u0131ndan k\u00fc\u00e7\u00fck performans etkileri yaratabilir. Ancak \u00e7o\u011fu durumda, bu etki modern JavaScript motorlar\u0131 taraf\u0131ndan optimize edildi\u011fi i\u00e7in ihmal edilebilir d\u00fczeydedir. \u0130yi tasarlanm\u0131\u015f ve optimize edilmi\u015f mod\u00fcller, genellikle performans sorunlar\u0131na yol a\u00e7mazlar. Bellek y\u00f6netimine dikkat etmek ve sadece gerekli olan veriyi closure i\u00e7inde tutmak, olas\u0131 sorunlar\u0131 \u00f6nlemeye yard\u0131mc\u0131 olur.<\/p>\n<\/li>\n<li>\n        <strong>Bir mod\u00fcl i\u00e7indeki \u00f6zel bir metoda veya de\u011fi\u015fkene d\u0131\u015far\u0131dan nas\u0131l eri\u015firim?<\/strong><\/p>\n<p>Mod\u00fcl Deseni'nin temel amac\u0131 veri gizleme oldu\u011fu i\u00e7in, mod\u00fcl i\u00e7indeki \u00f6zel (private) metotlara veya de\u011fi\u015fkenlere d\u0131\u015far\u0131dan do\u011frudan eri\u015fim sa\u011flamak m\u00fcmk\u00fcn de\u011fildir. E\u011fer bir private \u00fcyeye d\u0131\u015far\u0131dan kontroll\u00fc bir \u015fekilde eri\u015fmek veya manip\u00fcle etmek istiyorsan\u0131z, mod\u00fcl\u00fcn d\u00f6nd\u00fcrd\u00fc\u011f\u00fc public nesne i\u00e7inde bu \u00f6zel \u00fcye ile etkile\u015fime girecek bir \"getter\" (de\u011fer okuma) veya \"setter\" (de\u011fer atama) metodu sa\u011flamal\u0131s\u0131n\u0131z. Bu yakla\u015f\u0131m, mod\u00fcl\u00fcn API'si \u00fczerinden dolayl\u0131 ve g\u00fcvenli bir etkile\u015fim yolu sunar.<\/p>\n<\/li>\n<li>\n        <strong>Mod\u00fcl Deseni ile Singleton Deseni aras\u0131nda bir ili\u015fki var m\u0131?<\/strong><\/p>\n<p>Evet, Mod\u00fcl Deseni genellikle Singleton davran\u0131\u015f\u0131n\u0131 taklit etmek i\u00e7in kullan\u0131l\u0131r. IIFE yap\u0131s\u0131 sayesinde, mod\u00fcl kodu yaln\u0131zca bir kez \u00e7al\u0131\u015f\u0131r ve her zaman ayn\u0131 \u00f6rne\u011fi d\u00f6nd\u00fcr\u00fcr. Bu, mod\u00fcl\u00fcn sadece tek bir \u00f6rne\u011finin olmas\u0131n\u0131 ve bu \u00f6rne\u011fin uygulaman\u0131n tamam\u0131nda payla\u015f\u0131lmas\u0131n\u0131 sa\u011flar. Dolay\u0131s\u0131yla, Mod\u00fcl Deseni, JavaScript'te Singleton Deseni'ni uygulamak i\u00e7in yayg\u0131n ve etkili bir yoldur.<\/p>\n<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"JavaScript projelerinde kod karma\u015fas\u0131yla m\u0131 m\u00fccadele ediyorsunuz? Mod\u00fcl Deseni, veri gizleme ve kaps\u00fclleme ilkeleriyle daha okunabilir, s\u00fcrd\u00fcr\u00fclebilir ve&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":[129],"tags":[],"class_list":{"0":"post-35982","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-javascript","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>Mod\u00fcl Deseni: JavaScript Uygulamalar\u0131nda Temiz ve D\u00fczenli Kodlama Sanat\u0131<\/title>\n<meta name=\"description\" content=\"JavaScript projelerinde kod karma\u015fas\u0131yla m\u0131 m\u00fccadele ediyorsunuz? Mod\u00fcl Deseni, veri gizleme ve kaps\u00fclleme ilkeleriyle daha okunabilir, s\u00fcrd\u00fcr\u00fclebilir ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirmenize yard\u0131mc\u0131 olur. Bu desenin g\u00fcc\u00fcn\u00fc ke\u015ffedin ve projelerinizi bir \u00fcst seviyeye ta\u015f\u0131y\u0131n!\" \/>\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\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mod\u00fcl Deseni: JavaScript Uygulamalar\u0131nda Temiz ve D\u00fczenli Kodlama Sanat\u0131\" \/>\n<meta property=\"og:description\" content=\"JavaScript projelerinde kod karma\u015fas\u0131yla m\u0131 m\u00fccadele ediyorsunuz? Mod\u00fcl Deseni, veri gizleme ve kaps\u00fclleme ilkeleriyle daha okunabilir, s\u00fcrd\u00fcr\u00fclebilir ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirmenize yard\u0131mc\u0131 olur. Bu desenin g\u00fcc\u00fcn\u00fc ke\u015ffedin ve projelerinizi bir \u00fcst seviyeye ta\u015f\u0131y\u0131n!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-06T08:01:15+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=\"33 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Mod\u00fcl Deseni: JavaScript Uygulamalar\u0131nda Temiz ve D\u00fczenli Kodlama Sanat\u0131\",\"datePublished\":\"2025-12-06T08:01:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/\"},\"wordCount\":5833,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Javascript\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/\",\"name\":\"Mod\u00fcl Deseni: JavaScript Uygulamalar\u0131nda Temiz ve D\u00fczenli Kodlama Sanat\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-06T08:01:15+00:00\",\"description\":\"JavaScript projelerinde kod karma\u015fas\u0131yla m\u0131 m\u00fccadele ediyorsunuz? Mod\u00fcl Deseni, veri gizleme ve kaps\u00fclleme ilkeleriyle daha okunabilir, s\u00fcrd\u00fcr\u00fclebilir ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirmenize yard\u0131mc\u0131 olur. Bu desenin g\u00fcc\u00fcn\u00fc ke\u015ffedin ve projelerinizi bir \u00fcst seviyeye ta\u015f\u0131y\u0131n!\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mod\u00fcl Deseni: JavaScript Uygulamalar\u0131nda Temiz ve D\u00fczenli Kodlama Sanat\u0131\"}]},{\"@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":"Mod\u00fcl Deseni: JavaScript Uygulamalar\u0131nda Temiz ve D\u00fczenli Kodlama Sanat\u0131","description":"JavaScript projelerinde kod karma\u015fas\u0131yla m\u0131 m\u00fccadele ediyorsunuz? Mod\u00fcl Deseni, veri gizleme ve kaps\u00fclleme ilkeleriyle daha okunabilir, s\u00fcrd\u00fcr\u00fclebilir ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirmenize yard\u0131mc\u0131 olur. Bu desenin g\u00fcc\u00fcn\u00fc ke\u015ffedin ve projelerinizi bir \u00fcst seviyeye ta\u015f\u0131y\u0131n!","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\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/","og_locale":"tr_TR","og_type":"article","og_title":"Mod\u00fcl Deseni: JavaScript Uygulamalar\u0131nda Temiz ve D\u00fczenli Kodlama Sanat\u0131","og_description":"JavaScript projelerinde kod karma\u015fas\u0131yla m\u0131 m\u00fccadele ediyorsunuz? Mod\u00fcl Deseni, veri gizleme ve kaps\u00fclleme ilkeleriyle daha okunabilir, s\u00fcrd\u00fcr\u00fclebilir ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirmenize yard\u0131mc\u0131 olur. Bu desenin g\u00fcc\u00fcn\u00fc ke\u015ffedin ve projelerinizi bir \u00fcst seviyeye ta\u015f\u0131y\u0131n!","og_url":"https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-06T08:01:15+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"33 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Mod\u00fcl Deseni: JavaScript Uygulamalar\u0131nda Temiz ve D\u00fczenli Kodlama Sanat\u0131","datePublished":"2025-12-06T08:01:15+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/"},"wordCount":5833,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Javascript"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/","url":"https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/","name":"Mod\u00fcl Deseni: JavaScript Uygulamalar\u0131nda Temiz ve D\u00fczenli Kodlama Sanat\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-06T08:01:15+00:00","description":"JavaScript projelerinde kod karma\u015fas\u0131yla m\u0131 m\u00fccadele ediyorsunuz? Mod\u00fcl Deseni, veri gizleme ve kaps\u00fclleme ilkeleriyle daha okunabilir, s\u00fcrd\u00fcr\u00fclebilir ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirmenize yard\u0131mc\u0131 olur. Bu desenin g\u00fcc\u00fcn\u00fc ke\u015ffedin ve projelerinizi bir \u00fcst seviyeye ta\u015f\u0131y\u0131n!","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/modul-deseni-javascript-uygulamalarinda-temiz-ve-duzenli-kodlama-sanati\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Mod\u00fcl Deseni: JavaScript Uygulamalar\u0131nda Temiz ve D\u00fczenli Kodlama Sanat\u0131"}]},{"@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\/35982","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=35982"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35982\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35982"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35982"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35982"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}