4 Mart 2019 Pazartesi

Limnor Programlama Kendi Nesnelerinizi Üretmek

Özellikler Metodlar ve Olaylar Tanımlamak


Önceki yazıda değişik sınıflara ait özellikler , metodlar ve olayları kullanmasını görmüştük. Bir sınıfın işlevselliği onun özellikleri, metodları ve olayları ile belirlenir. Bu yazıda Limnor kullanım klavuzunu örnek aldım.

Kendi sınıfımızı tanımlamak istediğimizde onu mevcut olan sınıflardan birinden üretmek zorundayız. Klonladığımız sınıfın özellik, metod ve olayları otomatik olarak yeni tanımladığımız sınıfta da geçerli olacaktır. Biz bunlara kalıtımsal (inherited) özellik, metod ya da olay deriz. Şimdi Limnor geliştirme ortamını açalım ve yeni bir proje başlatarak örneklerle devam edelim.


Örneğin formumuzu nesne ağacında incelediğimizde kalıtımsal bileşenler "Properties inherited" , "Methods inherited" ve "Events inherited" bağşlıkları altında verilmiştir. Bu örnekte Form1 yeni üretilen sınıftır ve DrawingPage sınıfından türetilmiştir. Türetilen sınıf ayrıca üretilen sınıfın  "Temel sınıf"ı olarak da isimlendirilir. 

Yeni tanımlanan sınıfa temel sınıfında bulunmayan işlevsellikleri kazandırabilmek için yeni özellikler, metodlar veya olaylar ekleyebiliriz. 

Bu yazıda Person adında yeni bir sınıf üretip onun işlevselliğini yeni özellikler, metodlar ve olaylar tanımlayarak belirleyeceğiz. 

Projemiz bir Windows Form Uygulaması projesi. Bu projede yeni bir sınıf üretmek için uygulama üzerine sağ tıklayıp "Add" sekmesinde "New Item.." seçelim.


Açılan templates penceresinde Class kalıbını seçelim ve sınıfımıza Person adını verelim. Eğer mevcut sınıflardan birine benzeyen bir yeni sınıf üreteceksek, Sub Class kalıbını seçerek mevcut sınıflar içinden birini seçebiliriz. Ama biz burada tüm elemanlarını belirleyebileceğimiz yeni bir sınıf istediğimiz için Class kalıbını kullanıyoruz. 


OK tuşunu tıklayıp yeni sınıfımızı uygulamaya ekleyelim. Yeni sınıf üretildi ve proje ağacına yerleşti. İsterseniz sınıfı düzenlemek için açıp nesne ağacında üzerine sağ tıklayarak default olarak verilen ikonu istediğiniz bir ikon ile değiştirebilirsiniz. 




Özellikler Tanımlamak


Yeni Özellikler Eklemek


Person sınıfımızda FirstName (Ad) ve LastName (Soyad) özellikleri olmasını istiyoruz. Nesne ağacında "Properties" üzerine sağ tıklayıp "Create New Property" seçelim.


Yeni özelliğimiz nesne ağacında , haritada ve özellik penceresinde belirecektir.


Özelliğimizin adını Property1'den FirstName olarak değiştirelim.


Aynı şekilde LastName özelliğini de ekleyelim. 


Özellik Okuyucu ve Yazıcı Metodlar


Yeni bir özellik eklediğimizde program içinde bu özellik değerini okumak ve yazmak için iki adet metod otomatik eklenir. Değer okumak için Getter metodu, değer yazmak için Setter metodu.

Getter

Getter metodu dışardan özellik değeri okunmak istendiğinde çalışır. Bu metod default olarak özellik değerini geri döner, ama biz başka şeyler yapmasını istersek bu metodu yanındaki "..." butonundan değiştirebiliriz. 


Setter

Setter metodu özellik değerini değiştirmek istendiğinde çalışır. İstersek bu metodu da değiştirebiliriz. Default olarak bu metod kullanıldığı aksiyon parametresinde belirtilen değeri özelliğe yazar.




Sadece Okunabilir bir Özellik Eklemek


Diyelim FullName adında bir özellik ekleyeceğiz ve bu özellik kişinin adı ve soyadının birleşmesinden oluşacak. Bu durumda FullName özelliğine dışarıdan değer yazılmasını önlememiz gerekir, bu sadece okunabilir bir özelliktir. Bu amaçla FullName'in CanWrite özelliğini False değeri vererek iptal eder ve değer yazılmasını engelleriz.


Bu durumda FullName özelliğimize dışarıdan değer yazılamayacak ve değeri FirstName ve LastName değerlerinin birleştirilmesi ile oluşacak. Bunu gerçekleştirmek için okuyucu (getter) metodunu değiştireceğiz. Metodun yanındaki "..." butonu tıklayarak düzenleme penceresini açalım. 

Default olarak Getter metodunda sadece özellik değerini geri dönen bir aksiyon vardır. Bu aksiyonun "value" parametresi FullName özelliğini almakta ama biz onun yanındaki listeden matematik expresyon seçerek formül girişi yapalım. 


Biz değerin şöyle oluşmasını istiyoruz:

{FirstName}{bir boşluk}{LastName}

Birbirine eklenmiş 3 adet yazı. Bu amaçla yazı birleştirme fonksiyonunu "A+" kullanacağız. 


"A+" tıklayınca formül bölümünde 2 adet boş string belirecektir. 


İkinci boş stringi seçip "A+" tekrar tıklayalım. Şimdi formülde 3 adet boş string oldu.


Birinci boş stringi seçelim System sekmesinde Property'yi tıklayalım ve listeden FirstName özelliğini seçelim.



Next butonu tıklayalım ve ikinci boş stringi seçip boşluk tuşuna basark onu da bir boşluk şekline getirelim.


Son boş stringe de LastName özelliğini koyarak formülü bitirelim ve kaydedelim.


Getter metodunun değiştirilmesi tamamlandı. Ona da OK verip kaydedelim.


Setter metodu da eğer özellik sadece okunur değilse aynı şekilde değiştirilebilir, ama bunu sonra göreceğiz. 



Özellik Tipini Değiştirmek


Şimdi kişinin tasarruf miktarını belirtecek bir SavingAmount değeri için özellik ekleyelim.


Default olarak yeni eklenen özelliğin tipi String olarak gelir ama bizim SavingAmount özelliğimiz desimal bir sayı olacak. Bunun için Tipin yanındaki "..." butonuna tıklayarak açılan listeden Money
tipini seçalim. 


Özellik tipi değişti.







Metod Tanımlamak


Farzedelim lişi bilgilerini virgülle ayrılmış dosyada (.csv) saklamak istiyoruz. 

Adı,Soyadı,Tasarruf miktarı

Kişi bilgilerini bir text dosyadan okumak veya text dosyaya yazmak için metodlar ekleyeceğiz. 


Yeni bir Metod Eklemek


Harita ya da nesne ağacı kullanarak yeni metod ekleyebiliriz. Haritada boşluğa sağ tıklayıp "Create Method" seçelim.


Açılan metod editörünü az önce getter metodunu düzenlerken kullanmıştık hatırlarsanız. Metod adını değiştirip kaydedelim.




Metod Parametresi Eklemek


Kişi bilgisinin saklanacağı dosya isminin sabit olmasını istemiyoruz. Bu nedenle içinde dosya isminin barındıran bir değişkeni parametre olarak metoda eklemek istiyoruz. Daha sonra bu metodu kullanan aksiyonlar ürettiğimizde her aksiyon kendi dosya adını vererek metodu çağırabilir. 

Metod düzenleyiciyi açmak için haritada metoda sağ tıklayıp "Edit method" tıklayabiliriz. Metodumuza yeni parametre eklemek için parametre bölümüne sağ tıklayıp "Add parameter" seçelim. 


Tamam butonu basınca bize parametre tipini soracaktır. Dosya ismi yazı olacağı için String tipini seçiyoruz ve Next tuşuna basıyoruz. 


Parametre listeye eklendi. Şimdi onu seçerek adını "filename" olarak değiştirelim. 




Metoda Aksiyonlar Eklemek


Metodumuza sistemde mevcut aksiyonlardan ekleyebileceğimiz gibi kendi tanımladığımız aksiyonları da ekleyebiliriz. Bizim tanımladıklarımız sadece metodun içerisinde geçerli olacaktır. 

Statik Metod Kullanarak Aksiyon Eklemek

Microsoft .NET Framework kütüphanesinde bir File sınıfı vardır ve bu sınıfın ReadAllText adında bir metodu vardır. Bu bir statik metoddur , statik metodlar sınıf tarafından işletilir , sınıfın oluşumu tarafından değil. Bu yüzden File sınıfından yeni bir nesne üretmek zorunda değiliz. Metod editörü içine sağ tıklayalım ve "Add an action" seçerek ReadAllText metodunu kullanacak bir aksiyon üretelim. 


Metod seçmemiz için bir diyalog penceresi açılır. ReadAllText metodu NameSpaces bloğunda SystemIO grubu altında File sınıfı içindeki statik metodlar içinde bulunacaktır. 


İlk olarak Encoding özelliği. Bu olmazsa hata verecektir. Bu özelliği property seçiminden Encoding altında StaticProperties altında UTF-8 olarak seçelim.

Bu aksiyonumuzun okunacak dosya adını içeren bir "path" parametresi vardır. Parametre olarak filename seçmek için path özelliğiyanındaki oka tıklayalım ve Property seçelim.


filename parametresini seçelim ve Next butonunu tıklayalım.




Aksiyon Sonucunu Saklamak İçin bir Lokal Değişken Tanımlamak

ReadAllText aksiyonumuzun "Assign to" adındaki özelliği dosyadan okunan yazının hangi değişkene saklanacağını belirler. Aksiyon sonucunu (yani dosyadan okunan içeriği) saklamak için yeni bir lokal değişken tanımlayalım. 


Değişkene "fileContents" adını verip ekleyelim. 



Bu method çalıştırılınca dosya içeriği fileContents değişkeni içine yazılacaktır. Formatı şöyle olacaktır:

{Adı},{Soyadı},{Tasarruf miktarı}

Yukarıdaki bu yazıyı parçalayıp özelliklere yazacağız. Parçaladıktan sonra bunları Person sınıfının FirstName, LastName ve SavingAmount özelliklerine yazacağız. 

Lokal değişken fileContents string bir değişken. String sınıfı stringi parçalara ayırıp bir Array içine dağıtan Split fonksiyonuna sahiptir. Split metodunu kullanabilmek için metodumuza bir aksiyon eklemeliyiz. 

Sıralı Olarak Birden Fazla Aksiyon Kullanmak

fileContents değişkenine sağ tıklayıp "Add action" seçelim ve listeden Split metodunu bulalım.


Separators parametresini açıp altında boyutuna 1 değeri girelim. Enter bastığımızda bu 1 adet seperatörü gireceğimiz yeni bir özellik eklenir. Oraya da virgül karakteri yazalım. 


Aksiyon sonucunu kaydetmesi için de yine bir lokal değişken tanımlayalım.


Yeni lokal değişken Array1 metoda eklenecektir. 


OK tıkladığımızda yeni aksiyon metod editöründe görünecektir.




Array Değişkenden Özellik Değerlerinin Alınması

İkinci aksiyon ile virgülle ayrılmış string değerinden 3 elemanlı bir array değeri elden ettik. Array1 değişkeninde ilk elemanda FirstName değeri ikinci elemanda LastName değeri , üçüncü elemanda SavingAmount değeri bulunuyor. Şimdi bu değerleri Person sınıfında karşılık gelen özelliklere saklayacağız. Bu görev Array sınıfının get metoduyla yapılabilir. Get metodu hangi elemanın okunacağını belirten bir parametre alır. 0. eleman FirstName , 1. eleman LastName , 2. eleman Savingamount değerini içermektedir. 

Şimdi ilk elemanı okuyup FirstName özelliğine saklayacak bir Get aksiyonu ekleyelim. Array1 değişkenine sağ tıklayıp "Create action" ve "Get" metodunu seçelim. 


Parameter0'a array'in ilk elemanını seçmek için 0 değeri yazalım ve değeri kaydetmek için "Assign to" özelliğine "Select existing object" tıklayalım.


FirstName özelliğini seçelim ve Next tıklayalım.


OK tıklayarak aksiyonu kaydedelim. Bu aksiyon array'in ilk elemanını FirstName özelliğine kaydeder.


Aynı şekilde ikinci elemanı LastName özelliğine kaydeden bir aksiyon daha tanımlayalım.


Bir aksiyon da üçüncü elemanı SavingAmount özelliğine kaydetmek için. 


Artık bu metodun tanımlaması bitti.


Tamam işaretine tıklayarak metod tanımlamamızı bitirelim.


Aksiyon Listesi Oluşturmak


Ard arda gelen aksiyonları görüntünün daha temiz olması için tek bir grup altında birleştirebiliriz. Son 3 aksiyonu seçerek sağ tuş tıklayalım ve "Make Action List" seçelim. 


Seçilen aksiyonların hepsi bir aksiyon listesi içine toplandı.


Aksiyon adını ve diğer parametrelerini değiştirebiliriz.


Aksiyon listesi içindeki aksiyonları görmek veya düzenlemek için üzerine sağ tıklayıp "Edit" seçeriz. Listedeki her aksiyon ve özellikleri tek tek deüiştirilebilir.




Aksiyon Akışında Dallanma


Aksiyonların birer birer birbirini takip etmesine akış denir. Bazen farklı koşullara göre farklı aksiyonlar yapmak gerekir. Bu IF .. ELSE program bloğu gibi bir şeydir. Örneğin yukarıdaki uygulamada 3 elemanlı bir array'den üç özelliğe kayıt yaptık. Ama ya dosyada yanlış bilgi varsa? Eleman sayısı 3'ten farklıysa değer atamalarını yapmayıp kullanıcıya bir mesaj ile hatayı bildireceğiz. 

Akışta boş bir yere sağ tıklayıp "Create condition" seçelim ve bir koşul ekleyelim. Koşulun condition özelliğinde matematik formülü girişi seçelim


Lojik başlığı altındaki eşit mi sorusunu alalım.


Eşitliğin sol tarafına array'imizin eleman sayısını veren Length özelliğini koyalım.


Eşitliğin sağ tarafına sabit değer girmek için system sekmesinden Val fonksiyonunu seçelim. Değeri 3 olarak girelim.


Koşulumuz hazır, Tamam işareti ile koşulu kaydedelim. Şimdi bu karşılaştırmayı değer atamalarını yapmadan öncesine yerleştirelim. Mevcut akıştaki bağlantı çizgilerine sağ tıklayarak Disconnect ile ayırabilir ve uçlarındaki noktaları sürükleyerek yeni yerlerine bağlayabilirsiniz.



Peki koşul gerçekleşmezse yani array eleman sayısı 3'ten farklıysa, kullanıcıya bilginin hatalı olduğunu belirten bir mesaj penceresi göstermeliyiz. Bu amaçla bir mesaj aksiyonu ekleyeceğiz.

Aksiyonumuza metod olarak "Message Box" altınd "Static Methods" Altında "Show" metodunu seçiyoruz.


Aksiyon özelliklerinde mesaj olarak text özelliğine "Dosyadaki bilgi hatalı" yazabiliriz.


MesajBox aksiyonu "owner" özelliğine "property" deyip listeden Person nesnesini seçiyoruz.

Şimdi becerilerinizi kullanıp akış şemasını şöyle yakışıklı bir görünüşe getirin bakalım. Yaptığınız işten keyif almanız lazım.






SaveToFile Metodunun Oluşturulması


Bu bölümde kullanılan tüm teknikler önceki metod tanımlamasında kullanıldı. Bu yüzden anlatmadan geçtiğimiz bir şey olursa önceki bölümü tekrar inceleyebilirsiniz. 

Bilgileri dosyadan yüklemek için Person sınıfına LoadFromFile metodu eklediğimiz gibi şimdi de tersini yapmak için yani bilgileri ekrandan dosyaya yazmak için SaveToFile metodu eklememiz gerekir. 

Person sınıfına SaveToFile adında bir metod ekleyelim ve aynı şekilde parametre olarak String tipinde "filename" parametresini ekleyelim.


Hatırlarsanız LoadFromFile metodunda text dosyadan tüm yazıyı okumak için File sınıfının ReadAllText metodunu kullanmıştık. Dosyaya yazmak için de yine File sınıfının bu sefer WriteAllText metodunu kullanacağız. Bunu gerçekleştirmek için metoda bir aksiyon ekleyelim. 

NameSpaces altında SystemIO altında File sınıfında WriteAllText metodunu bulalım.


Bu metodun "path" özelliğine filename parametremizi yazıyoruz.


"contents" özelliğine ise dosya içine yazılacak yazı değerini belirlemek için matemetik formülünü seçeceğiz. Dosyaya yazacaklarımız 5 tane string'in birleştirilmesinden oluşuyor.

{FirstName}{virgül}{LastName}{virgül}{SavingAmount}

Tabii ki bu birleştirme için "A+" fonksiyonunu kullanacağız.Bu durumda formülümüzün son hali şöyle olacak. 

OK butonu tıklayıp bu aksiyonu kaydedelim.


Aksiyon tanımlamamız bitti bundan başka bir aksiyona ihtiyacımız yok. Bu metod ile bilgilerimizi dosyada saklayabiliriz.


Yeni metod listemizeeklendi. Devam edelim.




Karar Tablosu


Bir karar tablosu bir dizi karşılaştırmanın olduğu listedir. Her karşılaştırma sonucunda aksiyonlar gerçekleştirilir. Bir karar tablosu çalıştırıldığında sırayla her karşılaştırma sorgulanır ve True sonucu veren ilk karşılaştırma için tanımlanan aksiyonlar gerçekleştirilir ve karar tablosunun çalışması bundan sonra biter.

Yapı olarak aksiyon listesi karar tablosuna benzer. Aradaki fark aksiyon listelerinde tüm listedeki aksiyonlar işlenirken, karar tablolarında grubun başındaki koşulun doğru olduğu aksiyonlar işlenir. Eğer hiç bir koşul gerçekleşmezse karar tablosundan hiç bir aksiyon işletilmeden çıkılır.

Örnek olarak , diyelim biz Person sınıfında bir nesnenin SavingAmount değerine göre değişik aksiyonlar yapacağız. Şöyle bir karar tablomuz olsun:

SavingAmount <= 0                    >>>    Bir şeyler yap
SavingAmount > 0 and < 30       >>>    Bir şeyler yap
SavingAmount >= 30 and < 80   >>>    Bir şeyler yap
SavingAmount >= 80                  >>>    Bir şeyler yap


Her "Bir şeyler yap" cümlesi başka bir aksiyon listesini işaret eder.
Hadi ProcessSavingAmount adında bir metod tanımlayalım. Metodun akış çizelgesine sağ tıklayıp "Creat decission-table" seçelim.


Akış çizelgesine bir karar tablosu eklenecektir, bunu düzenlemek için üzerine sağ tıklayıp "Edit" seçelim. Tablo düzenleyici açılacaktır. "Add" butonu ile yeni bir karar satırı ekleyelim. Eklenen satırın "Condition" sütununda koşulumuz olacak. Buraya yanındaki düzenleme butonunu tıklayarak aşağıdaki formülü girelim.


"Actions" sütununa da koşul gerçekleşince yapılacak aksiyon listesi girilir. Şimdilik kafa karıştırmamak için aksiyon olarak her bir karşılaştırmada sadece karşılaştırma sonucunu bildirir bir mesaj verelim.


MesajBox aksiyonu "owner" özelliğine "property" deyip listeden Person nesnesini seçiyoruz.

Yukarıda örnek verdiğimiz tüm koşullar için bu karar elemanından kopyalayarak listemizi tamamlayalım.






Runtime Hatalarını Ele almak


Programımız çalışırken bir metodun yaptığı işlem sonucu hata oluşabilir. Örneğin bir sıfıra bölme ya da açılacak dosyanın bulunamaması vs. Bunlara "Exception" denir. Eğer programımızda bu hatayı ele almak için bir rutin tanımlamadıysak uygulama kırılacak ve hata mesajı verip kapanacaktır. 

Her metodun bir "ExceptionHandlers" ve bir de "FinalActions" özelliği vardır. Bu özellikler yardımıyla metodun oluşturabileceği hatalara karşı işlenecek aksiyonlar tanımlayabiliriz.

Ama bu ileri seviyede işleyeceğimiz bir konu. Şimdilik bu kadar ön bilgi yeterli.



Olayları Oluşturmak


Daha önce de gördüğümüz gibi bir olay , kendisine eşleştirilen aksiyonların gerçekleştirileceği bir zamanı ifade eder. Yeni bir sınıf tanımlarken sınıfı kullanacak programcıların yararlanacağı olaylar tanımlayabiliriz. 

Bizim Person sınıfımız için düşünürsek bir tane SavingAmount özelliğimiz var. Değer belli bir miktarın altına düştüğünde programcıya istediği aksiyonları gerçekleştirmesine imkan sunmak için bir olay tanımlayabiliriz. Aynı şekilde SavingAmount değeri belli bir değerin üzerine çıktığı zaman için de bir olay tanımlayabiliriz. 

Şu anda programcının ne aksiyonlar istediğini bilmiyoruz. Biz sadece bu durumlar için birer olay oluşturacağız. Daha sonra programcı isterse bu olayları kullanarak onlara aksiyonlar tanımlayabilecek. Person sınıfının değişik oluşumlarında bu aksiyonlar farklı farklı olabilir. 

Biz sadece programcının bunları yapmasını mümkün kılabilmek için Person sınıfına olay ekliyoruz.

Person sınıfı için 2 adet olay tanımlaması yapacağız.

  • SavingAmountLow olayı. Bu olay anı SavingAmount değerinin belli bir değerin altına düştüğünde oluşacaktır. Eşik değeri SavingAmountLowThreshold ismiyle belirleyelim. Gerçekte bu olayın tam gerçekleşme anı, SavingAmount değerinin SavingAmountLowThreshold değerinden büyük bir değerdeyken , SavingAmountLowThreshold değerinden daha küçük bir değerin yazılması esnasında olacaktır. 
  • SavingAmountHigh olayı. Bu olay anı SavingAmount değerinin belli bir değerin üstüne çıktığında oluşacaktır. Eşik değeri SavingAmountHighThreshold ismiyle belirleyelim. Gerçekte bu olayın tam gerçekleşme anı, SavingAmount değerinin SavingAmountHighThreshold değerinden küçük bir değerdeyken , SavingAmountHighThreshold değerinden daha büyük bir değerin yazılması esnasında olacaktır. 

Hadi bu olay tanımlamalarını nasıl yapacağımızı görelim.



Yeni Olay Eklemek


Person sınıfı haritasında sağ tıklayıp "Create event" seçelim. 


Sınıfımıza Event1 ismiyle yeni bir olay eklenecektir. Özelliklerinden adını SavingAmountLow olarak değiştirelim.


Bir olay eklemesi daha yapalım onun adı da SavingAmountHigh olsun.





Olay Tetikleme Aksiyonları Tanımlamak


3 çeşit aksiyon vardır. Özellik ayarlayan aksiyonlar, metod çalıştıran aksiyonlar ve olay tetikleyen aksiyonlar. Özellik ayarlayan ve metod çalıştıran aksiyonları daha önce defalarca kullandık. 

Bu bölümde olay tetikleme aksiyonu oluşturacağız ve nasıl kullanılacağını göreceğiz. 

Aksiyonu oluşturmak için haritada olayımız üzerine sağ tıklayıp "Create event-firing action" seçelim.


Açılan aksiyon özellikleri penceresinde şimdilik hiç bir şey değiştirmeyip kaydedelim. 


Aynı tanımlamayı SavingAmountHigh olayı için de yapalım. Olay tetikleme aksiyonu nedir? Bu aksiyon koşulu oluşunca bağlı olduğu olayı tetikler , yani sisteme bu olayın gerçekleştiğini bildirir. Bu sayede bu olaya sonradan programcının bağlayacağı rutinler çalışır. 



Olayı Tetiklemek


Yeni bir olay tanımladığımızda bu olayın gerçekleşme anını belirlemek bizim sorumluluğumuzdadır. 

SavingAmountLow ve SavingAmountHigh adında iki adet olay tanımladık. Şimdi bu olayların ne zaman gerçekleşeceğini bu tetiklemeler ile belirtmeliyiz. Olayların nasıl gerçekleşeceğini daha önce düz yazı olarak yazdık. Bunu formül olarak ifade edeceğiz.

Olay Anını Tarif Etmek


Bir kere SavingAmountLow ve SavingAmountHigh olayları SavingAmount özelliği değeri değişince oluşacak bunu bir kenara koyalım.

Bir özellik değiştiğinde onun set-property metodu çalışır yani özelliğin Setter metodu çalışır.

Setter metodunu bu iki olay tetikleci aksiyonu koşullar gerçekleştiğinde çağıracak şekilde düzenlemeliyiz. 

SavingAmount özelliğinin Setter metodunu editörde açalım.


Burada value parametresi metod işlediğinde SavingAmount özelliğine yazılacak değeri içerir. 

"set the property value" aksiyonu ile de bu value değeri SavingAmount özelliği içine kaydedilir. 

Biraz dikkat , bu durumda metod işlemeye başladığı anda value parametresi yeni değeri , SavingAmount özelliği var olan değeri içermektedir. 

İşte bu iki değeri karşılaştırarak SavingAmount özelliğinin hangi değerden hangi değere değiştiğini kontrol edebiliriz. 



SavingAmountHigh Olayının Zamanı


"value" değeri SavingAmount değerinden yüksekse değer artıyor demektir. Bu durumda SavingAmountHigh olayı oluşabilir. Farzedelim eşik değer olarak 100 belirledik. Eğer value 100'den büyük ve SavingAmount 100'e eşit ya da küçükse olayımız gerçekleşmesi lazım. Yani:
  • value > 100
  • SavingAmount <= 100
Bunu formüle çevirirsek :

    value > 100 and SavingAmount <= 100



SavingAmountLow Olayının Zamanı


"value" değeri SavingAmount değerinden düşükse değer azalıyor demektir. Bu durumda SavingAmountLow olayı oluşabilir. Farzedelim eşik değer olarak 50 belirledik. Eğer value 50'den küçük ve SavingAmount 50'ye eşit ya da büyükse olayımız gerçekleşmesi lazım. Yani:
  • value < 50
  • SavingAmount >= 50
Bunu formüle çevirirsek :

    value < 50 and SavingAmount >= 50



Olay Tetikleme Aksiyonlarını Çalıştırmak


Daha önce dediğimiz gibi SavingAmount özelliğinin önceki ve yeni değerlerini "set the property value" aksiyonundan önce görebiliriz. Bu aksiyondan sonra iki değer eşit olacaktır. 

Olay koşullarını belirtmek için lokal değişkenler kullandığımızı düşünelim. SavingAmountHigh olayının koşulu için "Boolean" bir lokal değişken tanımlayalım adı amountHigh olsun. Bu değişken SavingAmountHigh olay anının koşuluna göre değer alsın yani koşul gerçekleşmişse TRUE gerçekleşmemişse FALSE değeri alsın. Bu amaçla amountHigh lokal değişkeni üzerine sağ tıklayalım ve "Create Set Value Actşon" seçelim.


Tabik otomatik olarak eklediğimiz aksiyon akış şemasında en sona geldi. Hemen bunun bağlantılarını silip metodun başında işlenecek hale getirelim. 


Peki bu aksiyon amountHigh değişkenine ne değer verecek? InstanceValue özelliğindeki değeri verecek. Şu anda bu değer default değer olan FALSE olarak görünüyor, ama bir değişkenin olay koşuluna göre değer almasını istiyoruz. Bunun için özelliğie bir matematik formülü girerek koşulumuzu yazacağız. 


Aynı şekilde SavingAmountLow olayı için de bir değişken tanımlayıp aksiyonu yazarsak.


Olayları tetikleme işlemmlerini SavingAmount değerinin yazılmasından sonra yapmamız daha doğru olacaktır. Bunu gerçekleştirmek amacıyla metodun sonuna yeni bir aksiyon ekliyoruz. Akışa sağ tıklayıp "Add an action" seçtikten sonra açılan pencerede SavingAmountHigh olayını tetikleyen aksiyonu seçelim.


ActionCondition özelliği default olarak TRUE gelecektir. Ama biz sadece amountHigh değişkeninin değerinin TRUE olduğu durumda aksiyonun gerçekleşmesini istediğimiz için burada ActionCondition özelliğine formül olarak amountHigh değişkenini gireceğiz.


Aynı şekilde SavingAmountLow olayını tetikleyen aksiyonu da metodumuza ekleyelim.








Özellikler , Metodlar ve Olayların Test Edilmesi


Person sınıfına özellikler , metodlar ve olaylar ekledik. Bunların kullanımı temel sınıfından gelen "inherited" lerin kullanımından farklı olmayacaktır. 

Şimdi Person sınıfının tanımladığımız özellik , metod ve olaylarını test amacıyla örnekler yapacağız. 



Sınıf Oluşumu Üretmek


Görsel olarak Person sınıfının özelliklerini gösterebilmek için uygulamamızın ana penceresi olan Form1 penceresini düzenlemek için açıyoruz ve form üzerine bir Person nesnesi sürükleyip bırakıyoruz.


Editörde Person sınıfının bir oluşumu belirecektir.





Özelliklerin Kullanılması


Özellik Değerlerinin Okunması


Kişinin özelliklerini okumak için TextBox nesneleri kullanacağız. Şimdi formumuza her özellik için bir textbox nesnesi koyalım ve isimlerini şöyle verelim.


txtFullName textbox nesnesinin ReadOnly özelliğini TRUE yapıyoruz çünkü biliyorsunuz bu özellik değer yazılan bir özellik değil diğer iki özelliğin birleşiminden değeri oluşan bir özellik.

Textbox nesnelerinde Person nesnemizin özelliklerini göstermek amacıyla onlara set-property aksiyonları ekleyeceğiz.

FirstName özelliğine ait textbox nesnesine sağ tıklayıp "Create Set Property Action" seçelim ve özellik listesinden "Text" özelliğini seçelim.


Aksiyon özelliklerini girmemiz için açılan pencereden "value" özelliğine değer olarak Person nesnemizin FirstName özelliğini girelim.

Yeni aksiyonumuz proje ağacında yerini almıştır. Diğer tüm Person nesnesi özellikleri için aynı işlemi yapalım.






Özellik Değerlerinin Değiştirilmesi


Değerleri textbox nesnelerinde göstermek için aksiyonları tanımladık. Şimdide tam tersini yapan yani textboxlarda gösterilen değeri Person nesnemizin özelliğine yazmak için aksiyonlar tanımlayacağız. Bu amaçla karşı tarafa gidiyoruz. 

Tasarım ekranında formun altında görünen Person nesnesi oluşumumuza sağ tıklayıp "Create Set Property Action" seçiyoruz, özellik olarak da FirstName özelliğini seçiyoruz. 


Aksiyon özelliklerinden value değerine txtFirstName textbox nesnesinin "Text" özelliğini seçiyoruz.


Aynı şekilde LastName ve SavingAmount Özelliklerine yazan birer aksiyon tanımlıyoruz.


Neden FullName özelliği yok? Çünkü o sadece okunabilir bir özellik.





Metodların Kullanımı


Person sınıfımıza LoadFromFile ve SaveToFile adında iki metod tanımlamış idik. Her iki metod için birer aksiyon tanımlayarak kullanacağız. 

Bu metodlar hatırlarsanız filename adında bir parametre istiyordu. filename parametresini girmek için forma bir textbox nesnesi daha ekliyoruz. name özelliğine ad olarak txtFilename yazalım.





LoadFromFile Metodu için Aksiyon Tanımlamak ve Kullanmak


Person sınıfı oluşumumuza sağ tıklayıp "Create Action" seçelim ve metod olarak LoadFromFile metodunu seçelim.


filename değeri olarak yeni eklediğimiz textbox'ın text özelliğini seçelim.


Bu aksiyonu çalıştırmak için formumuza üzerinde "Load From File" yazan bir buton ekleyelim. Bu butona sağ tıklayıp "Assign Action" seçelim açılan olaylar listesinden de butonumuzun "Click" olayını seçelim.


Şimdi biraz düşünelim bu butona basınca neler olmasını istiyoruz. Önce LoadFromFile metodu çalışacak ve Person nesnesi oluşumu özelliklerine dosyadan okuduğu değerleri yazacak. Sonra da bu değerleri ilgili textbox nesnelerine yazmamız gerekiyor. Hepsi için aksiyonlar tanımladık. Şimdi bütün bu aksiyonları listeden seçip Tamam tuşuna basalım.


Haritada butonun click olayına tüm aksiyonlar bağlandı. Olayı seçtiğimizde aşağıda işlem sırası da görünür bu listede elemanlara sağ tıklayarak "Move Up" ya da "Move Down" komutlarıyla "LoadFromFile" metodunu en başa alalım ki önce dosyadan değerleri okuyup sonra yerlerine yazsın.







SaveToFile Metodu için Aksiyon Tanımlamak ve Kullanmak


Şimdi aynı şekilde bir buton ekleyip bu sefer metod olarak SaveToFile metodunu seçeceğiz. Tabii önce Person sınıfı oluşumuna sağ tıklayıp SaveToFile için bir aksiyon eklyerek başlayacağız.  Filename değeri için yine aynı txtFilename textbox değerini kullanacağız.

Şimdi dosyadan okumanın tam tersi olacak. Önce textbox'lardan değerler Person oluşumumuzun özelliklerine yazılacak, sonra Person nesnesinin SaveToFile aksiyonu çağırılarak bu değerlerin dosyaya yazılması sağlanacak. Sonuçta elde edeceğimiz aksiyon listesi şu şekilde olacaktır.


Aksiyonların sırasını kontrol etmeyi unutmayalım. SaveToFile en sonda olacak.






Olayların Kullanılması


Ne yazdık be! Buraya kadar takip ettiyseniz siz baya bi Limnor kullanmaya niyetlendiniz demektir..

Şimdiye kadar olanları bir çalıştırıp deneyelim bakalım hatamız falan var mı. Uygulamayı çalıştırıp değişik kişiler için örnek veriler girip dosyalara kaydedip sonra da geri okuma yapalım.

Geride olaylar kaldı. Person sınıfı için iki olay tanımlaması yapmıştık, SavingAmountLow ve SavingAmountHigh. Şimdi bu olayların kullanımını bir örnekle test edelim.

Olaylarımızın kullanımı oldukça basit olacak SavingAmountLow olayı anında tasarrufun düşük olduğunu belirtir bir mesaj çıkarırken , SavingAmountHigh olayı anında da tasarruf miktarının yüksek olduğunu belirtir mesajlar vereceğiz. 



Olaylar Anında Çalışacak Aksiyonlar Tanımlamak


Proje ağacında MessageBox nesnesinin metodları arasında pencereyi aktif etmek amacıyla daha önce de kullandığımız Show metodunu proje ağacında bulalım ve ondan bir aksiyon SavingAmountLow bir aksiyon da SavingAmountHigh olayı için tanımlayalım. Bunun için metoda sağ tıklayıp "Create action" seçelim.


Aksiyon özelliklerini şöyle ayarlayalım.


Benzerini SavingAmountLow olayı için de tanımlayalım. 


Her iki yeni aksiyonumuz da proje ağacında yerini almış olmalı.





Aksiyonları Olaylara Bağlamak


Artık geriye işin kolay kısmı kaldı. Tanımladığımız bu aksiyonları ilgili olaya bağlayacağız. Forma eklediğimiz Person sınıfı oluşumuna sağ tıklayıp Assign action ve SavingAmountHigh olayını seçelim. 


Açılan aksiyon listesinden MessageBox.ShowAmountHigh aksiyonunu seçelim.


Diğer olayı da aynı şekilde bağlayalım. Bağlantılarımız hem proje ağacında hem de haritada açıkça görülüyor.





Uygulamanın Test Edilmesi


Yüzdük yüzdük kuyruğuna geldik. Meşhur yeşil okumuza basalım uygulamamızı çalıştıralım. Her şey yolunda gitmişse Form ekranda görünecektir. Yok hata mesajı çıkarsa yandınız demektir. Hata mesajında yazılan abuk sabuk şeyleri anlamaya çalışıp aynı hataları internette arayıp bulmaya çalışacaksınız ya da bilen birilerine soracaksınız. Zaten bu hata ayıklama işini de sabırla yaptıysanız artık yazılımcılıkta bir üst seviyeye geçtiniz demektir.

Neyse biz hiç bir sorun olmadığı ve formumuzun hatasız bir şekilde ekranda göründüğünü kabul edelim.




Dosyadan Değerleri Yüklemek


Kolay bir yere Person1.txt adında bir text dosyası koyalım içinde şunlar olsun.


Dosya adını bildirip yükleme yapalım.


Dosyadan okunan bilgiler yerlerine gelmiş olmalı.





Bilgileri Dosyaya Saklamak


Bazı bilgileri değiştirip Save To File butonuna tıklayalım.


Text dosyamızdaki veri yenilenmiş olmalı.




Olayları Tetiklemek


SavingAmount değerini 100'den büyük olan bir değere mesela 112 ye değiştirelim ve Save To File butonuna basalım.


Değer daha önce 100'den küçükken şimdi daha büyük değer kaydettiğimiz için SavingAmountHigh olayı tetiklenecek ve buna bağladığımız aksiyondaki mesaj penceresi ortaya çıkacaktır.


Tamam butonu ile mesajı kapatalım. Şimdi de 50'den küçük bir değer, mesela 32, girip kaydedelim.


İlgili mesaj ekrana gelecektir.


Evetttt. Bu yazı da bu kadar. Umarım sizlere bir faydam olmuştur. Bir daha keyfim olup da yazana kadar, kalın sağlıcakla..








Hiç yorum yok:

Yorum Gönder