#2 Functional vs Object-Oriented vs Procedural

Ezgi Fıstıkçıoğlu
Huawei Developers - Türkiye
9 min readApr 25, 2021

Selamlar🙋‍♀️

Serinin 1. yazısında programlama paradigması nedir, farkları nelerdir, prosedürel programlama nedir gibi konulara değinmiştim. Eğer okumadıysanız 1. yazıdan başlamanızı tavsiye ederim.

Bu yazımda ise Nesneye yönelik programlama nedir, nasıl kullanılır, OOP ile PP farkı nedir vb. konulara değineceğim. O zaman haydi başlayalım🔍

👉Object Oriented Programming (OOP) (Nesne Yönelimli Programlama)

Program bileşenlerini nesneler olarak görür ve tüm bileşenler nesneler olarak temsil edilir.

Bir nesne(object), dataları(verileri) ve ilişkili metotları tek bir birim olarak birbirine bağlar. Böylelikle programcı, erişim belirleyicisini tanımlayarak veri erişim izinlerini kontrol edebilir, buna ilerleyen kısımda değineceğiz.

OOP’deki bir yöntem, Prosedürel’de ki bir prosedür olarak düşünülebilir, ancak OOP’de belirli bir nesneye aittir.

Nesne yönelimli programlamanın arkasındaki fikir, kodunuzu sınıflarda / nesnelerde düzenlemenizdir. Yani temel amacı gerçek dünya varlıklarını nesne(object), sınıf(classes), çok biçimlilik(polymorphism) benzeri kavramlarla çözebilmektir.

Nesneye yönelik programlama paradigmasının temeli SIMULA67 programlama diline dayanmaktadır.

✳️SIMULA67, Smalltalk, Eiffel, Ruby, C++, Java, C#, PHP, Python vs.

🟣Nesne(Object) Nedir?

Nesnenin matematiksel karşılığı önermedir.

Yandaki kümeye dikkatli baktığımızda aslında şu açıklamayı yapabiliriz. Dünya üzerindeki herşeyi içinde barındıran bir kümedir ve bu küme aslında “NESNE” kümesidir. Bu kümenin içinde yer alabilmek için bir durum(situation) veya bir davranışa(behavior) sahip olmak yeterlidir.

Herhangi bir problemdeki herhangi bir şeyi bilgisayar programları aracıyla nasıl ifade edebileceğimizin yolu tam olarak nesne’dir.

Bir nesne, canlı varlık, fiziksel veya mantıksal nesne ve hatta banka hesabı gibi iş kavramı olabilir. (Durum ve davranışı olan herhangi bir varlık olması yeterli.) Örneğin, sandalye, kalem, masa

Köpek bir nesnedir, çünkü isim,renk,cins vb durumları ve havlama, yemek yeme, hırlama gibi davranışları vardır. Bir nesne bir adres içerir ve bellekte yer kaplar.

Her nesnenin benzersiz bir kimliği ve bir state(durum)’u vardır. Kimliğin değeri harici kullanıcı tarafından görülmez.

Bir nesnenin state’i, üye değişkenleri tarafından tanımlanır.

Nesne davranışı(behavior), üye metotlarıyla tanımlanır. Nesne özellikleri değişkenlerle (veriler) temsil edilir. Nesnenin davranışı yöntemlerle tanımlanır.

Nesne bir sınıfın örneği olarak tanımlanabilir.

📌Syntax:

🟣Sınıf(Class) Nedir?

Sınıfın matematiksel karşılığı küme’dir. Resimdeki dünya-küme ikilisini hatırlayalım. O zaman sınıf kategorize edilmiş nesnelerden oluşur diyebiliriz. Yani ortak olan nesneleri gruplara ayırıp bir araya getiren bir template olarak düşünebiliriz.

Sınıf mantıksal(soyut) bir varlıktır. Bu sebeple bellekte herhangi bir alanda saklanmaz.

📌Syntax:

🟣Inheritance(Miras) Nedir?

Inheritance, üst sınıfın(superclass) mevcut işlevselliğini edinme ve miras alınan alt sınıfa(subclass) ek özellikler ve metotlar ekleme sürecidir. Bir sınıftan miras almak için, “extends” anahtar sözcüğü kullanılır.

Elimizdeki mevcut sınıflara dayanan yeni sınıflar oluşturabilmemizdir de diyebiliriz.

OOP’lerin önemli bir parçasıdır. Ebeveyn-çocuk ilişkisi olarak bilinen IS-A ilişkisini temsil eder.

Varolan bir sınıftan miras aldığımızda, o sınıfın yöntemlerini ve metotlarını yeniden kullanabiliriz. Ayrıca mevcut sınıfımıza yeni yöntemler ve metotlar da ekleyebiliriz.

Peki inheritance’ı neden kullanıyoruz diye soracak olursak, method overriding(yöntem geçersiz kılma) için kullanılır ve böylece çalışma zamanı polimorfizmi(runtime polymorphism) elde edilebilir.

📌Kalıtım Türleri:

Sınıf bazında, Java’da üç tip kalıtım olabilir: tekli kalıtım, çoklu kalıtım ve hiyerarşik(Çok Seviyeli Kalıtım).

Tekli(Single) kalıtım:

Bir sınıf başka bir sınıfı miras aldığında, bu tekli miras olarak bilinir. Yanda verilen örnekte, Dog sınıfı Animal sınıfını miras alır, bu nedenle tek bir miras vardır.

Çoklu(Multilevel) kalıtım:

Bir kalıtım zinciri olduğunda, çok düzeyli kalıtım olarak bilinir. Yanda verilen örnekte görebileceğiniz gibi, BabyDog sınıfı, yine Animal sınıfını miras alan Dog sınıfını miras alır, bu nedenle çok düzeyli bir kalıtım söz konusudur.

Hiyerarşik(Çok Seviyeli) kalıtım:

İki veya daha fazla sınıf tek bir sınıfı miras aldığında, buna hiyerarşik miras denir. Yanda verilen örnekte, Dog ve Cat sınıfları Animal sınıfını miras alır, bu nedenle çok seviyeli miras vardır.

Java programlamada, çoklu ve hibrit kalıtım yalnızca arayüz(interface) aracılığıyla desteklenir. Interface kısmında buna değineceğiz.

🟣Polimorfizm(Çok Biçimlilik) Nedir?

Geniş anlamda, polimorfizm bize aynı arayüzü farklı türlerdeki varlıklar için kullanma seçeneği sunar. Basitçe birçok form anlamına gelir.

Bir görev farklı yollarla gerçekleştiğinde polimorfizm olarak bilinir.

En yaygın ve basit kullanımı aynı method adının kullanılmasıdır.

Metodun çağırılma şekline bağlı olarak doğru yöntem çağırılacaktır.

İki ana polimorfizm türü vardır: Derleme zamanı(compile-time polimorfizm)

çalışma zamanı(runtime polimorfizm).

Yöntem aşırı yükleme ve yöntemi geçersiz kılma yoluyla java’da polimorfizm gerçekleştirebiliriz.

🟣Abstraction(Soyutlama) Nedir?

Son kullanıcı arka tarafta işleyen yapıyı bilsin istemiyoruz, bu yüzden bunu son kullanıcılara karşı soyutluyoruz. Bunu aşağıdaki örneklerle anlayabiliriz;

Araba motorları eskiden açık bir şekilde görülebilirken, günümüzde yeni çıkan motorların iç işleyişine erişemiyoruz ya da bir diğer örnek, bilgisayar donanım parçalarına eskisi gibi ulaşamıyoruz çünkü yeni üretilen bilgisayarlar pek de açıp incelemeye müsait bir yapıda üretilmiyorlar. Bu da bilgisayarın ve yeni nesil arabaların üreticisine bir nevi muhtraç olma durumunu doğurmuş oluyor. Zaten istenilen de bu.

Abstract sınıflar,genellikle ortak özellikleri olan nesneleri(kedi) tek bir çatı altında toplamak için kullanılır.

Abstract sınıflarda içi boş yada dolu metodlar tanımlanır.

Soyut(Abstract) bir sınıf, bir “abstract” anahtar sözcüğü ile bildirilmelidir.

Abstract ve abstract olmayan metotlara sahip olabilir.

Constructor’lara ve statik yöntemlere de sahip olabilir.

Alt sınıfı(subclass), metodun gövdesini değiştirmemesi için alt sınıfı zorlayacak final metotlara sahip olabilir.

Bu örnekte Machine sınıfı oluşturuyoruz. Bu sınıfımıza “abstract” kelimesi ekleyerek somut sınıf olarak tanımlıyoruz.

Machine sınıfımızın içindeyse start(), doStaff(), shutdown() adlarında metotlar tanımlıyoruz.

Oluşturduğumuz Machine isimli soyut sınıfımızdan miras alan Car sınıfı oluşturuyoruz. Burada Machine sınıfını miras aldıkları için, süper sınıfta yer alan bu 3 metot(start(), doStaff(), shutdown()) gerçekleştirilir.

🟣Interface(Arayüz) Nedir?

Interfaceler bir class’ın bir planıdır.

Statik sabitlere(constant) ve soyut metotlara sahiptir. Diğer bir deyişle Interfacelerin soyut metotları ve değişkenleri olabileceğini söyleyebilirsiniz.

Bir metot gövdesine sahip olamaz, abstract sınıf gibi somutlaştırılamaz.

Java Interface’i ayrıca IS-A ilişkisini temsil eder.

Bir arabirim bir yapıcı içeremez (çünkü nesne oluşturmak için kullanılamaz).

Daha önce Java’da çoklu kalıtımın desteklenmediğini) ve buna ayrıca değineceğimden bahsetmiştim. İşte arayüzler hem soyutlamayı sağlamak hem de çoklu kalıtımı uygulamak için kullanılır. Bir sınıf yalnızca bir üst sınıftan miras alabilir. Ancak, sınıf birden çok arabirimi uygulayabildiğinden arabirimlerle elde edilebilir. Not: Birden çok arabirimi uygulamak için, bunları örnek kodda olduğu gibi virgülle ayırın.

🟣Encapsulation(Kapsülleme) Nedir?

Kod ve verileri tek bir birim halinde birleştirmeye(sarmaya) kapsülleme adı verilir. Peki gerçek hayattan örneği nedir diye soracak olursak bildiğimiz ilaç kapsülleri buna çok iyi örnektir. Her ilacın içeriği, yan etkileri, faydaları, kullanım amaçları farklıdır fakat bu ilaçları genelde bir koruyucu katman gibi kapsüllerle sararlar ve bu kapsül midede eriyerek asıl ilacı ortaya çıkarır.

İşte encapsulationda da benzer şekilde, veri ve yöntemler, kapsülleme içinde tek bir birimde tutulur.

Java’da kapsüllemeyi uygulamak için, sınıfın veri üyesi değişkenlerini private yaparız. Artık bu private değişkenlere, sınıf nesnesi dahil olmak üzere sınıf dışındaki hiçbir şey erişemez. Bu yüzden getter() ve setter() metotlarını kullanırız.

🟣ÖZET:

Object: Bir gerçek dünya varlığı var, biz bu gerçek dünya varlığına nesne diyoruz. Nesne dediğimiz şey, durum veya davranışı olan herhangi birşeydi.

Class: Durum ve davranışları belirli ortak özelliklerine göre gruplandırdık ve buna da sınıf dedik. Bunun gerçekleştirilmiş hali nesneyi oluşturuyordu.

Inheritance: Bu sınıflar belirli hiyerarşi içerisinde yer alıyor, bu hiyerarşi mantığını gerçek dünyadaki kalıtım prensibine dayandırarak gösteriyoruz.

Polymorphism: Her nesne veya her yapı aynı durumda aynı şekilde davranmıyor, hareket etmiyor veya belirli durumlarda aynı şekilde hareket etmesi gerekirken, bazı durumlarda farklı şekilde hareket etmesi gerekiyor. Bunu polymorphism ile sağlıyoruz.

Abstraction: Biz bundan önceki 4 adımı gerçekleştirirken kullanıcının hangi detayları görüp, hangi detayları görmeyeceğini belirleme özgürlüğüne sahibiz. Daha soyut, daha basit düşünerek kullanıcının gereksiz detayları görmesini abstractlar ile engelleyebiliriz.

Encapsulation: Tüm bu adımları efektif bi şekilde sunduğumuz kısım ise kapsülleme olarak karşımıza çıkıyor.

Bir Shape interface’i oluşturulur. Bunun amacı alan hesabının ortak olması diyebiliriz.

Daha sonra sırasıyla Square,Rectangle,Circle sınıfları oluşturulur, Shape sınıfından implements edilir ve bu sınıflara alan hesaplaması yapabilmek içi nparametreler verilir. Shape sınıfından otomatik olarak areaCalculate() metodu getirilir ve biz bunun içini şeklimizin alan hesabına göre doğru bir şekilde doldururuz.

Son olarak Geometry class’ında her şeklin bir instance’ı oluşturulur ve bu instance ile artık metodumuza ulaşabilir hale gelmiş olduk.

( instance.areaCalculate() )

Prosedürel Programlama(PP) ~ Nesne yönelimli programlama (OOP)

  • PP ‘de program, işlevler adı verilen küçük bölümlere ayrılmıştır.
  • OOP’de program, nesneler adı verilen bölümlere ayrılmıştır.
  • PP ‘de, verilere değil, işlevlere ve yapılacak eylemlerin sırasına önem verilir.
  • OOP’de, gerçek bir dünya olarak çalıştığı için prosedürler veya işlevlerden çok verilere önem verilir.
  • PP , Yukarıdan Aşağı yaklaşımını izler. OOP, Aşağıdan Yukarı yaklaşımını izler.
  • PP ‘un herhangi bir erişim belirleyicisi yoktur. OOP, public, private, protected, vb. erişimbelirleyicilere sahiptir.
  • PP ‘ta veriler, sistemde işlevden işleve serbestçe hareket edebilir. OOP’de nesneler, üye işlevleri aracılığıyla birbirleriyle hareket edebilir ve iletişim kurabilir.
  • PP ‘a yeni veri ve işlev eklemek o kadar kolay değil. OOP, yeni veri ve işlev eklemenin kolay bir yolunu sağlar.
  • PP ‘ta , Çoğu işlev, sistemdeki işlevden işlevine serbestçe erişilebilen paylaşım için Global verileri kullanır. OOP’de veriler işlevden işleve kolayca taşınamaz, herkese açık veya özel tutulabilir, böylece verilere erişimi kontrol edebiliriz.
  • PP ‘un verileri gizlemek için uygun bir yolu yoktur, bu nedenle daha az güvenlidir. OOP, Veri Gizleme sağlar, böylece daha fazla güvenlik sağlar.
  • PP ‘ta aşırı yükleme mümkün değildir. OOP’de, Fonksiyon Aşırı Yüklemesi ve Operatör Aşırı Yüklemesi şeklinde aşırı yükleme mümkündür.
  • PP : C, VB, FORTRAN, ALGOL, COBOL, Basic, Pascal.
  • OOP : C#, C++, JAVA, Python, Ruby, Pearl .. etc.

Son olarak yandaki resimleri açıklamak istiyorum. Prosedürel programlama yapısal programlamayı destekliyordu. İlk dikkatimizi çeken alt alta bir yaklaşımla yazılmış olması. Nesneye dayalı programlamada ise herşey bir nesne idi ve bu nesneleri bir arayan getiren kümeler sınıflardı.

Bu örnekte de prosedürel programlamanın adım adım metotlardan oluştuğunu gösterilirken, OOP için elbette nesneler üzerinden yönetildiği gösterilmektedir.

İkinci yazı serimizin sonuna geldik. Burada amacımız OOP’yi tekrar etmek ve prosedürel programlamadan farkını anlamaktı. Umarım faydalı olmuştur. Serinin üçüncü yazısında görüşmek üzere.👩🏻‍💻

--

--