{"id":184,"date":"2009-05-25T17:27:00","date_gmt":"1970-01-01T00:00:00","guid":{"rendered":"http:\/\/www.yazilimmutfagi.com\/?p=184"},"modified":"2009-05-25T17:27:00","modified_gmt":"1970-01-01T00:00:00","slug":"yazilim-mutfagi-dersleri-csharp-ders-5-nesneye-dayali-programlamaya-giris","status":"publish","type":"post","link":"https:\/\/www.yazilimmutfagi.com\/index.php\/2009\/05\/25\/yazilim-mutfagi-dersleri-csharp-ders-5-nesneye-dayali-programlamaya-giris\/","title":{"rendered":"Yazilim Mutfagi Dersleri ( C#) Ders 5 &#8211; Nesneye Dayali Programlamaya Giris"},"content":{"rendered":"<h2>\n\tNesneye Dayali Programlama (Object Oriented Programming)<br \/>\n\t&nbsp;<\/h2>\n<p>\n\tBu dersimizde Object Oriented Programlamaya basliyoruz. Ilk olarak siniflari (class), nesneleri (object) ve bunlar hakkinda temel bilgileri &ouml;grenecegiz. Ardindan diger derslerimizde yapicilar(constructor), erisim belirleyiciler(Access modifiers), &ouml;zellikler (properties), method asiri y&uuml;klemesi (method overloading) ve static metotlar konularina ge&ccedil;ecegiz.<\/p>\n<h4>\n\tSinif Kavrami<\/h4>\n<p>\n\tBir veri tipini modellemek i&ccedil;in kullandigimiz yapilara sinif denir. Bir sinif, kaps&uuml;llenmis verileri bu veriler &uuml;zerinde islem yapacak metotlari ve bu verilere ait &ouml;zellikleri i&ccedil;erebilir. &Ouml;rnegin .Net Framework Class Library i&ccedil;inde bulunan String sinifini inceleyelim. Bu sinif karakterlerden olusan bir dizi barindirir, bu kisma data denir, barindirdigi data &uuml;zerinde islemler yapabilecegimiz ToLowerCase(), Trim(),SubString() v.b gibi metotlar i&ccedil;erir. Ayrica barindirdigi dataya ait &ouml;zellikler i&ccedil;erir. &Ouml;rn stringin uzunlugunu bulan Lenght &ouml;zelligi gibi.<\/p>\n<p>\n\tC# da bir sinifin tanimlanmasi basit&ccedil;e asagidaki gibidir.<\/p>\n<pre class=\"brush:csharp\">\nclass YeniClass\n{\n    \/\/sinif icinde verileri tutacak alanlar,\n    \/\/metotlar ve &ouml;zellikler bu kisma yaziliyor\n}<\/pre>\n<p>\n\t<a href='www.yazilimmutfagi.com'>.<\/a><\/p>\n<h3>\n\tNesneler(Object)<\/h3>\n<p>\n\tSiniflar bir veri modelidir, nesneler ise bu veri modeline bagli kalarak verileri tutan ve model i&ccedil;erisinde tanimlanmis metotlari ve &ouml;zellikleri kullanmamizi saglayan modele ait bir referanstir.<\/p>\n<pre class=\"brush:csharp\">\nYeniClass yeniNesne = new YeniClass()\n<\/pre>\n<p>\n\tYukaridaki kod ile YeniClass sinifi t&uuml;r&uuml;nde bir yeniNesne ismiyle bir nesne olusturmus olduk. Bu nesne ile sinifin i&ccedil;erdigi t&uuml;m modeli kullanabiliriz.<br \/>\n\t<br \/>\n\tNesneler referans tipi degiskenler grubuna girerler yani hafizada heap b&ouml;l&uuml;m&uuml;nde olusturulurlar. Referans ve deger tipi degiskenlerine daha &ouml;nceki <a href=\"..\/MakaleOku.aspx?Makale=YazIlIm+MutfagI+Dersleri+(CSharp)+Ders+2+-+Degisken+Tipleri,+Degisken+TanImlama+ve+Operatorler&amp;MakaleKey=13e2a215-a5a0-4716-a3bf-91a7393b551e\">derslerimizde <\/a>deginmistik.<\/p>\n<p>\n\t<img decoding=\"async\" alt=\"\" src=\"http:\/\/yazilimmutfagi.com\/Makale\/Dersler\/CSharp\/Ders5\/resim1.jpg\" style=\"width: 340px; height: 193px;\" \/><\/p>\n<h4>\n\tFields<\/h4>\n<p>\n\tFieldler sinif i&ccedil;erisinde veri barindiran alanlardir. ,Fieldler referans veya deger tiplerinden herhangi birisi olabilir, &Ouml;rn baska bir sinifa referans g&ouml;steren nesnelerde bir sinif i&ccedil;erisinde field olarak kullanilabilir.<br \/>\n\t<br \/>\n\tBir &ouml;grencinin bilgilerini ve notlarini tutan basit bir sinif yazalim.<\/p>\n<pre class=\"brush:csharp\">\nclass Ogrenci\n{\n    \/\/sinifa ait fieldler\n    string adSoyad;\n    int yas;\n    int numara;\n    int matematikNotu = 0; \/\/ilk deper verilmis..\n    int ingilizceNotu;\n    int dersOrtalama;\n}<\/pre>\n<p>\n\tYukaridaki kodda matematikkodu isimli degiskende oldugu gibi siniflara ait fieldlere tanimlama esnasinda deger atamasi yapabilirsiniz. Eger deger atamasi yapmazsaniz degiskenler default degerlerine set edilir. Degisken tiplerine g&ouml;re default degerleri asagidaki tablodaki gibidir.<\/p>\n<table class=\"reference\">\n\t<tbody>\n\t\t<tr>\n\t\t\t<th>\n\t\t\t\tVeri Tipi<\/th>\n\t\t\t<th>\n\t\t\t\tDefault Degeri<\/th>\n\t\t<\/tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tint<\/td>\n\t\t\t<td>\n\t\t\t\t0<\/td>\n\t\t<\/tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tlong<\/td>\n\t\t\t<td>\n\t\t\t\t0<\/td>\n\t\t<\/tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tfloat<\/td>\n\t\t\t<td>\n\t\t\t\t0.0<\/td>\n\t\t<\/tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tdouble<\/td>\n\t\t\t<td>\n\t\t\t\t0.0<\/td>\n\t\t<\/tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tbool<\/td>\n\t\t\t<td>\n\t\t\t\tFALSE<\/td>\n\t\t<\/tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tchar<\/td>\n\t\t\t<td>\n\t\t\t\t\\0&#39; (null karakteri<\/td>\n\t\t<\/tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tstring<\/td>\n\t\t\t<td>\n\t\t\t\t&quot;&quot; (bos metin)<\/td>\n\t\t<\/tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tObject<\/td>\n\t\t\t<td>\n\t\t\t\tnull<\/td>\n\t\t<\/tr>\n\t<\/tbody>\n<\/table>\n<h4>\n\tMetotlar<\/h4>\n<p>\n\tMetotlar, verileri kullanarak belirli islemler yapan yapilardir. Metotlar parametre olarak bazi degerler alabildigi gibi ger&ccedil;eklestirdigi islem sonucunda bazi degerleri de geri d&ouml;nd&uuml;r&uuml;rler. Bir metodun yapisi asagidaki gibidir.<\/p>\n<pre class=\"brush:csharp\">\n&lt;d&ouml;n&uuml;s degis. tipi&gt;&lt;metodun ismi&gt;(&lt;parametre tipi&gt; &lt;parametre ismi&gt;,..)\n{\n    \/\/Metodun ger&ccedil;eklestirecegi islemler i&ccedil;in kod kismi\n}<\/pre>\n<p>\n\t&Ouml;rnek bir metot;<\/p>\n<pre class=\"brush:csharp\">\nint ToplamBul(int sayi1, int sayi2)\n{\n    int toplam = sayi1 + sayi2;\n    return toplam;\n} \n\nint MatematikNotunuDondur()\n{\n    return matematikNotu;\n}<\/pre>\n<p>\n\tYukaridaki &ouml;rnekte iki sayiyi parametre olarak alan ve bunlari topladiktan sonra toplamlarini d&ouml;nd&uuml;ren basit bir metot tanimladik. Metotlar d&ouml;n&uuml;s islemlerini return kelimesi ile yaparlar. Eger tanimladigimiz metot bir d&ouml;n&uuml;s degerine sahip degilse d&ouml;n&uuml;s tipi olarak void yazmaliyiz. D&ouml;n&uuml;s tipi olarak belirledigimiz degisken tipi ile return ile d&ouml;nd&uuml;rd&uuml;g&uuml;m&uuml;z degerin degisken tipi ayni olmak zorundadir.&nbsp; D&ouml;n&uuml;s degeri olmayan ve herhangi bir parametre almayan basit bir &ouml;rnek;<\/p>\n<pre class=\"brush:csharp\">\nvoid TarihiYaz()\n{\n    Console.WriteLine(&quot;Suanki Tarih ve Saat : &quot;\n+ DateTime.Now.ToString(&quot;dd.MM.yyyy HH:mm&quot;));\n}<\/pre>\n<h4>\n\tNesne Olusturulmasi ve Nesneye Deger Atamasi<\/h4>\n<p>\n\tBir sinifi referans g&ouml;sterecek bir nesne olusturmak i&ccedil;in new anahtar kelimesi kullanilir.<\/p>\n<pre class=\"brush:csharp\">\nOgrenci ogrenci = new Ogrenci();\n\/\/Ilk olarak nesneyi tanimlayip daha sonra olusturabilirsiniz..\nOgrenci ogrenci2;\nogrenci2 = new Ogrenci();<\/pre>\n<p>\n\tYukaridaki &ouml;rnekte 2. Y&ouml;ntem ile tanimlama yaparken <span style=\"color:#0000ff;\">Ogrenci <\/span><span style=\"color:#808080;\">ogrenci2<\/span>; kod par&ccedil;acigi Ogrenci tipinde bir referans olusturur, fakat bu referans herhangi bir nesne i&ccedil;ermez. Bu y&uuml;zden bu referansin degeri nulldur<span style=\"color:#808080;\">. ogrenci2<\/span> = <span style=\"color:#0000cd;\">new<\/span> <span style=\"color:#0000ff;\">Ogrenci<\/span>();dedigimizde ise heap de bir nesne olusturulur ve referans degiskenimiz bu alana isaret eder.<\/p>\n<h4>\n\tBir Sinifin &Uuml;yelerine Erismek<\/h4>\n<p>\n\tBir sinifin &uuml;yelerine (field, metot veya properties gibi) erismek i&ccedil;in sinifa ait nesneden sonra nokta operat&ouml;r&uuml;n&uuml; kullaniriz.<\/p>\n<pre class=\"brush:csharp\">\nOgrenci ogrenci = new Ogrenci();\nogrenci.adSoyad = &quot;Mehmet Sabri KUNT&quot;;\nogrenci.yas = 27;\nogrenci.matematikNotu = 89;\nogrenci.ToplamBul(13, 43);\nint matnot = ogrenci.MatematikNotunuDondur();<\/pre>\n<h4>\n\tErisim Belirleyiciler ve Erisilebilirlilik Seviyeleri<\/h4>\n<p>\n\tBir sinifa ait &uuml;yeler i&ccedil;in erisilebilirlilik konusu &ouml;nemlidir. Peki, Erisilebilirlilik ne demektir? Erisim belirleyiciler kullanarak bir &uuml;yenin g&uuml;venligini saglamis oluruz. Eger bir &uuml;yeye sinifimiz i&ccedil;indeki metotlar disinda herhangi bir erisim yapilmasini istemiyorsak veya projemiz disinda herhangi bir yerden bu &uuml;yeye erisim izni vermek istemiyorsak erisim belirleyicileri kullanmak zorundayiz.<br \/>\n\t<br \/>\n\tPeki, erisimi engellemenin mantigi ne? Bir web servis yazdik ve bu web servisimiz i&ccedil;inde tanimladigimiz bir sinif var. Bu sinifa ait bir &uuml;yenin sadece web servis i&ccedil;inde tanimlanmis ve ya web servis projesi i&ccedil;inde tanimlanmis &uuml;yeler tarafindan erisilmesini istiyoruz. Web servisi kullanan insanlarin bu &uuml;yeye ait degerleri set etmesi veya get etmesi isimize gelmiyorsa, bu &uuml;yenin erisilebilirliligini kisitlamamiz gerekir. C# da kullanabilecegimiz toplam 5 farkli erisim seviyesi bulunuyor. Bunlari liste halinde asagida verdim.<\/p>\n<table class=\"reference\">\n\t<tbody>\n\t\t<tr>\n\t\t\t<th>\n\t\t\t\tErisim Belirleyici<\/th>\n\t\t\t<th>\n\t\t\t\tA&ccedil;iklama<\/th>\n\t\t<\/tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tprivate<\/td>\n\t\t\t<td>\n\t\t\t\tErisim seviyesi private olarak ayarlanan &uuml;yelere sadece bu &uuml;yenin bulundugu sinif i&ccedil;erisinden erisilebilir.<\/td>\n\t\t<\/tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tinternal<\/td>\n\t\t\t<td>\n\t\t\t\tSadece &uuml;yenin bulundugu proje i&ccedil;erisinden erisilebilir.<\/td>\n\t\t<\/tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tprotected<\/td>\n\t\t\t<td>\n\t\t\t\tSadece &uuml;yenin bulundugu sinif ve bu siniftan t&uuml;remis alt siniflardan erisilebilir.<\/td>\n\t\t<\/tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tprotected internal<\/td>\n\t\t\t<td>\n\t\t\t\tSadece &uuml;yenin bulundugu proje i&ccedil;erisinden ayrica &uuml;yenin sinifindan t&uuml;remis alt siniflar tarafindan erisilebilir.<\/td>\n\t\t<\/tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tpublic<\/td>\n\t\t\t<td>\n\t\t\t\tpublic &uuml;yelerin erisiminde herhangi bir kisitlama yapilmaz. Istenilen her yerden &uuml;yeye erisim a&ccedil;iktir.<\/td>\n\t\t<\/tr>\n\t<\/tbody>\n<\/table>\n<p>\n\tObject Oriented programlamada t&uuml;m sinif fieldlerinin private yapilmasi ve bu fieldlere erisimin metotlar ve\/veya &Ouml;zellikler(properties) &uuml;zerinden saglanmasi tavsiye edilir. Bu sayede fieldlerimize disaridan verilecek degerler kontrol edilebilir. Aksi takdirde disaridan fielde verilecek degerleri kontrol etmemiz imk&acirc;nsizdir.<br \/>\n\t<br \/>\n\t&Uuml;ye tanimlarken eger bir erisim belirleyici kullanmazsak C# default olarak &uuml;yemizin erisim seviyesini private yapacaktir.<br \/>\n\t<br \/>\n\tNamespaceler hari&ccedil; t&uuml;m veri tipleri i&ccedil;in erisim belirleyici kullanabilirsiniz. Fakat &uuml;st seviye tipler i&ccedil;in (sinif, struct, enum) i&ccedil;in sadece public ve internal erisim seviyelerini kullanabilirsiniz.<\/p>\n<h4>\n\t&Ouml;zellikler(Properties)<\/h4>\n<p>\n\tEger siniftaki t&uuml;m fieldlerin erisim seviyelerini private yaparsak o zaman bu fieldlere nasil erisebiliriz diye d&uuml;s&uuml;nm&uuml;ss&uuml;n&uuml;zd&uuml;r. Cevap tabi ki, properties kullanarak. C# properties &ouml;zelligini destekleyen ilk programlama dilidir. Java ve C++ gibi dillerde private bir fielde deger atamam veya bu fieldin degerini almak i&ccedil;in public tanimlanmis metotlar kullanilir. Private bir field tanimlayalim ve bu fielde erisimi metotlar ve properties ler &uuml;zerinden nasil yapacagimiza bakalim.<\/p>\n<h4>\n\tMetot kullanarak:<\/h4>\n<pre class=\"brush:csharp\">\nprivate int dersNotu;\npublic void SetDersNotu(int not)\n{\n    dersNotu = not;\n}\n\npublic int GetDersNotu()\n{\n    return dersNotu;\n}<\/pre>\n<h4>\n\tProperties kullanarak<\/h4>\n<pre class=\"brush:csharp\">\nprivate int dersNotu;\npublic int DersNotu\n{\n    get { return dersNotu; }\n    set { dersNotu = value; }\n}<\/pre>\n<p>\n\tYukaridaki kodlari incelerseniz properties kullanarak private olan bir fielde erismenin ne kadar kolay oldugunu g&ouml;r&uuml;rs&uuml;n&uuml;z. Ayrica Visual Studio bir field i&ccedil;in properties tanimlamayi otomatiklestiriyor. Bunun i&ccedil;in kodunuzdaki fieldi sag tiklayin a&ccedil;ilan men&uuml;den <strong>Refactor-&gt;Encapsulate<\/strong> <strong>Field <\/strong>men&uuml;s&uuml;n&uuml; se&ccedil;in, yukaridaki get ve set metotlari sizin i&ccedil;in otomatik olarak olusturulacaktir. Properties i&ccedil;inde set veya get metotlarinda en az birini tanimlamaniz gerekiyor. Eger fieldinizin sadece readonly olmasini istiyorsaniz set &ouml;zelligini silerek bunu yapabilirsiniz.<br \/>\n\t<br \/>\n\tEger tanimladiginiz field alaninin sadece belirli bir aralikta deger almasi gerekiyorsa, &lsquo;&ouml;rnegin ders notu 0 ile 100 arasi olmaz zorunda&rsquo; set metodu i&ccedil;ine bu kontrol&uuml; asagidaki gibi ekleyebilirsiniz. B&ouml;ylece dersNotu isimli fieldinizin alabilecegi degerleri kontrol etmis olursunuz. Bu kontrol&uuml; yapabilmek i&ccedil;in fieldinize ait erisim seviyesini private yapmali ve asagidaki gibi bir properties kullanmaniz gerekiyor. Sanirim bu kontrol ile bir fielde ait erisim seviyesinin neden private yapilmasi gerektigini anlamissinizdir.<\/p>\n<pre class=\"brush:csharp\">\nprivate int dersNotu;\npublic int DersNotu\n{\n    get { return dersNotu; }\n    set\n    {\n        if (dersNotu &gt;= 0 &amp;&amp; dersNotu &lt;= 100)\n            dersNotu = value; \n    }\n}<\/pre>\n<p>\n\tBasit bir &ouml;rnekle yukarida anlattiklarimiz pekistirelim.<\/p>\n<pre class=\"brush:csharp\">\nusing System;\nnamespace OOPOrnek\n{\n   class Program\n    {\n        static void Main(string[] args)\n        {\n            Dortgen dortgen = new Dortgen();\n            dortgen.KisaKenarUzunlugu = 200;\n            dortgen.UzunKenarUzunlugu = 200;\n            Console.WriteLine(&quot;Kenar Uzunluklari = {0}x{1}&quot;,\n              dortgen.KisaKenarUzunlugu, dortgen.UzunKenarUzunlugu);\n            Console.WriteLine(&quot;D&ouml;rtgen Tipi : {0}&quot;, dortgen.DortgenTipi);\n        }\n    }\n    class Dortgen\n    {\n        private int kisaKenarUzunlugu;\n        private int uzunKenarUzunlugu;\n        public int KisaKenarUzunlugu\n        {\n            get { return kisaKenarUzunlugu; }\n            set { kisaKenarUzunlugu = value; }\n        }\n     \n        public int UzunKenarUzunlugu\n        {\n            get { return uzunKenarUzunlugu; }\n            set { uzunKenarUzunlugu = value; }\n        }\n\n        public string DortgenTipi\n        {\n            get\n            {\n                string tip = &quot;&quot;;\n               &nbsp;if (kisaKenarUzunlugu == uzunKenarUzunlugu)\n                    tip = &quot;Kare&quot;;\n                else\n                    tip = &quot;Dikd&ouml;rtgen&quot;; \n                return tip;\n           }\n        }\n    }\n}<\/pre>\n<p>\n\tYukaridaki kodu inceleyecek olursak, basit bir sinif tanimladik. Sinifimiz basit bir d&ouml;rtgen yapisini barindiriyor. Tabi ki bu sinifi daha detayli hale getirebiliriz. Ilerleyen derslerimizde bu sinifa yeni ilaveler yapacagiz.&nbsp; Yeni bir console uygulamasi a&ccedil;ip yukaridaki kodu Program.cs dosyasinin i&ccedil;ine yapistirirsaniz sorunsuz &ccedil;alisir. &Ccedil;alistirdiginiz zaman asagidaki &ccedil;iktiyi elde edeceksiniz.<\/p>\n<pre>\nKenar Uzunluklari = 200x200\nD&ouml;rtgen Tipi : Kare\nDevam etmek i&ccedil;in bir tusa basin . . .\n<\/pre>\n<h4>\n\tSiniflarin Static &Uuml;yeleri<\/h4>\n<p>\n\tBir sinida ait &uuml;yeye erisebilmek i&ccedil;in o sinifa referans eden bir nesne olusturmaniz gerekir. Bu kural static &uuml;yeler i&ccedil;in ge&ccedil;erli degildir. Yani yukaridaki &ouml;rnegimizde D&ouml;rtgen sinifinda &uuml;rettigimiz bir dortgen nesnesini kullanarak kisaKenarUzunlugu &uuml;yesine erisebiliriz. Eger sinifimiza ait bir &uuml;ye varsa ve bu &uuml;ye bu siniftan t&uuml;r&uuml;yen t&uuml;m nesnelerde ayi degere sahip olacaksa static metod tanimlamak mantiklidir. Yukaridaki sinifimiza basit bir static &uuml;ye ekleyelim&nbsp; ve main fonksiyonu i&ccedil;inden &ccedil;agiralim.<\/p>\n<pre class=\"brush:csharp\">\nclass Dortgen\n    {\n        public static int kenarAcisi = 90;\n    &hellip;\n    &hellip;\n    }\n\n\nstatic void Main(string[] args)\n{    \n     Console.WriteLine(Dortgen.kenarAcisi);\n}<\/pre>\n<p>\n\tYukarida g&ouml;rd&uuml;g&uuml;nz gibi Dortgen sinifinin adini yazdiktan sonra direk olarak static &uuml;yemizin ismini yazarak kullandik.&nbsp; Static &uuml;ye tanimlarken dikkat etmeniz gereken nokta sudur. Eger bir methodu static tanimladiysaniz, bu metot i&ccedil;inde sinifin &uuml;yelerinden static olmayan bir &uuml;ye kullanamazsiniz. Tersi durumda yani static olmayan bir &uuml;ye i&ccedil;inde static bir &uuml;ye kullaniminda ise herhangi bir sorun yoktur.<\/p>\n<pre class=\"brush:csharp\">\nAn object reference is required for the non-static field, method, or property<\/pre>\n<p>\n\tYukaridaki gibi bir hata aldiysaniz static bir metor i&ccedil;inde static olmayan bir metot kullanmaya &ccedil;alisiyorsunuz demektir.<br \/>\n\t<br \/>\n\tBir sonraki dersimizde Object Oriented Programlamaya devam edecegiz. Bir sonraki derste g&ouml;r&uuml;smek &uuml;zere.<\/p>\n<p>\n\t<a href='www.yazilimmutfagi.com'>.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bu dersimizde Object Oriented Programlamaya basliyoruz. Ilk olarak siniflari (class), nesneleri (object) ve bunlar hakkinda temel bilgileri &#246;grenecegiz. Ardindan diger derslerimizde yapicilar(constructor), erisim belirleyiciler(Access modifiers), &#246;zellikler (properties),vb. gibi konulara deginecegiz<\/p>\n","protected":false},"author":517,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[436],"tags":[6501,6151,6299,6200,5521,6475,6391,4614,5867,5957,5370,3871,4142,6506,6449,6379,6451,6472,6426,6421,6318,6490,4879,4641,6498,6493],"_links":{"self":[{"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/posts\/184"}],"collection":[{"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/users\/517"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/comments?post=184"}],"version-history":[{"count":0,"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/posts\/184\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/media?parent=184"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/categories?post=184"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/tags?post=184"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}