NESNE TABANLI PROGRAMLAMA VE ARİSTOTELES

Oğuzhan KARAGÜZEL
6 min readSep 12, 2023

--

Başlık biraz ilginç ve ilgi uyandırıcı gelebilir. Şahsen tüm yazılımcılar gibi ben de nesne tabanlı programlama dünyasına girdiğimde, bunun altında basit ve güzel bir felsefenin yattığını hissetmiştim.

Şimdi ise herkes gibi sizlere oop anlatacak değilim. Eğer bu işin mantığını merak ediyor ve nereden öğreneceğinizi bulamıyorsanız size kaynağı söyleyeceğim. Ardından kaynak hakkında biraz bilgi verip gerisini size bırakacağım.

Yalnız burada kaynak hakkında bilgiyi detaylı tutacağım. Eğer isterseniz okuyabilirsiniz ya da doğrudan kaynağa gidebilirsiniz.

ARİSTOTELES

ARİSTOTELES — KATEGORİLER

Aristoteles’in kategoriler kitabını dikkatlice ve anlayarak okuduğunuzda, nesne tabanlı programlamanın mucidinin Aristoteles olduğunu görebilirsiniz.

Başlangıç için bilmeniz gerekenler şu şekilde; Okuduğunuz kitaba göre “töz” ya da “varlık” kavramı ile karşılaşabilirsiniz. ikiside aynı anlamdadır. Ancak anlamları sizin bildiğiniz varlık kavramından biraz farklı ya da daha detaylı olduğundan “töz” kavramı ilerleyen yıllarda kullanılmaya başlanmıştır.

Belki dikkatinizi çekebilir ve hatta kafanızı karıştırabilir. O dönemlerde renkler birer cisim olarak ele alınıyordu. Okuduğunuzda ne demek istediğimi anlayacaksınız.

Kaynağa gitmek için ise önerebileceğim kitaplar şu şekilde;

Doğrudan “Kategoriler” kitabını okuyabilirsiniz. İmge yayınlarından harika bir kitap edinmiştim. Belkide piyasada mevcuttur;

Aristoteles. (2002). Kategoriler (2. b.). (S. Babür, Çev.) Ankara, Türkiye: İmge Kitabevi Yayınları.

Ya da David ROSS’un “Aristoteles” kitabına bakabilirsiniz. Aristoteles’in hayatından ve aristonun olduğu bilinen tüm kitaplardan bahseder ve detaylıca açıklar. Sn. Prof. Dr. Ahmet Arslanın çevirisi mükemmel bir kaynaktır. O kitapta mantık bölümünü okuyarak dediğim kitabı okumuş olursunuz;

ROSS, D. (2011). Aristoteles (1. b.). (A. ARSLAN, Çev.) İzmir, Türkiye: kabalcı yayıncılık.

Şimdi ise kitabı okumadan önce benim tavsiyem biraz beni dinlemeniz. Tabi eğer daha önce felsefe ile hiç ilgilenmediyseniz! Yoksa rahatlıkla okuyabilirsiniz. Ancak daha önce felsefe ile ilgilenmeyenlerin (tıpkı benim gibi) bu kitabı anlamada yardıma ihtiyaç duyacağı (Tıpkı benim sevgili eşimden yardım aldığım gibi) açıktır. Buyrun o zaman kısa açıklamalarla size en azından yol gösterelim.

(KISACA) ARİSTOTELES’İ ANLAMAK

Bahsettiğim kitaplara ilk başladığınızda Aristoteles size ilk olarak kategorilerden bahsedecek. Bu kategorileri anlamak kolaydır. Anlamadığınız yerde tekrar okuyarak ya da üzerine tartışarak rahatlıkla anlayabilirsiniz. Benim derdim ise anlamayacağınızı düşündüğüm ya da nesne tabanlı programlama bu işin neresinde? dediğiniz kısımı anlatmaya çalışmak.

Anlamak için en baştan kısaca giriş yapalım. Kitabın başlarında Aristoteles’in şunları söylediğini okuyacaksınız;

Bir nesne başka bir nesneye taşıyıcı olarak yüklendiğinde, yüklenen için söylenenlerin hepsi taşıyıcı içinde söylenecektir; örneğin ‘insan’ belli bir insana yüklenir, ‘canlı’ ise insana: o halde ‘canlı’ da belli bir insana yüklenecektir, nitekim belli bir insan hem ‘insan’ dır hem de ‘canlı’ dır.

Aristoteles. (2002). Kategoriler (2. b.). (S. Babür, Çev.) Ankara, Türkiye: İmge Kitabevi Yayınları. (Sayfa: 9)

Görüldüğü üzere Aristoteles burada bize doğrudan kalıtımdan bahseder. Burada nesne denilen aslında varlık ya da töz’dür. Tabi bu biraz tartışmalı olabilir. Aristoteles kategorilerin sayısında tutarlılık gösterdi demek biraz zordur. Bunu kitabı okuduğunuzda anlayacaksınız.

Burada nesne ben olursam; İnsan için söylenenlerin hepsi artık benim içinde söylenecektir. Çünkü bir taşıyıcı olan bana, ‘insan’ artık yüklenmiştir. Ayrıca canlı için söylenenlerin hepsi hem benim için hem de insan için söylenecektir. Çünkü canlı; insana yüklenmiştir ve insan artık canlının taşıyıcısıdır. Ben ise oğuzhan olarak artık insanın taşıyıcısıyım. Bundan dolayıda canlının taşıyıcısıyım.

Kod satırlarında basitçe görecek olursak;

public class Canli
{
}
public class Insan : Canli
{
}
Insan oguzhan = new Insan();

Burada biraz kafanız karışabilir. “oguzhan” bir referans tipli değişkendir. Bir insan nesnesine işaret eder. Burada ‘Oguzhan’ diye bir sınıf açıp oradan bir örnek (instance) üretmek gerekmez mi? Bu bizim aramızda tartışacağımız bir konudur. Aristoteles bu konu hakkında da biraz ipucu vermektedir. Ayrıca tabi ki de burada alanları (fields) çoğaltarak daha anlamlı hale getirebilirsiniz!

Şimdi okumaya devam edelim ve Aristoteles bize neler diyor biraz daha kafaları karıştıralım

İlk başta ve asıl anlamıyla varlık, ne bir taşıyıcı için söylenen ne de bir tayaşıyıcı içinde olan varlıktır; örneğin belli bir insan ya da belli bir at. Türce ilk varlıklar denenlere bu türlerin cinsleri içinde bulunanlara ise ikincil varlıklar denir; sözgelişi belli bir insan tür olarak ‘insan’ dadır, türünün cinsi ise ‘canlı’. O halde, bunlara, ‘insan’ ve ‘canlı’ ya ikincil varlıklar denir.

Aristoteles. (2002). Kategoriler (2. b.). (S. Babür, Çev.) Ankara, Türkiye: İmge Kitabevi Yayınları. (Sayfa: 11–13)

Bu satırları tam anlamı ile kavramam oldukça uzun sürdü. Aslında oldukça basit. Ancak, haliyle kullanılan dil anlamamızı oldukça zorlaştırmakta. Kısaca Aristoteles şunu demektedir;

“Oğuzhan” bir varlıktır. Üzerine yüklenen ya da miras aldığı ‘insan’ ve ‘canlı’ (hatta bunu maddeye, oradan da enerjiye kadar götürebiliriz) ile varlıktır. Ancak “Oğuzhan” ilk varlıktır. Ya da sayın okur sen ilk varlıksın. Varlık olduğumuzu anladık. Peki neden ilk varlığız? güzel soru! Aristoteles cevabını veriyor. Ne bir taşıyıcı için söylenirim, ne bir taşıyıcı içinde olurum.

Bu ne demektir diye soruyorsanız şöyle söyleyeyim; ‘insan’ nesnesi ‘oğuzhan’ nesnesi için de söylenir ve o nesnenin içindedir. ‘canlı’ nesnesi ‘insan’ nesnesi içindedir ve insan için de “canlıdır” denir. Bundan dolayı ‘insan’ ve ‘canlı’ ikincil varlıktır. Ancak herhangi bir nesne için “oğuzhan” dır diyemezsiniz. Varsayalım ki bir varlık olsun ve bu varlık “Oğuzhan” ın tüm özelliklerine sahip olsun. Yani oğuzhan’dan miras alsın. üzerine de kendi ayırıcı özelliklerini göstersin. Bu durumda “Oğuzhan” artık ikincil varlık olacaktır. Ancak oğuzhan’dan miras alan bir varlık yoksa oğuzhan artık ilk varlıktır.

Ben bu konuyu kodlarla daha rahat anlamıştım. Size de bu konuyu kodlarla anlatırsam belki bu durum kolaylaşır. Oğuzhanın ilk varlık olmadığı durumu incelersek;

public class Canli
{
}
public class Insan : Canli
{
}
public class Oguzhan : Insan
{
}
public class Varlik : Oguzhan
{
}

Burada “Varlik” sınıfında türetilecek bir nesneye ilk varlık denmektedir. Bu durumda “Oguzhan” sınıfından bir nesne bile türetilse ikincil varlık olacaktır.

Şimdi buraya kadar şunu öğrendik; “Oğuzhan” nesnesi bir varlık olduğundan kesinlikle sınıf olarak tanımlanmalı. Bu akla yatkındır. Çünkü “Oğuzhan” bir yazılımcı iken başka bir insan yazılımcı olmayıp sanatçı olabilir. Oğuzhan sanatçı özelliklerini gösteremiyorken, sanatçı, yazılımcı özelliklerini gösteremez. İşte buradan kapsülleme (encapsulation) kavramına varabiliriz. Ancak henüz erken. Hatta kitabın heyecanını kaçırmamak için bu konuya girmeyip size bırakmak istiyorum. İlerleyen sayfalarda bunu siz daha iyi anlayacaksınız.

Peki şimdi asıl konuya dönelim. “Oğuzhan” ilk varlık olduğuna göre yukarıdaki kod bloğu hatalı. Bu durumu nasıl düzeltiriz. İşte böyle;

public class Canli
{
}
public class Insan : Canli
{
}
public sealed class Oguzhan : Insan
{
}

“sealed” anahtar kelimesi, miras verilemez olduğunu söyler. Bu durumda artık “Oguzhan” sınıfından türetilen nesnenin ilk varlık olduğunu söyleyebiliriz. Tabi aklınızda tonlarca şey var biliyorum. Adım adım ilerlersek;

Her varlığın doğrudan belli bir nesne belirttiği gürünüyor. İlk varlıkların doğrudan belli bir nesne belirttikleri tartışma götürmeyecek biçimde doğru; çünkü bölünmez, sayıca tek olan bir şey olarak açıklanmıştı. İkincil varlıklar adlarının biçimi nedeniyle -’insan’ ya da ‘canlı’ dendiğinde- doğrudan belli bir nesne belirtiyormuş gibi gelir ama, bu doğru değil, daha çok bir nitelik belirtirler -çünkü ilk varlıktaki gibi taşıyıcı tek değil: ‘insan’ ya da ‘canlı’ çok şey için söylenir-. Öte yandan ‘ak’ gibi saltık anlamda bir nitelik de belirtmezler; çünkü ak, nitelikten başka hiçbir şey belirtmez, oysa türle cins, bir varlık konusunda niteliği belirtir -belli bir varlığın neliğini gösterir-. Cinsle yapılan belirlemenin kaplamı türle yapılanınkinden daha geniş, çünkü ‘canlı’ diyen, ‘insan’ diyenden daha geniş bir kaplamı belirtmiş olur.

Aristoteles. (2002). Kategoriler (2. b.). (S. Babür, Çev.) Ankara, Türkiye: İmge Kitabevi Yayınları. (Sayfa: 21)

Burada ikincil varlıkların nesne belirtmeyeceğini ve bir nitelik belirteceğini söylüyor. Bu durumda beklediğiniz gibi “abstract” anahtar kelimesinden faydalanacağımız aşikârdır. bunun dışında ilk varlıkların, varlık olduğundan bir sınıf olduğunu söylemiştik. Ancak tek ve bölünemez bir nesne belirteceğini de Aristodan öğrendik bu durumda’da singleton desing pattern izleyeceğimiz aşikârdır. Ancak ben bu durumda şunun hala geçerli olacağını düşünüyorum; Eğer insan sınıfını amaca uygun düzenlersek. Her örnek insan’dan oluşturulmuş kendine özgü bir nesneyi refere edeceğinden, bu örneklerimiz hala daha doğru olacaktır. Yani buradan illa ki yukarıda dediklerimi çıkartmaya gerek yoktur. Ancak her ne çıkartırsak çıkartalım. Nesne tabanlı programlamada bir yeri olduğu aşikârdır. Kodlarımızı düzenlersek;

public abstract class Canli
{
}

public abstract class Insan : Canli
{
}

public sealed class Oguzhan : Insan
{
private static Oguzhan oguzhan;

private Oguzhan()
{

}

public static Oguzhan GetObject
{
get
{
if (oguzhan is null)
{
oguzhan = new Oguzhan();
}
return oguzhan;
}
}
}

Artık elimizde bir tane oğuzhan var. İnsan ve canlı sınıfından nesne türetilemez. oğuzhan ise sadece bir nesneyi gösterebilir. Aristo ile oldukça uyuştuk. Dediğim gibi. İnsan sınıfını amaca uygun bir biçimde düzenlersek. Ürettiğimiz her örnekte bu duruma mantiken uyar. Bundan dolayı nasıl çıkarımda bulunursak bulunalım oop’de yeri vardır. Ancak ben hem desing pattern’lere hemde encapsulation kavramlarına girebilmek için, Aristonun bahsettiklerinden en fazla çıkarımı yapabilmek adına bu yolu izledim. Yoksa şu durumda da;

Insan oguzhan = new Insan();

‘oguzhan ’değişkeni sadece bir nesneyi refere ettiğinden ve miras verilmesi durumundan bahsedilemediğinden sdp’ye ya da encapsulation’a gerek kalmaz. Ancak dediğim gibi. Buradan nereye varırsan var oop’de yeri var.

Bu yazıyı daha uzatmamak ve kitabın heyecanını kaçırmamak adına burada bitiriyorum. Açıkçası ben bu kitabı keşfederken (Evet! Okurken oop’yi keşfettiğinizi hissediyorsunuz.) çok zevk aldım. Umarım sizde aynı heyecan ve zevkle okursunuz.

İyi okumalar.

Son olarak, nesne tabalı programlama bir ihtiyaçtan doğmuştur. Bu ihtiyaç ise C programlama dilinde kod yazan yazılımcıların struct’ları kullanarak tıpkı oop’deki gibi bir yol izlemelerinden kaynaklanmaktadır. Bunun sonucu olarak oop geliştirilmiştir. Ancak oop’nin mantığı programlama dillerine göre farklılık göstermektedir. Temel felsefeyi aristonun ortaya koyduğu aşikardır. Ayrıca Microsoft ise C# ve .Net ile bu felsefeyi oldukça güzel bir biçimde uygulamıştır. Dilerseniz C programlama dili ve struct’ları araştırabilir ve oop hakkında daha fazla bilgi edinebilirsiniz.

--

--