{"id":248,"date":"2015-01-31T23:51:50","date_gmt":"2015-01-31T21:51:50","guid":{"rendered":"http:\/\/ozenozkaya.com\/blog\/?p=248"},"modified":"2016-02-07T21:25:04","modified_gmt":"2016-02-07T19:25:04","slug":"gomulu-sistemler-18-fonksiyonlar-ve-temiz-kodlama","status":"publish","type":"post","link":"http:\/\/ozenozkaya.com\/blog\/?p=248","title":{"rendered":"G\u00f6m\u00fcl\u00fc C &#8211; 7 : Fonksiyonlar ve Temiz Kodlama"},"content":{"rendered":"<p>\u0130ngilizce&#8217;de\u00a0&#8220;clean coding&#8221; (temiz kodlama) denilen mevzu ile ilgi, c\u00fcz-i irademden d\u00f6k\u00fclen bir tak\u0131m fikir ve ilmi bilgileri, \u00a0siz de\u011ferli okurlarla payla\u015faca\u011f\u0131m.<\/p>\n<p><strong>Temiz Fonksiyonlar<\/strong><\/p>\n<p>Malumunuz fonksiyonlar (methodlar) bir program\u0131n eli kolu\u00a0de\u011fildir ama\u00a0program\u0131n hayata dokunmas\u0131 s\u00fcrecidir. Fonksiyonlar\u00a0do\u011fru kullan\u0131lmazsa, \u00e7ok yanl\u0131\u015f anla\u015f\u0131labilir, b\u00fcy\u00fck felaketleri do\u011furabilir. \u00a0Buradaki ibret do\u011fal olarak fonksiyonlar i\u00e7in de aynen ge\u00e7erlidir.<\/p>\n<p>Bir program bir problemi \u00e7\u00f6zmek \u00fczere bir tak\u0131m i\u015fler yapaca\u011f\u0131ndan, programda i\u015fi yapan, haliyle fonksiyonlard\u0131r. Bu sebepten \u00f6t\u00fcr\u00fcd\u00fcr ki fonksiyon isimlerinin ve tan\u0131mlamalar\u0131n\u0131n iyi yap\u0131lmas\u0131, program\u0131n i\u015fini hakk\u0131 ile yapmas\u0131nda yads\u0131namaz bir paya sahiptir. Bir fonksiyon okundu\u011funda, okuyan ki\u015finin beyninde ba\u011flant\u0131 kuraca\u011f\u0131 bir \u015feyleri uzun s\u00fcreler aramamal\u0131, hemen gidece\u011fi yere gitmelidir. Bu da fonksiyonu yazan\u0131n pekala da yard\u0131mc\u0131 olabilece\u011fi bir konudur. \u00c7i\u00e7ek gibi kod yazman\u0131n baz\u0131 basit, temel kurallar\u0131 vard\u0131r. Bu kurallar\u0131n baz\u0131lar\u0131 biliniyor baz\u0131lar\u0131n\u0131 ben uydurdum. Akl\u0131n\u0131za yatmayan\u0131 zaten bo\u015f veriniz. S\u00f6z konusu\u00a0kurallar \u015f\u00f6yle:<\/p>\n<ul>\n<li>Fonksiyonun ad\u0131, fonskiyonun sorumlulu\u011funu ve s\u00f6z konusu mevzuyu \u00e7ok^5 temizlik seviyesinde a\u00e7\u0131klamal\u0131d\u0131r. Temizlik, isimden ba\u015flamaktad\u0131r.<\/li>\n<li>Fonksiyon, m\u00fcmk\u00fcnse tek bir i\u015f yapmal\u0131d\u0131r. M\u00fcmk\u00fcn de\u011filse bile fonksiyon tek bir i\u015f yapmal\u0131d\u0131r.<\/li>\n<li>Fonksiyon \u00e7ok uzun olamamal\u0131d\u0131r. Bir fonksiyonu okurken afedersiniz skrol yapmak gerekiyorsa, \u00a0o fonksiyon hemen par\u00e7alanmal\u0131d\u0131r.21&#8243; monit\u00f6rde tek fonksiyon i\u00e7ine skrol gerektirecek kadar kod yazmak hol de\u011fildir.<\/li>\n<li>Fonksiyon pahal\u0131 bir olgudur. Bu sebeple fonksiyonun tekrar kullan\u0131laca\u011f\u0131 d\u00fc\u015f\u00fcn\u00fclmelidir.<\/li>\n<li>Yaz\u0131lan bir\u00a0fonksiyon, makine i\u00e7in de\u011fil insan i\u00e7in yaz\u0131l\u0131r. Fonksiyon\u00a0makine \u00fczerinde \u00e7al\u0131\u015facak diye bir tek makinenin anlayaca\u011f\u0131 \u015fekilde yazmak kalite ve anla\u015f\u0131labilirlik\u00a0kayb\u0131na sebep olur. Kod \u00e7al\u0131\u015fmak zorunda oldu\u011fundan makine zaten onu anlayacakt\u0131r. As\u0131l mesele, insan\u0131n anlayaca\u011f\u0131 \u015fekilde kod yazmakt\u0131r.<\/li>\n<li>Fonksiyon, da\u011f\u0131t\u0131lmadan \u00f6nce do\u011frulanmal\u0131d\u0131r ki kullanan ki\u015filere aktar\u0131lmas\u0131n\u0131n bir manas\u0131 olsun.<\/li>\n<li>Kolaya ka\u00e7\u0131l\u0131p, afedersiniz k\u00f6t\u00fc kod, yorum sat\u0131rlar\u0131yla s\u0131vanmamal\u0131d\u0131r. Yorum sat\u0131rlar\u0131 ge\u00e7ici iken, fonksiyonun kendisi kal\u0131c\u0131d\u0131r. Madem ki yorum sat\u0131r\u0131 yaz\u0131labiliyor, ondan \u00f6nce fonksiyonun kendisi temiz yaz\u0131lmal\u0131d\u0131r. Kod yazarak yap\u0131lamayacak \u015feyler, yorum sat\u0131rlar\u0131 ile yap\u0131lmald\u0131r.<\/li>\n<li>Bir fonksiyonun ad\u0131nda -meclisten d\u0131\u015far\u0131- &#8220;ve(and), veya(and), oyleyse(then)&#8221; gibi kelimelerin ge\u00e7mesi, o fonksiyonun birden fazla i\u015f yaparak d\u00fcnyay\u0131 kurtarmaya \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6stermektedir. Bu \u00e7ok yanl\u0131\u015ft\u0131r. D\u00fcnyay\u0131 kurtarmak \u00a0bir tak\u0131m i\u015fidir. Bu fonksiyonlar derhal par\u00e7alanmal\u0131 ve temizlenmelidir.<\/li>\n<li>Bir fonksiyonu her kullanan ki\u015fi, o fonksiyonun tepesindeki yorumlar\u0131 de\u011fil, bizzat ismini g\u00f6recektir. Yorum sat\u0131r\u0131n\u0131 g\u00f6rebilmek i\u00e7in fonksiyonun implementasyonunu a\u00e7mak gerekmektedir. Bu,\u00a0orta \u00e7a\u011fdan kalma bir i\u015fkence y\u00f6ntemidir ve yap\u0131lmamal\u0131d\u0131r. Re\u00e7ete olarak, temiz, yapt\u0131\u011f\u0131 i\u015fi ismiyle anlatan fonksiyonlar\u0131n yaz\u0131lmas\u0131 \u015fifa verecektir.<\/li>\n<li>Bir yaz\u0131l\u0131mdaki t\u00fcm isimler, derleyici taraf\u0131ndan adres sembollerine \u00e7evirilece\u011finden, uzun ve derdi a\u00e7\u0131k\u00e7a anlatan fonksiyon isimleri se\u00e7mek hi\u00e7 kimseye zarar vermeyece\u011fi gibi yazar\u0131n yapt\u0131\u011f\u0131 i\u015fin kalitesini\u00a0art\u0131racakt\u0131r. Uzun isimli fonksiyon, k\u0131sa isimli fonksiyondan daha fazla bellek t\u00fcketmeyece\u011finden eli korkak al\u0131\u015ft\u0131rman\u0131n l\u00fczumu yoktur.<\/li>\n<\/ul>\n<p>Maddeler bunlar. \u015eimdi kalem kalem bu ba\u015fl\u0131\u011f\u0131n \u00f6nemli konular\u0131na\u00a0de\u011finelim.<\/p>\n<p><strong>Anla\u015f\u0131labilirlik ve Mod\u00fclarite<\/strong><\/p>\n<p>Hi\u00e7 laf kalabal\u0131\u011f\u0131 yapmadan, somut\u00a0\u00f6rneklerle mevzuya dalaca\u011f\u0131m. Zaten eski bir ahitte yazd\u0131\u011f\u0131m bir \u00f6rne\u011fi sizlerle bu perspektifte payla\u015faca\u011f\u0131m.<\/p>\n<p><del><em>K\u00f6t\u00fc \u00d6rnek:<\/em><\/del><\/p>\n<pre class=\"lang:c decode:true\">void ikiDegiskeniToplaVeSeriPortaYaz(uint32_t a, uint32_t b)\r\n{\r\n\/\/here we sum two\r\nuint32_t c= a+b;\r\n\r\n\/\/das ist sch\u00f6n, jaa\r\nUART5.RESET = 1;\r\nUART5.DREG = c&gt;&gt;24; \r\nUART5.TX = 1;\r\n \r\nUART5.RESET=1;\r\nUATRT5.DREG=c&gt;&gt;16;\r\nUART5.TX = 1;\r\n \r\nUART5.RESET=1;\r\nUART5.DREG=c&gt;&gt;8;\r\nUART5.TX =1;\r\n \r\nUART5.RESET=1;\r\nUART5.DREG=c;\r\nUART5.TX=1;\r\n}<\/pre>\n<p>Yukar\u0131daki rezil kodu hat\u0131rlars\u0131n\u0131z. Bu t\u00fcr kodlama y\u00fcz\u00fcnden nice \u00e7ok da olumlu yorulmlar al\u0131nmayaca\u011f\u0131 anla\u015f\u0131lmakta. Bir kere fonksiyonun ad\u0131ndan &#8220;Ve&#8221; yaz\u0131yor. Bu fonksiyon d\u00fcnyay\u0131 tek ba\u015f\u0131na kurtarma gayretini, belki iyi niyetle ancak saf bir cehaletle g\u00f6stermektedir. Cehalet k\u00f6t\u00fcd\u00fcr. Fonksiyonun ad\u0131 hele iyice faciad\u0131r \u00e7\u00fcnk\u00fc C dilini az \u00e7ok bilen herkes bu fonksiyonun iki de\u011feri toplayarak, bellekte\u00a0bir yerlere yazd\u0131\u011f\u0131n\u0131 anlayabilecektir. As\u0131l soru bu i\u015fin neden, ne zaman, ne ama\u00e7la yap\u0131ld\u0131\u011f\u0131d\u0131r ki bu da ger\u00e7e\u011fin alt\u0131ndaki hakikatin ta kendisidir.<\/p>\n<p>Bir di\u011fer \u015f\u0131k olmayan davran\u0131\u015f ise\u00a0fonksiyon isminin T\u00fcrk\u00e7e, yorumlar\u0131n ise Almanca + \u0130ngilizce olmas\u0131d\u0131r. Bu yorumlar\u0131 kimse &#8211; belki \u0130lber Ortayl\u0131 hari\u00e7 &#8211; anlayamayacakt\u0131r (\u0130lber Hoca da yorumlar\u0131 anlasa da kodu anlayamayacakt\u0131r). Dolay\u0131s\u0131yla kodda tek bir insan dili tercih etmek daha ho\u015f olacakt\u0131r.<\/p>\n<p><em>G\u00fczel \u00d6rnek:<\/em><\/p>\n<pre class=\"lang:c decode:true\">typedef union\r\n{\r\n   uint32_t u32Veri;\r\n   uint8_t  au8Veri[4];\r\n}tu_VeriPaketi32Bit;\r\n \r\nvoid bilgisayaraByteGonder(uint8_t u8Veri)\r\n{\r\n UART5.RESET=1;\r\n UART5.DREG=u8Veri;\r\n UART5.TX = 1;\r\n}\r\n \r\nuint32_t hasilatiHesaplaTL(uint16_t u16BazUcretTL, uint16_t u16KomisyonUcretiTL)\r\n{\r\n    return (u16BazUcretTL+u16KomisyonUcretiTL);\r\n}\r\n \r\nvoid hasilatiGonder(uint32_t u32HasilatTL)\r\n{\r\n tu_VeriPaketi32Bit UHasilat.u32Veri=u32HasilatTL;\r\n for(uint8_t i=0;i&lt;sizeof(tu_VeriPaketi32Bit); i++)\r\n {\r\n    bilgisayaraByteGonder(UHasilat.au8Veri[i]);\r\n }\r\n}<\/pre>\n<p>Bu yukar\u0131daki kod da tan\u0131d\u0131k. Ama ben kodu yeni g\u00f6rm\u00fc\u015f gibi, &#8220;aaa ne g\u00fczel kod O_o&#8221; demek istiyorum. Paralel evrenin, bu kodu i\u00e7eren, pek de \u00fccrada kalmam\u0131\u015f bu g\u00fczel k\u00f6\u015fesinde, k\u00f6t\u00fc \u00f6rnek kodunda yap\u0131lan i\u015fler bu defa \u00e7i\u00e7ek gibi tertemiz bir \u015fekilde, amme hizmeti bilinci ile\u00a0yap\u0131lm\u0131\u015ft\u0131r. \u00a0K\u00f6t\u00fc \u00f6rnekteki kod derin kod oldu\u011fundan ne i\u015f yapt\u0131\u011f\u0131 bilinmemekte idi. G\u00fczel \u00f6rnekteki kod temiz kod oldu\u011fundan, kodun asl\u0131nda ticaret i\u015fleri ile u\u011fra\u015ft\u0131\u011f\u0131 anla\u015f\u0131lmaktad\u0131r.<\/p>\n<p>G\u00f6nderilecek veri serile\u015ftirilmek zorunda oldu\u011fundan, union kullan\u0131larak +1 m\u00fchendislik puan\u0131\u00a0kazan\u0131lm\u0131\u015ft\u0131r.<\/p>\n<p>De\u011fi\u015fken adlar\u0131 da mevzu hakk\u0131nda \u00e7ok say\u0131da a\u00e7\u0131k bilgiyi, yaz\u0131l\u0131m tutkunlar\u0131n\u0131n\u00a0hizmetine sunmaktad\u0131r. Bu kodu okuyunca u16BazUcretTL&#8217;nin TL cinsinden, 65536 TL&#8217;den k\u00fc\u00e7\u00fck bir mebla\u011f oldu\u011fu anla\u015f\u0131lmaktad\u0131r. Bu da, kodlamada \u015feffafl\u0131k ve temizliktir.<\/p>\n<p>K\u00f6t\u00fc kod, k\u00f6t\u00fcl\u00fckle s\u0131k\u0131 ba\u011flar kurmu\u015ftur. Seri porttan veri g\u00f6nderme i\u015fi er ya da ge\u00e7 ba\u015fka yerlerde de kullan\u0131laca\u011f\u0131ndan, k\u00f6t\u00fc \u00f6rnekteki yap\u0131da kopyala yap\u0131\u015ft\u0131r yapmak gerekcektir ki bu tekrar kullan\u0131labilirlik kavram\u0131ndan \u00e7ok uzakt\u0131r. G\u00fczel \u00f6rnekte ise bu i\u015fi yapan bir fonksiyon, ayr\u0131 bir bireydir ve tekrar kullan\u0131labilir yap\u0131dad\u0131r. Yani benzetme yap\u0131lacak olursa; hem d\u00fcnyas\u0131, hem ahireti g\u00fczeldir.<\/p>\n<p><strong>Rek\u00fcrsif Fonksiyonlar\u0131n Kullan\u0131m\u0131<\/strong><\/p>\n<p>M\u00fcmk\u00fcnse kullanmayal\u0131m efendim. Stack derinli\u011fi sabit olmayan rek\u00fcrsif fonksiyonlar, g\u00f6m\u00fcl\u00fc sistemlerde kullan\u0131lmamal\u0131d\u0131r. Zaten ters gidebilecek bir s\u00fcr\u00fc \u015fey varken neden bir \u015fey daha ekleyelim ki?<\/p>\n<p>Say\u0131n muhterem&#8230;\u00a0Eveeeet, bir program\u0131n daha sonuna geldiik.<\/p>\n<p>\u015eimdi devam!<\/p>\n<a href=\"http:\/\/ozenozkaya.com\/blog\/?p=245\" class=\"su-button su-button-style-3d\" style=\"color:#FFFFFF;background-color:#2D89EF;border-color:#246ec0;border-radius:5px\" target=\"_self\"><span style=\"color:#FFFFFF;padding:6px 16px;font-size:13px;line-height:20px;border-color:#6cadf4;border-radius:5px;text-shadow:none\"><i class=\"sui sui-arrow-circle-o-left\" style=\"font-size:13px;color:#FFFFFF\"><\/i> \u00d6nceki Sayfa<\/span><\/a> \u00a0<a href=\"http:\/\/ozenozkaya.com\/blog\/?p=255\" class=\"su-button su-button-style-3d\" style=\"color:#FFFFFF;background-color:#2D89EF;border-color:#246ec0;border-radius:5px\" target=\"_self\"><span style=\"color:#FFFFFF;padding:6px 16px;font-size:13px;line-height:20px;border-color:#6cadf4;border-radius:5px;text-shadow:none\"><i class=\"sui sui-arrow-circle-right\" style=\"font-size:13px;color:#FFFFFF\"><\/i> Sonraki Sayfa<\/span><\/a>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0130ngilizce&#8217;de\u00a0&#8220;clean coding&#8221; (temiz kodlama) denilen mevzu ile ilgi, c\u00fcz-i irademden d\u00f6k\u00fclen bir tak\u0131m fikir ve ilmi bilgileri, \u00a0siz de\u011ferli okurlarla payla\u015faca\u011f\u0131m. Temiz Fonksiyonlar Malumunuz fonksiyonlar (methodlar) bir program\u0131n eli kolu\u00a0de\u011fildir ama\u00a0program\u0131n hayata dokunmas\u0131 s\u00fcrecidir. Fonksiyonlar\u00a0do\u011fru kullan\u0131lmazsa, \u00e7ok yanl\u0131\u015f anla\u015f\u0131labilir, b\u00fcy\u00fck felaketleri do\u011furabilir. \u00a0Buradaki ibret do\u011fal olarak fonksiyonlar i\u00e7in de aynen ge\u00e7erlidir. Bir program bir problemi <a class=\"read-more\" href=\"http:\/\/ozenozkaya.com\/blog\/?p=248\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_tr_post_content":"\u0130ngilizce'de\u00a0\"clean coding\" (temiz kodlama) denilen mevzu ile ilgi, c\u00fcz-i irademden d\u00f6k\u00fclen bir tak\u0131m fikir ve ilmi bilgileri, \u00a0siz de\u011ferli okurlarla payla\u015faca\u011f\u0131m.\r\n\r\n<strong>Temiz Fonksiyonlar<\/strong>\r\n\r\nMalumunuz fonksiyonlar (methodlar) bir program\u0131n eli kolu\u00a0de\u011fildir ama\u00a0program\u0131n hayata dokunmas\u0131 s\u00fcrecidir. Fonksiyonlar\u00a0do\u011fru kullan\u0131lmazsa, \u00e7ok yanl\u0131\u015f anla\u015f\u0131labilir, b\u00fcy\u00fck felaketleri do\u011furabilir. \u00a0Buradaki ibret do\u011fal olarak fonksiyonlar i\u00e7in de aynen ge\u00e7erlidir.\r\n\r\nBir program bir problemi \u00e7\u00f6zmek \u00fczere bir tak\u0131m i\u015fler yapaca\u011f\u0131ndan, programda i\u015fi yapan, haliyle fonksiyonlard\u0131r. Bu sebepten \u00f6t\u00fcr\u00fcd\u00fcr ki fonksiyon isimlerinin ve tan\u0131mlamalar\u0131n\u0131n iyi yap\u0131lmas\u0131, program\u0131n i\u015fini hakk\u0131 ile yapmas\u0131nda yads\u0131namaz bir paya sahiptir. Bir fonksiyon okundu\u011funda, okuyan ki\u015finin beyninde ba\u011flant\u0131 kuraca\u011f\u0131 bir \u015feyleri uzun s\u00fcreler aramamal\u0131, hemen gidece\u011fi yere gitmelidir. Bu da fonksiyonu yazan\u0131n pekala da yard\u0131mc\u0131 olabilece\u011fi bir konudur. \u00c7i\u00e7ek gibi kod yazman\u0131n baz\u0131 basit, temel kurallar\u0131 vard\u0131r. Bu kurallar\u0131n baz\u0131lar\u0131 biliniyor baz\u0131lar\u0131n\u0131 ben uydurdum. Akl\u0131n\u0131za yatmayan\u0131 zaten bo\u015f veriniz. S\u00f6z konusu\u00a0kurallar \u015f\u00f6yle:\r\n<ul>\r\n\t<li>Fonksiyonun ad\u0131, fonskiyonun sorumlulu\u011funu ve s\u00f6z konusu mevzuyu \u00e7ok^5 temizlik seviyesinde a\u00e7\u0131klamal\u0131d\u0131r. Temizlik, isimden ba\u015flamaktad\u0131r.<\/li>\r\n\t<li>Fonksiyon, m\u00fcmk\u00fcnse tek bir i\u015f yapmal\u0131d\u0131r. M\u00fcmk\u00fcn de\u011filse bile fonksiyon tek bir i\u015f yapmal\u0131d\u0131r.<\/li>\r\n\t<li>Fonksiyon \u00e7ok uzun olamamal\u0131d\u0131r. Bir fonksiyonu okurken afedersiniz skrol yapmak gerekiyorsa, \u00a0o fonksiyon hemen par\u00e7alanmal\u0131d\u0131r.21\" monit\u00f6rde tek fonksiyon i\u00e7ine skrol gerektirecek kadar kod yazmak hol de\u011fildir.<\/li>\r\n\t<li>Fonksiyon pahal\u0131 bir olgudur. Bu sebeple fonksiyonun tekrar kullan\u0131laca\u011f\u0131 d\u00fc\u015f\u00fcn\u00fclmelidir.<\/li>\r\n\t<li>Yaz\u0131lan bir\u00a0fonksiyon, makine i\u00e7in de\u011fil insan i\u00e7in yaz\u0131l\u0131r. Fonksiyon\u00a0makine \u00fczerinde \u00e7al\u0131\u015facak diye bir tek makinenin anlayaca\u011f\u0131 \u015fekilde yazmak kalite ve anla\u015f\u0131labilirlik\u00a0kayb\u0131na sebep olur. Kod \u00e7al\u0131\u015fmak zorunda oldu\u011fundan makine zaten onu anlayacakt\u0131r. As\u0131l mesele, insan\u0131n anlayaca\u011f\u0131 \u015fekilde kod yazmakt\u0131r.<\/li>\r\n\t<li>Fonksiyon, da\u011f\u0131t\u0131lmadan \u00f6nce do\u011frulanmal\u0131d\u0131r ki kullanan ki\u015filere aktar\u0131lmas\u0131n\u0131n bir manas\u0131 olsun.<\/li>\r\n\t<li>Kolaya ka\u00e7\u0131l\u0131p, afedersiniz k\u00f6t\u00fc kod, yorum sat\u0131rlar\u0131yla s\u0131vanmamal\u0131d\u0131r. Yorum sat\u0131rlar\u0131 ge\u00e7ici iken, fonksiyonun kendisi kal\u0131c\u0131d\u0131r. Madem ki yorum sat\u0131r\u0131 yaz\u0131labiliyor, ondan \u00f6nce fonksiyonun kendisi temiz yaz\u0131lmal\u0131d\u0131r. Kod yazarak yap\u0131lamayacak \u015feyler, yorum sat\u0131rlar\u0131 ile yap\u0131lmald\u0131r.<\/li>\r\n\t<li>Bir fonksiyonun ad\u0131nda -meclisten d\u0131\u015far\u0131- \"ve(and), veya(and), oyleyse(then)\" gibi kelimelerin ge\u00e7mesi, o fonksiyonun birden fazla i\u015f yaparak d\u00fcnyay\u0131 kurtarmaya \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6stermektedir. Bu \u00e7ok yanl\u0131\u015ft\u0131r. D\u00fcnyay\u0131 kurtarmak \u00a0bir tak\u0131m i\u015fidir. Bu fonksiyonlar derhal par\u00e7alanmal\u0131 ve temizlenmelidir.<\/li>\r\n\t<li>Bir fonksiyonu her kullanan ki\u015fi, o fonksiyonun tepesindeki yorumlar\u0131 de\u011fil, bizzat ismini g\u00f6recektir. Yorum sat\u0131r\u0131n\u0131 g\u00f6rebilmek i\u00e7in fonksiyonun implementasyonunu a\u00e7mak gerekmektedir. Bu,\u00a0orta \u00e7a\u011fdan kalma bir i\u015fkence y\u00f6ntemidir ve yap\u0131lmamal\u0131d\u0131r. Re\u00e7ete olarak, temiz, yapt\u0131\u011f\u0131 i\u015fi ismiyle anlatan fonksiyonlar\u0131n yaz\u0131lmas\u0131 \u015fifa verecektir.<\/li>\r\n\t<li>Bir yaz\u0131l\u0131mdaki t\u00fcm isimler, derleyici taraf\u0131ndan adres sembollerine \u00e7evirilece\u011finden, uzun ve derdi a\u00e7\u0131k\u00e7a anlatan fonksiyon isimleri se\u00e7mek hi\u00e7 kimseye zarar vermeyece\u011fi gibi yazar\u0131n yapt\u0131\u011f\u0131 i\u015fin kalitesini\u00a0art\u0131racakt\u0131r. Uzun isimli fonksiyon, k\u0131sa isimli fonksiyondan daha fazla bellek t\u00fcketmeyece\u011finden eli korkak al\u0131\u015ft\u0131rman\u0131n l\u00fczumu yoktur.<\/li>\r\n<\/ul>\r\nMaddeler bunlar. \u015eimdi kalem kalem bu ba\u015fl\u0131\u011f\u0131n \u00f6nemli konular\u0131na\u00a0de\u011finelim.\r\n\r\n<strong>Anla\u015f\u0131labilirlik ve Mod\u00fclarite<\/strong>\r\n\r\nHi\u00e7 laf kalabal\u0131\u011f\u0131 yapmadan, somut\u00a0\u00f6rneklerle mevzuya dalaca\u011f\u0131m. Zaten eski bir ahitte yazd\u0131\u011f\u0131m bir \u00f6rne\u011fi sizlerle bu perspektifte payla\u015faca\u011f\u0131m.\r\n\r\n<del><em>K\u00f6t\u00fc \u00d6rnek:<\/em><\/del>\r\n<pre class=\"lang:c decode:true\">void ikiDegiskeniToplaVeSeriPortaYaz(uint32_t a, uint32_t b)\r\n{\r\n\/\/here we sum two\r\nuint32_t c= a+b;\r\n\r\n\/\/das ist sch\u00f6n, jaa\r\nUART5.RESET = 1;\r\nUART5.DREG = c&gt;&gt;24; \r\nUART5.TX = 1;\r\n \r\nUART5.RESET=1;\r\nUATRT5.DREG=c&gt;&gt;16;\r\nUART5.TX = 1;\r\n \r\nUART5.RESET=1;\r\nUART5.DREG=c&gt;&gt;8;\r\nUART5.TX =1;\r\n \r\nUART5.RESET=1;\r\nUART5.DREG=c;\r\nUART5.TX=1;\r\n}<\/pre>\r\nYukar\u0131daki rezil kodu hat\u0131rlars\u0131n\u0131z. Bu t\u00fcr kodlama y\u00fcz\u00fcnden nice \u00e7ok da olumlu yorulmlar al\u0131nmayaca\u011f\u0131 anla\u015f\u0131lmakta. Bir kere fonksiyonun ad\u0131ndan \"Ve\" yaz\u0131yor. Bu fonksiyon d\u00fcnyay\u0131 tek ba\u015f\u0131na kurtarma gayretini, belki iyi niyetle ancak saf bir cehaletle g\u00f6stermektedir. Cehalet k\u00f6t\u00fcd\u00fcr. Fonksiyonun ad\u0131 hele iyice faciad\u0131r \u00e7\u00fcnk\u00fc C dilini az \u00e7ok bilen herkes bu fonksiyonun iki de\u011feri toplayarak, bellekte\u00a0bir yerlere yazd\u0131\u011f\u0131n\u0131 anlayabilecektir. As\u0131l soru bu i\u015fin neden, ne zaman, ne ama\u00e7la yap\u0131ld\u0131\u011f\u0131d\u0131r ki bu da ger\u00e7e\u011fin alt\u0131ndaki hakikatin ta kendisidir.\r\n\r\nBir di\u011fer \u015f\u0131k olmayan davran\u0131\u015f ise\u00a0fonksiyon isminin T\u00fcrk\u00e7e, yorumlar\u0131n ise Almanca + \u0130ngilizce olmas\u0131d\u0131r. Bu yorumlar\u0131 kimse - belki \u0130lber Ortayl\u0131 hari\u00e7 - anlayamayacakt\u0131r (\u0130lber Hoca da yorumlar\u0131 anlasa da kodu anlayamayacakt\u0131r). Dolay\u0131s\u0131yla kodda tek bir insan dili tercih etmek daha ho\u015f olacakt\u0131r.\r\n\r\n<em>G\u00fczel \u00d6rnek:<\/em>\r\n<pre class=\"lang:c decode:true\">typedef union\r\n{\r\n   uint32_t u32Veri;\r\n   uint8_t  au8Veri[4];\r\n}tu_VeriPaketi32Bit;\r\n \r\nvoid bilgisayaraByteGonder(uint8_t u8Veri)\r\n{\r\n UART5.RESET=1;\r\n UART5.DREG=u8Veri;\r\n UART5.TX = 1;\r\n}\r\n \r\nuint32_t hasilatiHesaplaTL(uint16_t u16BazUcretTL, uint16_t u16KomisyonUcretiTL)\r\n{\r\n    return (u16BazUcretTL+u16KomisyonUcretiTL);\r\n}\r\n \r\nvoid hasilatiGonder(uint32_t u32HasilatTL)\r\n{\r\n tu_VeriPaketi32Bit UHasilat.u32Veri=u32HasilatTL;\r\n for(uint8_t i=0;i&lt;sizeof(tu_VeriPaketi32Bit); i++)\r\n {\r\n    bilgisayaraByteGonder(UHasilat.au8Veri[i]);\r\n }\r\n}<\/pre>\r\nBu yukar\u0131daki kod da tan\u0131d\u0131k. Ama ben kodu yeni g\u00f6rm\u00fc\u015f gibi, \"aaa ne g\u00fczel kod O_o\" demek istiyorum. Paralel evrenin, bu kodu i\u00e7eren, pek de \u00fccrada kalmam\u0131\u015f bu g\u00fczel k\u00f6\u015fesinde, k\u00f6t\u00fc \u00f6rnek kodunda yap\u0131lan i\u015fler bu defa \u00e7i\u00e7ek gibi tertemiz bir \u015fekilde, amme hizmeti bilinci ile\u00a0yap\u0131lm\u0131\u015ft\u0131r. \u00a0K\u00f6t\u00fc \u00f6rnekteki kod derin kod oldu\u011fundan ne i\u015f yapt\u0131\u011f\u0131 bilinmemekte idi. G\u00fczel \u00f6rnekteki kod temiz kod oldu\u011fundan, kodun asl\u0131nda ticaret i\u015fleri ile u\u011fra\u015ft\u0131\u011f\u0131 anla\u015f\u0131lmaktad\u0131r.\r\n\r\nG\u00f6nderilecek veri serile\u015ftirilmek zorunda oldu\u011fundan, union kullan\u0131larak +1 m\u00fchendislik puan\u0131\u00a0kazan\u0131lm\u0131\u015ft\u0131r.\r\n\r\nDe\u011fi\u015fken adlar\u0131 da mevzu hakk\u0131nda \u00e7ok say\u0131da a\u00e7\u0131k bilgiyi, yaz\u0131l\u0131m tutkunlar\u0131n\u0131n\u00a0hizmetine sunmaktad\u0131r. Bu kodu okuyunca u16BazUcretTL'nin TL cinsinden, 65536 TL'den k\u00fc\u00e7\u00fck bir mebla\u011f oldu\u011fu anla\u015f\u0131lmaktad\u0131r. Bu da, kodlamada \u015feffafl\u0131k ve temizliktir.\r\n\r\nK\u00f6t\u00fc kod, k\u00f6t\u00fcl\u00fckle s\u0131k\u0131 ba\u011flar kurmu\u015ftur. Seri porttan veri g\u00f6nderme i\u015fi er ya da ge\u00e7 ba\u015fka yerlerde de kullan\u0131laca\u011f\u0131ndan, k\u00f6t\u00fc \u00f6rnekteki yap\u0131da kopyala yap\u0131\u015ft\u0131r yapmak gerekcektir ki bu tekrar kullan\u0131labilirlik kavram\u0131ndan \u00e7ok uzakt\u0131r. G\u00fczel \u00f6rnekte ise bu i\u015fi yapan bir fonksiyon, ayr\u0131 bir bireydir ve tekrar kullan\u0131labilir yap\u0131dad\u0131r. Yani benzetme yap\u0131lacak olursa; hem d\u00fcnyas\u0131, hem ahireti g\u00fczeldir.\r\n\r\n<strong>Rek\u00fcrsif Fonksiyonlar\u0131n Kullan\u0131m\u0131<\/strong>\r\n\r\nM\u00fcmk\u00fcnse kullanmayal\u0131m efendim. Stack derinli\u011fi sabit olmayan rek\u00fcrsif fonksiyonlar, g\u00f6m\u00fcl\u00fc sistemlerde kullan\u0131lmamal\u0131d\u0131r. Zaten ters gidebilecek bir s\u00fcr\u00fc \u015fey varken neden bir \u015fey daha ekleyelim ki?\r\n\r\nSay\u0131n muhterem...\u00a0Eveeeet, bir program\u0131n daha sonuna geldiik.\r\n\r\n\u015eimdi devam!\r\n\r\n[su_button url=\"http:\/\/ozenozkaya.com\/blog\/?p=245\" style=\"3d\"\u00a0icon=\"icon: arrow-circle-o-left\"]\u00d6nceki Sayfa[\/su_button] \u00a0[su_button url=\"http:\/\/ozenozkaya.com\/blog\/?p=255\" style=\"3d\" icon=\"icon: arrow-circle-right\"]Sonraki Sayfa[\/su_button]\r\n\r\n&nbsp;","_tr_post_name":"gomulu-sistemler-18-fonksiyonlar-ve-temiz-kodlama","_tr_post_excerpt":"","_tr_post_title":"G\u00f6m\u00fcl\u00fc C - 7 : Fonksiyonlar ve Temiz Kodlama","_en_post_content":"","_en_post_name":"","_en_post_excerpt":"","_en_post_title":"","edit_language":"tr","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"enabled":false},"version":2}},"categories":[2,3],"tags":[5,6],"class_list":["post-248","post","type-post","status-publish","format-standard","hentry","category-elektronik","category-gomulu-sistemler","tag-elektronik","tag-gomulu-sistemler"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5gWM6-40","jetpack-related-posts":[],"_links":{"self":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/248","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=248"}],"version-history":[{"count":2,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/248\/revisions"}],"predecessor-version":[{"id":534,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/248\/revisions\/534"}],"wp:attachment":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=248"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=248"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=248"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}