{"id":34416,"date":"2025-11-16T11:00:50","date_gmt":"2025-11-16T08:00:50","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/"},"modified":"2025-11-16T11:00:50","modified_gmt":"2025-11-16T08:00:50","slug":"mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/","title":{"rendered":"Mastering BeanShell Hash Variables in Joget: The Most Basic &#038; Practical Guide"},"content":{"rendered":"<p><body><\/p>\n<p>Joget platformunda dinamik veri y\u00f6netimi ve otomasyon s\u00fcre\u00e7lerinde s\u0131k\u0131\u015f\u0131p m\u0131 kald\u0131n\u0131z? \u00d6zellikle formlar aras\u0131 ge\u00e7i\u015flerde veya d\u0131\u015f sistemlerle entegrasyonlarda karma\u015f\u0131k verileri kolayca ele almak ister misiniz? BeanShell Hash de\u011fi\u015fkenleri, tam da bu noktada devreye girerek Joget uygulamalar\u0131n\u0131zda g\u00fc\u00e7l\u00fc bir esneklik ve kontrol sa\u011fl\u0131yor. Bu rehberde, BeanShell Hash de\u011fi\u015fkenlerinin temelden ileri seviyeye nas\u0131l kullan\u0131laca\u011f\u0131n\u0131, ger\u00e7ek d\u00fcnya senaryolar\u0131 ve pratik \u00f6rneklerle ad\u0131m ad\u0131m \u00f6\u011freneceksiniz.<\/p>\n<p>\u0130\u015f s\u00fcre\u00e7lerini otomatikle\u015ftirmek, dijital formlar olu\u015fturmak ve karma\u015f\u0131k i\u015f ak\u0131\u015flar\u0131n\u0131 y\u00f6netmek g\u00fcn\u00fcm\u00fcz i\u015f d\u00fcnyas\u0131nda kritik \u00f6neme sahiptir. \u0130\u015fte tam da bu noktada, d\u00fc\u015f\u00fck kodlu uygulama geli\u015ftirme platformlar\u0131 (Low-Code Development Platforms) \u00f6nemli bir rol oynar. Joget, bu platformlardan biridir ve kullan\u0131c\u0131lara kod yazma ihtiyac\u0131n\u0131 minimuma indirerek h\u0131zl\u0131 bir \u015fekilde uygulamalar geli\u015ftirmelerine olanak tan\u0131r. Ancak Joget&#8217;in sundu\u011fu standart fonksiyonellikler bazen \u00f6zelle\u015ftirilmi\u015f ve daha dinamik \u00e7\u00f6z\u00fcmler gerektirebilir. Bu gibi durumlarda, BeanShell devreye girer.<\/p>\n<p>Peki, BeanShell nedir? BeanShell, Java tabanl\u0131 bir scripting dilidir ve Java kodunu dinamik olarak \u00e7al\u0131\u015ft\u0131rman\u0131za olanak tan\u0131r. Yani, derleme gerektirmeden, an\u0131nda Java s\u0131n\u0131flar\u0131n\u0131 ve nesnelerini kullanabilir, Java API&#8217;lerine eri\u015febilir ve \u00f6zel mant\u0131klar uygulayabilirsiniz. Joget, BeanShell&#8217;i entegre ederek, platformun yerle\u015fik yeteneklerini geni\u015fletmek isteyen geli\u015ftiricilere b\u00fcy\u00fck bir esneklik sunar. \u00d6rne\u011fin, bir form submit edildi\u011finde \u00f6zel bir do\u011frulama yapmak, bir i\u015f ak\u0131\u015f\u0131 a\u015famas\u0131nda dinamik olarak veri i\u015flemek veya harici bir sistemle entegrasyon kurmak istedi\u011finizde BeanShell betiklerini kullan\u0131rs\u0131n\u0131z. Bu sayede, Joget&#8217;in kullan\u0131c\u0131 dostu aray\u00fcz\u00fcn\u00fcn \u00f6tesine ge\u00e7erek, daha derinlemesine ve \u00f6zelle\u015ftirilmi\u015f i\u015flevsellikler ekleyebilirsiniz. \u00d6zellikle karma\u015f\u0131k veri yap\u0131lar\u0131n\u0131 y\u00f6netmek s\u00f6z konusu oldu\u011funda, BeanShell&#8217;in esnekli\u011fi paha bi\u00e7ilmezdir.<\/p>\n<p>BeanShell&#8217;in Joget ile entegrasyonu, \u00f6zellikle &#8220;Process Tools&#8221; (S\u00fcre\u00e7 Ara\u00e7lar\u0131), &#8220;Form Element Properties&#8221; (Form Eleman\u0131 \u00d6zellikleri) ve &#8220;Custom HTML&#8221; (\u00d6zel HTML) alanlar\u0131nda kendini g\u00f6sterir. Bu alanlara yazd\u0131\u011f\u0131n\u0131z BeanShell kodlar\u0131, Joget uygulaman\u0131z\u0131n kalbinde \u00e7al\u0131\u015f\u0131r ve form verilerine, sistem de\u011fi\u015fkenlerine ve kullan\u0131c\u0131 bilgilerine do\u011frudan eri\u015febilir. Bu yetenek, sadece statik verileri de\u011fil, ayn\u0131 zamanda dinamik olarak de\u011fi\u015fen veya olu\u015fturulan verileri de efektif bir \u015fekilde y\u00f6netme ihtiyac\u0131n\u0131 do\u011furur. \u0130\u015fte bu noktada, tekil de\u011fi\u015fkenlerin yetersiz kald\u0131\u011f\u0131 durumlar ortaya \u00e7\u0131kar ve daha karma\u015f\u0131k, yap\u0131land\u0131r\u0131lm\u0131\u015f veri tutabilen ara\u00e7lara ihtiya\u00e7 duyar\u0131z. Bu ihtiya\u00e7 bizi, anahtar-de\u011fer \u00e7iftleri \u015feklinde veri saklayan, yani Hash de\u011fi\u015fkenlerine y\u00f6nlendirir. Hash de\u011fi\u015fkenleri, Joget uygulamalar\u0131n\u0131zda veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flaman\u0131n ve i\u015f ak\u0131\u015flar\u0131n\u0131z\u0131 daha ak\u0131ll\u0131 hale getirmenin temel bir yolunu sunar. Bu g\u00fc\u00e7l\u00fc kombinasyon, Joget&#8217;i sadece bir d\u00fc\u015f\u00fck kod platformu olmaktan \u00e7\u0131kar\u0131p, ger\u00e7ek anlamda \u00f6zelle\u015ftirilebilir ve g\u00fc\u00e7l\u00fc bir i\u015f \u00e7\u00f6z\u00fcm\u00fcne d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.<\/p>\n<h2>BeanShell Hash De\u011fi\u015fkenleri Neden Bu Kadar \u00d6nemli? Temel Kavramlar ve Avantajlar\u0131<\/h2>\n<p>Joget platformunda i\u015f ak\u0131\u015flar\u0131 ve formlar genellikle tekil veri noktalar\u0131 (\u00f6rne\u011fin, bir kullan\u0131c\u0131n\u0131n ad\u0131, bir \u00fcr\u00fcn\u00fcn fiyat\u0131) etraf\u0131nda d\u00f6ner. Ancak \u00e7o\u011fu zaman, bu tekil noktalar yetersiz kal\u0131r ve birbiriyle ili\u015fkili, daha karma\u015f\u0131k veri setlerini y\u00f6netme ihtiyac\u0131 do\u011far. \u0130\u015fte bu noktada, BeanShell Hash de\u011fi\u015fkenleri devreye girer ve veri y\u00f6netimini k\u00f6kten basitle\u015ftirir. Peki, bir &#8220;Hash de\u011fi\u015fkeni&#8221; tam olarak nedir ve neden bu kadar \u00f6nemlidir?<\/p>\n<p>Teknik dilde Hash de\u011fi\u015fkenleri, &#8220;Map&#8221; veya &#8220;Dictionary&#8221; olarak da bilinirler. Bunlar, verileri &#8220;anahtar-de\u011fer \u00e7iftleri&#8221; (key-value pairs) \u015feklinde depolayan veri yap\u0131lar\u0131d\u0131r. T\u0131pk\u0131 bir s\u00f6zl\u00fck gibi d\u00fc\u015f\u00fcnebilirsiniz: her kelimenin (anahtar) belirli bir tan\u0131m\u0131 (de\u011fer) vard\u0131r. Bu yap\u0131 sayesinde, bir de\u011feri do\u011frudan anahtar\u0131 \u00fczerinden \u00e7a\u011f\u0131rabilir veya g\u00fcncelleyebilirsiniz, bu da veri eri\u015fimini son derece h\u0131zl\u0131 ve sezgisel hale getirir. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n bilgilerini tutmak istedi\u011finizde, tek tek <code>kullaniciAdi<\/code>, <code>kullaniciSoyadi<\/code>, <code>kullaniciEmail<\/code> gibi ayr\u0131 de\u011fi\u015fkenler tan\u0131mlamak yerine, tek bir Hash de\u011fi\u015fkeni i\u00e7inde <code>kullaniciBilgileri.put(\"ad\", \"Ahmet\");<\/code>, <code>kullaniciBilgileri.put(\"soyad\", \"Y\u0131lmaz\");<\/code> \u015feklinde depolayabilirsiniz.<\/p>\n<p>Hash de\u011fi\u015fkenlerinin sa\u011flad\u0131\u011f\u0131 avantajlar olduk\u00e7a fazlad\u0131r. \u0130lk olarak, <strong>esneklik<\/strong> sunarlar. Farkl\u0131 t\u00fcrdeki verileri (metin, say\u0131, boolean, hatta ba\u015fka bir Hash de\u011fi\u015fkeni veya liste) tek bir yap\u0131 alt\u0131nda toplayabilirsiniz. Bu, \u00f6zellikle dinamik olarak de\u011fi\u015fen veya bilinmeyen veri yap\u0131lar\u0131yla \u00e7al\u0131\u015f\u0131rken inan\u0131lmaz derecede faydal\u0131d\u0131r. \u0130kinci olarak, <strong>okunabilirlik<\/strong> ve <strong>bak\u0131m kolayl\u0131\u011f\u0131<\/strong> sa\u011flarlar. Karma\u015f\u0131k veri setlerini mant\u0131ksal gruplar halinde d\u00fczenlemek, kodunuzu daha anla\u015f\u0131l\u0131r hale getirir ve ileride yap\u0131lacak de\u011fi\u015fiklikleri veya hata ay\u0131klamay\u0131 \u00e7ok daha basit hale getirir. \u00dc\u00e7\u00fcnc\u00fc olarak, <strong>performans<\/strong> a\u00e7\u0131s\u0131ndan da avantajl\u0131d\u0131rlar. Anahtarlar arac\u0131l\u0131\u011f\u0131yla de\u011ferlere do\u011frudan eri\u015fim, b\u00fcy\u00fck veri setlerinde bile olduk\u00e7a h\u0131zl\u0131d\u0131r.<\/p>\n<p>Tekil de\u011fi\u015fkenler genellikle basit, ba\u011f\u0131ms\u0131z veri par\u00e7ac\u0131klar\u0131n\u0131 tutmak i\u00e7in yeterlidir. Ancak, birbiriyle ili\u015fkili birden fazla \u00f6zelli\u011fi olan bir &#8220;nesne&#8221; veya &#8220;kay\u0131t&#8221; benzeri bir yap\u0131y\u0131 temsil etmek istedi\u011finizde, Hash de\u011fi\u015fkenleri vazge\u00e7ilmezdir. Mesela bir sipari\u015fin detaylar\u0131n\u0131 d\u00fc\u015f\u00fcn\u00fcn: \u00fcr\u00fcn ad\u0131, miktar\u0131, birim fiyat\u0131, toplam fiyat\u0131, m\u00fc\u015fterinin ad\u0131, adresi&#8230; T\u00fcm bu bilgileri ayr\u0131 ayr\u0131 de\u011fi\u015fkenlerde tutmak yerine, <code>siparisDetaylari<\/code> ad\u0131nda bir Hash de\u011fi\u015fkeni alt\u0131nda toplamak, hem kodunuzu d\u00fczenli tutar hem de ilgili verilere daha kolay eri\u015fim sa\u011flar. Bu durum, \u00f6zellikle Joget&#8217;te dinamik formlar olu\u015ftururken, API entegrasyonlar\u0131 yaparken veya i\u015f ak\u0131\u015f\u0131 de\u011fi\u015fkenlerini y\u00f6netirken \u00e7ok b\u00fcy\u00fck bir kolayl\u0131k sa\u011flar. Bu temel anlay\u0131\u015f, BeanShell&#8217;de Hash de\u011fi\u015fkenlerini etkin bir \u015fekilde kullanman\u0131n ve Joget uygulamalar\u0131n\u0131z\u0131n potansiyelini tam olarak ortaya \u00e7\u0131karman\u0131n ilk ad\u0131m\u0131d\u0131r. \u015eimdi, bu g\u00fc\u00e7l\u00fc ara\u00e7lar\u0131 Joget ortam\u0131nda nas\u0131l olu\u015fturaca\u011f\u0131m\u0131z\u0131 ve kullanaca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyelim.<\/p>\n<h2>Joget&#8217;te BeanShell Hash De\u011fi\u015fkenleri Nas\u0131l Olu\u015fturulur ve Kullan\u0131l\u0131r? Ad\u0131m Ad\u0131m Rehber<\/h2>\n<p>Joget&#8217;te BeanShell Hash de\u011fi\u015fkenlerini kullanmaya ba\u015flamak olduk\u00e7a basittir. Java&#8217;n\u0131n <code>Map<\/code> aray\u00fcz\u00fcn\u00fc uygulayan <code>HashMap<\/code> s\u0131n\u0131f\u0131n\u0131 kullanarak, veri depolama ihtiya\u00e7lar\u0131n\u0131z\u0131 kar\u015f\u0131layabilirsiniz. Bu b\u00f6l\u00fcmde, Hash de\u011fi\u015fkenlerini tan\u0131mlamaktan de\u011fer okumaya kadar t\u00fcm temel ad\u0131mlar\u0131 detayl\u0131ca ele alaca\u011f\u0131z.<\/p>\n<h3>Bo\u015f Bir Hash De\u011fi\u015fkeni Tan\u0131mlama ve De\u011fer Atama<\/h3>\n<p>Joget i\u00e7inde herhangi bir BeanShell betik alan\u0131nda (\u00f6rne\u011fin, bir s\u00fcre\u00e7 arac\u0131nda, form eleman\u0131n\u0131n \u00f6zel HTML&#8217;inde veya bir validasyon beti\u011finde) bir Hash de\u011fi\u015fkeni tan\u0131mlamak i\u00e7in a\u015fa\u011f\u0131daki s\u00f6zdizimini kullan\u0131r\u0131z:<\/p>\n<pre><code>\nMap myHashMap = new HashMap();\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kod sat\u0131r\u0131, <code>myHashMap<\/code> ad\u0131nda yeni, bo\u015f bir Hash de\u011fi\u015fkeni (ger\u00e7ekte bir <code>HashMap<\/code> nesnesi) olu\u015fturur. Bu de\u011fi\u015fken art\u0131k anahtar-de\u011fer \u00e7iftlerini saklamaya haz\u0131rd\u0131r. De\u011ferleri eklemek i\u00e7in <code>put()<\/code> metodunu kullan\u0131r\u0131z. Bu metod iki parametre al\u0131r: eklemek istedi\u011finiz anahtar ve bu anahtara kar\u015f\u0131l\u0131k gelen de\u011fer.<\/p>\n<pre><code>\nmyHashMap.put(\"urunAdi\", \"Ak\u0131ll\u0131 Telefon\");\nmyHashMap.put(\"fiyat\", 5999.90);\nmyHashMap.put(\"stokDurumu\", true);\nmyHashMap.put(\"adet\", 2);\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, bir \u00fcr\u00fcn\u00fcn farkl\u0131 \u00f6zelliklerini tek bir <code>myHashMap<\/code> de\u011fi\u015fkeninde toplad\u0131k. G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, anahtarlar genellikle metin (String) olurken, de\u011ferler farkl\u0131 veri tiplerinde olabilir (String, Double, Boolean, Integer vb.). Anahtarlar\u0131n benzersiz olmas\u0131 gerekti\u011fini unutmay\u0131n; ayn\u0131 anahtarla yeni bir de\u011fer eklerseniz, eski de\u011ferin \u00fczerine yaz\u0131l\u0131r.<\/p>\n<h3>Hash De\u011fi\u015fkenlerinden De\u011fer Okuma ve Kullanma<\/h3>\n<p>Hash de\u011fi\u015fkenine ekledi\u011finiz de\u011ferlere daha sonra eri\u015fmek ve bunlar\u0131 kullanmak i\u00e7in <code>get()<\/code> metodunu kullan\u0131r\u0131z. Bu metod, bir anahtar al\u0131r ve o anahtara kar\u015f\u0131l\u0131k gelen de\u011feri d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre><code>\nString urunAdi = (String) myHashMap.get(\"urunAdi\");\nDouble fiyat = (Double) myHashMap.get(\"fiyat\");\nBoolean stoktaVarMi = (Boolean) myHashMap.get(\"stokDurumu\");\n\n\/\/ De\u011ferleri g\u00f6r\u00fcnt\u00fclemek veya ba\u015fka i\u015flemler i\u00e7in kullanmak\nLog.info(\"\u00dcr\u00fcn Ad\u0131: \" + urunAdi); \/\/ Joget'in Log mekanizmas\u0131\nLog.info(\"Fiyat: \" + fiyat);\nLog.info(\"Stok Durumu: \" + stoktaVarMi);\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>get()<\/code> metodundan d\u00f6nen de\u011feri uygun veri tipine d\u00f6n\u00fc\u015ft\u00fcrmek (casting) \u00f6nemlidir, \u00e7\u00fcnk\u00fc <code>get()<\/code> metodunun kendisi varsay\u0131lan olarak <code>Object<\/code> tipinde bir de\u011fer d\u00f6nd\u00fcr\u00fcr. Bu d\u00f6n\u00fc\u015ft\u00fcrme, \u00f6zellikle daha sonra bu de\u011ferler \u00fczerinde tipine \u00f6zg\u00fc i\u015flemler yapacaksan\u0131z gereklidir. Joget'teki <code>Log.info()<\/code> gibi ifadeler, betiklerinizi \u00e7al\u0131\u015ft\u0131r\u0131rken hata ay\u0131klama veya de\u011ferleri kontrol etme a\u00e7\u0131s\u0131ndan \u00e7ok kullan\u0131\u015fl\u0131d\u0131r ve bu \u00e7\u0131kt\u0131lar\u0131 Joget'in sistem g\u00fcnl\u00fcklerinde g\u00f6rebilirsiniz.<\/p>\n<p>Joget'te bu BeanShell kodlar\u0131n\u0131 nereye yerle\u015ftirebilece\u011finize dair birka\u00e7 \u00f6rnek verelim:<\/p>\n<ul>\n<li><strong>S\u00fcre\u00e7 Ara\u00e7lar\u0131 (Process Tools):<\/strong> Bir i\u015f ak\u0131\u015f\u0131 ad\u0131m\u0131ndan sonra veya \u00f6nce otomatik olarak veri i\u015flemek istedi\u011finizde \"Tool\" elementini kullanabilirsiniz. Burada \"BeanShell Tool\" se\u00e7ene\u011fi ile yukar\u0131daki kodlar\u0131 do\u011frudan yazabilirsiniz.<\/li>\n<li><strong>Form Elemanlar\u0131 - \u00d6zel HTML (Form Elements - Custom HTML):<\/strong> Bir formdaki dinamik mesajlar\u0131 veya formun belirli bir b\u00f6l\u00fcm\u00fcn\u00fc dinamik olarak olu\u015fturmak istedi\u011finizde, bir \"Custom HTML\" eleman\u0131 ekleyip onun i\u00e7eri\u011fine BeanShell kodu yerle\u015ftirebilirsiniz.<\/li>\n<li><strong>Form Validasyonu (Form Validation):<\/strong> Bir formdaki alanlar\u0131n belirli kurallara g\u00f6re ge\u00e7erli olup olmad\u0131\u011f\u0131n\u0131 kontrol ederken, karma\u015f\u0131k do\u011frulama mant\u0131\u011f\u0131 i\u00e7in BeanShell validator'lar i\u00e7inde Hash de\u011fi\u015fkenleri kullanabilirsiniz.<\/li>\n<li><strong>Dinamik Se\u00e7enek Listeleri (Dynamic Options for Select Box):<\/strong> Bir a\u00e7\u0131l\u0131r men\u00fcn\u00fcn (select box) se\u00e7eneklerini dinamik olarak bir kaynaktan \u00e7ekip Hash de\u011fi\u015fkenleri ile bi\u00e7imlendirebilirsiniz.<\/li>\n<\/ul>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, BeanShell Hash de\u011fi\u015fkenleri, Joget uygulamalar\u0131n\u0131zda dinamik ve yap\u0131land\u0131r\u0131lm\u0131\u015f veri y\u00f6netimi i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir temel sunar. Bu temel bilgiyi edindikten sonra, \u015fimdi ger\u00e7ek d\u00fcnya senaryolar\u0131nda bu de\u011fi\u015fkenleri nas\u0131l daha etkili kullanabilece\u011fimize bakal\u0131m.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131nda Hash De\u011fi\u015fkenleri: Vaka Analizleri ve Uygulamalar<\/h2>\n<p>BeanShell Hash de\u011fi\u015fkenlerinin teorik temellerini anlad\u0131k. \u015eimdi s\u0131ra, bu g\u00fc\u00e7l\u00fc arac\u0131 ger\u00e7ek Joget uygulamalar\u0131nda nas\u0131l hayata ge\u00e7irece\u011fimize geldi. A\u015fa\u011f\u0131daki vaka analizleri, Hash de\u011fi\u015fkenlerinin pratik de\u011ferini ve Joget i\u015f ak\u0131\u015flar\u0131n\u0131z\u0131 ne kadar geli\u015ftirebilece\u011fini g\u00f6sterecektir.<\/p>\n<h3>Vaka Analizi 1: Dinamik Form Alan\u0131 De\u011ferlerini Y\u00f6netme<\/h3>\n<p><strong>Senaryo:<\/strong> Bir e-ticaret sipari\u015f formunda, kullan\u0131c\u0131 birden fazla \u00fcr\u00fcn se\u00e7ebilir ve her \u00fcr\u00fcn\u00fcn miktar\u0131 ve \u00f6zel notlar\u0131 olabilir. Kullan\u0131c\u0131 \u00fcr\u00fcn ekledik\u00e7e, formun alt\u0131ndaki bir \u00f6zet tablosunun dinamik olarak g\u00fcncellenmesi ve toplam sipari\u015f tutar\u0131n\u0131n hesaplanmas\u0131 gerekmektedir. Ayr\u0131ca, sipari\u015f kaydedildi\u011finde, t\u00fcm \u00fcr\u00fcn detaylar\u0131n\u0131n tek bir yap\u0131land\u0131r\u0131lm\u0131\u015f de\u011fi\u015fken olarak i\u015f ak\u0131\u015f\u0131na aktar\u0131lmas\u0131 istenmektedir.<\/p>\n<p><strong>Problemin \u00c7\u00f6z\u00fcm\u00fc:<\/strong> Her bir \u00fcr\u00fcn i\u00e7in ayr\u0131 ayr\u0131 de\u011fi\u015fkenler tan\u0131mlamak yerine, BeanShell Hash de\u011fi\u015fkenlerini kullanarak her bir \u00fcr\u00fcn\u00fcn \u00f6zelliklerini (\u00fcr\u00fcn ad\u0131, miktar, birim fiyat\u0131, notlar) tek bir Hash i\u00e7inde tutabilir, ard\u0131ndan bu \u00fcr\u00fcn Hash'lerini bir Listeye ekleyebiliriz. B\u00f6ylece, t\u00fcm sipari\u015f kalemlerini i\u00e7eren yap\u0131land\u0131r\u0131lm\u0131\u015f bir veri elde ederiz.<\/p>\n<p>Formdaki \"\u00dcr\u00fcn Ekle\" butonu t\u0131kland\u0131\u011f\u0131nda veya form alanlar\u0131 de\u011fi\u015fti\u011finde \u00e7al\u0131\u015facak bir BeanShell beti\u011fi hayal edelim:<\/p>\n<pre><code>\n\/\/ Mevcut sipari\u015f kalemlerini tutan ana liste (e\u011fer yoksa yeni olu\u015ftur)\nList siparisKalemleri = (List) workflowVariableMap.get(\"siparisKalemleri\");\nif (siparisKalemleri == null) {\n    siparisKalemleri = new ArrayList();\n}\n\n\/\/ Formdan gelen \u00fcr\u00fcn bilgilerini al\nString urunAdi = request.getParameter(\"urun_adi_form_id\");\nInteger miktar = Integer.parseInt(request.getParameter(\"miktar_form_id\"));\nDouble birimFiyat = Double.parseDouble(request.getParameter(\"birim_fiyat_form_id\"));\nString notlar = request.getParameter(\"notlar_form_id\");\n\n\/\/ Yeni \u00fcr\u00fcn i\u00e7in bir Hash de\u011fi\u015fkeni olu\u015ftur\nMap urunDetayi = new HashMap();\nurunDetayi.put(\"urunAdi\", urunAdi);\nurunDetayi.put(\"miktar\", miktar);\nurunDetayi.put(\"birimFiyat\", birimFiyat);\nurunDetayi.put(\"toplamFiyat\", miktar * birimFiyat);\nurunDetayi.put(\"notlar\", notlar);\n\n\/\/ Yeni \u00fcr\u00fcn detay\u0131n\u0131 listeye ekle\nsiparisKalemleri.add(urunDetayi);\n\n\/\/ G\u00fcncel listeyi workflow de\u011fi\u015fkeni olarak kaydet\nworkflowVariableMap.put(\"siparisKalemleri\", siparisKalemleri);\n\n\/\/ Toplam sipari\u015f tutar\u0131n\u0131 hesapla ve ba\u015fka bir workflow de\u011fi\u015fkenine kaydet\nDouble genelToplam = 0.0;\nfor (Map item : siparisKalemleri) {\n    genelToplam += (Double) item.get(\"toplamFiyat\");\n}\nworkflowVariableMap.put(\"genelSiparisToplami\", genelToplam);\n\nLog.info(\"Sipari\u015f Kalemleri G\u00fcncellendi: \" + siparisKalemleri.toString());\nLog.info(\"Genel Toplam: \" + genelToplam);\n<\/pre>\n<p><\/code><\/p>\n<div class=\"expert-tip\">Uzman \u0130pucu: Joget'te <code>request.getParameter()<\/code> ile form alanlar\u0131na eri\u015fmek, form g\u00f6nderimi (submit) s\u0131ras\u0131nda veya Custom HTML alanlar\u0131nda kullan\u0131\u015fl\u0131d\u0131r. Workflow de\u011fi\u015fkenleri (<code>workflowVariableMap<\/code>) ise i\u015f ak\u0131\u015f\u0131n\u0131n farkl\u0131 ad\u0131mlar\u0131 aras\u0131nda veri ta\u015f\u0131mak i\u00e7in idealdir.<\/div>\n<p>Bu senaryoda, <code>siparisKalemleri<\/code> ad\u0131nda bir <code>List<\/code> (liste) ve her bir listedeki eleman olarak <code>urunDetayi<\/code> ad\u0131nda bir <code>Map<\/code> (Hash de\u011fi\u015fkeni) kulland\u0131k. Bu sayede, karma\u015f\u0131k bir veri yap\u0131s\u0131n\u0131 (\u00e7oklu \u00fcr\u00fcn detaylar\u0131) tek bir i\u015f ak\u0131\u015f\u0131 de\u011fi\u015fkeni alt\u0131nda d\u00fczenli bir \u015fekilde depolayabiliyor ve kolayca i\u015fleyebiliyoruz.<\/p>\n<h3>Vaka Analizi 2: Harici API Entegrasyonlar\u0131 \u0130\u00e7in Veri Haz\u0131rlama<\/h3>\n<p><strong>Senaryo:<\/strong> Joget uygulaman\u0131z, onaylanan bir m\u00fc\u015fteri kayd\u0131n\u0131 harici bir CRM sistemine g\u00f6ndermelidir. CRM API'si, m\u00fc\u015fterinin ad\u0131n\u0131, e-posta adresini, telefon numaras\u0131n\u0131 ve \u015firketini i\u00e7eren belirli bir JSON format\u0131nda veri beklemektedir.<\/p>\n<p><strong>Problemin \u00c7\u00f6z\u00fcm\u00fc:<\/strong> Joget formundan gelen m\u00fc\u015fteri bilgilerini almak ve bunlar\u0131 CRM API'sinin bekledi\u011fi yap\u0131ya uygun bir BeanShell Hash de\u011fi\u015fkeni i\u00e7inde d\u00fczenlemek, entegrasyonu hem daha anla\u015f\u0131l\u0131r hem de daha sa\u011flam hale getirir.<\/p>\n<p>CRM entegrasyonu i\u00e7in bir \"BeanShell Tool\" i\u00e7inde \u00e7al\u0131\u015facak kod \u00f6rne\u011fi:<\/p>\n<pre><code>\n\/\/ Joget workflow de\u011fi\u015fkenlerinden veya formdan m\u00fc\u015fteri bilgilerini al\nString musteriAdi = (String) workflowVariableMap.get(\"musteri_adi\");\nString musteriEmail = (String) workflowVariableMap.get(\"musteri_email\");\nString musteriTelefon = (String) workflowVariableMap.get(\"musteri_telefon\");\nString musteriSirket = (String) workflowVariableMap.get(\"musteri_sirket\");\n\n\/\/ CRM API'sinin bekledi\u011fi formatta bir Hash de\u011fi\u015fkeni olu\u015ftur\nMap crmPayload = new HashMap();\ncrmPayload.put(\"firstName\", musteriAdi);\ncrmPayload.put(\"email\", musteriEmail);\ncrmPayload.put(\"phone\", musteriTelefon);\ncrmPayload.put(\"company\", musteriSirket);\ncrmPayload.put(\"status\", \"ACTIVE\"); \/\/ API'ye \u00f6zel sabit bir de\u011fer\n\n\/\/ Bu Hash de\u011fi\u015fkenini JSON format\u0131na d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in bir JSON k\u00fct\u00fcphanesi kullan\u0131labilir.\n\/\/ (Joget genellikle bir JSON k\u00fct\u00fcphanesi i\u00e7erir veya harici bir jar eklenerek kullan\u0131labilir)\n\/\/ \u00d6rne\u011fin: import org.json.JSONObject;\n\/\/ JSONObject jsonObject = new JSONObject(crmPayload);\n\/\/ String jsonString = jsonObject.toString();\n\n\/\/ Olu\u015fturulan payload'\u0131 bir HTTP iste\u011fi ile CRM API'sine g\u00f6nder\n\/\/ (Bu k\u0131s\u0131m, Joget'in entegrasyon yetenekleri veya \u00f6zel BeanShell kodu ile yap\u0131labilir)\n\/\/ \u00d6rne\u011fin: HttpUtil.sendPostRequest(\"https:\/\/api.crm.com\/customers\", jsonString, \"application\/json\");\n\nLog.info(\"CRM Payload Haz\u0131rland\u0131: \" + crmPayload.toString());\n\/\/ Log.info(\"G\u00f6nderilecek JSON: \" + jsonString); \/\/ E\u011fer JSON d\u00f6n\u00fc\u015f\u00fcm\u00fc yap\u0131ld\u0131ysa\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>crmPayload<\/code> adl\u0131 Hash de\u011fi\u015fkeni, Joget'teki veriler ile harici CRM API'sinin bekledi\u011fi veri yap\u0131s\u0131 aras\u0131nda bir k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr. Anahtar isimlerini API'nin bekledi\u011fi \u015fekilde ayarlamak, entegrasyonun ba\u015far\u0131l\u0131 olmas\u0131 i\u00e7in kritik \u00f6neme sahiptir. Bu t\u00fcr bir yakla\u015f\u0131m, API \u00e7a\u011fr\u0131lar\u0131n\u0131 daha mod\u00fcler, okunabilir ve y\u00f6netilebilir hale getirir. Hash de\u011fi\u015fkenleri, sadece basit anahtar-de\u011fer \u00e7iftleri tutmakla kalmaz, ayn\u0131 zamanda i\u00e7 i\u00e7e ge\u00e7mi\u015f yap\u0131lar (nested maps) veya listeler de i\u00e7erebilir, bu da \u00e7ok daha karma\u015f\u0131k JSON veya XML yap\u0131lar\u0131n\u0131 kolayca olu\u015fturman\u0131za olanak tan\u0131r. Bu sayede, Joget'in entegrasyon yeteneklerini BeanShell ile daha da ileriye ta\u015f\u0131yabilirsiniz.<\/p>\n<p>Bu vaka analizleri, BeanShell Hash de\u011fi\u015fkenlerinin Joget'te dinamik form verilerini y\u00f6netmekten harici sistemlerle entegrasyona kadar ne kadar \u00e7e\u015fitli alanlarda kullan\u0131labilece\u011fini a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Do\u011fru kullan\u0131ld\u0131\u011f\u0131nda, bu de\u011fi\u015fkenler uygulama geli\u015ftirme s\u00fcre\u00e7lerinizi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde h\u0131zland\u0131rabilir ve Joget projelerinize daha fazla esneklik katabilir.<\/p>\n<h2>\u0130leri D\u00fczey Kullan\u0131m \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar: Performans ve G\u00fcvenlik<\/h2>\n<p>BeanShell Hash de\u011fi\u015fkenlerinin temel ve pratik kullan\u0131mlar\u0131n\u0131 ele ald\u0131k. \u015eimdi, daha karma\u015f\u0131k senaryolarda bu de\u011fi\u015fkenleri daha verimli ve g\u00fcvenli bir \u015fekilde kullanman\u0131z\u0131 sa\u011flayacak ileri d\u00fczey ipu\u00e7lar\u0131na ve en iyi uygulamalara g\u00f6z atal\u0131m.<\/p>\n<h3>\u0130terasyon ve Veri \u0130\u015fleme<\/h3>\n<p>Bazen bir Hash de\u011fi\u015fkeni i\u00e7indeki t\u00fcm anahtar-de\u011fer \u00e7iftleri \u00fczerinde d\u00f6ng\u00fc yapmak (iterate etmek) isteyebilirsiniz. \u00d6rne\u011fin, bir formdaki t\u00fcm dinamik alanlar\u0131 kontrol etmek veya bir Hash'deki t\u00fcm de\u011ferleri belirli bir kurala g\u00f6re g\u00fcncellemek gerekebilir. BeanShell, Java'n\u0131n standart d\u00f6ng\u00fc yap\u0131lar\u0131n\u0131 destekledi\u011fi i\u00e7in bunu kolayca yapabilirsiniz:<\/p>\n<pre><code>\nMap ayarlar = new HashMap();\nayarlar.put(\"tema\", \"koyu\");\nayarlar.put(\"dil\", \"T\u00fcrk\u00e7e\");\nayarlar.put(\"bildirimler\", true);\n\nLog.info(\"Ayarlar Listesi:\");\nfor (Map.Entry entry : ayarlar.entrySet()) {\n    Log.info(\"Anahtar: \" + entry.getKey() + \", De\u011fer: \" + entry.getValue());\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kod blo\u011fu, <code>ayarlar<\/code> Hash de\u011fi\u015fkeni i\u00e7indeki her bir anahtar-de\u011fer \u00e7ifti \u00fczerinde d\u00f6ng\u00fc yaparak bunlar\u0131 g\u00fcnl\u00fc\u011fe yazd\u0131r\u0131r. <code>entrySet()<\/code> metodu, her biri anahtar ve de\u011feri i\u00e7eren bir <code>Map.Entry<\/code> nesnesi d\u00f6nd\u00fcr\u00fcr, bu da hem anahtara (<code>getKey()<\/code>) hem de de\u011fere (<code>getValue()<\/code>) eri\u015fimi kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>Hash Haritas\u0131 T\u00fcr\u00fc Se\u00e7imi: Performans Optimizasyonu<\/h3>\n<p>BeanShell'de <code>Map<\/code> aray\u00fcz\u00fcn\u00fc uygulayan birden fazla s\u0131n\u0131f bulunur ve her birinin kendine \u00f6zg\u00fc performans \u00f6zellikleri vard\u0131r. Genellikle <code>HashMap<\/code> kullan\u0131r\u0131z \u00e7\u00fcnk\u00fc \u00e7o\u011fu durumda iyi bir performans sunar. Ancak, ihtiya\u00e7lar\u0131n\u0131za g\u00f6re di\u011fer t\u00fcrleri de d\u00fc\u015f\u00fcnebilirsiniz:<\/p>\n<ul>\n<li><code>HashMap<\/code>: En yayg\u0131n kullan\u0131lan\u0131d\u0131r. Anahtar-de\u011fer \u00e7iftlerinin s\u0131ras\u0131n\u0131 garanti etmez ancak \u00e7ok h\u0131zl\u0131 eri\u015fim ve ekleme\/\u00e7\u0131karma i\u015flemleri sunar. \u00c7o\u011fu senaryo i\u00e7in idealdir.<\/li>\n<li><code>LinkedHashMap<\/code>: Elemanlar\u0131n eklenme s\u0131ras\u0131n\u0131 korur. Yani, ekledi\u011finiz s\u0131rayla iterasyon yapabilirsiniz. S\u0131ra \u00f6nemliyse tercih edilebilir.<\/li>\n<li><code>TreeMap<\/code>: Anahtarlar\u0131 do\u011fal s\u0131ralar\u0131na g\u00f6re veya \u00f6zel bir <code>Comparator<\/code> kullanarak s\u0131ralar. Anahtarlar\u0131n her zaman s\u0131ral\u0131 olmas\u0131n\u0131 istedi\u011finiz durumlarda kullan\u0131\u015fl\u0131d\u0131r, ancak <code>HashMap<\/code>'e g\u00f6re biraz daha yava\u015ft\u0131r.<\/li>\n<\/ul>\n<pre><code>\n\/\/ TreeMap \u00f6rne\u011fi (anahtarlar alfabetik olarak s\u0131ralan\u0131r)\nMap siraliAyarlar = new TreeMap();\nsiraliAyarlar.put(\"dil\", \"T\u00fcrk\u00e7e\");\nsiraliAyarlar.put(\"tema\", \"koyu\");\nsiraliAyarlar.put(\"bildirimler\", true);\n\nLog.info(\"S\u0131ral\u0131 Ayarlar Listesi:\");\nfor (Map.Entry entry : siraliAyarlar.entrySet()) {\n    Log.info(\"Anahtar: \" + entry.getKey() + \", De\u011fer: \" + entry.getValue());\n}\n<\/pre>\n<p><\/code><\/p>\n<p>K\u00fc\u00e7\u00fck veri setlerinde performans fark\u0131 pek fark edilmeyebilirken, b\u00fcy\u00fck veri setleriyle \u00e7al\u0131\u015f\u0131rken do\u011fru <code>Map<\/code> t\u00fcr\u00fcn\u00fc se\u00e7mek uygulaman\u0131z\u0131n performans\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde etkileyebilir.<\/p>\n<h3>G\u00fcvenlik ve Hata Y\u00f6netimi<\/h3>\n<p>BeanShell betikleri, Joget uygulaman\u0131z\u0131n sunucu taraf\u0131nda \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in g\u00fcvenlik ve hata y\u00f6netimi kritik \u00f6neme sahiptir.<\/p>\n<ul>\n<li>\n        <strong>Giri\u015f Do\u011frulama (Input Validation):<\/strong> Kullan\u0131c\u0131dan veya harici sistemlerden gelen verileri Hash de\u011fi\u015fkenlerine atmadan \u00f6nce her zaman do\u011frulay\u0131n. Beklenmedik veya k\u00f6t\u00fc niyetli girdiler, uygulaman\u0131zda g\u00fcvenlik a\u00e7\u0131klar\u0131 veya hatalara yol a\u00e7abilir.<\/p>\n<pre><code>\nString gelenDeger = request.getParameter(\"kullanici_girisi\");\nif (gelenDeger != null && gelenDeger.length() < 255) {\n    myHashMap.put(\"guvenliVeri\", gelenDeger);\n} else {\n    Log.warn(\"Ge\u00e7ersiz veya \u015f\u00fcpheli giri\u015f tespit edildi.\");\n    \/\/ Hata y\u00f6netimi veya varsay\u0131lan de\u011fer atama\n}\n        <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n        <strong>Hata Yakalama (Exception Handling):<\/strong> Beklenmeyen durumlar\u0131 (\u00f6rne\u011fin, <code>null<\/code> de\u011ferlere eri\u015fmeye \u00e7al\u0131\u015fma, ge\u00e7ersiz tip d\u00f6n\u00fc\u015ft\u00fcrme) y\u00f6netmek i\u00e7in <code>try-catch<\/code> bloklar\u0131n\u0131 kullan\u0131n. Bu, beti\u011finizin \u00e7\u00f6kmesini engeller ve daha sa\u011flam uygulamalar olu\u015fturman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<pre><code>\ntry {\n    Double fiyat = (Double) myHashMap.get(\"fiyat\");\n    if (fiyat != null) {\n        Double vergiliFiyat = fiyat * 1.18;\n        Log.info(\"Vergili Fiyat: \" + vergiliFiyat);\n    } else {\n        Log.warn(\"Fiyat bilgisi bulunamad\u0131.\");\n    }\n} catch (ClassCastException e) {\n    Log.error(\"Fiyat de\u011feri Double tipine d\u00f6n\u00fc\u015ft\u00fcr\u00fclemedi: \" + e.getMessage());\n} catch (Exception e) {\n    Log.error(\"Beklenmedik bir hata olu\u015ftu: \" + e.getMessage());\n}\n        <\/pre>\n<p><\/code>\n    <\/li>\n<\/ul>\n<div class=\"expert-tip\">Uzman \u0130pucu: Joget'te hassas verileri (\u015fifreler, API anahtarlar\u0131) do\u011frudan BeanShell betiklerinde sabit kod olarak saklamaktan ka\u00e7\u0131n\u0131n. Bunun yerine, Joget'in \"System Settings\" (Sistem Ayarlar\u0131) veya \"Environment Variables\" (Ortam De\u011fi\u015fkenleri) gibi g\u00fcvenli depolama mekanizmalar\u0131n\u0131 kullanarak bu verilere eri\u015fin. Bu, hem g\u00fcvenli\u011fi art\u0131r\u0131r hem de uygulaman\u0131z\u0131n farkl\u0131 ortamlar aras\u0131nda ta\u015f\u0131nmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/div>\n<p>Bu ileri d\u00fczey ipu\u00e7lar\u0131 ve en iyi uygulamalar, BeanShell Hash de\u011fi\u015fkenlerini Joget'te sadece temel d\u00fczeyde kullanmakla kalmay\u0131p, ayn\u0131 zamanda daha g\u00fcvenli, performansl\u0131 ve bak\u0131m\u0131 kolay uygulamalar geli\u015ftirmenize olanak tan\u0131r. Unutmay\u0131n, iyi yaz\u0131lm\u0131\u015f bir BeanShell beti\u011fi, Joget uygulaman\u0131z\u0131n g\u00fcc\u00fcn\u00fc katlayarak art\u0131r\u0131r.<\/p>\n<h2>Sonu\u00e7: \u00d6\u011frendiklerimizi Peki\u015ftirelim<\/h2>\n<p>Bu kapsaml\u0131 rehber boyunca, BeanShell Hash de\u011fi\u015fkenlerinin Joget platformundaki temelden ileri d\u00fczeye kullan\u0131m\u0131n\u0131 derinlemesine inceledik. Anahtar-de\u011fer \u00e7iftleri mant\u0131\u011f\u0131na dayanan bu esnek veri yap\u0131s\u0131n\u0131n, dinamik form alanlar\u0131n\u0131 y\u00f6netmekten karma\u015f\u0131k API entegrasyonlar\u0131na kadar Joget uygulamalar\u0131n\u0131zda ne kadar kritik bir rol oynad\u0131\u011f\u0131n\u0131 g\u00f6rd\u00fck. Hash de\u011fi\u015fkenleri sayesinde, tekil de\u011fi\u015fkenlerin yetersiz kald\u0131\u011f\u0131 durumlarda dahi verilerinizi d\u00fczenli, eri\u015filebilir ve i\u015flenebilir k\u0131labilirsiniz. Bu, sadece kodunuzu daha okunabilir ve bak\u0131m\u0131 kolay hale getirmekle kalmaz, ayn\u0131 zamanda Joget'in d\u00fc\u015f\u00fck kodlu yap\u0131s\u0131n\u0131 daha da geni\u015fleterek size benzersiz bir \u00f6zelle\u015ftirme g\u00fcc\u00fc sunar. Performans optimizasyonu, g\u00fcvenlik ve hata y\u00f6netimi gibi konulara de\u011finerek, sadece nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 de\u011fil, ayn\u0131 zamanda en iyi uygulamalarla nas\u0131l sa\u011flam ve verimli \u00e7\u00f6z\u00fcmler geli\u015ftirilece\u011fini de g\u00f6sterdik. Art\u0131k Joget projelerinizde BeanShell Hash de\u011fi\u015fkenlerini g\u00fcvenle kullanabilir ve i\u015f ak\u0131\u015flar\u0131n\u0131z\u0131 bir \u00fcst seviyeye ta\u015f\u0131yabilirsiniz. Bu bilgiyi pratik ederek, Joget'teki uzmanl\u0131\u011f\u0131n\u0131z\u0131 art\u0131rman\u0131z ka\u00e7\u0131n\u0131lmaz olacakt\u0131r.<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h2>\n<h3>1. BeanShell Hash de\u011fi\u015fkenleri ne zaman kullan\u0131lmal\u0131?<\/h3>\n<p>BeanShell Hash de\u011fi\u015fkenleri, birbiriyle ili\u015fkili birden fazla veri par\u00e7as\u0131n\u0131 tek bir yap\u0131da gruplamak istedi\u011finizde kullan\u0131lmal\u0131d\u0131r. \u00d6rne\u011fin, bir \u00fcr\u00fcn\u00fcn ad\u0131n\u0131, fiyat\u0131n\u0131 ve stok durumunu veya bir kullan\u0131c\u0131n\u0131n ad\u0131n\u0131, e-posta adresini ve telefon numaras\u0131n\u0131 birlikte y\u00f6netmek istedi\u011finizde idealdir. Dinamik form alanlar\u0131n\u0131 i\u015flerken, API'ler i\u00e7in veri haz\u0131rlarken veya karma\u015f\u0131k i\u015f ak\u0131\u015f\u0131 verilerini saklarken tercih edilir.<\/p>\n<h3>2. Hash de\u011fi\u015fkenlerinin kullan\u0131m\u0131 performans fark\u0131 yarat\u0131r m\u0131?<\/h3>\n<p>Evet, Hash de\u011fi\u015fkenlerinin kullan\u0131m\u0131 (\u00f6zellikle <code>HashMap<\/code>) genellikle tek tek bir\u00e7ok de\u011fi\u015fken tan\u0131mlamaktan daha verimli olabilir, \u00e7\u00fcnk\u00fc veriye anahtar arac\u0131l\u0131\u011f\u0131yla do\u011frudan eri\u015fim sa\u011flar. Ancak, \u00e7ok b\u00fcy\u00fck veri setleriyle \u00e7al\u0131\u015f\u0131rken veya s\u00fcrekli olarak ayn\u0131 verileri yinelemeli olarak i\u015flerken <code>HashMap<\/code> yerine <code>LinkedHashMap<\/code> veya <code>TreeMap<\/code> gibi farkl\u0131 <code>Map<\/code> t\u00fcrlerinin performans \u00f6zelliklerini g\u00f6z \u00f6n\u00fcnde bulundurmak faydal\u0131 olabilir.<\/p>\n<h3>3. BeanShell Hash de\u011fi\u015fkenleri ile di\u011fer veri yap\u0131lar\u0131 (\u00f6rne\u011fin Listeler) aras\u0131ndaki fark nedir?<\/h3>\n<p>Hash de\u011fi\u015fkenleri (Map), verileri anahtar-de\u011fer \u00e7iftleri olarak depolar ve de\u011ferlere anahtarlar\u0131 arac\u0131l\u0131\u011f\u0131yla eri\u015filir. Listeler ise verileri s\u0131ral\u0131 bir koleksiyon olarak depolar ve elemanlara indeks numaralar\u0131 (0, 1, 2...) arac\u0131l\u0131\u011f\u0131yla eri\u015filir. Birbiriyle ili\u015fkili farkl\u0131 \u00f6zelliklere sahip verileri bir arada tutmak i\u00e7in Hash, s\u0131ral\u0131 bir dizi eleman tutmak i\u00e7in ise Liste daha uygundur. \u0130htiyaca g\u00f6re bu yap\u0131lar i\u00e7 i\u00e7e (\u00f6rne\u011fin, bir Liste i\u00e7inde Hash'ler veya bir Hash i\u00e7inde Listeler) kullan\u0131labilir.<\/p>\n<h3>4. Joget context'ine (\u00f6rne\u011fin mevcut kullan\u0131c\u0131, form verileri) Hash de\u011fi\u015fkenleri \u00fczerinden nas\u0131l eri\u015filir?<\/h3>\n<p>Joget ortam\u0131nda \u00e7al\u0131\u015fan BeanShell betikleri, otomatik olarak baz\u0131 global de\u011fi\u015fkenlere eri\u015febilir. \u00d6rne\u011fin, mevcut i\u015f ak\u0131\u015f\u0131 de\u011fi\u015fkenlerine <code>workflowVariableMap<\/code> \u00fczerinden (<code>workflowVariableMap.get(\"anahtar\")<\/code>), formdan gelen parametrelere <code>request.getParameter(\"form_alan_id\")<\/code> \u00fczerinden ve mevcut kullan\u0131c\u0131 bilgilerine <code>currentUser<\/code> nesnesi \u00fczerinden eri\u015febilirsiniz. Bu global nesneler, Hash de\u011fi\u015fkenlerinizle etkile\u015fime girerek dinamik veriler olu\u015fturman\u0131za veya mevcut verileri manip\u00fcle etmenize olanak tan\u0131r.<\/p>\n<h3>5. BeanShell Hash de\u011fi\u015fkenleri kullan\u0131rken hata ay\u0131klama nas\u0131l yap\u0131l\u0131r?<\/h3>\n<p>Hata ay\u0131klama i\u00e7in en temel y\u00f6ntem, <code>Log.info()<\/code>, <code>Log.warn()<\/code> veya <code>Log.error()<\/code> gibi metodlar\u0131 kullanarak beti\u011finizin farkl\u0131 noktalar\u0131ndaki de\u011fi\u015fken de\u011ferlerini veya i\u015fleyi\u015f ad\u0131mlar\u0131n\u0131 Joget'in sistem g\u00fcnl\u00fcklerine yazd\u0131rmakt\u0131r. Bu sayede, beti\u011finiz \u00e7al\u0131\u015f\u0131rken hangi de\u011ferlerin hangi a\u015famada oldu\u011funu takip edebilir ve beklenmeyen davran\u0131\u015flar\u0131 tespit edebilirsiniz. Daha karma\u015f\u0131k hatalar i\u00e7in <code>try-catch<\/code> bloklar\u0131 kullanarak spesifik istisnalar\u0131 yakalay\u0131p daha anlaml\u0131 hata mesajlar\u0131 \u00fcretebilirsiniz.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Joget platformunda dinamik veri y\u00f6netimi ve otomasyon s\u00fcre\u00e7lerinde s\u0131k\u0131\u015f\u0131p m\u0131 kald\u0131n\u0131z? \u00d6zellikle formlar aras\u0131 ge\u00e7i\u015flerde veya d\u0131\u015f sistemlerle&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":[1319],"tags":[],"class_list":{"0":"post-34416","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-powershell","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>Mastering BeanShell Hash Variables in Joget: The Most Basic &amp; Practical Guide<\/title>\n<meta name=\"description\" content=\"Joget platformunda dinamik veri y\u00f6netimi ve otomasyon s\u00fcre\u00e7lerinde s\u0131k\u0131\u015f\u0131p m\u0131 kald\u0131n\u0131z? \u00d6zellikle formlar aras\u0131 ge\u00e7i\u015flerde veya d\u0131\u015f sistemlerle entegrasyonlarda karma\u015f\u0131k verileri kolayca ele almak ister misiniz? BeanShell Hash de\u011fi\u015fkenleri, tam da bu noktada devreye girerek Joget uygulamalar\u0131n\u0131zda g\u00fc\u00e7l\u00fc bir esneklik ve kontrol sa\u011fl\u0131yor. Bu rehberde, BeanShell Hash de\u011fi\u015fkenlerinin temelden ileri seviyeye nas\u0131l kullan\u0131laca\u011f\u0131n\u0131, ger\u00e7ek d\u00fcnya senaryolar\u0131 ve pratik \u00f6rneklerle ad\u0131m ad\u0131m \u00f6\u011freneceksiniz.\" \/>\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\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mastering BeanShell Hash Variables in Joget: The Most Basic &amp; Practical Guide\" \/>\n<meta property=\"og:description\" content=\"Joget platformunda dinamik veri y\u00f6netimi ve otomasyon s\u00fcre\u00e7lerinde s\u0131k\u0131\u015f\u0131p m\u0131 kald\u0131n\u0131z? \u00d6zellikle formlar aras\u0131 ge\u00e7i\u015flerde veya d\u0131\u015f sistemlerle entegrasyonlarda karma\u015f\u0131k verileri kolayca ele almak ister misiniz? BeanShell Hash de\u011fi\u015fkenleri, tam da bu noktada devreye girerek Joget uygulamalar\u0131n\u0131zda g\u00fc\u00e7l\u00fc bir esneklik ve kontrol sa\u011fl\u0131yor. Bu rehberde, BeanShell Hash de\u011fi\u015fkenlerinin temelden ileri seviyeye nas\u0131l kullan\u0131laca\u011f\u0131n\u0131, ger\u00e7ek d\u00fcnya senaryolar\u0131 ve pratik \u00f6rneklerle ad\u0131m ad\u0131m \u00f6\u011freneceksiniz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-16T08:00:50+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=\"21 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Mastering BeanShell Hash Variables in Joget: The Most Basic &#038; Practical Guide\",\"datePublished\":\"2025-11-16T08:00:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/\"},\"wordCount\":3511,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"PowerShell\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/\",\"name\":\"Mastering BeanShell Hash Variables in Joget: The Most Basic & Practical Guide\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-16T08:00:50+00:00\",\"description\":\"Joget platformunda dinamik veri y\u00f6netimi ve otomasyon s\u00fcre\u00e7lerinde s\u0131k\u0131\u015f\u0131p m\u0131 kald\u0131n\u0131z? \u00d6zellikle formlar aras\u0131 ge\u00e7i\u015flerde veya d\u0131\u015f sistemlerle entegrasyonlarda karma\u015f\u0131k verileri kolayca ele almak ister misiniz? BeanShell Hash de\u011fi\u015fkenleri, tam da bu noktada devreye girerek Joget uygulamalar\u0131n\u0131zda g\u00fc\u00e7l\u00fc bir esneklik ve kontrol sa\u011fl\u0131yor. Bu rehberde, BeanShell Hash de\u011fi\u015fkenlerinin temelden ileri seviyeye nas\u0131l kullan\u0131laca\u011f\u0131n\u0131, ger\u00e7ek d\u00fcnya senaryolar\u0131 ve pratik \u00f6rneklerle ad\u0131m ad\u0131m \u00f6\u011freneceksiniz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mastering BeanShell Hash Variables in Joget: The Most Basic &#038; Practical Guide\"}]},{\"@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":"Mastering BeanShell Hash Variables in Joget: The Most Basic & Practical Guide","description":"Joget platformunda dinamik veri y\u00f6netimi ve otomasyon s\u00fcre\u00e7lerinde s\u0131k\u0131\u015f\u0131p m\u0131 kald\u0131n\u0131z? \u00d6zellikle formlar aras\u0131 ge\u00e7i\u015flerde veya d\u0131\u015f sistemlerle entegrasyonlarda karma\u015f\u0131k verileri kolayca ele almak ister misiniz? BeanShell Hash de\u011fi\u015fkenleri, tam da bu noktada devreye girerek Joget uygulamalar\u0131n\u0131zda g\u00fc\u00e7l\u00fc bir esneklik ve kontrol sa\u011fl\u0131yor. Bu rehberde, BeanShell Hash de\u011fi\u015fkenlerinin temelden ileri seviyeye nas\u0131l kullan\u0131laca\u011f\u0131n\u0131, ger\u00e7ek d\u00fcnya senaryolar\u0131 ve pratik \u00f6rneklerle ad\u0131m ad\u0131m \u00f6\u011freneceksiniz.","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\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/","og_locale":"tr_TR","og_type":"article","og_title":"Mastering BeanShell Hash Variables in Joget: The Most Basic & Practical Guide","og_description":"Joget platformunda dinamik veri y\u00f6netimi ve otomasyon s\u00fcre\u00e7lerinde s\u0131k\u0131\u015f\u0131p m\u0131 kald\u0131n\u0131z? \u00d6zellikle formlar aras\u0131 ge\u00e7i\u015flerde veya d\u0131\u015f sistemlerle entegrasyonlarda karma\u015f\u0131k verileri kolayca ele almak ister misiniz? BeanShell Hash de\u011fi\u015fkenleri, tam da bu noktada devreye girerek Joget uygulamalar\u0131n\u0131zda g\u00fc\u00e7l\u00fc bir esneklik ve kontrol sa\u011fl\u0131yor. Bu rehberde, BeanShell Hash de\u011fi\u015fkenlerinin temelden ileri seviyeye nas\u0131l kullan\u0131laca\u011f\u0131n\u0131, ger\u00e7ek d\u00fcnya senaryolar\u0131 ve pratik \u00f6rneklerle ad\u0131m ad\u0131m \u00f6\u011freneceksiniz.","og_url":"https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-16T08:00:50+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"21 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Mastering BeanShell Hash Variables in Joget: The Most Basic &#038; Practical Guide","datePublished":"2025-11-16T08:00:50+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/"},"wordCount":3511,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["PowerShell"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/","url":"https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/","name":"Mastering BeanShell Hash Variables in Joget: The Most Basic & Practical Guide","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-16T08:00:50+00:00","description":"Joget platformunda dinamik veri y\u00f6netimi ve otomasyon s\u00fcre\u00e7lerinde s\u0131k\u0131\u015f\u0131p m\u0131 kald\u0131n\u0131z? \u00d6zellikle formlar aras\u0131 ge\u00e7i\u015flerde veya d\u0131\u015f sistemlerle entegrasyonlarda karma\u015f\u0131k verileri kolayca ele almak ister misiniz? BeanShell Hash de\u011fi\u015fkenleri, tam da bu noktada devreye girerek Joget uygulamalar\u0131n\u0131zda g\u00fc\u00e7l\u00fc bir esneklik ve kontrol sa\u011fl\u0131yor. Bu rehberde, BeanShell Hash de\u011fi\u015fkenlerinin temelden ileri seviyeye nas\u0131l kullan\u0131laca\u011f\u0131n\u0131, ger\u00e7ek d\u00fcnya senaryolar\u0131 ve pratik \u00f6rneklerle ad\u0131m ad\u0131m \u00f6\u011freneceksiniz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/mastering-beanshell-hash-variables-in-joget-the-most-basic-practical-guide\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Mastering BeanShell Hash Variables in Joget: The Most Basic &#038; Practical Guide"}]},{"@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\/34416","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=34416"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34416\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34416"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34416"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34416"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}