Nesne Tabanlı Programlama(OOP) Nedir ?

Fatih İzgi
5 min readAug 3, 2021

--

Hiç şüphe yok ki yazılım dünyasında en çok karşılaşılan kavramlardan bir tanesi nesne tabanlı programlama kavramıdır. Nesne tabanlı programlama aslında bir düşünme şekli, bir felsefe olarak kabul edilebilir. Bu felsefede her şey nesnedir. Gerçekleştirilen işlemler nesneler ve nesneler arasındaki ilişkiler yardımı ile gerçekleştirilir.

Object Oriented Programming (kısaca OOP) için gerçek hayatın yazılım dünyasına aktarılmasıdır demek yanlış olmaz. Çünkü çevremizde gördüğümüz her şey de aslında birer nesnedir. Örneğin siz bir nesnesiniz ve sizi siz yapan bazı özellikler bulunmaktadır. İsminiz, doğum yılınız, göz renginiz ve boyunuz gibi pek çok özelliğe sahipsiniz. Ayrıca gerçekleştirdiğiniz bazı davranışlar da bulunmaktadır. Örneğin yemek yemek, uyumak, yazı yazmak gibi bazı davranışları da gerçekleştiriyorsunuz. Nesne yönelimli programlamada da olay aynen bu şekildedir. Bir nesnenin özellikleri ve davranışları bulunmaktadır. Bu özellik ve davranışlar sınıf içerisinde oluşturulur. Sınıf, nesnelerin üretim merkezidir. Bir nesnenin özellikleri ve davranışları sınıf içerisinde belirtilir ve buna göre üretim yapılır. Nesnelerin özellikleri değişkenler ile oluşturulurken; davranışları metotlar/fonksiyonlar ile belirlenir. Nesnelerin oluşturulması için ise “new” anahtar sözcüğü kullanılır ve “new” anahtarının kullanılması ile bellekte o nesneye özel bir yer ayrılır. Böylece nesne artık var olmuş, hayata geçmiştir.

Nesne ve sınıf kavramlarının netleştirilmesi adına bir örnek proje oluşturalım. Projede, bir sosyal medya uygulamasındaki kullanıcının profil sayfası üzerine kullanıcı bilgilerini yerleştirmek istiyoruz (Şimdilik bu işlemleri sadece ekrana bastırma olarak gerçekleştireceğiz ancak gerçekten bir web sitesi veya mobil uygulama geliştirirken de nesne kullanma mantığı örnekteki gibi olacaktır. Veri tabanından nesne verileri çekilir ve nesnelerin özellikleri ekrana yerleştirilir). Kullanıcının kullanıcı adı, yaşadığı ülke, yaş ve doğum tarihi özellikleri bulunsun. Ayrıca, kullanıcının profilin görüntülendiği gün eğer kullanıcının doğum günü ise doğum tarihinin yanında “Bugün Doğum Günü” bilgisi yazdırılsın. Ayrıca kullanıcı adının boş olup olunmadığı da kontrol edilsin ve buna göre ekrana bilgi bastırılsın. Tahmin edileceği üzere burada üreteceğimiz nesne “kullanıcı” nesnesidir. Dolayısıyla bir Kullanıcı sınıfına ihtiyacımız vardır. Daha sonra Main/Test sınıfımız içerisinde bu nesneyi üreterek bilgilerine erişmeye çalışacağız. (Not : Eğer OOP dünyasına ilk kez adım attıysanız aşağıdaki kod örneklerini tam olarak kafanızda canlandıramayabilirsiniz ancak ilerleyen yazılarda işlenecek olan Constructor, Getter/Setter Methods, Encapsulation gibi kavramları öğrendikçe projeler geliştirmeniz ve geliştirilen projeleri anlamanız çok daha kolay olacaktır. Şimdilik, OOP mantığı kavramak amacıyla sadece genel yapıyı incelemeniz yeterli olacaktır.)

Görüldüğü gibi öncelikle User adında bir sınıf oluşturduk. Bu sınıftan üretilecek olan nesnenin özelliklerini değişkenler ile belirttik. Daha sonra nesneye ait metotları oluşturduk. Bu metotlar ile nesnelere iş yaptırmak mümkün hale geldi. Örneğin oluşturulan kullanıcı nesnesi, kullanıcı adının boş olup olmadığını kontrol etti. Ayrıca doğum günü olup olmadığını da kontrol ederek doğum günü bilgisini güncelledi. Yani kendisine ait bir özelliği, bir davranışı ile değiştirmiş oldu.

Output :

Kullanıcı Adı : Kullanıcı245

Yaşadığı Ülke : Türkiye

Kullanıcı Yaşı : 23

Doğum Tarihi : 02.06.1998 (Bugün Doğum Günü)

Kullanıcı Adı Boş Değil!

OOP ÖNEMİ

Geliştirilen hemen hemen her yazılım projesi OOP mantığı ile geliştirilmektedir. Dolayısıyla OOP, her yazılımcının bilmesi gereken bir kavramdır. Ayrıca OOP mantığını iyi kavramak, diğer yazılım kavramlarının daha rahat anlaşılmasını sağlar. Örneğin, Tasarım Desenleri konularına hakim olmak istiyorsanız OOP bilmeniz şarttır ve OOP mantığını iyi kavradıysanız Tasarım Desenleri öğrenmeniz de daha rahat olacaktır. Bunlarla beraber, güzel ve kaliteli projeler gerçekleştirmek için kullanılan yazılım diline hakim olmak gerekmektedir ve günümüzde kullanılan yazılım dillerinin çoğu nesne tabanlıdır. Dolayısıyla OOP mantığına hakim olmak, kullanılan yazılım dilinden daha fazla yararlanabilmek ve daha kaliteli projeler gerçekleştirebilmek anlamına gelir. Sıklıkla kullandığımız Java, C#, C++ ve Python gibi diller nesne tabanlı programlama dillerine örnek verilebilir.

OOP PRENSİPLERİ

Object Oriented Programming dünyasının 4 temel prensibi vardır. Bir programlama dilinin nesne tabanlı olması tüm bu prensipleri kapsadığı anlamına gelir. OOP prensiplerinden herhangi birine sahip olmayan dil, nesne tabanlı programlama dili olamaz. (NOT: Bu prensipler ilerleyen yazılarda çok daha ayrıntılı olarak ele alınacaktır. Şimdilik, genel kültür olması açısından bilmeniz yeterlidir.)

1- Abstraction (Soyutlama)

2- Encapsulation (Sarmalama / Kapsülleme / Paketleme)

3- Inheritance (Kalıtım / Miras Alma)

4- Polymorphism (Çok Biçimlilik)

OOP’NİN SAĞLADIĞI AVANTAJLAR

OOP’nin yazılım dünyasına sağladığı pek çok avantaj bulunmaktadır. Eğer OOP dünyasına henüz yeni adım attıysanız aşağıdaki kavramların kafanızda canlanması biraz zor olabilir ancak merak etmeyin. İlerleyen yazılarda tüm bu kavramları ayrıntılı olarak inceleyip örneklerini göreceğiz. Şimdilik, genel kültür düzeyinde bu bilgileri bilmek yeterli olacaktır.

1- Modülerlik : Bir nesnenin oluşturulması için tasarlanan sınıf diğer tüm sınıflardan bağımsız olabilir. Böylece yazılımın bütünlüğü korunmuş olur. Örneğin, geliştirilen projede A isimli bir sınıf var ve o sınıftan “a” isimli nesneler üretiliyor ancak projenin ilerleyen aşamalarında bunun gereksiz olduğu fark edildi ve artık “a” nesnelerinin kullanımı sonlandırılmak isteniyor. Projeden A sınıfını çıkarmak B,C,D… gibi kalan diğer sınıfları etkilemez(İstisnalar olabilir). Böylece projeye baştan başlanılmasına veya projede çok büyük bir değişiklik yapılmasına gerek kalmamış olur. Ayrıca modülerlik, ekip çalışmalarında da kolaylık sağlar. Örneğin bir takım arkadaşınızın görevi sadece A,B,C sınıflarını yazmak, sizin göreviniz de D,E,F,G sınıflarını tasarlamak olabilir. Birbirinizden tamamen bağımsız olarak çalışabilir ve iş yükünü azaltabilirsiniz. (Modularity)

2- Bilgi Saklama : Bir sınıfın diğer sınıflardan bağımsız olabileceğinden bahsettik. Eğer projenizde, bir sınıfın özelliklerine başka bir sınıf çok rahat bir şekilde erişebilirse ve bu özellikler üzerinde değişiklikler yapabilirse karışıklıklar ortaya çıkar ve yüksek ihtimalle hatalı sonuçlar veren bir proje geliştirmiş olursunuz. OOP felsefesi ile bu karışıklıklar önlenebilir. Bir sınıfın özellikleri gizlenebilir ve böylece dışarıdan erişime kapatılabilir. (Information Hiding)

3- Kodların Yeniden Kullanılabilmesi : Bir sınıf bir kez oluşturulur ve içerisindeki özellikler tekrar tekrar kullanılabilir. Örneğin, tasarladığınız A sınıfı içerisinde M isimli bir metot bulunuyor olsun. Biz bu metoda farklı durum ve yerlerde ihtiyaç duyuyor olabiliriz. Her ihtiyaç durumunda bu metodu tekrar tekrar yazmak yazılımcılar için hem vakit kaybı olacaktır hem görüntü açısından çok kalabalık ve istenmeyen bir durum oluşturacaktır. OOP kullanımı ile kodların defalarca kez yazılmasının önüne geçilebilir. (Code Reuse)

4- Objelerin Birbirleri Yerine Kullanılabilmesi : Bir nesnenin sahip olduğu davranış diğer nesneler için de kullanılabilir. Örneğin, geliştirilen projede Ürün isimli bir sınıf bulunuyor olsun ve bu sınıftan “ürün” isimli nesneler üretiyor olalım. Ürün sınıfında indirimUygula isimli bir metot bulunuyor. Bununla beraber Ayakkabı, Telefon ve Buzdolabı isimli 3 sınıfımız da projemizde yer alıyor olsun. Ürün sınıfındaki indirimUygula metodu her üç sınıftan üretilen nesneler için de kullanılabilir(Bu durum, biz izin verdiğimiz sürece gerçekleşebilir ve örneklerine sıklıkla rastlanır). Böylece hem “ayakkabı” hem “telefon” hem de “buzdolabı” nesneleri bu metottan faydalanabilir. Dolayısıyla, Ürün sınıfının bir davranışı diğer sınıflardaki nesnelerin özelliklerini etkilemiş olacaktır. Ayrıca bir obje yerine başka bir objenin kullanılabilmesinin sağladığı en önemli avantajlardan bir tanesi de hatalı durumlardan kurtulmaktır. Örneğin, indirim hesaplama işleminde bir hata yaptığımızı varsayalım. “ayakkabı”, “telefon” ve “buzdolabı” nesneleri “ürün” nesnesine bağlı olduğu için sadece “ürün” nesnesindeki hatanın giderilmesi tüm nesnelerdeki hatalı hesaplama problemini ortadan kaldıracaktır. Eğer nesneler birbirinden bağımsız işlemler gerçekleştirseydi hesaplamada yaptığımız hatayı tüm nesneler için ayrı ayrı gidermemiz gerekirdi. (Pluggability and Debugging Ease)

--

--