OOP Mantığı Haziran 2010 | Sayı : 15

Merhaba arkadaşlar. Makalemizde OOP mimarisini kullanarak Adventureworks veri tabanımızda bulunan person.contact tablomuzdan bazı verilerimizi çekeceğiz  ama ilk önce biraz OOP mimarisinden bahsedelim.

OOP mimarisinde 3 adet ana katmanımız  vardır.

Data Access layer: Bu katman sadece database işlemleri ile uğraşan katmanımızdır. Bu katmana gelen data, temiz data olarak kabul edilir ve gelen data üzerinde ilgili olan tablomuzda insert, delete, update işlemlerimizi gercekleştiririz  ya da databaseimizdeki bir tablomuzdan veri çekeriz ve bu veriyi işlemeden direkt bir üst katmana göndeririz. Uygulamamız içerisinde bu katmanımızın adı Dal.cs olarak geçecektir .

Business Layer:  Adından da anlaşılacağı gibi bu katmanımız iş katmanıdır. Bu katmanımız, sunum katmanından  (birazdan inceleyecegiz )  gelen verilerin düzenlendiği katmandır. Bu katman içerisinde veriler üzerinde düzenleme işlemleri yapılır. Ara katmandır. Uygulamamız içerisinde bu katmandan datayonetim.cs diye bahsedeceğiz.

Presentation Layer: Sunum katmanımızdır. Uygulamayı kullanacak olan kullanıcının gördüğü katmandır. Bu bir Windows form da olabilir, bir Web uygulamasındaki herhangi bir aspx dosya da olabilir. Bu katmanda yapılan işlem, datayonetim adını verdiğimiz katmandaki metotlarımızı çağırmak ve kullanmak olacaktır.

Şimdi, yazacağımız uygulama hakkında biraz bilgi sahibi olalım. Amacımız adventureworks veri tabanı içerisindeki person.contact ve humanresources.employee veri tabanına bir inner join işlemi gerceklestirip personellerin adını, soyadını, cinsiyetini ve evlilik durumlarını getirmek olsun .

İlk önce SQL sorgumuzu inceleyelim.

Select pc.firstname,pc.lastname,(case he.gender when 'M' then 'Bay' when 'F' then 'Bayan' end ) as [Cinsiyet],he.maritalstatus from person.contact pc inner join humanresources.employee he on pc.contactid = he.contactid

Yukarıdaki sorgumuzda inner join işlemi ile iki tablomuzu contact id’leri ile birbirine bağladık. Burada bir adet case işlemi de yaptık. Gender yani cinsiyet kısmında M ise bay, F ise bayan yazmasını istedik.

C Sharp tarafında da kapsülleme ile evlilik durumu M olanlara “Evli”, S olanlara “Bekar” diyelim.  ( Kapsülleme ile bunu yapabiliriz )

İlk önce tipimizi yazalım.

personel.cs
-------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace OOP
{
    class Personel
    {
        public string  PersonelAdi{ get; set; }
        public string PersonelSoyadi { get; set; }
        public string PersonelCinsiyet { get; set; }
        string _personelmedenihali;
        public string PersonelMedeniHali
        {
            get { return _personelmedenihali; }
            set
            {
                if (value == "M")
                    _personelmedenihali = "Evli";
                else
                    _personelmedenihali = "Bekar";
            }
        }

        public override string ToString()
        {
            return string.Format("Personel Adı {0} Soyad {1} Cinsiyet {2} Medeni Hali {3}", PersonelAdi,
PersonelSoyadi, PersonelCinsiyet, PersonelMedeniHali);
        }
    }
}

Yukarıda personel.cs adında personel tipimizi oluşturduk. Tüm fieldlarımızı hızlı property tanımlama ile yaptık. Yalnız PersonelMedeniHali adını verdiğimiz propertymizi 2.0 mantığı ile tanımladık. Bunun nedeni, burada kapsülleme yapma isteğimizin olması. Hızlı property tanımı ile bu işlemi yapamayız. Uygulama içerisinde, bu sekilde bir kapsüllemeye ihtiyacımız olduğunda 2.0 tekniği ile kapsülleme işlemini yaparız. Hızlı property tanımıyla ise sadece get veya set bloklarımızı private yapar saklarız.

Şimdi katmanlarımıza geçelim.

İlk katmanımız veri tabanı ile uğraşan katmanımız.

Dal.cs
--------

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;

namespace OOP
{
    class Dal
    {
        SqlConnection Con;
        SqlCommand Cmd;

        public Dal()
        {
            Con = new SqlConnection("data source = .; initial catalog = AdventureWorks; integrated security = true");
        }

        // Bağlantı durumumuzu kontrol eden ve duruma göre bağlantımızı açıp kapatacak olan metodumuzu yazalım.
        public void BaglantiKontrol()
        {
            if (Con.State == System.Data.ConnectionState.Closed) // eger sql ile aramdaki baglantı kapalı ise
            {
                Con.Open(); // ilgili baglantıyı ac
            }
            else // degil ise
            {
                Con.Close(); // kapat
            }
        }

        public SqlDataReader PersonellerimiAl()
        {
            Cmd = new SqlCommand(@"Select pc.firstname,pc.lastname,
(case he.gender when 'M' then 'Bay' when 'F' then 'Bayan' end ) as [Cinsiyet],he.maritalstatus from person.contact pc inner join humanresources.employee he on pc.contactid = he.contactid", Con);
            BaglantiKontrol(); // Bağlantımızı kontrol ettirdik ve bağlantı durumumuza göre işlemlerimizi yaptırdık.
            return Cmd.ExecuteReader(); // Executereader metodu, sqldatareader tipinden donmektedir. Metodumuz zaten sqldatareader tipinden veri geri dondurucegi icin direkt olarak burada return dedik.

        }
    }
}

Yukarıdaki Dal.cs sınıfımızda ilgili veri tabanı işlemlerimizi gerçekleştirdik. İİk önce yapıcı metodunda SqlConnection tipimizin bağlantı yolunu üzerine almasını sağladık. Sonra Baglantikontrol adında bir metot yazdık ve SQL ile aramızdaki duruma göre bazı işlemler yapmasını istedik. (Bu işlemler SQL ile aramızdaki bağlantı kapalı ise aç, açık ise kapat seklindedir.) Daha sonra PersonellerimiAl adını verdiğimiz metot sayesinde SqlCommand yani SQL Server üzerinde çalışmasını istediğimiz SQL cümlemizi yazdık ve ExecuteReader metodu ile bize gelen resultı SqlDataReader tipinde  metodumuzdan geri döndürdük.

Dal sınıfımız  gelen result (sonuc) üzerinde herhangi bir işlem yapmadı. İlgili list tipine verilerimizi alma görevi tabii ki datayonetim katmanımın işi.

 

datayonetim.cs
------------------

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;

namespace OOP
{
    class Datayonetim
    {
        SqlDataReader Okuyucu;
        Dal databaseislemlerim;

        public Datayonetim()
        {
            databaseislemlerim = new Dal();
        }

        public List PersonellerimAl()
        {
            Okuyucu = databaseislemlerim.PersonellerimiAl();
            List Personellerim = new List();
            while (Okuyucu.Read())
            {
                Personellerim.Add(new Personel()
                {
                    PersonelAdi = Okuyucu.GetString(0),
                    PersonelSoyadi = Okuyucu.GetString(1),
                    PersonelCinsiyet = Okuyucu.GetString(2),
                    PersonelMedeniHali = Okuyucu.GetString(3).ToUpper(),
                });
            }
            Okuyucu.Close();
            databaseislemlerim.BaglantiKontrol();
            return Personellerim;
        }
    }
}

Datayonetim katmanımızda dal katmanımızdan gelen SqlDataReader nesnemiz içindeki resultı bir koleksiyona alma işlemini yaptık yani verimizi yönettik. datayonetim ara katmandı; sunum katmanından gelen verilerin kontrollerinin yapıldığı ya da dal sınıfından gelen verilerin ayarlandığı katmandı. O nedenle, bu katmanda biz SqlDataReader olarak gelen verimizi bir koleksiyon içerisine bastık ve geriye bir adet list koleksiyon döndürdük.

Şimdi sunum katmanımıza geçelim ve bize gelen bu koleksiyonun listesini alalım.

 Program.cs
---------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace OOP
{
    class Program
    {
        static void Main(string[] args)
        {
            Datayonetim Yonetim = new Datayonetim();
            List Personellerim = Yonetim.PersonellerimAl();
            foreach (var item in Personellerim)
            {
                Console.WriteLine(item);
            }
        }
    }
}

Sunum katmanımız olan program.cs bölümünde yaptığımız tek işlem datayonetim katmanımızdan PersonellerimiAl metodunu cağırmak. Zaten metodumuz bize list koleksiyonu dönmekte idi. İlgili koleksiyonu bu katmanda aldık ve foreach ile yazdırdık.

Uygulamamızı çalıştıralım.

Evet arkadaslar, uygulamamızın sonuna geldik. Makalemiz içerisinde kodlarımızı yazarken bir iş dağılımı yaptık ve her class’ın bir görevi vardı. Kısaca hatırlayalım.

Dal: Sadece veri tabanı islemlerine bakan departman.
Datayonetim: Daldan gelen veya sunum katmanından gelen veriler üzerinde istediğimiz düzenlemeyi, kontrolü yaptığımız departman.
Sunum Katmanı program.cs : Kullanıcının gördüğü veri girişi yaptığı katman.
Personel.cs: Uygulama içerisinde kullandığımız n tane tipten sadece bir tanesi.

.Net ile kalın.

      Cengiz ATİLLA
Eğitmen
- Haziran 2010 -
Editörden... | Muhammed CÜCE Sonsuzluk | Ilgın UĞUR Java Teknolojisi ve Geliştirme Araçları | Bülent ÇOBANOĞLU OOP Mantığı | Cengiz ATİLLA Assassin's Creed II | Erman TEPE SHA-1 Algoritması | Kayhan KIRGIZ Elektrofobi | Muhammed CÜCE Donanım Elemanları | Oğuz BIYIK Cloud Computing Güvenliği | Emre BALCI Joomla Bileşenleri | Serkan AKDEMİR Derleyicilerin Yapısı - 2 | Ercan ZENGİN Kadın ve Bilişim | Feyzan SARUHAN
« önceki sayfa - 3 - sonraki sayfa »

ana sayfa | arşiv | dergimiz | künye | iletişim | yazarlar için...
© 2009-2010 Bilisimdergi.Com Tasarım - Kodlama : İU BİLGİSAYAR

Creative Commons License
Bilişim Dergi içeriği  Creative Commons  lisansı ile korunmaktadır.
Kaynak göstermek ve link vermek şartıyla yazılarımızı kullanabilirsiniz.