1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
#encoding:UTF-8 #encapsulation yani sarmalama yada kapsülleme olarka ifade edebileceğimiz bu ifade sınıfımızın içersine dış dünya ile bir sınır koymasını sağlayan bir kavramdır. #dış dünya tarafından ulaşılmasını istemediğimiz kodlarımızı bu yöntem ile gizleyebilir ve programımızı güvenli hale getirebiliriz. #Yazar adında bir sınıf oluşturup yapıcı metotuna(initialize) kitapAdi ve yazarAdi parametreleri alan ve dışarıdan kitapAdi sınıf değişkenine ulşaılmasın ısağlayan progrmaı yazalım class Yazar def initialize(kitapAdi,yazarAdi,basimTarihi) @kitapAdi,@yazarAdi,@basimTarihi=kitapAdi,yazarAdi,basimTarihi end attr_reader :kitapAdi #kitapAdi örnek değişkeni sadece veri okunabilir attr_writer :yazarAdi #yazarAdi örnek değişkeni sadece veri yazabilir attr_accessor :basimTarihi #basimTarihi örnek değişkeni hem yazılabilir hem okunabilir end yazar=Yazar.new("Son Seferad","Beyazıt AKMAN",2012) #Yazar sınıfının yazar adında nesnesini oluşturduk ve yapıcı metotuna gerekli değerleri yolladık print "Kitap Adı: ",yazar.kitapAdi,"\n" #yazar.kitapAdi="Ruby" #yukarıdaki kodu aktif ettiğimizde kitapAdi sadece okunabilir özelliğe sahip olduğu için atama işlemini reddecek ve hata verecek yazarAdi="Beyazıt Akman" #puts yazar.yazarAdi #üstte satırımızı çalıştırdığımızda hata verecektür çünkü yazarAdi örnek değişkenine writer sadece değer gönderilebilir özzelliğini verdik. print "Basım Tarihi ", yazar.basimTarihi, "\n" yazar.basimTarihi="2011" print "Yeni Basım Tarihi: ",yazar.basimTarihi, "\n" #değerini değiştiremediğimiz kitapAdi ve değerini göremediğimiz yazarAdi örnek değişkenlerine encapsulation kurallarına uymadan erişmemiz mümkün fakat bu yöntemleri uygulamamamız programımızın geleceği açısından önemlidir. #örnek olarak o kodlarımızı yazalım. #kitapAdi örnek değişkenine nesne kuralına uymadan değerini değişterelim yazar.instance_variable_set(:@kitapAdi, "Ruby") puts yazar.kitapAdi #yazarAdi örnek değişkenine nesne kuralına uymadan değerine ulaşalım yazar.yazarAdi="Onur ARSLAN" puts yazar.instance_variable_get(:@yazarAdi) #Kisi adında bir sınıf oluşturalım. #sınıfın ad ve soyadında parametreleri ve ad ve soyadı ekrana yazdırmayı sağlayan EkranaYazdir ismide metot oluşturalım ve metot yapıcı metot ile birlikte çağırılsın. class Kisi def initialize(ad,soyad) @ad=ad @soyad=soyad self.EkranaYazdir end def ad=(ad) @ad=ad end #bir örnek değişkenin değerini değiştirmek için fonksyion tanımlandıktan sonra =(parametre) yazılmalıdır attr_accessor :soyad #attr_accessor ile get ve set işlemler iyaparız. üstte 3 satırda yaptığımız değişkenin değiştirme işlemini burda tek satırda yapıyoruz def EkranaYazdir puts "Hoşgeldin #{@ad} #{@soyad}" end end kisi1=Kisi.new("Onur","Arslan") kisi1.ad="Burak" kisi1.soyad="Yaşar" kisi1.EkranaYazdir #encapsulation yani sarmalama kullanırken metotlarımızın erişim ayarlarınıda belirleriz. #ruby dilinde 3 çeşit metotlara ait erişim belirteçleri vardır. #public, her yerden ulaşılabilir metotlardır. sınıfın nesnesi üzerinden de ulaşılabilir. varsayılan olarka metotlar public dir. #private, dışarıya karşı kapalı olan metotlarlardır. sadece sınfı ieçrisnde kullanılabilir. sınıfın örneği üzerinden ulaşılamaz. #protected, private gibidir. dışarıdan ulaşılamaz fakat sınıfın en az herhangi iki örneği birbirleri üzerinden işlemler gerçekleştirebilir #private ve protected metotlar dışarıya ver ivermesi gerektiği durumda public metotlar aracılığı ile yapılabilir. #aşağıdak i rörnekte Topla, Carp ve EkranaYaz isminde metotları olan Islem sınıfı vardır. #Topla metotu private ile Carp metotu protected ile dış dünyaya karşı güvenliği sağlanmıştır. #dış dünya ile iletişime gçemesi için public olan EkranaYaz metotunu kullanıyoruz. class Islem def initialize(a,b) @a,@b=a,b end private def Topla return @a+@b end protected def Carp @a*@b end public def EkranaYaz puts "Topla: #{Topla()}" puts "Çarp: #{Carp()}" end end islem=Islem.new(5,3) islem.EkranaYaz #islem.Topla #islem.Carp #yukarıdaki pasif kodları aktif ettiğimizde erişim belirteçlerindne dolayı hata alırız. puts islem.send(:Carp) #eğer bu metotlara ulaşmak istiyorsanız yukarı ki gibi send metotu ardından metot ismini sembol olarak çağırma :(iki nokta önüne ekleyerek) çağırırz #tabi yine bunları nesne yönelim mantığı nedeni ile istisnai durumlar dışında önermiyoruz. #Sayı tahmini yapan ve sayının yaklaşma durumuna göre büyük veya küçük sayı giriniz yazdıran programı yazalım. #rand() fonksiyonu rastgele sayı üretilmesini sağlar class TahminOyunu def initialize @sayi=rand(100) end def TahmineBasla @i=0 #yerel değişkenler sadece bulunduğu blok içersinde geçerli olduğu için başka blokta kullanılduğında hata verecektir. #i değişkenini Yakinlik metodunda da kullanabilmek için @i yani örnek değişkeni haline getirmemiz gerekti. #kısacası değişşkenimizi başka bir blok,method içerisnde kullanacaksak örnek değişkeni olarak tanımlamalıyız while @i!=1 print "Lütfen Tahmininizi Giriniz: " @tahmin=gets.chomp.to_i self.Yakinlik end end def Yakinlik if @tahmin<@sayi puts "Büyük Giriniz" elsif @tahmin>@sayi puts "Küçük Giriniz" elsif @tahmin==@sayi puts "Tebrikler Tahmin Ettiniz !" @i=1 else puts "Geçersiz Değer Girdiniz." end end end tahminEt=TahminOyunu.new tahminEt.TahmineBasla |