﻿
{"id":13018,"date":"2020-01-06T22:00:56","date_gmt":"2020-01-06T22:00:56","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=13018"},"modified":"2020-01-06T22:00:56","modified_gmt":"2020-01-06T22:00:56","slug":"c-delegasyon-ile-exception-yonetimi","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-delegasyon-ile-exception-yonetimi\/","title":{"rendered":"C# &#8211; Delegasyon \u0130le Exception Y\u00f6netimi"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Proje geli\u015ftirme s\u00fcre\u00e7lerinde en \u00f6nemli noktalardan birisi uygulaman\u0131n herhangi bir noktas\u0131nda olan anl\u0131k hatalar\u0131\/aksakl\u0131klar\u0131\/istisnalar\u0131 takip etmemizi sa\u011flayan <em>try &#8211; catch<\/em> yap\u0131lanmas\u0131d\u0131r. Bu yap\u0131lanma, bir v\u00fccudun genel sinir a\u011f yap\u0131lanmas\u0131n\u0131 olu\u015fturan ve sanki deri \u00fczerinde olu\u015fan normal d\u0131\u015f\u0131 bir m\u00fcdahalede direkt olarak beyne sinyal g\u00f6nderen glia h\u00fccreleri misali uygulama \u00fczerinde de metot metot i\u015flenmeli ve olas\u0131 t\u00fcm ola\u011fan d\u0131\u015f\u0131 durumda biz developerlara bilgi vermeli ve bir yandan da kullan\u0131c\u0131y\u0131 do\u011fru y\u00f6nlendirmelidir.<\/p>\n<p>T\u00fcm bunlar\u0131n yan\u0131nda try &#8211; catch yap\u0131lanmas\u0131 olduk\u00e7a dikkatli ve do\u011fru hesaplanm\u0131\u015f bir \u015fekilde kullan\u0131lmal\u0131d\u0131r. Bunun nedeni kod ak\u0131\u015f\u0131n\u0131 reaktif bir takip ile hata verip vermeyece\u011fini denetleyen ve varsa hata bunu manip\u00fcle edebilen bir mekanizma olmas\u0131ndan kaynaklanmaktad\u0131r. Dolay\u0131s\u0131yla bu bahsedilen yetenekler anlayaca\u011f\u0131n\u0131z y\u00fcksek yak\u0131t gerektirmekte ve nihayetinde bu durumda ortaya bir maliyet serilmektedir. Bundan dolay\u0131, hata kontrol mekanizmalar\u0131n\u0131n yersiz kullan\u0131mlar\u0131n\u0131n uygulamay\u0131 ne kadar olumsuz etkileyece\u011fi hesaba kat\u0131lmal\u0131 ve ona g\u00f6re yerli ve do\u011fru bir \u015fekilde kullan\u0131lmas\u0131 i\u00e7in \u00f6zen g\u00f6sterilmelidir.<\/p>\n<p>Geli\u015fmi\u015f uygulama tasar\u0131mlar\u0131nda nesne y\u00f6nelimli programlama nimetlerini kullanarak \u0130stisnai Durum Y\u00f6netimi(Exception Handling) ba\u015fl\u0131\u011f\u0131 alt\u0131nda de\u011ferlendirilen tasar\u0131mlar sayesinde projeye \u00f6zg\u00fc a&#8217;dan z&#8217;ye \u00f6zelle\u015ftirilmi\u015f stratejiler geli\u015ftirilebilir ve t\u00fcm bu desenler try &#8211; catch yap\u0131lanmas\u0131 ile y\u00f6netilerek, sistem y\u00f6neticisine yahut developera uygulaman\u0131n i\u015fleyi\u015fine dair kritik bilgiler verilebilir. Anlayaca\u011f\u0131n\u0131z \u00fczerine kafa yoruldu\u011fu taktirde ucu buca\u011f\u0131 olmayan bir derya olabilecek konu \u00fczerinde kalem oynat\u0131yoruz diyebiliriz.<\/p>\n<p>Bizler bu i\u00e7eri\u011fimizde hata kontrol mekanizmalar\u0131n\u0131 nesne y\u00f6nelimli programlama prensipleri \u0131\u015f\u0131\u011f\u0131nda ortaya konmu\u015f tasar\u0131mlar a\u00e7\u0131s\u0131ndan ele almaktan ziyade direkt olarak yap\u0131sal ele alacak ve try &#8211; catch yap\u0131lanmas\u0131n\u0131 daha aktif ve daha pratik nas\u0131l kullan\u0131labilece\u011fine odaklanaca\u011f\u0131z. Bunun i\u00e7in yaz\u0131m\u0131z\u0131n ileriki sat\u0131rlar\u0131nda da g\u00f6rebilece\u011finiz \u00fczere <a href=\"https:\/\/www.gencayyildiz.com\/blog\/cta-delegatetemsilci-ve-eventolay-kullanimi\/\" rel=\"noopener noreferrer\" target=\"_blank\">delege<\/a>leri kullanaca\u011f\u0131z.<\/p>\n<p>Her\u015feyden \u00f6nce o bildi\u011finiz kavisli k\u0131vr\u0131mlar\u0131yla hemen hemen her metot i\u00e7erisinde kullan\u0131lan try &#8211; catch yap\u0131s\u0131n\u0131 \u015f\u00f6yle bi al\u0131c\u0131 g\u00f6z\u00fcyle tekrar ele alal\u0131m \ud83d\ude42<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            try\r\n            {\r\n                \/\/Olas\u0131 hata verebilecek komutlar...\r\n            }\r\n            catch (Exception)\r\n            {\r\n                \/\/Hata al\u0131nd\u0131\u011f\u0131 taktirde \u00e7al\u0131\u015ft\u0131r\u0131lacak komutlar...\r\n                throw;\r\n            }\r\n            finally\r\n            {\r\n                \/\/Hata olsa da olmasa da \u00e7al\u0131\u015ft\u0131r\u0131lacak komutlar...\r\n            }\r\n<\/pre>\n<p>Yap\u0131sal olarak try &#8211; catch bloklar\u0131, \u00e7al\u0131\u015fma mant\u0131\u011f\u0131 a\u00e7\u0131s\u0131ndan olduk\u00e7a kolay lakin kod israf\u0131 a\u00e7\u0131s\u0131ndan ise olduk\u00e7a maliyetlidir. Nihayetinde tek sat\u0131rl\u0131k i\u015flemlerinde scopelar\u0131n\u0131n kald\u0131r\u0131lmas\u0131na bile m\u00fcsade etmeyen bu blok bir kod sayfas\u0131nda birka\u00e7 kez kullan\u0131ld\u0131\u011f\u0131 taktirde kendisini belli etmekte ve kodu haddinden fazla \u015fi\u015firmektedir. \u015e\u00f6yle ki;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static double Bol(double sayi1, double sayi2)\r\n        {\r\n            try\r\n            {\r\n                double sonuc = sayi1 \/ sayi2;\r\n                return sonuc;\r\n            }\r\n            catch (DivideByZeroException ex)\r\n            {\r\n                Console.WriteLine(&quot;L\u00fctfen sayi2 de\u011ferini s\u0131f\u0131rdan farkl\u0131 giriniz.&quot;);\r\n                throw;\r\n            }\r\n            finally\r\n            {\r\n                Console.WriteLine(&quot;\u0130\u015flem sonlanm\u0131\u015ft\u0131r.&quot;);\r\n            }\r\n        }\r\n\r\n        static double Donustur(string deger)\r\n        {\r\n            try\r\n            {\r\n                double sayisalDeger = double.Parse(deger);\r\n                return sayisalDeger;\r\n            }\r\n            catch (Exception)\r\n            {\r\n                Console.WriteLine(&quot;L\u00fctfen degeri say\u0131sal belirtiniz.&quot;);\r\n                throw;\r\n            }\r\n        }\r\n<\/pre>\n<p>g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere yukar\u0131daki kod esas\u0131nda ufak iki adet i\u015flem bar\u0131nd\u0131r\u0131yor olsada yaz\u0131lan kodun maliyetine bak\u0131n\u0131z. Halbuki bu kodun sade hali a\u015fa\u011f\u0131dakinden farks\u0131zd\u0131r \ud83d\ude42<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static double Bol(double sayi1, double sayi2)\r\n        {\r\n            double sonuc = sayi1 \/ sayi2;\r\n            return sonuc;\r\n        }\r\n\r\n        static double Donustur(string deger)\r\n        {\r\n            double sayisalDeger = double.Parse(deger);\r\n            return sayisalDeger;\r\n        }\r\n<\/pre>\n<p>Bizler tabi ki de kullan\u0131c\u0131dan gelen opsiyonel de\u011ferler do\u011frultusunda olas\u0131 hata bar\u0131nd\u0131ran t\u00fcm kodlar\u0131m\u0131z\u0131 try &#8211; catch ile korumaya alaca\u011f\u0131z. Lakin bu i\u015f bu kadar maliyetli olmak zorunda de\u011fildir. Bunun i\u00e7in yukar\u0131daki sat\u0131rlarda da bahsedildi\u011fi \u00fczere delegasyonel bir yakla\u015f\u0131mla daha pratik ve kullan\u0131\u015fl\u0131 bir \u015fekilde tasar\u0131m olu\u015fturularak, \u00e7\u00f6z\u00fclebilir.<\/p>\n<p><strong>Peki exception y\u00f6netimi i\u00e7in delegasyondan kast\u0131n\u0131z nedir?<\/strong><br \/>\nBu soruya cevap olarak &#8220;System&#8221; namespace&#8217;i alt\u0131nda bulunan <em>Action<\/em> delegate&#8217;ini verebiliriz. &#8220;Action&#8221; \u00f6z\u00fc itibariyle bir delegate oldu\u011fu i\u00e7in imzas\u0131 gere\u011fi geriye de\u011fer d\u00f6nd\u00fcrmeyen herhangi bir metodu temsil edebilmektedir. E\u011fer ki, geriye de\u011fer d\u00f6nd\u00fcren metotlar\u0131 temsil eden bir delegasyonla \u00e7al\u0131\u015fmak istiyorsan\u0131z ya custom bir delegete geli\u015ftirmeniz yahut \u00f6nceden tan\u0131mlanm\u0131\u015f bir delege t\u00fcr\u00fc olan <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-funconceden-tanimlanmis-delege-turu\/\" rel=\"noopener noreferrer\" target=\"_blank\">Func<\/a> yap\u0131lar\u0131na g\u00f6z atman\u0131z gerekmektedir.<\/p>\n<p><strong>Delegasyondan kast\u0131n\u0131z\u0131n Action delegesi oldu\u011funu anlad\u0131m. Peki bu delegasyon ile nas\u0131l bir tasar\u0131m ger\u00e7ekle\u015ftirmemizi \u00f6neriyorsunuz?<\/strong><br \/>\nBu soruyu teoride cevaplarsak e\u011fer; t\u00fcm uygulamada exception kontrol sorumlulu\u011funu \u00fcstlenecek olan bir metot tasarlan\u0131r ve bu metotta &#8220;Action&#8221; tipinde bir parametre al\u0131n\u0131r. Bu parametre d\u0131\u015far\u0131dan verilen callback fonksiyon i\u00e7erisindeki i\u015flemleri ilgili metot i\u00e7erisinde \u00f6nceden varsay\u0131lan olarak yaz\u0131lm\u0131\u015f bir try &#8211; catch yap\u0131lanmas\u0131 i\u00e7erisinde uygun bir yerde invoke edecektir. Dolay\u0131s\u0131yla bir metot ve o metoda verilen callback fonksiyon arac\u0131l\u0131\u011f\u0131yla yaz\u0131lan kod, esas\u0131nda try &#8211; catch blo\u011fu i\u00e7erisinde \u00e7al\u0131\u015ft\u0131r\u0131laca\u011f\u0131 i\u00e7in kod maliyetini olduk\u00e7a minimize etmi\u015f ve m\u00fcmk\u00fcn mertebe temiz kod yazabilme olana\u011f\u0131 elde etmi\u015f olunacakt\u0131r.<\/p>\n<p>Yine ilgili soruyu pratikte cevaplarsak e\u011fer; exception kontrol sorumlulu\u011funu \u00fcstlenecek olan metodumuzu a\u015fa\u011f\u0131daki gibi geli\u015ftirmemiz gerekmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void ExceptionHandler(Action metot)\r\n        {\r\n            try\r\n            {\r\n                metot();\r\n            }\r\n            catch (Exception)\r\n            {\r\n                throw;\r\n            }\r\n            finally\r\n            {\r\n\r\n            }\r\n        }\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8220;Action&#8221; delegasyon tipinden olan &#8220;metot&#8221; isimli parametre try blo\u011fu i\u00e7erisinde invoke edilmektedir. Bu metot ilgili delegasyon i\u00e7erisinde olan t\u00fcm operasyonlar\u0131 invoke edildi\u011fi noktada tetikleyece\u011finden ve o noktan\u0131nda try &#8211; catch blo\u011fu i\u00e7erisinde olmas\u0131ndan dolay\u0131 do\u011fal bir hata kontrol mekanizmas\u0131 s\u00f6z konusu olacakt\u0131r. Bu yap\u0131y\u0131 a\u015fa\u011f\u0131daki gibi kullanarak yukar\u0131lardaki sat\u0131rlarda verilen \u00f6rneklere nazaran kodumuzu geli\u015ftirirsek e\u011fer aradaki fark\u0131 g\u00f6rmenizi istirham ederim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static double Bol(double sayi1, double sayi2)\r\n        {\r\n            double sonuc = 0;\r\n            ExceptionHandler(() =&gt; sonuc = sayi1 \/ sayi2);\r\n            return sonuc;\r\n        }\r\n\r\n        static double Donustur(string deger)\r\n        {\r\n            double sayisalDeger = 0;\r\n            ExceptionHandler(() =&gt; sayisalDeger = double.Parse(deger));\r\n            return sayisalDeger;\r\n        }\r\n<\/pre>\n<p>Nihai olarak, her daim kodun genel anatomisini destekleyen \u00e7al\u0131\u015fmalar\u0131n sade ve sadece mimarisel tasar\u0131mlarla de\u011fil azda olsa bu \u015fekilde prosed\u00fcrel yakla\u015f\u0131mlar sergileyerekte sa\u011flanabildi\u011finin fark\u0131nda olman\u0131z ve ilgilenenlerin faydalanmas\u0131 dile\u011fiyle \ud83d\ude42<\/p>\n<p>Sonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar dilerim&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Proje geli\u015ftirme s\u00fcre\u00e7lerinde en \u00f6nemli noktalardan birisi uygulaman\u0131n herhangi bir noktas\u0131nda olan anl\u0131k hatalar\u0131\/aksakl\u0131klar\u0131\/istisnalar\u0131 takip etmemizi sa\u011flayan try &#8211; catch yap\u0131lanmas\u0131d\u0131r. Bu yap\u0131lanma, bir v\u00fccudun genel sinir a\u011f yap\u0131lanmas\u0131n\u0131 olu\u015fturan ve sanki deri&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":3014,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2739,12],"tags":[287,3112,3111,169,3113,527],"class_list":["post-13018","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core","category-c-sharp-c","tag-action","tag-action-exception","tag-delegasyon-ile-exception-yonetimi","tag-delegate","tag-delegate-exception","tag-func"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/13018","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=13018"}],"version-history":[{"count":36,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/13018\/revisions"}],"predecessor-version":[{"id":13054,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/13018\/revisions\/13054"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3014"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=13018"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=13018"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=13018"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}