1960`lı yılların sonuna doğru ortaya çıkan bu yaklaşım, o dönemin yazılım dünyasında beliren bir bunalımın sonucudur. Yazılımların karmaşıklığı ve boyutları sürekli artıyor, ancak belli bir nitelik düzeyi korumak için gereken bakımın maliyeti (zaman ve çaba olarak) daha da hızlı artıyordu. NYP`yi bu soruna karşı bir çözüm haline getiren ana özelliği yazılımda birimselliği (İngilizce - modularity) benimsemesidir.
NYP`nın altında yatan birimselliğin ana fikri, her bilgisayar programının (izlence), etkileşim içerisinde olan birimler veya nesneler kümesinden oluştuğu varsayımıdır. Bu nesnelerin her biri, kendi içerisinde veri işleyebilir, ve diğer nesneler ile çift yönlü veri alışverişinde bulunabilir. Halbuki NYP`dan önce var olan tek yaklaşımda (Yordamsal programlama), programlar sadece bir komut dizisi veya birer işlev (fonksiyon) kümesi olarak görülmektediler.
Bu temele dayanan NYP`nın, bilimsel çevreler tarafından geçmişe göre daha yüksek esneklik ve bakım kolaylığı sunduğu iddia edilmektedir, ve bu nedenle günümüzde geniş çaplı yazılım geliştirme tasarılarında yaygınca kullanılmaktadır.
Temel Kavramlar
Her ne kadar NYP`nın bilgisayar bilimlerine girişi üzerinden 40 yılı aşkın bir süre geçmiş olsa da henüz yaygın olarak kabul görmüş bir tanımı yoktur. Ancak önerilen sayısız tanımların çoğunluğunda yer alan bazı ortak kavramlar sayılabilir:- Sınıf - bir `şeyin` soyut özellik ve davranışlarını tanımlar. Örneğin `Köpek` sınıfının, tüm köpeklerde ortak olarak görülen özellikleri (tür, renk, vb), ve davranışları (havlamak) içermesi beklenir. Özellikler (İngilizce - attribute) ile davranışları tanımlayan yöntemlere (İngilizce - method) topluca ``sınıf üyeleri`` (İngilizce - Class members) denir. Sınıflar NYP`nın birimselliğini sağlayan en önemli öğeler konumundadırlar ve tasarım ilkesi olarak, tanımladıkları `şey` ile aşina kişilerce kolayca anlaşılmaları beklenmektedir.
- Nesne - bir sınıfın örneği veya olumudur (İngilizce - instance). Örneğin `Köpek` tüm köpekleri tanımlayan bir sınıf, yani soyut bir yapı ise, `Karabaş` bu sınıfa ait bir bireyi, yani somut bir nesneyi tanımlar. Sınıf üyelerinin renk özelliği ve havlamak yönteminden oluştuğunu var sayarsak, Karabaş da pekala beyaz renk ve havlama yeteneğine sahip bir köpek olabilir. Tanım itibari ile, bir nesnenin özelliklerinin değer kümesine ``nesnenin durumu`` (İngilizce - object state) denir.
- Yöntem - bir nesnenin yeteneklerine denir (İngilizce - method). Örneğin `Karabaş`, `Köpek` sınıfına ait bir nesne olarak, o sınıfta tanımlı davranışları sergiler, yani havlar. Diğer bir deyişle, `havlamak` `Karabaş`ın bir yöntemidir.
- Kalıtım - sınıflararası sıradüzensel (hiyerarşik) bir ilişkiyi tanımlar (İngilizce - Inheritance). Ortalama bir yazılım tasarısında sınıf sayısının onlar hatta yüzler ile ifade edildiği düşünülürse, yapı esnekliğini sağlamak açısından bu tür ilişkiler hayati önem taşır. Kısaca kalıtım ``altsınıflar``, yani belli bir sınıf veya sınıflardan türeyen, uzmanlaşmış/ayrıntılandırılmış sınıflar yaratılmasına olanak tanır. Örneğimize dönecek olursak, genel `Köpek` sınıfının olası ayrıntılandırılmış altsınıfları, Kangal, Dalmaçyalı ve Sibirya kurdu olabilir. Bu altsınıflara, `Köpek` sınıfının üyeleri kalıtım ilkesine göre ``miras`` kalır. Böylece, tekrar yazmaya gerek kalmadan her üç alt sınıf da `Köpek` sınıfında yer alan renk özelliğine ve havlamak yöntemine sahip olurlar. Kalıtımın bu özelliği sayesinde yazılım geliştirme süresinde ciddi oranda tasarruf edilmektedir. Üst sınıftan miras kalan sınıf üyelerinin yanısıra, her altsınıf kendi özellik ve yöntemlerini de tanımlayabilir. Örneğin Kangal altsınıfına ona özel bir özellik olan ``kurt_boğ`` yöntemi eklenebilir. Böylece, eğer `Karabaş` Kangal sınıfına ait ise, üstsınıf olan `Köpek` sınıfının renk ve havlamak üyelerinin yanısıra ``kurt_boğ`` yöntemine de sahip olur. Bir sınıfın birden fazla üstsınıfı olduğu takdirde ``çoklu kalıtımdan`` söz edilmektedir.
- Sarma - bir sınıfın içeriğinin, onun üyelerini kullananlara, ancak gerektiği kadar erişim hakkı tanınmasından ibarettir (İngilizce - encapsulation). Bu şekilde, dış dünyaya açık olan sınıf üyelerinin imzası değiştirilmedikçe, o sınıfın nesnelerini kullananlara sorun yaratmadan, sınıf içerisinde değişikliklere gidilebilir. Örnek vermek gerekirse, `Köpek` sınıfındaki havlamak yöntemi, havlamayı tam olarak tanımlar (mesela, önce ``nefes_al`` ve sonra ``nefes_ver`` yöntemleri ile), ancak bu sınıfı kullanacak olanlara nefes_al ve nefes_ver yöntemlerine erişim hakkı tanımak gereksizdir, zira havlamanın nasıl gerçekleştiği onları ilgilendirmemektedir. Başka bir deyişle, bu iki yöntem ``sarmalanmıştır``. Sonuç itibarı ile sınıf üyeleri genelde üçe ayrılır, tüm sınıflarca kullanılanlar (İngilizce - public), altsınıflarca kullanılanlar (İngilizce - protected) ve sadece üyelerin ait olduğu sınıfça kullanılanlar (İngilizce - private).
- Çok biçimlilik - çok biçimlilik, belli bir davranışın, gerçekleştiren sınıfa bağlı olmasını tanımlar (İngilizce - polymorphism). Örneğin, `Hayvan` sınıfı `konuşmak` yöntemine sahip olsun. `Köpek` ve `Kedi` onun altsınıfları olmalarına rağmen, köpeğin konuşması havlamak biçiminde, kedininki ise miyavlamak olarak gerçekleşebilir.
- Soyutlama - belli bir kavram yapısını sınıflar ile oluştururken, söz konusu soruna en uygun kalıtım düzeyini belirmeyi tanımlar (İngilizce - abstraction). Örneğin, bazı durumlar için `Köpek` ve `Kangal` altsınıfı yeterli olurken, daha karmaşık durumlar Karabaşın `Hayvan`,`Memeli`,`Evcil`,`Köpek`,`Kangal` kalıtım dizisine ait bir nesne olmasını gerektirebilir.
Nesne yönelimli programlama dilleri yukarıda adı geçen tüm öğelere sahip olurken, Visual Basic gibi nesne tabanlı programlama dilleri birkaçından yoksundur.
Tasarım Şablonları
Nesneye yönelik tasarım esnasında bazı sorunlara sıkça rastlanır. Bu sık rastlanan sorunlara karşı yaygın olarak kabul edilmiş çözümler de mevcuttur. Bu çözümlere ``tasarım şablonları`` denir (İngilizce - Design patterns). Bu alanda en çok tanınmış kaynak, Erich Gamma, Richard Helm, Ralph Johnson ve John Vlissides tarafından yazılmış ``Design Patterns: Elements of Reusable Object-Oriented Software`` adlı, en sık kullanılan 23 tasarım şablonunu içeren kitaptır.Tarihçe
1961 | Norwegian Computing Center, Oslo, Norveç`den Ole-Johan Dahl ve Kristen Nygaard Simula dillerini geliştirdiler. Nygaard`ın operasyonel araştırmalarında, karmaşık insan-makina sistemlerinin benzetimi için yazılım gereçlerine ihtiyaç duyuldu. Dahl`ın derleyici tasarımındaki tecrübesi, 1961`de algoritmik bir programlama dilini geliştirme düşüncesini hayata geçirdi. |
1965 | UNIVAC tarafından finanse edilen SIMULA I derleyicisi, Ocak 1965 yılında tamamlandı ve kısa sürede benzetim programlama dili olarak ünlendi. |
1967 | Kalıtım mekanizmasının bulunmasıyla, Simula 67 daha geniş uygulama alanlarında kullanılabilen genel bir programlama dili oldu. |
1970`ler | 1970`li yılların başında, UNIVAC, IBM, Control Data, Burroughs ve DEC gibi şirketlerin ürettiği bilgisayarlarda Simula 67 derleyicisi kullanıldı. | Simula VLSI devrelerinin (Intel, CALTECH, Stanford) tasarımında kullanıldı. Xerox PARC`dan Alan Kay liderliğindeki grup, GKA ve etkileşimli program çalıştırma özellikleri ile 1970`lerde popüler olacak Smalltalk dilini geliştirmek için Simula platformunu kullandı.
1980`ler | 1980`lerde Bjarne Stroustrup, Simula`nın temel kavramlarını C diline taşıyarak C++` dilini geliştirdi. Program bileşenlerinin tekrar kullanımı, program kütüphanelerinin oluşturulması gibi çalışmalara da Simula ilham kaynağı olmuştur. | 1980`li yıllarda ABD Savunma Bakanlığı`nın desteklediği ADA ve Japon`ların "5. Nesil Bilgisayar Projesi" tercihi PROLOG programlama dillerinin 1990`lı yıllarda NYP dilleri ile çekişmesi bekleniyordu.
Bugün | NYP, çok sayıda etkileşimli yazılım bileşenlerini içeren karmaşık programların gerçekleştirilmesinde tercih edilen ve bu açıdan yordamsal programlamaya göre üstünlüğünü kanıtlamış bir yaklaşımdır. |
Ayrıca Bakınız
- Nesne yönelimli programlama dili
- Nesne tabanlı programlama dili
- Nesne Yönelimli Çözümleme ve Tasarım
- CORBA
- Tasarım şablonları