{"id":263,"date":"2015-02-03T00:07:16","date_gmt":"2015-02-02T22:07:16","guid":{"rendered":"http:\/\/ozenozkaya.com\/blog\/?p=263"},"modified":"2015-02-03T00:07:16","modified_gmt":"2015-02-02T22:07:16","slug":"gomulu-sistemler-20-gomulu-c-kosullamalar-2","status":"publish","type":"post","link":"http:\/\/ozenozkaya.com\/blog\/?p=263","title":{"rendered":"G\u00f6m\u00fcl\u00fc C &#8211; 9 : G\u00f6m\u00fcl\u00fc C: Ko\u015fullamalar 2"},"content":{"rendered":"<p>Ko\u015fullamalar yaz\u0131s\u0131nda if-else yap\u0131lar\u0131 ile ilgili s\u00f6ylenebilecek g\u00fczel bir tak\u0131m \u015feyleri, lisan-\u0131 m\u00fcnasiple konu\u015fmu\u015ftuk. O yaz\u0131 \u00e7ok tutunca, devam\u0131n\u0131 \u00e7ekmek farz oldu.<\/p>\n<p>Bu arada dostlar, yaz\u0131lar\u0131mdaki temalarla ilgili yorumlarda insanlar\u0131n a\u011fz\u0131ndan bal daml\u0131yor.\u00a0Bu vesileyle bu yaz\u0131n\u0131n temas\u0131 bal oluyor \ud83d\ude42<\/p>\n<p>Malumunuz if-else yap\u0131s\u0131, dertlere derman, karars\u0131zl\u0131\u011fa d\u00fc\u015fman. \u0130\u015fin \u015fakas\u0131, verilecek bir karar\u0131 olan herkesi if-else kullanmaya davet etsek yeri midir diye d\u00fc\u015f\u00fcnm\u00fcyor de\u011filim. Bir karar verilecekse hi\u00e7 d\u00fc\u015f\u00fcnmeden if-else kullan\u0131rd\u0131m. Ama biraz d\u00fc\u015f\u00fcnsem, her yerde if-else kullanmazd\u0131m \ud83d\ude42\u00a0\u0130\u015fte bu yaz\u0131n\u0131n \u00f6z\u00fc de bu olacak. Haydi bakal\u0131m, ko\u015fullamalar\u0131 s\u0131ksak i\u00e7inden ne \u00e7\u0131kacak!<\/p>\n<p>&nbsp;<\/p>\n<p><strong>1. if-else Nedir, Nerelerde Kullan\u0131l\u0131r<\/strong><\/p>\n<p>Bir \u00f6nceki yaz\u0131m\u0131zda, if-else ko\u015fullamalar\u0131n\u0131n nas\u0131l kullan\u0131lmas\u0131 gerekti\u011fine ve nas\u0131l kullan\u0131lmamas\u0131 gerekti\u011fine haddince, hatta belki haddinden bir tutam fazla de\u011findik. \u015eimdi tutup da, onca felsefi ve uhrevi bilginin ard\u0131ndan tekrar bu kadar temel sorularla kar\u015f\u0131n\u0131za\u00a0\u00e7\u0131k\u0131nca, ben de garip hissetmiyor de\u011filim. Haydi bakal\u0131m hay\u0131rl\u0131s\u0131.<\/p>\n<p>Sevgili okuyucu, if &#8211; else yap\u0131lar\u0131 ad\u0131 \u00fczerinde e\u011fer \u00f6yleyse \u015f\u00f6yle yap, e\u011fer b\u00f6yleyse b\u00f6yle yap t\u00fcr\u00fcnde olan, dolay\u0131s\u0131yla yap\u0131y\u0131 anlamak i\u00e7in b\u00fct\u00fcn ko\u015ful blo\u011funu anlamam\u0131z\u0131, okumam\u0131z\u0131 gerektiren yap\u0131lard\u0131r. Bu yap\u0131lar\u0131 okumak, sinemada film izlemeye benzer. Ba\u015f\u0131 \u00e7ok anlams\u0131z olan bir film sonunda kendini \u00f6vd\u00fcrebilir, ba\u015fta g\u00fczel giden film sonunda s\u00f6vd\u00fcrebilir, kimisiyse insana kendini d\u00f6vd\u00fcrebilir. Bir ba\u015fka \u00f6rnek ile anlatmak gerekirse, ileriden gelen u\u00e7an b\u00f6ce\u011fin, afedersiniz e\u015fek ar\u0131s\u0131\u00a0m\u0131 bal ar\u0131s\u0131 m\u0131 oldu\u011fu anlamak i\u00e7in yakla\u015fmas\u0131n\u0131 beklemek zorunda kalmaya benzer bu s\u00fcre\u00e7.\u00a0\u00a0Ve her bir ko\u015fulun gelece\u011fi, her an ba\u015fka bir ko\u015ful taraf\u0131ndan bertaraf edilebilir. Bu da \u00e7o\u011fu zaman sirke tad\u0131 verir. Bu ibretlik tespiti, l\u00fctfen akl\u0131n\u0131zdan \u00e7\u0131karmay\u0131n\u0131z. if-else&#8217;de her bir ko\u015fulun kaderi, di\u011fer ko\u015fullara \u00e7ok \u00e7ok ba\u011fl\u0131d\u0131r.<\/p>\n<p>Mesela asag\u0131daki kodda, 18 yasindan kucuk arac kullananlara ceza kesilmi\u015f. Yani 18 ya\u015f ve \u00fczerini g\u00f6ndermi\u015f polis amcalar.<\/p>\n<pre class=\"lang:c decode:true\">#define MIN_EHLIYET_ALMA_YASI (18)\n\nif(u8SurucuYasi &lt; MIN_EHLIYET_ALMA_YASI)\n{\n    CezaKesss();\n}\nelse\n{\n    GonderGitsinDonerseSenindir();\n}<\/pre>\n<p>\u00d6yle ya, buras\u0131 T\u00fcrkiye. Bir torba yasa ile bu kanun de\u011fi\u015fti diyelim. 20 ya\u015f\u0131ndan k\u00fc\u00e7\u00fcklere\u00a0stajer s\u00fcr\u00fcc\u00fcl\u00fck s\u00fcresi var. Bu s\u00fcre\u00e7te de tek kullanmak yasakland\u0131. Yukar\u0131daki kodu yazan arkada\u015f ister istemez sabah gidip kodu g\u00fcncelleyecek. Ne yazsa be\u011fenirsin&#8230;<\/p>\n<pre class=\"lang:c decode:true\">#define MIN_EHLIYET_ALMA_YASI (18)\n#define MIN_TEK_BASINA_KULLANIMA_YETKILI_SURUCU_YASI (20)\nif(u8SurucuYasi &lt; MIN_EHLIYET_ALMA_YASI)\n{\n    CezaKesss();\n}\nelse if(u8SurucuYasi &lt; MIN_TEK_BASINA_KULLANIMA_YETKILI_SURUCU_YASI )\n{\n   if(SurucuTekMiSuruyor())\n   {\n       CezaKesss(); \n   }\n   else\n   {\n       YanindakininEhliyetiKesss();\n   }\n}\nelse\n{\n    GonderGitsinDonerseSenindir();\n}<\/pre>\n<p>Adam kodu \u00e7i\u00e7ek gibi yazm\u0131\u015f, ko\u015fulunu araya eklemi\u015f. Ama en alttaki else art\u0131k bizim bildi\u011fimiz else de\u011fil. Biz \u00e7am bal\u0131 diye ald\u0131k, re\u00e7el \u00e7\u0131kt\u0131. \u00d6nceden else ko\u015fulu 18&gt; ya\u015flar\u0131n tamam\u0131n\u0131 desteklerken, bir gece uyuduk uyand\u0131k bir bakt\u0131k ki, tek sat\u0131r\u0131n\u0131 de\u011fi\u015ftirmedi\u011fimiz else blo\u011fu gitmi\u015f yerine 20&gt; ya\u015f i\u00e7in ge\u00e7erli else blo\u011fu gelmi\u015f. Tek sat\u0131r\u0131n\u0131 bile de\u011fi\u015ftirmedi\u011finiz bir kod alan\u0131n\u0131n, kimyas\u0131ndaki bu de\u011fi\u015fiklik, hepimizi ziyadesiyle paranoyak eder art\u0131k kod yazarken \ud83d\ude42<\/p>\n<p>Ayn\u0131 zamanda ko\u015fullar \u00e7ok uzun olursa, yani; &#8220;\u00f6yle olursa \u015f\u00f6yle yap ama \u00f6yle olmaz da b\u00f6yle olursa, ya da \u015f\u00f6yle olmazsa b\u00f6yle yap&#8221; filan gibi bitmek bilmeyen, geli\u015fimini \u00e7oktan tamamlam\u0131\u015f, d\u00fcnyan\u0131n en ak\u0131ll\u0131\u00a0\u0131rklar\u0131ndan olan\u00a0bir insan\u0131n dahi beyninin tek hamlede\u00a0saklamayaca\u011f\u0131 ko\u015fullamalar\u0131 bu yap\u0131larla tutmamakta fayda var. Zira her bir ko\u015ful, ister istemez di\u011ferini etkiler ve ko\u015ful say\u0131s\u0131 artt\u0131k\u00e7a halis bildi\u011fimiz bal\u0131n dibinde \u015feker tabakas\u0131 birikmeye ba\u015flar. O bal da kaymakla bile tad vermez.\u00a0Bu gibi nedenlerledir ki, uzun if-else bloklar\u0131 da \u00e7ok can s\u0131kar, \u00e7ok can yakar muhteremler. T\u0131pk\u0131 kullanmas\u0131n\u0131 bilmeden kullanmaya kalkt\u0131\u011f\u0131m\u0131z her \u015fey gibi, bunun da sonu mutlak h\u00fcsran olur. \u00c7\u00f6z\u00fcm, gereksiz uzun if-else&#8217;leri tra\u015flamaktan ge\u00e7iyor. A\u015f\u0131r\u0131 u\u00e7lar\u0131 temizleyelim. Bunu yapman\u0131n en iyi yolu, durum indirgemesi yapmak. Nas\u0131l yapaca\u011f\u0131z, misal <a href=\"http:\/\/en.wikipedia.org\/wiki\/Karnaugh_map\" target=\"_blank\">Karnaugh <\/a>ile yapaca\u011f\u0131z. Durum indirgemelerini dostlar, lojik yaz\u0131snda aktarm\u0131\u015ft\u0131m, tekrara d\u00fc\u015fmemek ad\u0131na burada art\u0131k s\u00f6z edip ge\u00e7iyorum.<\/p>\n<p>Ama if-else&#8217;in \u00e7ok g\u00fczel bir yan\u0131 da vard\u0131r ki, bu yap\u0131 bize, aral\u0131k \u00f6l\u00e7eklemesi yapma \u015fans\u0131 verir. Yani\u00a0bu kovanda 100&#8217;den az ar\u0131 varsa, ben bu bala \u00e7\u00f6kerim \u00f6nermesini, \u00e7ok net if-else ile yapmak m\u00fcmk\u00fcnd\u00fcr hatta m\u00fcbaht\u0131r. \u00a0Demek ki aral\u0131klar ile bir \u00f6l\u00e7ekleme yapacaksak, if-else kullanmakta faydalar varm\u0131\u015f. Ehliyet kontrol\u00fc yapaca\u011f\u0131z diye t\u00fcm ya\u015flar\u0131 ayr\u0131 ayr\u0131 analiz etmedik misal.<\/p>\n<p>Peki bu if&#8217;in onca zaafiyeti var biz napal\u0131m kullanmayal\u0131m m\u0131 bunu? Hay\u0131r efendim, nerede nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 anlad\u0131k. \u00c7i\u00e7ek bal\u0131 gibi yap\u0131lar kurulabilir if-else ile. Ama unutmay\u0131n ki, tek bal \u00e7e\u015fidi \u00e7i\u00e7ek bal\u0131 de\u011fildir. Pekala da \u00e7am bal\u0131 da vard\u0131r!<\/p>\n<p><strong>2. switch-case Nedir, Nerelerde Kullan\u0131l\u0131r<\/strong><\/p>\n<p>\u0130\u015fte bizim \u00e7am bal\u0131: switch-case. Se\u00e7 be\u011fen al usulu hem de, tam isabet sevenlere. if-else i\u00e7in ko\u015fullar\u0131n gelece\u011fi birbirine \u00e7ok ba\u011fl\u0131 demi\u015ftik, bu amans\u0131z derdin derman\u0131 switch case yap\u0131s\u0131. Zira switch case&#8217;de her seferinde (asl\u0131nda genelde), durumlardan biri \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r. Ve yine do\u011fru kullan\u0131mda, ko\u015fullar yani durumlar birbirlerini etkilemez. Bu nedenledir ki, <a href=\"http:\/\/en.wikipedia.org\/wiki\/Finite-state_machine\" target=\"_blank\">durum makinalar\u0131 \u00a0<\/a>\u00a0switch case ile ger\u00e7eklenir. \u00d6yleyse ibret y\u00fckleme moduna ge\u00e7iyoruz: switch case nokta at\u0131\u015f\u0131 i\u00e7in, if-else ise aral\u0131k \u00f6l\u00e7eklemesi i\u00e7in kullan\u0131ld\u0131\u011f\u0131nda \u00e7i\u00e7ek olur. Bu vesiyleyse if karde\u015fimizin de iade-i itibar\u0131n\u0131 yapm\u0131\u015f bulunduk.<\/p>\n<p>\u015eimdi switch case ile durum analizine bir \u00f6rnek verelim.<\/p>\n<pre class=\"lang:c decode:true \">typedef enum\n{\nE_STATE_NONE=0,\nE_STATE_START,\nE_STATE_SEND,\nE_STATE_RECEIVE,\nE_STATE_STOP,\nE_STATE_LAST\n}tE_STATE;\n\ntE_STATE eState = E_STATE_NONE;\n\nswitch(eState)\n{\n case E_STATE_NONE:\n {\n   DoJobForNone() ;\n }\n break;\n case E_STATE_START:\n {\n   DoJobForStart() ;\n }\n break;\n case E_STATE_SEND:\n {\n   DoJobForSend() ;\n }\n break;\n case E_STATE_RECEIVE:\n {\n   DoJobForReceive() ;\n }\n break;\n case E_STATE_STOP:\n {\n   DoJobForStop() ;\n }\n break;\n default:\n {\n   DoErrorRecovery() ;\n }\n break;\n}<\/pre>\n<p>Yukar\u0131daki yap\u0131 \u00e7i\u00e7ek gibi bir durum makinesi olaraktan tariflenebilir. G\u00f6rd\u00fc\u011f\u00fcn\u00fcz her bir case, bir ve yaln\u0131zca bir duruma kar\u015f\u0131l\u0131k d\u00fc\u015ft\u00fc\u011f\u00fcnden, if&#8217;deki karma\u015fa burada asla ya\u015fanmaz. Ayr\u0131ca enum ile switch-case&#8217;in bal kaymak misali bir uyumu vard\u0131r. \u0130kisinde de araya bir\u015feyler eklemeniz, di\u011ferlerinin keyfini hi\u00e7 mi hi\u00e7 bozmaz. Bu s\u00f6yledi\u011fimi, enum&#8217;u anlataca\u011f\u0131m yaz\u0131da daha g\u00fczel\u00a0aktarabilece\u011fim \u00e7\u00fcnk\u00fc bulmacan\u0131n par\u00e7alar\u0131 bir araya gelmi\u015f olacak.<\/p>\n<p>Switch case uzun dahi olsa, her bir durum kendi i\u00e7inde bir cumhuriyet oldu\u011fundan, okumas\u0131 hi\u00e7 zor olmaz. Ancak tabi ki unutmamak gerekir ki if&#8217;lerde oldu\u011fu gibi, \u00a0i\u00e7 i\u00e7e \u00e7ok say\u0131da switch yap\u0131s\u0131 kullanmak, orta\u00e7a\u011fda insanlara uygulanan i\u015fkence \u00e7e\u015fitlerinden birisidir. Hak yolu varken bu yollara hi\u00e7 gerek yok.<\/p>\n<p>Peki bu ko\u015fullamalar sadece if-else ile mi yap\u0131l\u0131r? \u0130\u015fte \u015fimdi karadenizin doruklar\u0131ndan deli bal\u0131 huzurlar\u0131n\u0131za geliyor!<\/p>\n<p><strong>3. Ko\u015fullamas\u0131z Durum Makinas\u0131<\/strong><\/p>\n<p>Basit bir durum makinas\u0131 d\u00fc\u015f\u00fcnelim. 4 tane durum olsun. Ba\u015flang\u0131\u00e7 durumumuz 1 yani 1. durum olsun. Sistemde her zaman durum ak\u015f\u0131\u015f\u0131 \u015f\u00f6yle olsun: 1-&gt;3, 3-&gt;2, 2-&gt;4, 4-&gt;1. Bunu nas\u0131l modelleriz? Misal \u015f\u00f6yle modelleriz:<\/p>\n<pre class=\"lang:c decode:true\">#include &lt;stdint.h&gt;\n#include &lt;stdio.h&gt;\n\n#define STATE_DEMO_LOOP_CNT    (10)\n\n\n\ntypedef enum\n{\n  E_STATE_NONE=0,\n  E_STATE_1,     \n  E_STATE_2,\n  E_STATE_3,\n  E_STATE_4,\n  E_STATE_LAST\n}E_STATES;\n\nE_STATES e_state;\n\n\nvoid Init()\n{\n    e_state = E_STATE_1;\n}\nint main()\n{\n    uint8_t bCnt;\n    Init();\n    \n    for(bCnt=0;bCnt&lt;STATE_DEMO_LOOP_CNT;bCnt++)\n    {\n        switch(e_state)\n        {\n            case E_STATE_1:\n            {\n                printf(\"State1n\"); \n                e_state = E_STATE_3;  \n            }\n            break;\n            case E_STATE_2:\n            {\n                printf(\"State2n\"); \n                e_state = E_STATE_4;  \n            }           \n            break;\n            case E_STATE_3:\n            {\n                printf(\"State3n\"); \n                e_state = E_STATE_2;  \n            }\n            break;\n            case E_STATE_4:\n            {\n                printf(\"State4n\"); \n                e_state = E_STATE_1;  \n            }\n            break;\n            default:\n                printf(\"Wrong state!!!rn\");\n            break;\n        }   \n    }\n    \n    while(1); \/\/stop here\n    return 0;\n }\n<\/pre>\n<p>Peki bu \u00e7am bal\u0131 gib halis munis yap\u0131, daha basit, daha sanatsal bir \u015fekilde kurulamaz m\u0131? Switch case&#8217;i ortadan nas\u0131l kald\u0131r\u0131r\u0131z? if else ile diyenleri duyar gibiyim ama bu ba\u015fl\u0131\u011f\u0131n ibreti ve vizyonu biraz daha b\u00fcy\u00fck. Karab\u00fcy\u00fc ile harmanlad\u0131\u011f\u0131m\u0131z deli bal\u0131 ile bu yap\u0131y\u0131 ger\u00e7ekleyelim.<\/p>\n<pre class=\"lang:c decode:true\">#include &lt;stdint.h&gt;\n#include &lt;stdio.h&gt;\n\n#define STATE_DEMO_LOOP_CNT    (10)\n\ntypedef void (*myStateHandler) (void);\n\ntypedef enum\n{\n  E_STATE_NONE=0,\n  E_STATE_1,     \n  E_STATE_2,\n  E_STATE_3,\n  E_STATE_4,\n  E_STATE_LAST\n}E_STATES;\n\nmyStateHandler myStateList[E_STATE_LAST];\nE_STATES e_state;\n\n\nvoid STATE1_HANDLER (void)\n{\n     printf(\"State1n\"); \n     e_state = E_STATE_3;  \n}\n\nvoid STATE2_HANDLER (void)\n{\n     printf(\"State2n\"); \n     e_state = E_STATE_4;  \n}\n\nvoid STATE3_HANDLER (void)\n{\n     printf(\"State3n\"); \n     e_state = E_STATE_2;  \n}\n\nvoid STATE4_HANDLER (void)\n{\n     printf(\"State4n\"); \n     e_state = E_STATE_1;  \n}\n\n\nvoid Init()\n{\n    myStateList[E_STATE_1] =  STATE1_HANDLER;\n    myStateList[E_STATE_2] =  STATE2_HANDLER;\n    myStateList[E_STATE_3] =  STATE3_HANDLER;\n    myStateList[E_STATE_4] =  STATE4_HANDLER;\n    e_state = E_STATE_1;\n}\nint main()\n{\n    uint8_t bCnt;\n    Init();\n    \n    for(bCnt=0;bCnt&lt;STATE_DEMO_LOOP_CNT;bCnt++)\n    {\n        myStateList[e_state]();    \n    }\n    \n    while(1); \/\/stop here\n    return 0;\n    }\n<\/pre>\n<p>Yukar\u0131daki kodu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda konsol \u00e7\u0131kt\u0131s\u0131 \u015f\u00f6yle oluyor:<\/p>\n<div class=\"su-note\"  style=\"border-color:#e5b24c;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;\"><div class=\"su-note-inner su-u-clearfix su-u-trim\" style=\"background-color:#ffcc66;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;\">\nState1<br \/>\nState3<br \/>\nState2<br \/>\nState4<br \/>\nState1<br \/>\nState3<br \/>\nState2<br \/>\nState4<br \/>\nState1<br \/>\nState3<br \/>\n<\/div><\/div>\n<p>Yani, durum makinam\u0131z, durumlar\u0131 ko\u015fullar\u0131 kullanmadan ger\u00e7eklenmi\u015f oldu. Bu kodun hikmetini anlayanlar vard\u0131r anlamayanlar vard\u0131r. Anlamayan \u00fcz\u00fclmesin \u00e7\u00fcnk\u00fc i\u015faret\u00e7iler ba\u015fl\u0131\u011f\u0131nda bunlar\u0131 da anlataca\u011f\u0131m. Burada OOP&#8217;dan da polymorphism&#8217;i ucundan kula\u011f\u0131ndan \u00e7arpm\u0131\u015f olduk. Bir yap\u0131sal programlama dili ile \u00e7al\u0131\u015fmam\u0131z bunu de\u011fi\u015ftiremedi \ud83d\ude09<\/p>\n<p>Dilerim her \u00fc\u00e7 bal\u0131n da tad\u0131 ho\u015funuza gitmi\u015ftir. Bu ballar\u0131 yiyen \u015fi\u015fman yemeyen pi\u015fman \ud83d\ude00<\/p>\n<p>Aray\u0131 fazla a\u00e7madan yaz\u0131lara devam etmeye \u00e7al\u0131\u015faca\u011f\u0131m.<\/p>\n<p>Unutmadan; yaz\u0131lar\u0131 be\u011fendiyseniz e\u011fer, \u00a0faydalanabilecek arkada\u015flar\u0131n\u0131zla da payla\u015fabilirseniz sevinirim.<\/p>\n<p>\u015eimdi devam&#8230;<\/p>\n<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-o-left\" style=\"font-size:13px;color:#FFFFFF\"><\/i> \u00d6nceki Sayfa<\/span><\/a> \u00a0<a href=\"http:\/\/ozenozkaya.com\/blog\/?p=275\" 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<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ko\u015fullamalar yaz\u0131s\u0131nda if-else yap\u0131lar\u0131 ile ilgili s\u00f6ylenebilecek g\u00fczel bir tak\u0131m \u015feyleri, lisan-\u0131 m\u00fcnasiple konu\u015fmu\u015ftuk. O yaz\u0131 \u00e7ok tutunca, devam\u0131n\u0131 \u00e7ekmek farz oldu. Bu arada dostlar, yaz\u0131lar\u0131mdaki temalarla ilgili yorumlarda insanlar\u0131n a\u011fz\u0131ndan bal daml\u0131yor.\u00a0Bu vesileyle bu yaz\u0131n\u0131n temas\u0131 bal oluyor \ud83d\ude42 Malumunuz if-else yap\u0131s\u0131, dertlere derman, karars\u0131zl\u0131\u011fa d\u00fc\u015fman. \u0130\u015fin \u015fakas\u0131, verilecek bir karar\u0131 olan herkesi if-else <a class=\"read-more\" href=\"http:\/\/ozenozkaya.com\/blog\/?p=263\">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":"Ko\u015fullamalar yaz\u0131s\u0131nda if-else yap\u0131lar\u0131 ile ilgili s\u00f6ylenebilecek g\u00fczel bir tak\u0131m \u015feyleri, lisan-\u0131 m\u00fcnasiple konu\u015fmu\u015ftuk. O yaz\u0131 \u00e7ok tutunca, devam\u0131n\u0131 \u00e7ekmek farz oldu.\n\nBu arada dostlar, yaz\u0131lar\u0131mdaki temalarla ilgili yorumlarda insanlar\u0131n a\u011fz\u0131ndan bal daml\u0131yor.\u00a0Bu vesileyle bu yaz\u0131n\u0131n temas\u0131 bal oluyor :)\n\nMalumunuz if-else yap\u0131s\u0131, dertlere derman, karars\u0131zl\u0131\u011fa d\u00fc\u015fman. \u0130\u015fin \u015fakas\u0131, verilecek bir karar\u0131 olan herkesi if-else kullanmaya davet etsek yeri midir diye d\u00fc\u015f\u00fcnm\u00fcyor de\u011filim. Bir karar verilecekse hi\u00e7 d\u00fc\u015f\u00fcnmeden if-else kullan\u0131rd\u0131m. Ama biraz d\u00fc\u015f\u00fcnsem, her yerde if-else kullanmazd\u0131m :)\u00a0\u0130\u015fte bu yaz\u0131n\u0131n \u00f6z\u00fc de bu olacak. Haydi bakal\u0131m, ko\u015fullamalar\u0131 s\u0131ksak i\u00e7inden ne \u00e7\u0131kacak!\n\n&nbsp;\n\n<strong>1. if-else Nedir, Nerelerde Kullan\u0131l\u0131r<\/strong>\n\nBir \u00f6nceki yaz\u0131m\u0131zda, if-else ko\u015fullamalar\u0131n\u0131n nas\u0131l kullan\u0131lmas\u0131 gerekti\u011fine ve nas\u0131l kullan\u0131lmamas\u0131 gerekti\u011fine haddince, hatta belki haddinden bir tutam fazla de\u011findik. \u015eimdi tutup da, onca felsefi ve uhrevi bilginin ard\u0131ndan tekrar bu kadar temel sorularla kar\u015f\u0131n\u0131za\u00a0\u00e7\u0131k\u0131nca, ben de garip hissetmiyor de\u011filim. Haydi bakal\u0131m hay\u0131rl\u0131s\u0131.\n\nSevgili okuyucu, if - else yap\u0131lar\u0131 ad\u0131 \u00fczerinde e\u011fer \u00f6yleyse \u015f\u00f6yle yap, e\u011fer b\u00f6yleyse b\u00f6yle yap t\u00fcr\u00fcnde olan, dolay\u0131s\u0131yla yap\u0131y\u0131 anlamak i\u00e7in b\u00fct\u00fcn ko\u015ful blo\u011funu anlamam\u0131z\u0131, okumam\u0131z\u0131 gerektiren yap\u0131lard\u0131r. Bu yap\u0131lar\u0131 okumak, sinemada film izlemeye benzer. Ba\u015f\u0131 \u00e7ok anlams\u0131z olan bir film sonunda kendini \u00f6vd\u00fcrebilir, ba\u015fta g\u00fczel giden film sonunda s\u00f6vd\u00fcrebilir, kimisiyse insana kendini d\u00f6vd\u00fcrebilir. Bir ba\u015fka \u00f6rnek ile anlatmak gerekirse, ileriden gelen u\u00e7an b\u00f6ce\u011fin, afedersiniz e\u015fek ar\u0131s\u0131\u00a0m\u0131 bal ar\u0131s\u0131 m\u0131 oldu\u011fu anlamak i\u00e7in yakla\u015fmas\u0131n\u0131 beklemek zorunda kalmaya benzer bu s\u00fcre\u00e7.\u00a0\u00a0Ve her bir ko\u015fulun gelece\u011fi, her an ba\u015fka bir ko\u015ful taraf\u0131ndan bertaraf edilebilir. Bu da \u00e7o\u011fu zaman sirke tad\u0131 verir. Bu ibretlik tespiti, l\u00fctfen akl\u0131n\u0131zdan \u00e7\u0131karmay\u0131n\u0131z. if-else'de her bir ko\u015fulun kaderi, di\u011fer ko\u015fullara \u00e7ok \u00e7ok ba\u011fl\u0131d\u0131r.\n\nMesela asag\u0131daki kodda, 18 yasindan kucuk arac kullananlara ceza kesilmi\u015f. Yani 18 ya\u015f ve \u00fczerini g\u00f6ndermi\u015f polis amcalar.\n\n<pre class=\"lang:c decode:true\">#define MIN_EHLIYET_ALMA_YASI (18)\n\nif(u8SurucuYasi &lt; MIN_EHLIYET_ALMA_YASI)\n{\n    CezaKesss();\n}\nelse\n{\n    GonderGitsinDonerseSenindir();\n}<\/pre>\n\n\u00d6yle ya, buras\u0131 T\u00fcrkiye. Bir torba yasa ile bu kanun de\u011fi\u015fti diyelim. 20 ya\u015f\u0131ndan k\u00fc\u00e7\u00fcklere\u00a0stajer s\u00fcr\u00fcc\u00fcl\u00fck s\u00fcresi var. Bu s\u00fcre\u00e7te de tek kullanmak yasakland\u0131. Yukar\u0131daki kodu yazan arkada\u015f ister istemez sabah gidip kodu g\u00fcncelleyecek. Ne yazsa be\u011fenirsin...\n\n<pre class=\"lang:c decode:true\">#define MIN_EHLIYET_ALMA_YASI (18)\n#define MIN_TEK_BASINA_KULLANIMA_YETKILI_SURUCU_YASI (20)\nif(u8SurucuYasi &lt; MIN_EHLIYET_ALMA_YASI)\n{\n    CezaKesss();\n}\nelse if(u8SurucuYasi &lt; MIN_TEK_BASINA_KULLANIMA_YETKILI_SURUCU_YASI )\n{\n   if(SurucuTekMiSuruyor())\n   {\n       CezaKesss(); \n   }\n   else\n   {\n       YanindakininEhliyetiKesss();\n   }\n}\nelse\n{\n    GonderGitsinDonerseSenindir();\n}<\/pre>\n\nAdam kodu \u00e7i\u00e7ek gibi yazm\u0131\u015f, ko\u015fulunu araya eklemi\u015f. Ama en alttaki else art\u0131k bizim bildi\u011fimiz else de\u011fil. Biz \u00e7am bal\u0131 diye ald\u0131k, re\u00e7el \u00e7\u0131kt\u0131. \u00d6nceden else ko\u015fulu 18&gt; ya\u015flar\u0131n tamam\u0131n\u0131 desteklerken, bir gece uyuduk uyand\u0131k bir bakt\u0131k ki, tek sat\u0131r\u0131n\u0131 de\u011fi\u015ftirmedi\u011fimiz else blo\u011fu gitmi\u015f yerine 20&gt; ya\u015f i\u00e7in ge\u00e7erli else blo\u011fu gelmi\u015f. Tek sat\u0131r\u0131n\u0131 bile de\u011fi\u015ftirmedi\u011finiz bir kod alan\u0131n\u0131n, kimyas\u0131ndaki bu de\u011fi\u015fiklik, hepimizi ziyadesiyle paranoyak eder art\u0131k kod yazarken :)\n\nAyn\u0131 zamanda ko\u015fullar \u00e7ok uzun olursa, yani; \"\u00f6yle olursa \u015f\u00f6yle yap ama \u00f6yle olmaz da b\u00f6yle olursa, ya da \u015f\u00f6yle olmazsa b\u00f6yle yap\" filan gibi bitmek bilmeyen, geli\u015fimini \u00e7oktan tamamlam\u0131\u015f, d\u00fcnyan\u0131n en ak\u0131ll\u0131\u00a0\u0131rklar\u0131ndan olan\u00a0bir insan\u0131n dahi beyninin tek hamlede\u00a0saklamayaca\u011f\u0131 ko\u015fullamalar\u0131 bu yap\u0131larla tutmamakta fayda var. Zira her bir ko\u015ful, ister istemez di\u011ferini etkiler ve ko\u015ful say\u0131s\u0131 artt\u0131k\u00e7a halis bildi\u011fimiz bal\u0131n dibinde \u015feker tabakas\u0131 birikmeye ba\u015flar. O bal da kaymakla bile tad vermez.\u00a0Bu gibi nedenlerledir ki, uzun if-else bloklar\u0131 da \u00e7ok can s\u0131kar, \u00e7ok can yakar muhteremler. T\u0131pk\u0131 kullanmas\u0131n\u0131 bilmeden kullanmaya kalkt\u0131\u011f\u0131m\u0131z her \u015fey gibi, bunun da sonu mutlak h\u00fcsran olur. \u00c7\u00f6z\u00fcm, gereksiz uzun if-else'leri tra\u015flamaktan ge\u00e7iyor. A\u015f\u0131r\u0131 u\u00e7lar\u0131 temizleyelim. Bunu yapman\u0131n en iyi yolu, durum indirgemesi yapmak. Nas\u0131l yapaca\u011f\u0131z, misal <a href=\"http:\/\/en.wikipedia.org\/wiki\/Karnaugh_map\" target=\"_blank\">Karnaugh <\/a>ile yapaca\u011f\u0131z. Durum indirgemelerini dostlar, lojik yaz\u0131snda aktarm\u0131\u015ft\u0131m, tekrara d\u00fc\u015fmemek ad\u0131na burada art\u0131k s\u00f6z edip ge\u00e7iyorum.\n\nAma if-else'in \u00e7ok g\u00fczel bir yan\u0131 da vard\u0131r ki, bu yap\u0131 bize, aral\u0131k \u00f6l\u00e7eklemesi yapma \u015fans\u0131 verir. Yani\u00a0bu kovanda 100'den az ar\u0131 varsa, ben bu bala \u00e7\u00f6kerim \u00f6nermesini, \u00e7ok net if-else ile yapmak m\u00fcmk\u00fcnd\u00fcr hatta m\u00fcbaht\u0131r. \u00a0Demek ki aral\u0131klar ile bir \u00f6l\u00e7ekleme yapacaksak, if-else kullanmakta faydalar varm\u0131\u015f. Ehliyet kontrol\u00fc yapaca\u011f\u0131z diye t\u00fcm ya\u015flar\u0131 ayr\u0131 ayr\u0131 analiz etmedik misal.\n\nPeki bu if'in onca zaafiyeti var biz napal\u0131m kullanmayal\u0131m m\u0131 bunu? Hay\u0131r efendim, nerede nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 anlad\u0131k. \u00c7i\u00e7ek bal\u0131 gibi yap\u0131lar kurulabilir if-else ile. Ama unutmay\u0131n ki, tek bal \u00e7e\u015fidi \u00e7i\u00e7ek bal\u0131 de\u011fildir. Pekala da \u00e7am bal\u0131 da vard\u0131r!\n\n<strong>2. switch-case Nedir, Nerelerde Kullan\u0131l\u0131r<\/strong>\n\n\u0130\u015fte bizim \u00e7am bal\u0131: switch-case. Se\u00e7 be\u011fen al usulu hem de, tam isabet sevenlere. if-else i\u00e7in ko\u015fullar\u0131n gelece\u011fi birbirine \u00e7ok ba\u011fl\u0131 demi\u015ftik, bu amans\u0131z derdin derman\u0131 switch case yap\u0131s\u0131. Zira switch case'de her seferinde (asl\u0131nda genelde), durumlardan biri \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r. Ve yine do\u011fru kullan\u0131mda, ko\u015fullar yani durumlar birbirlerini etkilemez. Bu nedenledir ki, <a href=\"http:\/\/en.wikipedia.org\/wiki\/Finite-state_machine\" target=\"_blank\">durum makinalar\u0131 \u00a0<\/a>\u00a0switch case ile ger\u00e7eklenir. \u00d6yleyse ibret y\u00fckleme moduna ge\u00e7iyoruz: switch case nokta at\u0131\u015f\u0131 i\u00e7in, if-else ise aral\u0131k \u00f6l\u00e7eklemesi i\u00e7in kullan\u0131ld\u0131\u011f\u0131nda \u00e7i\u00e7ek olur. Bu vesiyleyse if karde\u015fimizin de iade-i itibar\u0131n\u0131 yapm\u0131\u015f bulunduk.\n\n\u015eimdi switch case ile durum analizine bir \u00f6rnek verelim.\n\n<pre class=\"lang:c decode:true \">typedef enum\n{\nE_STATE_NONE=0,\nE_STATE_START,\nE_STATE_SEND,\nE_STATE_RECEIVE,\nE_STATE_STOP,\nE_STATE_LAST\n}tE_STATE;\n\ntE_STATE eState = E_STATE_NONE;\n\nswitch(eState)\n{\n case E_STATE_NONE:\n {\n   DoJobForNone() ;\n }\n break;\n case E_STATE_START:\n {\n   DoJobForStart() ;\n }\n break;\n case E_STATE_SEND:\n {\n   DoJobForSend() ;\n }\n break;\n case E_STATE_RECEIVE:\n {\n   DoJobForReceive() ;\n }\n break;\n case E_STATE_STOP:\n {\n   DoJobForStop() ;\n }\n break;\n default:\n {\n   DoErrorRecovery() ;\n }\n break;\n}<\/pre>\n\nYukar\u0131daki yap\u0131 \u00e7i\u00e7ek gibi bir durum makinesi olaraktan tariflenebilir. G\u00f6rd\u00fc\u011f\u00fcn\u00fcz her bir case, bir ve yaln\u0131zca bir duruma kar\u015f\u0131l\u0131k d\u00fc\u015ft\u00fc\u011f\u00fcnden, if'deki karma\u015fa burada asla ya\u015fanmaz. Ayr\u0131ca enum ile switch-case'in bal kaymak misali bir uyumu vard\u0131r. \u0130kisinde de araya bir\u015feyler eklemeniz, di\u011ferlerinin keyfini hi\u00e7 mi hi\u00e7 bozmaz. Bu s\u00f6yledi\u011fimi, enum'u anlataca\u011f\u0131m yaz\u0131da daha g\u00fczel\u00a0aktarabilece\u011fim \u00e7\u00fcnk\u00fc bulmacan\u0131n par\u00e7alar\u0131 bir araya gelmi\u015f olacak.\n\nSwitch case uzun dahi olsa, her bir durum kendi i\u00e7inde bir cumhuriyet oldu\u011fundan, okumas\u0131 hi\u00e7 zor olmaz. Ancak tabi ki unutmamak gerekir ki if'lerde oldu\u011fu gibi, \u00a0i\u00e7 i\u00e7e \u00e7ok say\u0131da switch yap\u0131s\u0131 kullanmak, orta\u00e7a\u011fda insanlara uygulanan i\u015fkence \u00e7e\u015fitlerinden birisidir. Hak yolu varken bu yollara hi\u00e7 gerek yok.\n\nPeki bu ko\u015fullamalar sadece if-else ile mi yap\u0131l\u0131r? \u0130\u015fte \u015fimdi karadenizin doruklar\u0131ndan deli bal\u0131 huzurlar\u0131n\u0131za geliyor!\n\n<strong>3. Ko\u015fullamas\u0131z Durum Makinas\u0131<\/strong>\n\nBasit bir durum makinas\u0131 d\u00fc\u015f\u00fcnelim. 4 tane durum olsun. Ba\u015flang\u0131\u00e7 durumumuz 1 yani 1. durum olsun. Sistemde her zaman durum ak\u015f\u0131\u015f\u0131 \u015f\u00f6yle olsun: 1-&gt;3, 3-&gt;2, 2-&gt;4, 4-&gt;1. Bunu nas\u0131l modelleriz? Misal \u015f\u00f6yle modelleriz:\n\n<pre class=\"lang:c decode:true\">#include &lt;stdint.h&gt;\n#include &lt;stdio.h&gt;\n\n#define STATE_DEMO_LOOP_CNT    (10)\n\n\n\ntypedef enum\n{\n  E_STATE_NONE=0,\n  E_STATE_1,     \n  E_STATE_2,\n  E_STATE_3,\n  E_STATE_4,\n  E_STATE_LAST\n}E_STATES;\n\nE_STATES e_state;\n\n\nvoid Init()\n{\n    e_state = E_STATE_1;\n}\nint main()\n{\n    uint8_t bCnt;\n    Init();\n    \n    for(bCnt=0;bCnt&lt;STATE_DEMO_LOOP_CNT;bCnt++)\n    {\n        switch(e_state)\n        {\n            case E_STATE_1:\n            {\n                printf(\"State1n\"); \n                e_state = E_STATE_3;  \n            }\n            break;\n            case E_STATE_2:\n            {\n                printf(\"State2n\"); \n                e_state = E_STATE_4;  \n            }           \n            break;\n            case E_STATE_3:\n            {\n                printf(\"State3n\"); \n                e_state = E_STATE_2;  \n            }\n            break;\n            case E_STATE_4:\n            {\n                printf(\"State4n\"); \n                e_state = E_STATE_1;  \n            }\n            break;\n            default:\n                printf(\"Wrong state!!!rn\");\n            break;\n        }   \n    }\n    \n    while(1); \/\/stop here\n    return 0;\n }\n<\/pre>\n\nPeki bu \u00e7am bal\u0131 gib halis munis yap\u0131, daha basit, daha sanatsal bir \u015fekilde kurulamaz m\u0131? Switch case'i ortadan nas\u0131l kald\u0131r\u0131r\u0131z? if else ile diyenleri duyar gibiyim ama bu ba\u015fl\u0131\u011f\u0131n ibreti ve vizyonu biraz daha b\u00fcy\u00fck. Karab\u00fcy\u00fc ile harmanlad\u0131\u011f\u0131m\u0131z deli bal\u0131 ile bu yap\u0131y\u0131 ger\u00e7ekleyelim.\n\n<pre class=\"lang:c decode:true\">#include &lt;stdint.h&gt;\n#include &lt;stdio.h&gt;\n\n#define STATE_DEMO_LOOP_CNT    (10)\n\ntypedef void (*myStateHandler) (void);\n\ntypedef enum\n{\n  E_STATE_NONE=0,\n  E_STATE_1,     \n  E_STATE_2,\n  E_STATE_3,\n  E_STATE_4,\n  E_STATE_LAST\n}E_STATES;\n\nmyStateHandler myStateList[E_STATE_LAST];\nE_STATES e_state;\n\n\nvoid STATE1_HANDLER (void)\n{\n     printf(\"State1n\"); \n     e_state = E_STATE_3;  \n}\n\nvoid STATE2_HANDLER (void)\n{\n     printf(\"State2n\"); \n     e_state = E_STATE_4;  \n}\n\nvoid STATE3_HANDLER (void)\n{\n     printf(\"State3n\"); \n     e_state = E_STATE_2;  \n}\n\nvoid STATE4_HANDLER (void)\n{\n     printf(\"State4n\"); \n     e_state = E_STATE_1;  \n}\n\n\nvoid Init()\n{\n    myStateList[E_STATE_1] =  STATE1_HANDLER;\n    myStateList[E_STATE_2] =  STATE2_HANDLER;\n    myStateList[E_STATE_3] =  STATE3_HANDLER;\n    myStateList[E_STATE_4] =  STATE4_HANDLER;\n    e_state = E_STATE_1;\n}\nint main()\n{\n    uint8_t bCnt;\n    Init();\n    \n    for(bCnt=0;bCnt&lt;STATE_DEMO_LOOP_CNT;bCnt++)\n    {\n        myStateList[e_state]();    \n    }\n    \n    while(1); \/\/stop here\n    return 0;\n    }\n<\/pre>\n\nYukar\u0131daki kodu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda konsol \u00e7\u0131kt\u0131s\u0131 \u015f\u00f6yle oluyor:\n\n[su_note note_color=\"#ffcc66\"]\nState1\nState3\nState2\nState4\nState1\nState3\nState2\nState4\nState1\nState3\n[\/su_note]\n\nYani, durum makinam\u0131z, durumlar\u0131 ko\u015fullar\u0131 kullanmadan ger\u00e7eklenmi\u015f oldu. Bu kodun hikmetini anlayanlar vard\u0131r anlamayanlar vard\u0131r. Anlamayan \u00fcz\u00fclmesin \u00e7\u00fcnk\u00fc i\u015faret\u00e7iler ba\u015fl\u0131\u011f\u0131nda bunlar\u0131 da anlataca\u011f\u0131m. Burada OOP'dan da polymorphism'i ucundan kula\u011f\u0131ndan \u00e7arpm\u0131\u015f olduk. Bir yap\u0131sal programlama dili ile \u00e7al\u0131\u015fmam\u0131z bunu de\u011fi\u015ftiremedi ;)\n\nDilerim her \u00fc\u00e7 bal\u0131n da tad\u0131 ho\u015funuza gitmi\u015ftir. Bu ballar\u0131 yiyen \u015fi\u015fman yemeyen pi\u015fman :D\n\nAray\u0131 fazla a\u00e7madan yaz\u0131lara devam etmeye \u00e7al\u0131\u015faca\u011f\u0131m.\n\nUnutmadan; yaz\u0131lar\u0131 be\u011fendiyseniz e\u011fer, \u00a0faydalanabilecek arkada\u015flar\u0131n\u0131zla da payla\u015fabilirseniz sevinirim.\n\n\u015eimdi devam...\n\n[su_button url=\"http:\/\/ozenozkaya.com\/blog\/?p=255\" style=\"3d\"\u00a0icon=\"icon: arrow-circle-o-left\"]\u00d6nceki Sayfa[\/su_button] \u00a0[su_button url=\"http:\/\/ozenozkaya.com\/blog\/?p=275\" style=\"3d\" icon=\"icon: arrow-circle-right\"]Sonraki Sayfa[\/su_button]\n\n&nbsp;\n\n&nbsp;","_tr_post_name":"gomulu-sistemler-20-gomulu-c-kosullamalar-2","_tr_post_excerpt":"","_tr_post_title":"G\u00f6m\u00fcl\u00fc C - 9 : G\u00f6m\u00fcl\u00fc C: Ko\u015fullamalar 2","_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":[],"class_list":["post-263","post","type-post","status-publish","format-standard","hentry","category-elektronik","category-gomulu-sistemler"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5gWM6-4f","jetpack-related-posts":[],"_links":{"self":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/263","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=263"}],"version-history":[{"count":0,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/263\/revisions"}],"wp:attachment":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=263"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=263"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=263"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}