Nesneye Dayalı Programlama: Giriş

Programlamayı öğrendik, nesnelisi kaldı

Yukarıdaki resim, arkeolojik bir kazıda bulunan bir Hitit tabletinden şemalandırılmış kadar eski de olsa, anlamak açısından önemli. Alt tabakadaki yöntemler, üst tabakalardakileri oluşturuyor. Yani üsttekiler, alttakilerden oluşuyor binevi. Tabii, şu anda C’nin üzerinde de Python, Java (biraz farklı olsa da), C++ gibi diller oturmakta.

Esasında C ile program yazmak, bir çok açıdan iş görüyor olsa da, donanımın ve yazılım tekniklerinin gelişmesi sonucunda da, Object Oriented Programming -yani Nesneye Dayalı Programlama– ya olan ihtiyacı doğurmuştur.

O ne?

C seviyesindeki dillerin yapıları, doğası gereği, yaptığın işi hatırlamayı, iyi belgelemeyi (buna bir ara değineceğim) gerektirir. Buna rağmen, yazılan kodu bir insanın anlaması, üst seviye dillere göre (Java falan) daha zordur. Öyle değil midir ya? Dilersen binary kod şeklinde yaz (10101010010111 falan), makine yine çalıştırır onu. Önemli olan, senden sonra o koda bakıp düzenleyecek olan, hatta senin geri dönüp baktığında anlaman.

Bu konuda Dennis Ritchie reyizin katkısını asla yadırgamamak gerek. Yoksa hala MOV MOV diye assembly yazıyor olacaktık. Hoş yine bir babayiğit çıkıp C gibi bir dil yazacaktı, tıpkı Pascal, Fortran gibi. Ama bu diller de doğal seçilimde kütür kütür elendi. Bugün genel olarak C tabanlı diller kullanmamızın sebebi, C’nin doğasının daha kolay ve geliştirilebilir olması. Ve tabii ki daha bir çok faktör var.

Bugün kullanılan dillerin birçoğu ise OOP tabanlıdır. OOP tabanlı olmak demek, tıpkı bizim tanımladığımız gibi nesnelerin olması demek. Bir şeyin, nitelikleri, nicelikleri (özellikleri) ve eylemleri vardır. Bunun ingilizceleri ‘properties‘ ve ‘methods‘ tur. Kısacası, bir çatı altında, bir yığın değişkeni, diziyi, fonksiyonları bulundurmaktır. Hemen koda geçeceğim.

En Sevdiğim Araba

Bir an için empati yap ve kendini makinenin yerine koy. Karşındaki senden bir ‘Araba’ düşünmeni istiyor.

class Araba:

yazıyor. Sen de diyorsun ki, e kardeşim bu arabanın özellikleri, nitelikleri neler? O da sana,

  • String tipinde bir Model Adı
  • String tipinde bir Plaka
  • Float tipinde bir Hız
  • Float tipinde bir Yakıt Seviyesi
  • Int tipinde bir Koltuk Sayısı
  • Int tipinde bir Vites

Şimdilik bunları bir koda dökelim. Tabi Python’da tiplerin çok önemi olmadığı için, şimdilik bir değere eşitlemek iş görecektir.

Bu şekilde ilk değerler verilerek bir sınıf oluşturmuş olduk. Araba olarak tanımladığımız bir değişken üzerinden,

araba1.hiz

diyerek, o anki hız değerini öğrenebiliriz.

Peki arkadaş, biz bu kadar değişken oluşturduk, bu araba gitmiyor mu? Vites değiştirmiyor mu? Hiç mi şeyi yok lan?

Var tabii ki. Arabayı yarattığımız anda, bir fonksiyon çalışacak. Biz o fonksiyonu,

def __init__():

olarak tanımlayacağız. Neden mi? Python öyle yazılmış çünkü. Bir de, yazdığımız her fonksiyon, dışardan argüman alıyor olacak. Bunların yanı sıra, her fonksiyonun ilk parametresi, self olmak zorunda. Yani

def __init__(self) şeklinde yazmak zorundayız. Çünkü sınıf değerlerine bu şekilde ulaşabiliyoruz.

O halde, mesela arabanın sadece yukarıdaki özelliklerini kullanacak fonksiyonlar yazalım. Mesela gaz. Gaza basınca, hıza vitesle orantılı bir değer ekleniyor. Koda dökecek olursak:

def gaz(self):

    self.hiz = self.hiz + self.vites * 10

    self.yakit = self.yakit – self.hiz/10

Burada 10 değerini ben salladım istedim. Siz istediğinizi diyebilirsiniz. Bir standart olarak kullandım. Tabi yakıtta da aynı durum söz konusu.

Şimdi freni yazalım:

def fren(self):

    self.hiz = 0

Tabi buradaki hesaba göre “lönk” diye durmamız bekleniyor.

Bir de vites değiştirelim mesela:

def vitesDegistir(self, yeniVites):

    self.vites = yeniVites

Bu direkt değişken eşitleme ile yaptığımız bir işlem. Prototip kodun son halini atayım.

Evet efenim kodu oturup yazacaksınız ki, hissedebilesiniz.

Hikmetinden sual olunmaz ama

nerden bilicem? Şöyle ki, yazdığımız kodu çalıştırdığımızda hiçbir çıktı almıyoruz. Sadece RAM’imize, böyle bir sınıfın olduğunu bildiriyoruz. Ancak bu karın doyurmuyor.

Haydi bir araba yaratalım ve kodumuzu deneyelim:

arabam = Araba()

arabam.yakit += 50.0

print(arabam.yakit)

arabam.gaz()

print(arabam.hiz)

arabam.vitesDegistir(2)

arabam.gaz()

print(arabam.hiz)

print(arabam.yakit)

print(arabam.plaka)

 

 

 

 


class Araba:
    model_ad = "Pejo"
    plaka = "82 MSL 55"
    hiz = 0.0
    yakit = 0.0
    koluk_sayisi = 5
    vites = 0

    def __init__(self):
        vites = 1

    def gaz(self):
        self.hiz = self.hiz + self.vites * 10
        self.yakit = self.yakit - self.hiz/10

    def fren(self):
        self.hiz = 0

    def vitesDegistir(self, yeniVites):
        self.vites = yeniVites

arabam = Araba()
arabam.yakit += 50.0
print(arabam.yakit)
arabam.gaz()
print(arabam.hiz)
arabam.vitesDegistir(2)
arabam.gaz()
print(arabam.hiz)
print(arabam.yakit)
print(arabam.plaka)

Bu sayede, arabamızın neler yaptığını neler yapabileceğimizi görmüş oluyoruz. Çıktıya beraber bakalım:

Sırasıyla aldığımız çıktılar böyleee.

Şimdi sizden bir ricam var. Bana bir insan sınıfı yazıp gönderiniz. Bakalım nasıl yaratıcı şeyler çıkacak? Mail atmanız yeterli: furkankaynary@gmail.com

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Blog at WordPress.com.

Up ↑

%d bloggers like this: