{"id":147,"date":"2022-11-10T14:20:00","date_gmt":"2022-11-10T14:20:00","guid":{"rendered":"http:\/\/blog.firatyasar.com\/?p=147"},"modified":"2023-03-19T19:16:03","modified_gmt":"2023-03-19T19:16:03","slug":"software-design-patterns-part-1","status":"publish","type":"post","link":"https:\/\/blog.firatyasar.com\/?p=147","title":{"rendered":"Software Design Patterns \u2014 Part 1"},"content":{"rendered":"\n<p id=\"090a\">Bu yaz\u0131mda yaz\u0131l\u0131m d\u00fcnyas\u0131nda yer alan \u00e7e\u015fitli yaz\u0131l\u0131m mimarilerinden bahsedece\u011fim. Bildi\u011finiz \u00fczere uygulamalar yaz\u0131lmadan \u00f6nce belirli bir yap\u0131 \u00fczerine in\u015faa edilir, t\u0131pk\u0131 bir bina dikilmeden \u00f6nce \u00e7\u0131kar\u0131lan yap\u0131 plan\u0131 gibi.<\/p>\n\n\n\n<h1 id=\"0118\">Bir Yaz\u0131l\u0131m Mimarisine Neden \u0130htiya\u00e7 Duyar\u0131z?<\/h1>\n\n\n\n<p id=\"ec93\">E\u011fer uygulama belirli bir yap\u0131 \u00fczerine in\u015faa edilmezse bu uygulaman\u0131n bile\u015fenleri aras\u0131ndaki ba\u011fl\u0131l\u0131k \u00e7ok y\u00fcksek olacakt\u0131r. Bu da uygulamada en ufak bir de\u011fi\u015fiklik yapmak istedi\u011fimizde bize \u00e7e\u015fitli zorluklar \u00e7\u0131karacakt\u0131r.<br>Mimari yap\u0131 bize, \u201cBu mimari geni\u015fleyebiliyor mu?\u201d \u201cUygulamadan bekledi\u011fimiz performans nedir\u201d? \u201cBu uygulama ihtiya\u00e7lara ne kadar kolay cevap verebiliyor?\u201d gibi sorular\u0131n cevaplar\u0131n\u0131 bulmam\u0131zda yard\u0131mc\u0131 olur.<br>Yaz\u0131l\u0131m mimarisini se\u00e7erken gereken di\u011fer parametreler ise, se\u00e7ilen mimari yap\u0131n\u0131n g\u00fc\u00e7l\u00fc yanlar\u0131, zay\u0131f yanlar\u0131 ve g\u00fcn\u00fcn sonunda uygulaman\u0131n ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131lay\u0131p kar\u015f\u0131layamamas\u0131d\u0131r.<\/p>\n\n\n\n<p id=\"df08\">\u015eimdi yayg\u0131n olarak kullan\u0131lan mimarilere bir g\u00f6z atal\u0131m.<\/p>\n\n\n\n<h1 id=\"75eb\"><strong>Katmanl\u0131 Mimari (Layered Architecture)<\/strong><\/h1>\n\n\n\n<p id=\"d6e8\">Bu mimari, yaz\u0131l\u0131m mimarileri aras\u0131nda en \u00e7ok kullan\u0131lan bir di\u011fer deyi\u015fle de n \u2014 tier mimari desendir. Bir \u00e7ok Java uygulamas\u0131 i\u00e7in de sekt\u00f6r taraf\u0131ndan kabul g\u00f6ren ve bir \u00e7ok yaz\u0131l\u0131m mimar\u0131, tasar\u0131mc\u0131 ve geli\u015ftirici aras\u0131nda yayg\u0131n olarak bilinir ve geleneksel organizasyonel yap\u0131ya benzerlik g\u00f6sterir.<br>Katmanl\u0131 mimaride katmanlar yatay \u015fekildedir ve uygulamada her katman\u0131n spesifik bir g\u00f6revi vard\u0131r. Genel olarak bu mimaride katmanlar \u015fu \u015fekildedir: sunum katman\u0131 (presentation layer), i\u015f katman\u0131 (business layer) ve veritaban\u0131 (database layer) katman\u0131d\u0131r. Bu katmanlar\u0131n k\u0131saca g\u00f6revlerine gelirsek ise; sunum katman\u0131 kullan\u0131c\u0131 aray\u00fcz\u00fcne gelen istekleri kar\u015f\u0131lar. \u0130\u015f katman\u0131nda ise k\u0131saca uygulaman\u0131n i\u015f y\u00fckleri yaz\u0131l\u0131r. Aray\u00fczden gelen istekler ve veritaban\u0131ndan al\u0131nan datalar bu katmanda i\u015flenir. Bu mimaride i\u015fler par\u00e7a par\u00e7a tamamlan\u0131r. Sunum katman\u0131 istemci datas\u0131n\u0131n nas\u0131l al\u0131nd\u0131\u011f\u0131n\u0131 bilmek durumunda de\u011fildir, sadece gelen datay\u0131 i\u015fleyip ekrana yans\u0131tmakla g\u00f6revlidir. Buna benzer olarak i\u015f katman\u0131n\u0131n da aray\u00fcze yans\u0131t\u0131lacak bilgilerin nas\u0131l yans\u0131t\u0131laca\u011f\u0131n\u0131 bilmesine gerek yoktur. Sadece gelen datay\u0131 al\u0131r i\u015f kurallar\u0131na g\u00f6re i\u015fler ve aray\u00fcze g\u00f6nderir. Bu mimarinin en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden birisi de bu katmanlar\u0131n ilgilendi\u011fi konlar\u0131n birbirlerinden ayr\u0131l\u0131yor olmas\u0131d\u0131r.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/miro.medium.com\/v2\/resize:fit:1022\/1*O9cDnNOk9qhLOpzuGK3LCw.png\" alt=\"\"\/><\/figure>\n\n\n\n<h1 id=\"9829\">Anahtar Kavramlar<\/h1>\n\n\n\n<ul><li>Bu mimarinin en \u00f6nemli kavramlar\u0131ndan birisi her katman\u0131n kapal\u0131 olarak i\u015faretlenmesidir. Peki bu ne demek? Bir istek geldi\u011finde yukar\u0131dan a\u015fa\u011f\u0131ya do\u011fru t\u00fcm katmanlarda hareket eder. Peki neden bu istek direkt olarak aray\u00fczden veritaban\u0131 katman\u0131na gitmiyor? Bunun cevab\u0131 ise \u201clayers of isolation\u201d olrak bilinen kavramd\u0131r. Buradaki her bir katman bir di\u011feri \u00fczerinde etkisi yoktur. Bu katmanlar birbirileri i\u00e7erisinde ba\u011f\u0131ms\u0131zlard\u0131r ve birbirlerinin nas\u0131l \u00e7al\u0131\u015ft\u0131klar\u0131 hakk\u0131nda \u00e7ok az bilgiye sahiplerdir.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*psW2RsoORzOUc0kxKQ9sYA.png\" alt=\"\"\/><\/figure>\n\n\n\n<ul><li>Baz\u0131 durumlarda ise ara bir katman olarak servis katman\u0131 konumland\u0131rmak iyi bir fikirdir. Ayr\u0131 bir servis katman\u0131 olmadan sunum katman\u0131n\u0131n, bu servislere eri\u015fimini mimari olarak s\u0131n\u0131rlayamay\u0131z. Servis katman\u0131n\u0131 a\u00e7\u0131k olarak i\u015faretleyerek, gelen isteklerin bu katman\u0131 bypass edip alttaki di\u011fer katmana eri\u015fimi sa\u011flan\u0131r. Kapal\u0131 ve a\u00e7\u0131k katmanlar; t\u00fcm katmanlar ve istek ak\u0131\u015f\u0131 aras\u0131ndaki ili\u015fkiyi tan\u0131mlamaya yard\u0131mc\u0131 olur. Ayr\u0131ca, geli\u015ftiriciye katmanlar aras\u0131ndaki eri\u015fim k\u0131s\u0131tlamalar\u0131 hakk\u0131nda gerekli bilgileri de sa\u011flar.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*08QtpoUZ5Q25gFXf-l8hcQ.png\" alt=\"\"\/><\/figure>\n\n\n\n<p id=\"a049\"><em>De\u011ferlendirme k\u0131sm\u0131 okudu\u011fum kitapta 6 ana ba\u015fl\u0131k alt\u0131nda toplan\u0131yor. Bu \u015fekildeki anlat\u0131m ho\u015fuma gitti\u011fi i\u00e7in ben de ayn\u0131 yap\u0131da de\u011ferlendirme k\u0131sm\u0131n\u0131 olu\u015fturdum.<\/em><br>Katmanl\u0131 Mimariyi De\u011ferlendirilmesi;<\/p>\n\n\n\n<ul><li><strong>\u00c7eviklik<\/strong>: D\u00fc\u015f\u00fck<br>&#8211; De\u011fi\u015fiklikler, katmanlarda izole bir \u015fekilde yap\u0131lmas\u0131na ra\u011fmen bu mimaride de\u011fi\u015fiklikler kolay olmaz ve gere\u011finden fazla zaman harcatabilir. Bu ya\u015fanan s\u0131k\u0131nt\u0131lar ise monolitik mimarinin do\u011fas\u0131 gere\u011fi ve bile\u015fenlerinin birbirine s\u0131k\u0131 bir \u015fekilde ba\u011fl\u0131 olmas\u0131ndan ortaya \u00e7\u0131kmaktad\u0131r.<\/li><li><strong>Da\u011f\u0131t\u0131m Kolayl\u0131\u011f\u0131<\/strong>: D\u00fc\u015f\u00fck<br>&#8211; B\u00fcy\u00fck uygulamalar i\u00e7in da\u011f\u0131t\u0131m (deployment) baz\u0131 durumlarda s\u0131k\u0131nt\u0131l\u0131 olabilmektedir. Bir bile\u015fende yap\u0131lacak ufak bir de\u011fi\u015fiklik, t\u00fcm uygulaman\u0131n tekrardan da\u011f\u0131t\u0131lmas\u0131n\u0131 gerektirebilir. Bu da da\u011f\u0131t\u0131m\u0131n mesai saatleri d\u0131\u015f\u0131nda veya hafta sonlar\u0131 yap\u0131lmas\u0131 y\u00f6n\u00fcnde planlanmas\u0131na neden olur.<\/li><li><strong>Testedilebilirlik<\/strong>: Y\u00fcksek<br>&#8211; Bile\u015fenler bulundu\u011fu spesifik katmana ba\u011fl\u0131 olduklar\u0131 i\u00e7in di\u011fer katmanlar mock\u2019lanabilir. Bu da bu mimarinin kolay test edilmesini sa\u011flar.<\/li><li><strong>Performans<\/strong>: D\u00fc\u015f\u00fck<br>&#8211; Bu mimaride, gelen bir istek t\u00fcm katmanlardan ge\u00e7ece\u011fi i\u00e7in verimsizli\u011fe yol a\u00e7acakt\u0131r. Bu da y\u00fcksek performansl\u0131 uygulamalar i\u00e7in istedi\u011fimiz bir durum de\u011fildir.<\/li><li><strong>\u00d6l\u00e7eklenebilirlik<\/strong>: D\u00fc\u015f\u00fck<br>&#8211; Monolitik ve katmanlar\u0131n birbirleriyle s\u0131k\u0131 \u015fekilde ba\u011fl\u0131 olmas\u0131ndan dolay\u0131, bu mimaride yaz\u0131lm\u0131\u015f uygulamalar kolay bir \u015fekilde \u00f6l\u00e7eklendirilemezler. Bu mimaride, her katman ayr\u0131 bir \u015fekilde da\u011f\u0131tl\u0131r veya t\u00fcm uygulamay\u0131 birden fazla node\u2019a kopyalanabilir. Fakat bu durumda \u00f6l\u00e7eklendirme \u00e7ok masrafl\u0131 olacakt\u0131r.<\/li><li><strong>Geli\u015ftirme kolayl\u0131\u011f\u0131<\/strong>: Y\u00fcksek<br>&#8211; Bu mimari \u00e7ok iyi bilinen ve uygulanmas\u0131 kar\u0131\u015f\u0131k olmayan bir mimaridir. Bir \u00e7ok firma uygulamalar\u0131n\u0131 katman katman b\u00f6lerek geli\u015ftirece\u011fi i\u00e7in bu mimari i\u015f uygulamalar\u0131 i\u00e7in bi\u00e7ilmi\u015f kaftand\u0131r.<br>&#8211; Firmalar\u0131n organizasyonel yap\u0131s\u0131 ve ileti\u015fimi aras\u0131ndaki ba\u011flant\u0131ya ve bu yap\u0131ya benzeyen uygulama geli\u015ftirme y\u00f6ntemine Conway\u2019s law denir. Google\u2019dan bu konu hakk\u0131nda detayl\u0131 bilgiler edinebilirsiniz.<\/li><\/ul>\n\n\n\n<p id=\"7714\">Yaz\u0131m\u0131n devam\u0131nda&nbsp;<a href=\"https:\/\/medium.com\/p\/1bccd79a14f\">Olay Dayal\u0131 Mimari(Event-Driven Architecture)<\/a>\u2019den bahsedece\u011fim.<br>Kaynak\u00e7a: Software Architecture Patterns \u2014 Mark Richards<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bu yaz\u0131mda yaz\u0131l\u0131m d\u00fcnyas\u0131nda yer alan \u00e7e\u015fitli yaz\u0131l\u0131m mimarilerinden bahsedece\u011fim. Bildi\u011finiz \u00fczere uygulamalar yaz\u0131lmadan \u00f6nce belirli bir yap\u0131 \u00fczerine in\u015faa edilir, t\u0131pk\u0131 bir bina dikilmeden \u00f6nce \u00e7\u0131kar\u0131lan yap\u0131 plan\u0131 gibi. Bir Yaz\u0131l\u0131m Mimarisine Neden \u0130htiya\u00e7 Duyar\u0131z? E\u011fer uygulama belirli bir yap\u0131 \u00fczerine in\u015faa edilmezse bu uygulaman\u0131n bile\u015fenleri aras\u0131ndaki ba\u011fl\u0131l\u0131k \u00e7ok y\u00fcksek olacakt\u0131r. Bu da uygulamada\u2026 <span class=\"read-more\"><a href=\"https:\/\/blog.firatyasar.com\/?p=147\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":148,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=\/wp\/v2\/posts\/147"}],"collection":[{"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=147"}],"version-history":[{"count":2,"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=\/wp\/v2\/posts\/147\/revisions"}],"predecessor-version":[{"id":201,"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=\/wp\/v2\/posts\/147\/revisions\/201"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=\/wp\/v2\/media\/148"}],"wp:attachment":[{"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=147"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=147"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=147"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}