Nesne Tabanlı Yazılım

Adem Efe Devrez
TechSheet
Published in
5 min readMar 15, 2023

Eğer bir süredir yazılım öğreniyorsanız ve temelleri yavaş yavaş oturtmaya başladıysanız muhtemelen şimdiye kadar egzersiz yapmak için birkaç küçük program yazmışsınızdır. Bu programlar öyle ahım şahım şeyler olmak zorunda değiller, mesela sayı tahmin oyunu olabilir, sıcaklık değerlerini Celsius’tan Fahrenheit’a dönüştürme programı olabilir, herhangi bir şey olabilir. Başlangıçta yazdığımız programların genelde ortak bir modeli oluyor: bir girdi değeri alıyor, bu değer üzerinde işlemler uyguluyor ve ortaya yeni bir değer çıkarıyor. Sayı tahmin oyununda sayıyı doğru tahmin ederseniz başarı mesajı alıyorsunuz, sıcaklık dönüştürme programına 0 Celsius girdiğinizde 32 Fahrenheit değerini alıyorsunuz vesaire. İşte bu yazılım türüne Prosedürel Yazılım deniyor. Ortada bir Prosedür, yani adım adım uygulanacak bir işlem var; verilere teker teker bu adımlar uygulanıyor ve ortaya istenilen sonuç çıkıyor. Ama zaten yazılımın kendisi bu değil mi? Başka yazılım türleri de mi var? Dostlarım, Yazılım Paradigmalarını Açıklıyoruz mini serimize hoş geldiniz!

Aslında bu yazı, programlamaya dair farklı yaklaşımlardan yani Yazılım Paradigmaları’ndan bahsedeceğim kısa bir Açıklıyoruz yazısı olacaktı. Ancak yazının daha Nesne Tabanlı Yazılım kısmının taslağını çıkarırken bu taslağın kendi başına diğer yazılarımınki kadar uzadığını fark edince yazıyı bölüp küçük bir mini seri yapmaya karar verdim. Giriş bölümüne Prosedürel Programlama’nın küçük bir betimlemesini yaptım ama merak etmeyin, başlı başına bir Prosedürel Programlama yazısı da gelecek. Bunun yanı sıra bu yazıdan sonra Nesne Tabanlı Yazılım Konseptleri, Fonksiyonel Yazılım ve Fonksiyonel Yazılım Konseptleri üzerine de yazmayı planlıyorum. Yazıları olabildiğince birbirinden bağımsız yazmayı hedefliyorum, mesela Fonksiyonel Yazılım yazısını anlamak için Nesne Tabanlı Yazılım yazılarını okumanıza gerek olmamalı. Serimizi de tanıttığımıza göre yazının kendisine geri dönebiliriz. Nesne Tabanlı Yazılım nedir, ne işe yarar? Hadi bir örnek üzerinden ilerleyelim.

Object Oriented Programming — Nesne Tabanlı Yazılım

Diyelim ki yazılım becerinizi pekiştirmek ve öğrendiklerinizi kullanmak için basit bir uygulama yapıyorsunuz. Mesela başlangıçta bahsettiğimiz Sıcaklık Dönüştürme programını ele alalım. Programın algoritmasını oluşturdunuz, koda döktünüz ve Github’a yüklediniz. Oldukça basit bir proje, gayet uygun gayet yeterli. Kodda veya mantıkta bir hata varsa hemen çözebiliyorsunuz, her bir değişkenin ve fonksiyonun ne yaptığını biliyorsunuz. Programınız çalışıyor.

Ve sonra programı geliştirmeye karar veriyorsunuz. Neden sadece Celsius’tan Fahrenheit’a dönüştürsün ki değerleri? Tam tersini de yapabilsin. Hatta işin içine Kelvin de girsin. Ama kullanıcının hangi işlemi kullanmak istediğini nasıl bileceğiz? Onun için de bir fonksiyon yazalım. Programımız neden sadece Terminal’den çalışsın ki? Grafik Arayüz de yazalım. Hatta önceki işlemleri kaydetmek için bir veritabanı da oluşturalım…

Programınız gelişmeye başlıyor. Önceden tek bir işlevi yerine getiren bir programken artık farklı farklı algoritmalara sahip, bir arayüzü hatta bir veritabanı bile var. Ama bu noktada programın tamamını tek başına yazmak artık zor gelmeye başlıyor. Böylece projenizle ilgilenen birkaç arkadaşınızla küçük bir ekip kuruyorsunuz. Birisi arayüzü geliştiriyor, birisi veritabanı ile ilgileniyor, siz de bir başka arkadaşınızla programın kendisini geliştiriyor, hata ayıklamaya devam ediyorsunuz.

Projenizin ilk hali basit, çerez bir programken şimdi karşınızda günlük kullanıma hazır, hatta belki de gerçekten kullanacağınız bir program var. Ekibinize yeni kişiler alıyorsunuz, algoritmalarınızın performansını arttırmak için fonksiyonlarınızı yeniden yazmaya başlıyorsunuz, arayüz ve veritabanı da yenileniyor, her şey iyi güzel. Ama işte bu sırada bazı problemler ortaya çıkmaya başlıyor.

Bu zamana kadar programınızdaki hataları ayıklamak nispeten daha kolaydı: program daha küçüktü, daha az kişi çalıştığınız için daha az hata ortaya çıkıyordu ve genelde bir fonksiyonun ne yaptığını aşağı yukarı herkes bildiği için o kodu düzeltince başka bir hata ortaya çıkmıyordu. Ama programınız büyüdükçe ve ekibiniz genişledikçe artık bir kişinin hata yapması çok daha yüksek bir ihtimal, bu tarz bir hata ortaya çıktığında bunu düzeltmeye çalışırken başka bir yerde hataya sebep olunması kaçınılmaz ve programın bir kısmı bozulunca diğer kısımlar da bozulduğu için programın geliştirilmesi artık çok yavaşlıyor hatta duraklama seviyesine geliyor. Peki programımızın kodunun her bir parçasının tam olarak ne işe yaradığını ve nasıl çalıştığını çok daha kolay anlayabilseydik ne olurdu? Her bir verinin özel bir etiketi olsa, o verilere sadece bazı işlemler uygulanabiliyor olsa programdaki olası hataların önüne, o hatalar daha ortaya çıkmaya fırsat bulmadan geçebilsek çok daha iyi olmaz mıydı? Acaba programımızın kendi içerisinde bu tarz sınırlandırmalar belirleyerek gerçekten geliştirme sürecine katkıda bulunabilir miydik? İşte Nesne Tabanlı Yazılım tam da bu işe yarıyor!

Nesne Tabanlı Yazılım: Sınıflar (Class) ile kendi veri tiplerimizi oluşturmayı, Nesneler (Object) ile bu sınıflandırmalara uygun veriler tanımlamayı ve Metodlar (Method) ile hangi sınıfa hangi fonksiyonun uygulanabileceğini belirlememizi sağlayan yazılım paradigmasıdır. Basit birer örnekle bu üç kavramı açıklayalım.

  1. Mesela Yazar adında bir sınıfımız olsun. Her bir yazarın adı, soyadı, yazı sayısı, son yazısı ve email adresi olsun.
Yazar Sınıfı ve Nitelikleri (Attributes)

2. Şimdi de Adem ve Elem adında iki yazar nesnemiz olsun.

Adem ve Elem Nesneleri

3. Ve bu Yazar sınıfına tanımladığımız bazı metodları kullanalım.

Örnek Metodlar

İlk örnekte bir Yazar sınıfı oluşturduk, peki neden? Gördüğümüz üzere ad, soyad ve yazı sayısı gibi bazı veriler aslında birbiriyle mantıken bağlantılı olabiliyorlar. Sonuçta her bir yazar bu özelliklere sahip oluyor. Biz de bir Yazar sınıfı oluşturarak aslında bu verilerin bağlantılı olduğu bilgisini kodumuza dökmüş oluyoruz. Böylece programda “Adem’in emaili”, “Elem’in soyadı” gibi değişkenler havada uçuşmak yerine kendileriyle alakalı diğer değişkenlerle bir bütün oluşturuyorlar.

İkinci örnekte Yazar sınıfını kullanarak Adem ve Elem nesnelerini oluşturduk. Böylece programımızda birbirinden bağımsız olarak email değişkenleri, yazı sayısı değişkenleri tutmak yerine kısaca Adem.YazıSayısı veya Elem.Email gibi nokta notasyonlu (dot-notation) ifadeler kullanarak istediğimiz verilere çok daha kolay ve standartlaşmış bir şekilde ulaşabiliyoruz. Böylece yanlış yerde yanlış veriyi kullanmanın önüne geçiyoruz.

Üçüncü örnekte ise Yazar sınıfımıza tanımladığımız özel metodları kullanarak belirli işlemler yapıyoruz. Adem.YeniYazı(“Nesne Tabanlı Yazılım”) metodu Adem nesnesinin YazıSayısı değişkenini bir arttırıyor ve SonYazı değişkenini “Nesne Tabanlı Yazılım” olarak güncelliyor. Elem.EmailAt(“Yeni yazı var mı?”) metodu ise Elem nesnesinin email bilgisine ulaşıyor ve o emaile “Yeni yazı var mı?” diye bir mail atıyor. Kulağa basit gelebilir ama tüm bu işlemlerin hepsini tek tek elle yaparken yanlışlıkla bir yazı başlığının yazı sayısını güncellemek veya bir yazarın soyadına email atmak gibi basit hatalar yapabiliriz ve bu hataları bulmak da, düzeltmek de ayrı birer zaman kaybı olur. Sınıflara metodlar tanımlayarak bu metodları nesneler üzerinde kullanmak bizi bu tarz sayısız hatadan kurtarıyor ve bu hataların bize mal olacağı zamanı ve enerjiyi hiç kaybetmememizi sağlıyor.

İşte Nesne Tabanlı Yazılım’ın mantığı basitçe bu! Özellikle bir ekip olarak geliştirdiğiniz uygulamalarda Nesne Tabanlı Yazılım ilkelerini kullanarak pek çok hatanın daha en başlarda önüne geçebilir ve okuması da hata ayıklaması da çok daha kolay olan programlar yazabilirsiniz. Nesne Tabanlı Yazılım’ın temelini bahsettiğimiz gibi Sınıflar, Nesneler ve Metodlar oluşturuyor ancak bu yazımızda bahsetmediğimiz Soyutlama (Abstraction), Mirasalma (Inheritance) ve Kapsülleme (Encapsulation) gibi kavramlar da bu paradigmanın birer parçası. Ama bu yazı daha şimdiden uzun bir yazı oldu ve bu kavramlar da başka bir yazımızın konusu olsun! O zamana kadar kendinize iyi bakın, hoşça kalın!

--

--