BLOG

Object Oriented Programming yani Nesne Yönelimli Programlama

30/01/2017 tarihinde Mustafa Bora ŞİMŞEK tarafından yazılmıştır.

Nesneye yönelik programlama, yapılan işlerden ziyade modellemenin önemsendiği bir programlama mantığıdır. Eskiden yapısal programlama mantığı uygulanırdı. Programlama; girdi alan, girdiyi işleyen ve bir çıktı üreten mantıksal bir dizi komut olarak görülürdü. Önceden, geliştirme dünyamız, belirli bir girdiyi alıp, fonksiyonları çağırıp, işleyişe devam etmekteydi. Bu sistem içerisinde birçok sorunu barındırıyordu. En önemli sorunları, bakım yapılabilirlik ve projeye yeni dâhil olanların adaptasyonlarıydı. Programı geliştirmeye devam etmek için, neredeyse tüm yapıyı bilmek zorundaydık. Ayrıca proje genelini bilen birisi için bile bakım zordu. Özellikle büyük projelerin bakımı, proje büyüdükçe içinden çıkılmaz bir hal alıyordu. 1960’larda ortaya atılan nesneye yönelik programlama (NYP), nihayetinde bakım maliyetini düşürmek amacında olan bir yapıdır. İşleyişten çok verileri tutmaya ve onların arasındaki ilişkileri belirlemeye yöneliktir. Temel özellikleri şunlardır:

  • Bilgileri gizleme
  • Bilgileri soyutlama
  • Kalıtım
  • Çok Biçimlilik

  • Bunları açıklamaya başlamadan önce bazı temel kavramları açıklamakta fayda görüyorum.

    Sınıf, Eleman, Yordam ve Yapıcı


    NYP’de belli bir türün tanımının yapıldığı yerlere sınıf denilir. Sınıfların içerisinde elemanları ve yordamları olabilir. Yordam belli bir işi yapan kodlar bütünüdür. Yapıcı ise, o sınıfı oluşturmaya yarar.
    Sınıf Kişi {
    	String  adSoyad;		//eleman
    	int yaş;			//eleman
    	yordam yasArtır() {		//yordam
    		yaş = yaş+1;
    	}
    	Yapıcı(String ad) {		//yapıcı / üretici		
    		adSoyad = ad;
    		yaş = 0;
    	}
    }
    

    Bilgiler Gizli Mi? /h4> Bilgilerin gizliliği tüm önemli kurumlarda zorunlu bir şey olarak karşımıza çıkar. NYP de bu durumu sağlamış. Nesneler arasında ilişkiler, yardımlaşmalar ve mesajlaşmalar var. Ama nesnelerin özel olarak belirttiği elemanları veya metotları varsa bunlara direk erişilemiyor. Şöyle bir kod düşünelim:
    	kişi.yas = -10;
    

    Böyle bir kod çalışırsa, kişi nesnesinin yaş elemanı -10 yapılacak ve sistemde bir tutarsızlığa neden olacaktır. Daha önemli bir örnek vereyim:
    void paraAktar(BankaHesap bh) {
    	bh.miktar = 1000000000;
    }
    

    Bir anda belli bir banka hesabına belli bir miktar paranın yatması sorunlara yol açacaktır. NYP bu soruna sarmalama (encapsulation) adında bir çözüm bulmuş:
    public class Kisi {
    	private int yas;			//dışarıdan erişilemeyen yas elemanı
    	public void setYas(int y) {		//yas elemanını sarmalayan metod
    		if(y > 0) {			//metodun içinde istediğimiz kontrolleri yapabiliriz.
    			this.yas = y;
    		}
    	}
    	public int getYas() {
    		return yas;
    	}
    }
    

    Yukarıdaki sınıfta private ile belirtilen yaş elementine dışarıdan erişim yasaktır. Ama bir altında public setYas metodu sayesinde yas elementine dolaylı yoldan erişebiliyoruz. Yaş elementi sarmalanmış ve dışarıya gizlenmiş konumdadır.
    Şimdi gelin beraber kişi nesnesine -10 yaşını yeniden vermeye çalışalım.
    	Kişi.setYas(-10);
    

    2 yukarıdaki kodda da görüldüğü gibi, kişi nesnesine yanlış bir yaş atayamıyoruz. Bunu nesneye yönelik programlamanın sarmalama (encapsulation) özelliği sayesinde yapabiliyoruz.

    Kalıtım

    NYP’de nesneler ata çocuk ilişkisi ile birbirine bağlıdır. Kalıtımsal olarak biz insanlar nasıl anne babamızın özelliklerini alıyorsak, NYP’de de çocuk sınıf, atasının özelliklerini alır. Mesela hayvanlar âlemini bilgisayar dünyasına taşımak istiyoruz diyelim. Hayvan gibi bir ata sınıfımız olsun. Ondan türeyen de bazı türler ve hayvanlar olacaktır.
    Sınıf Hayvan {
    	private String türAdı;
    	private int kromozomSayısı;
    	public Hayvan(String tur, int kromozom) {
    		kromozomSayısı = kromozom;
    		türAdı = tur;
    	}
    public void setKromozomSayısı(int y) {
    		kromozomSayısı = y;
    }
    	public int getKromozomSayısı () {
    		return kromozomSayısı;
    	}
    }
    Sınıf Kedi extends Hayvan{			//Kedi sınıfı Hayvan sınıfının çocuğu
    	String isim;
    	String kullandıgıMama;
    	public Kedi(String ismi, String mama) {
    		süper(“Kedi”, 38);
    isim = ismi;
    		kullandıgıMama = mama;
    	}
    }
    Kedi minnoş = new Kedi(“Minnos”, “etliMama”);
    

    Minnoş adlı kedimizin kromozom sayısına erişmek istiyoruz diyelim. Görüyoruz ki Kedi sınıfında kromozom sayısı yok, ama Kedi’nin ata sınıfı olan Hayvan sınıfında kromozomSayısı elementi var. Yani şöyle bir kod yazılabilir:
    Göster(minnoş.getKromozomSayısı());

    Yukarıdaki kod çalışır. Bu yeteneğe NYP’nin kalıtım yeteneği sayesinde sahibiz.

    Çok Biçimlilik

    Bazen bazı ortak işler yapan ama kendi içerinde işleri farklı halleden sınıflarımız olabilir. Mesela Telefon adında bir arayüzümüz olsun. Arayüzde tanımlı telefonEt yordamımız olsun. Biz de o telefonla arama yapmaya çalışan bir kullanıcı olalım. Bizim için sadece telefon etmek önemlidir. Ama kullandığımız telefon CepTelefonu, AnkesorluTelefon, EvTelefonu gibi farklı telefon türlerinden biri olabilir. Kullanıcı olarak biz her bir telefon çeşidinin nasıl bağlantıyı sağladığı, verileri nasıl ilettiğini bilmek zorunda değiliz. İşte böyle durumlarda CepTelefonu, AnkesorluTelefon, EvTelefonu sınıflarından hangisini kullanırsak kullanalım, içerisindeki telefonEt yordamının olması ve işini kendi yöntemleriyle halletmesi bizim için yeterlidir.

    Soyutlama

    Soyutlama kavramı nesneler arasında mesajlaşmadan kaynaklanır. Mesela bir kullanıcı olarak belli bir siteye giriş yapacağız. Sisteme kullanıcı adımızı ve şifremizi girdiğimizde sistem kendi içinde neler yapıyor bilmeyiz. Kullanıcı adımızı alıp belli bir veri tabanından yaptığı sorgu nedir, şifremizin uygun olup olmamasının nasıl bulunduğu, uygunsa bize gösterilecek içeriğin nasıl belirlendiği, bizim için önemli değildir. İşin açığı biz sistemin mesajlarımıza cevap verip vermediğiyle ilgileniriz, nasıl verdiğini önemsemeyiz. NYP’de de durum böyledir. Nesneler arasında mesajlaşma vardır ama bu mesajlaşmadan dönen cevap önemlidir, mesajlaşılan nesnenin aldığı mesajı nasıl kullandığını bilmemize gerek yok, zaten bilmiyoruz da. Yani içerdeki gerçekleştirimden soyutlanmış durumdayız.

Mustafa Bora ŞİMŞEK

Bilgisayar Mühendisi

Yorumlar

Henüz yorum yapılmadı. Yorum yapan ilk kişi siz olun

Yorum Yaz