ile

Nesne Yönelimli Programlama Mantığı – OOP

öğrenci-kıyafetleri

Sürekli sağdan soldan duyuyorsunuzdur. Artık hayatımızda OOP ve NYP diye kavramlar var. Bu yazıda size teknik detaylardan daha çok sınıfları neden kullanmalıyız ve mantığı nedir onu anlatmaya çalışacağım.

Eğer siz de “ben fonksiyon yazıyorum, oop neymiş yeaaaee” demiyorsanız, kendinizi geliştirmeye de açıksanız oop’nin, yani nesne yönelimli programlamanın faydalarından başlayalım.

1. Kodunuz okunabilir olur.

Kodda kullandığınız değişkenleri, fonksiyonları rahatça görebilir ve değiştirebilirsiniz. Aynı projede çalışan sizden başka geliştiriciler kodunuzu anlayabilirler.

2. Kodunuz tekrar tekrar kullanılabilir

Örneğin her veritabanı işleminde tekrar tekrar SQL kodu yazmak yerine, bir veritabnı sınıfı kullanırsınız, ya da bu ekle, sil, göster, listele işlemlerini yapan bi sınıf oluşturursunuz, başka bir şirket bu proje oracle’da çalışsın istiyorum dediğinde apışıp kalmazsınız. Ya da bir okul için yazdığınız “öğrenciler” sınıfını, öğrencilerin notlarının yönetildiği ders yönetim sisteminde ve yemekhane yönetim sisteminde kolayca kullanabilirsiniz.

3. Kapsülleme

Kodlar üzerinde çalışan kişilerin kendilerini ilgilendirmeyen bölümlere erişmesini önler, maksimum güvenlik sağlarsınız. Hiçkimse ve hiçbir program bölümü kendisini ilgilendirmeyen koda müdahele edip çalışmasını bozamaz.

4. Tasarım avantajı

Daha önce yazılmış algoritmaları ve tasarım şablonlarını kolayca uygulama şansınız vardır. Bir de kodlar büyüdükçe yüzbinlerce satır içinde hata aramak, kodun yerini bulmak yerine, NYP size kolayca kodları sınıflandırma sağlar.

5. Gelişime açıklık

Diyelim ki öğrenci sınıfını yazdınız. Bu sınıfa ek özellikler ve metodlar eklemek istiyorsunuz. Örneğin “lise öğrencileri”. Bunun için öğrenciler sınıfını değiştirmenize gerek yok. Aynı sınıfı kullanan programları bozabilirsiniz çünkü. Bunun yerine o sınıftan miras yoluyla başka bir sınıf türetirsiniz. Ek özellik ve metodları buraya yazarsınız. Bunu spaghetti kodda yapmanızın hiçbir yolu, mantığı ve faydası yok. Aynı zamanda, asıl sınıftan türeyen yeni sınıfların nasıl hareket edeceğini de belirlemek bize mantık avantajı sağlar. (polymorpism)

Buraya kadar herşeyi anlamamış olabilirsiniz. Avantajlarından bahsettik çünkü. Şimdi gelelim mantığa.

Beynimizin çalışma yapısı kavramlara, kavramların içinde bulunduğu konuma (bağlam) ve bu kavramların birbiriyle olan ilişkilerine bağlıdır. İnsan beyni, kavramları parça parça değil, bir bütün olarak algılar ve sınıflandırır.

Kavram, nesnel gerçekliğin insan beyninde yansıma biçimidir. Bundan ötürüdür ki her kavram doğrudan ya da dolaylı olarak nesnel gerçekliği içerir. Bu, örneğin ağaç gibi nesne kavramları için böyle olduğu gibi özgürlük gibi düşünce kavramları için de böyledir. Zümrüdü anka kuşu gibi tümüyle hayal ürünü olan kavramlar bile nesnel gerçeklikten yansımıştır. Ne var ki böyle kavramlar nesnel gerçekliğe döndürülemezler; eş deyişle denenemez, doğrulanamazlar. Bunlar bilimdışı kavramlardır. Demek ki kavramları bilimsel ve bilimdışı kavramlar olmak üzere de ayırmak gerekir.

Atatürk Üniversitesi Sosyoloji Bölümü 1. Sınıf “Felsefeye Giriş” ve 3. Sınıf “Çağdaş Felsefe Tarihi” Dersi Ders Notları (Ömer YILDIRIM); “Felsefe Sözlüğü” Orhan Hançerlioğlu  http://www.felsefe.gen.tr/felsefe_sozlugu/k/kavram_nedir_ne_demektir.asp

Nesne yönelimli programlama tam olarak bu mantığa dayanır. Daha önceden yapılması gereken şeyleri tek tek makineye söylediğimiz yordamsal programlamadan ziyade, gerçek hayattaki konuları ve kavramları, aralarındaki ilişkileri modellediğimiz bir programlama yapısıdır. Bu ne avantaj sağlar? Aslında avantajı program kodunu okuyan insanlar içindir. Daha önceden bahsettiğim okunabilirlik, anlşılabilirlik, yazılım projelerinin verimini artıran bir numaralı olgudur.

Örnek vererek başlayalım. Doğayı ilk sınıflandıran Aristo olmuştur. Doğada gördüğü canlıları sınıflandırmayı amaçlamıştır. Bilimsel olarak canlıları farklılaşmalarına göre tür ve sınıf olarak ayırırız ki kavramlar ve farklılıklar gözümüzde canlabilsin. Örneğin, hayvanlar, bitkiler, mantarlar, bakteriler sınıfları, sınıfların farklılıklarını daha iyi algılamamazı sağlarlar. Hayvanlar sınıfından devam edersek, memeliler, sürüngenler, balıklar, yumuşakçalar gibi sınıflara ayırabiliriz. Memeliler de farklı farklı sınıflara ayrılır. Burada en çok anlamamız gereken püf noktası, bir canlı eğer memeliler sınıfına üye ise, memeliler sınıfına özel olan süt verme, doğum yapma gibi özellikleri alır ve bu sınıfa ait diğer türlerle paylaşır.

tax_interpret

Yazdığımız yazılımlarda ilk yapacağımız işler, “Problemi belirleme (Analiz)”, “Modelleme ile yapılar kurma (Kavram)”, “Modellerin birbiriyle olan ilişkilerini belirleme (fonksiyonlar) (Bağlam)” ve “Test yapma” aşamalarını kafamızda canlandırmayı, nesneler ve birbirleri ile olan ilişkilerini düşünerek yapabiliriz.

Daha berrak bir örnek verelim. Mantıksal tasarımımızı doğru yaptığımızda geri dönüşlerimiz azalacaktır.

Bilal Ünal tarafından gönderilen soru üzerinden konuyu inceleyelim:

Midori hocam iyi günler. Lise öğrencisiyim ve yarışmaya katılacağım ve aklımda ki proje şudur ;

1-Yemekhane sistemi; öğrenci t.c kimlik numarası ve okul no’su ile giriş yapıp hangi günler yemek yemek istediğini seçecek.
2-Sınav sistemi; öğrenci aynı şekilde giriş yapıp, belirli günler yapılan dks(ders kontrol sınavı) sonuçlarına bakabilecek.

Görsel tasarım serisinde yaptığımız gibi, problemi öncelikle mantıksal olarak tasarlamamız gerekir. Buradaki kavramlar nelerdir?

En önce inceleyeceğimiz kavram “Öğrenci”. Bu kavramın diğer kavramlarla olan ilişkisini inceleyecek iki adet yazılımımız olacak.

  1. İlk projede “Yemek” kavramı var, ikinci projede “Ders” kavramı mevcut.
  2. İlişkilere geçelim. Öğrenci “belirli günlerde”, yemek yiyor.
  3. Aynı zamanda “Öğrenci” belirli günlerde sınava giriyor.
  4. Her dersin, belirli günlerde sınavları var.
  5. Son olarak yemek yenilen günlerde, örneğin kahvaltı edildiyse, kahvaltı ile sınav sonuçlarının ilişkisini grafik olarak göstereceğiz.

Yaratmamız gereken sınıflar Öğrenci, Ders, Yemek, Sınav. Yemeğin farklı türleri varsa, onları da alt sınıf olarak veya özellik olarak belirleyebiliriz. Kahvaltı, öğlen yemeği, akşam yemeği gibi. Benzer bi ilişki sınav kavramı için de geçerli, sınav kavramının ders özelliği de, matematik, fizik, kimya vb. gibi oluşturulmuş ders sınıfının üyeleri arasından seçilebilir. Programın ilerlemesi sırasında değişimi de veritabanına kaydetmek en mantıklı çözüm olacak.

1sinif_uyum_programi_9_13_eylul_2013_h89036

Ogrenci’nin sistemde yapacağı işlemleri düşünelim.

  1. tckimlik no, ogrenci no ve parola ile giriş yapmak
  2. yemek sisteminde, rezervasyon yapmak. gününü ve yemek türünü seçmek.
  3. ders sisteminde, sınava kayıt yaptırmak, sınav sonuçlarına bakmak.

İlk öğrenci sınıfımızı şu şekilde oluştururuz. Burada ilk önce construct metodunu ve get/set metodlarını incelemenizi öneririm.


<?php
class ogrenci
{
    private $tcKimlikNo;
    private $parola;
    public $ogrenciNo;

// Sınıf yaratılırken kullanılacak metod. Örneğin 1234567 ogrenci nolu ogrenci, şu şekilde yaratılır.
/*
$ilkOgrenci = new ogrenci('12345678910','1234567','asdfjkahsdjk');
*/
    public function _construct($tcKimlikNo,$parola,$ogrenciNo)
    {
        $this->setParola($parola);
        $this->setOgrenciNo($ogrenciNo);
        $this->setTcKimlikNo($tcKimlikNo);
    }

    public function girisYap($tcKimlikNo,$parola,$ogrenciNo)
    {
    // DB sınıfımız olduğunu varsayalım, ve db sınıfından students tablosuna, tckimlikno ev ogrencino verdiğimizde bu bize parolayı döndurdugunu düşünelim.
        if($db->login($tcKimlikNo,$ogrenciNo)==$parola){
            return true;
        }
        else{
            return false;
        }
    }

    // get set fonksiyonları
    public function getOgrenciNo(){
        return $this->ogrenciNo;
    }

    public function getTcKimlikNo(){
        return $this->tcKimlikNo;
    }

    public function getParola(){
        return $this->parola;
    }

    private function setTcKimlikNo($tcKimlikNo){
        $this->tcKimlikNo = $tcKimlikNo;
    }

    private function setParola($parola){
        $this->parola = $parola;
    }

    private function setOgrenciNo($ogrenciNo){
        $this->ogrenciNo = $ogrenciNo;
    }
}

Burada private ve public kavramları da sınıfın dışından erişilebilecek metod ve değişkenleri belirtir. Mesela bu sınıftan kullanığımız $db->login() metodu, eğer public olarak tanımlanmış olmasaydı, hata alacaktık. Public olarak tanımlanmış değişken ve metodlara sınıf dışından erişebilirken, private olarak tanımlanmış metod ve değişkenlere sadece sınıfa üye olan fonksiyonlardan erişebiliriz. Bu kodda kullanılan $this->setOgrenciNo() ifadesindeki $this kavramı da, o sınıfta türetilen metod ve değişkenlere aynı sınıf içerisinden erişilmesini sağlar.

Kaynaklar:

  1. http://www.php.net/manual/tr/language.oop5.php
  2. http://www.realdealmarketing.net/docs/index.html
  3. https://www.cs.drexel.edu/~introcs/Fa12/notes/06.1_OOP/Advantages.html?CurrentSlide=3
  4. https://forum.ceviz.net/genel-programlama/109354-nesne-yonelimli-programlamanin-avantajlari.html
  5. http://ismek.ibb.gov.tr/ismek-el-sanatlari-kurslari/webedition/file/2013_hbo_program_modulleri/nesnetabanliprogramlama1.pdf
  6. http://www.felsefe.gen.tr/felsefe_sozlugu/k/kavram_nedir_ne_demektir.asp
  7. http://torpil.com/egitim/lise-konulari/felsefe/hhcfp/felsefenin-bolumleri.html
  8. http://w2.anadolu.edu.tr/aos/kitap/EHSM/1024/unite04.pdf
  9. http://tr.wikipedia.org/wiki/Nesne_Y%C3%B6nelimli_Programlama
  10. http://www.vanherbaryum.yyu.edu.tr/f/taksonomi.html

Yorumla

Yorum