NTP C# Dersi 15: Nesne Oluşturma; Get/Set Komutu; Class PuanBord

Merhaba arkadaşlar, bir önceki derste bir nesne oluşturacağımızı söylemiştik. Hatırlayın classlar ve structların geneli için nesne kavramını kullanmıştık. Windows form nesneleri için de bu geçerli yani görsel unsurlar taşıyan form nesneleri de birer classtır. Ve form ögelerinin bir kod kütüphanesi unsurları olduğu anlamına gelir. Bu kütüphane System.Windows.Forms‘dur.

Daha önce kod kütüphanesi(class library) projesi geliştirmeyi öğrenmiştik. Şimdi nesnemizi kod kütüphanesi projesi açıp nesnemizi kodlayacağız daha sonra form uygulamamıza çağırıp kullanacağız.

Class PuanBord

Kod kütüphanesi projesini açmadan önce nasıl bir nesne oluşturacağız biraz bahsedelim.

Hepimiz Mario’yu biliriz. Mario kısa boylu, yaşlıca, tonton ve asıl mesleği muslukçu olan bir video oyunu karakteridir. Nedir hikayesi ?… Kabaca bir muslukçunun, Prenses Peach’i kurtarmak için atılmış olduğu macerasıdır. Bu macera sırasında altınlar toplar ve level geçtikçe puanlar toplar. Bizde bu video oyunu için bir puan tablosu geliştireceğiz. Tablo diyorum ama daha önce de dediğim gibi görsel kısmını oluşturmayacağız. Ama görsel kısmını da oluştursaydık butonlar hariç Şekil 1‘deki gibi olabilirdi. Tabi ki daha küçük ve tek parça halinde olacaktı.

İsterseniz projemizi kodlamaya başlayalım. Kodlamadan önce Şekil 1’deki formu oluşturalım ki geliştireceğimiz sınıf hakkında bi’ fikir versin.

Bir form uygulaması projesi açalım ve aşağıdaki nesneleri tanımlayıp forma yerleştirelim. Form1.Designer.cs kodları:

this.nameTxt = new System.Windows.Forms.TextBox();
this.nameLbl = new System.Windows.Forms.Label();
this.loadBtn = new System.Windows.Forms.Button();
this.puanTxt = new System.Windows.Forms.TextBox();
this.cakeCheck = new System.Windows.Forms.CheckBox();
this.goldTxt = new System.Windows.Forms.TextBox();
this.levelTxt = new System.Windows.Forms.TextBox();
this.puanLbl = new System.Windows.Forms.Label();
this.goldLbl = new System.Windows.Forms.Label();
this.levelLbl = new System.Windows.Forms.Label();
this.intoPuanBtn = new System.Windows.Forms.Button();
this.intoGoldBtn = new System.Windows.Forms.Button();



Ardından bir C# kütüphanesi projesi açalım ve kodlamaya başlayalım.

yGLibrary.dll kodları:

//===========================================
// Yazan Gençlik C# Kütüphanesi
// © yazanGençlik – 2014
// yGLibrary
// Muhammet Aygün
//==========================================
using System;

 

namespace yGLibrary
{
    public class PuanBoard
    {
        string name = null;
        int level = 0;
        int gold = 0;
        int puan = 0;
        bool cake = false;

/*

 

İlk önce puan tablomuzda verileri depolayacak değişkenleri tanımlayalım ve varsayılan değerlerini yükleyelim. Burada değişkenlerin private olduğuna dikkat edelim. Yani dışarıdan kimsenin bu değişkenlere erişmesini istemiyoruz. Çünkü bu değişkenlere her türlü değerin yüklenmesini istemediğimizden, erişim iznini private olarak tanımladık. Aslında private olarak tanımlamamızın asıl sebebi yerel değişkenlerin private olarak tanımlanmasının bir gelenek haline gelmesidir. Bu değişkenlere erişimi ise bir metot yardımıyla sağlayacağız.

 

cake, Mario’nun yedikten sonra boyunu uzatan kektir arkadaşlar.

Burada boolean bir değişkenle kekin yenip yenmediğini kontrol ediyoruz. 

null: boş değer, tanımlanmamış, hiçbir şey anlamına geliyor.

 

*/

        public PuanBoard(string n)
        {
            name = n;
        }

/*

 

Sınıfımızın kurucu metodunu oluşturalım. Hatırlayalım;

[-X]:
Çağırma şekli:
PuanBoard ad = new PuanBoard(“lakap”); 

Oyunu iki kişi oynamak isteyebilir bu yüzden oyuncuların isimlerini alıyoruz. Fakat burada name değerinin hiçbir etkisi yok. Yani bu değişkeni tanımlamamız şart değil. Yukarıdaki şablonda ad ile “name” ‘i karıştırmamalıyız.

[-X] kod satırının parçaları:
PuanBord: masa gibi genel bir isimdir.
lakap: bu nesnenin özel ismidir. Ali, Ahmet gibi…
name: bu nesnenin lakabıdır. Bir insanın lakabı resmiyette hiçbir şey ifade etmediği gibi name de burada hiçbir şey ifade etmez aslına bakarsanız. Ama programı kullanırken nesnenin adını ekrana yazmak için kullanacağız.

 

*/

 

        public string Name
        {
            get { return name; }
        }
        public int Level
        {
            get { return level; }
            set
            {
                if (value < 0)
                {
                    level = -1 * (value);
                }
                else level = value;
            }
        }

/*

 

Get & Set Komutları

Parametresi(parantezleri “()”) olmayan metotlarda bilgi giriş çıkışını kontrol eden komutlardır. İkisinin de aynı anda kullanılması şart değildir.

Get: Metottan bilgi çıkışını sağlar.
Set: Metoda bilgi girişini sağlar.

Kısaca get ve set bir metodun bilgi akışını sağlayan iki kanaldır. Ve en önemli faydaları ise bilgiyi filtrelememize imkan vermeleridir. Bu özellikleri neden bu metotların kullanıldığının da en belirgin cevabıdır. Yani değişkenleri, public olarak sunmayıp da değişkenlere dolaylı bir yol ile etkileşim izni vermemizin en sağlam cevabıdır.

Örneğin int Level metodu TextBox sınıfının (string) Text metodu ile aynı yapıya sahip metottur. Farklılıklar da var tabi ki int-string farkı gibi…

Çağırma şekilleri:
textBox1.Text;
puanBoard1.Level;

 

*/

        public int Gold
        {
            get { return gold; }
            set { gold = value; }
        }
        public int Puan
        {
            get { return puan; }
            set { puan = value; }
        }
        public bool Cake
        {
            get { return cake; }
            set { cake = value; }
        }
        public void Execute(Exe cmd)
        {
            switch (cmd)
            {
                case Exe.Reset:
                    {
                        level = 0;
                        gold = 0;
                        puan = 0;
                        cake = false;
                        break;
                    }
                case Exe.IntoPuan:
                    {
                        puan += level * 100;
                        puan += gold * 10;
                        puan += Convert.ToInt16(cake) * 50;
                        level = 0;
                        gold = 0;
                        cake = false;
                        break;
                    }
                case Exe.IntoGold:
                    {
                        int modd = puan % 10;
                        gold += (puan - modd) / 10;
                        puan = modd;
                        break;
                    }
            }
        }
    }

/*

 

Void: Boş anlamına gelir. Bir değer döndürmeyen ve sadece iş yapan metotlar void olarak tanımlanabilir.

 

*/

     public enum Exe
    {
        Reset,
        IntoPuan,
        IntoGold,
    }
/*
 
Enum

Belirlediğimiz sabitleri tanımladığımız bir metot üstü yapıdır. Bir nevi değişken oluşturuyoruz da diyebiliriz ama değişkenlerden çok farklıdırlar. Mesela boolean değişkenin saklayabileceği değerler true ve false ‘dır. Enumlar ile bir nevi sadece x kadar değer a, b, c, … vs. gibi değerler alabilen bir tür değişken yapıyoruz diyebiliriz. Ama şunu da unutmayalım değişkenlerden çok ama çok ilkel bir yapıdır. Enumu başka bir benzetme ile sabit bir dizi olarak da tanımlayabiliriz. 

Enumlar bize ne sağlar ve biz burada ne gibi faydalar gördük ? 

Görüldüğü gibi üç farklı işi, bir switch yardımı ile tek bir metotta, void Execute’ta birleştirdik.
Bu işleri 3 ayrı metoda da yaptırabilirdik ama böyle daha düzenli gibi…

Bu 3 işi tek bir metotta birleştirince bir sorun ortaya çıktı.
İşler arasında seçim yapmak gerekiyor. Bunu da bir parametre belirleyerek yapabiliriz. Parametremizin de türünü belirlemeliyiz, string, int vs.

Parametremizi int olarak tanımlasaydık değerlerini 0, 1 ve 2 olarak belirleyecektik. Bu sefer de yeni bir problem ile karşılaşacaktık, parametreye girilen değerin kontrol gibi bir problem. Çünkü int değişken -21474648 …21474647 (tam sayı) arası değer saklayabilir.

Bu problemden de kurtulabilmek için iki seçeneğimiz var. Ya switch’e default komutunu ekleyebilir ya da enum bir yapı oluştururuz.

 

*/

}

 

Form1.cs dosyamızın kodları:

 

using System;
using System.Windows.Forms;
using yGLibrary;

 

namespace yGPuanBord
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

 

        PuanBoard mario = new PuanBoard(“Mario”);

 

        private void loadBtn_Click(object sender, EventArgs e)
        {
            mario.Gold = Convert.ToInt16(goldTxt.Text);
            mario.Level = Convert.ToInt16(levelTxt.Text);
            mario.Puan = Convert.ToInt16(puanTxt.Text);
            mario.Cake = Convert.ToBoolean(cakeCheck.Checked);
        }

 

        private void intoPuanBtn_Click(object sender, EventArgs e)
        {
            mario.Execute(Exe.IntoPuan);
            btnEvent();
        }

 

        private void intoGoldBtn_Click(object sender, EventArgs e)
        {
            mario.Execute(Exe.IntoGold);
            btnEvent();
        }

 

        public void btnEvent()
        {
            nameTxt.Text = mario.Name;
            puanTxt.Text = mario.Puan.ToString();
            goldTxt.Text = mario.Gold.ToString();
            levelTxt.Text = mario.Level.ToString();
            cakeCheck.Checked = mario.Cake;
        }
/*

 

Aynı işleri btnEvent metodunda birleştirip butonların metotlarında işleri tekrarlamaktan kaçtık. Bu hareket programımızı mikro saniyelerle ölçülen ufak bir hıza kavuşturdu.

 

*/
    }
}
 
C# derslerine başlamadan önce anlatmayı düşündüğüm tüm konuları anlattım ve dersi burada bitiriyorum. Ama anlatmayı unuttuğum bir konu var ise ve hatırlar isem tabi ki bir ders daha hazırlayabilirim ama şimdilik dersi burada noktalıyoruz.

 

Buradan sonra C#, bilgi, ezber ve pratiğe dayalı ve ben işin mantığını anlatmaya çalıştım inşallah faydam dokunmuştur. Artık bir nesnenin nasıl yapıldığını ve çalışma mantığını biliyoruz. Buradan sonrası nesneleri öğrenmek, metotlarının yaptığı işleri ezberlemeye kalmış.

 

Dersi burada noktalıyoruz ama bu dersin altına yorum yapılıp, “Hocam x konu hakkında bir bilginiz varsa bir ders hazırlayabilir misiniz ? ” gbi bir istek olursa ve bilgim varsa bir ders hazırlayabilirim.
İyi çalışmalar…

 
Önerilen diğer yazılar:
NTP C# Dersi 14: Form Uygulaması Geliştirme

Saygılarımla:Muhammet AYGÜN

Yorum Yap

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>