Ihsan Erdem - blogNesne Yönelimli Programlama (OOP)
İçerik
Nesne Yönelimli Programlama Nedir ?
Nesne Yönelimli Programlama (NYP), sınıflar ve nesnelere odaklanan bir programlama yaklaşımıdır. Yeniden kullanılabilir kod blokları oluşturarak programlama yapacağımızdan yazacağımız kod miktarı bir hayli azalır. Oluşturduğumuz her nesne için , ona ait özellikleri, verileri ve diğer nesnelerle nasıl etkileşimde bulunacağını tanımlarız.
NYP’de programlar, nesnelerin birbirleriyle etkileşimi üzerine kuruludur. Gerçek hayattaki karmaşıklığı modelleyerek bilgisayarın anlamasını sağlarız. Modelleme, problemleri çözmek için kullanılan bir yöntemdir; büyük bir problemi zihinde canlandırmak yerine, hedef sistemin görünüşü ve davranışları üzerinde gözlem yapabiliriz.
NYP ile her şeyi bilgisayarın anlayacağı şekilde nesne olarak aktarıyoruz, böylece gerçek hayattaki nesneleri bilgisayarların anlayacağı hale getiriyoruz. Bu sayede kodlayıcı ve bilgisayar arasında dilden bağımsız bir anlaşma ve felsefe ortaya çıkıyor.
Neden Nesne Yönelimli Programlama ?
- OOP ile, programı kolayca ayrıştırılıp birleştirilebilen modüler küçük parçalar ayırabiliriz.
- Kalıtım özelliği sayesinde sınıfların özelliklerini ve yöntemlerini yeni sınıflara aktararak kodun yeniden kullanımı mümkün olur, bu ise geliştirme sürecini bir hayli hızlandırır.
- Polimorfizm ile aynı arayüze sahip farklı nesnelerin farklı şekillerde çalışmasını sağlarız, bu da kodumuza esneklik ve genişletilebilirlik özelliği sağlar.
- Kapsülleme ile, veriyi ve fonksiyonları bir araya getirerek programımız iyi yapılandırılmış bir durumda olur, bu da güvenlik ve kod düzenliliği sağlar.
Nesneler ve Sınıflar
Sınıflar
Sınıflar nesne yönelimli programlamanın temel yapı taşlarıdır. Sınıflar, nesnelerin özelliklerini ve metodlarını belirlemek için bizim tasarladığımız şablonlardır. Bir sınıftan oluşturulan herhangi bir nesneyi, bizim tasarlandığımız şablona göre oluşturulan özgün bir klon olarak düşünebiliriz. Aynı sınıftan oluşturulmuş iki farklı nesne, ortak bir şablonu paylaşmalarına rağmen birbirlerinden tamamen bağımsızdırlar. Yani, bir nesne üzerindeki değişiklikler diğerini etkilemez, her nesne kendi durumunu(state) ve verilerini ayrı olarak tutar.
Nesneler
Bir nesne, bir sınıfın oluşturulmuş ve kullanımda olan bir örneği/klonu olarak düşünebiliriz. Nesneler, sınıfları tarafından tanımlanan şablona göre oluşturulur ve hem durum (veri, nitelikler veya özellikler) hem de davranış (metotlar) içeren varlıklardır.
1class Arabad
2# initialize metodu, bir nesne oluşturulduğunda çağrılır
3def initialize(marka, model)
4@marka = marka # instance değişkeni
5@model = model # instance değişkeni
6end
7
8# Bir instance metodu
9def bilgi_ver
10"Araba markası: #{@marka}, modeli: #{@model}"
11end
12end
Nesne Yönelimli Programlamanın 4 Ana Prensibi
Encapculation(Kapsülleme)
Kapsülleme sayesinde istediğimiz metot ve verilere erişmenin yolunu kısıtlayabilir ve nesnemize ait verilerin kontrolünü tamamen kendi ellerimize alırız.
Kapsülleme işlemini, public
, private
, ve protected
gibi başlıklar ile yönetiriz. Bu başlıklar, hangi metodların dışarıdan erişilebilir olup olmadığını tanımlar:
- Public (Herkese açık): Varsayılan olarak tüm metodlar
public
tir. Herkes bu metodlara erişebilir. - Private (Özel): Bu metodlara/verilere sadece sınıfın içinde kullanılabilir, dışarıdan erişmek için ekstradan bir method kullanmamız gerekir.
- Protected (Korunmuş): Bu metodlar/verilere, sadece alt sınıflardan erişilebilinir.
1class Kedi
2def initialize(isim)
3@isim = isim
4end
5
6def ses_cikar
7miyavla
8end
9
10private
11
12def miyavla
13puts "#{@isim} miyav dedi!"
14end
15end
16
17kedi = Kedi.new("Minnoş")
18kedi.ses_cikar # Minnoş miyav dedi!
19kedi.miyavla # Hata: private method `miyavla' çağrılamaz
20
INHERITANCE(MİRAS)
Miras, bir sınıfın başka bir sınıftan özellikleri ve metotları devraldığı, böylece kodun genişletilip tekrar kullanılmasını sağlayan nesne yönelimli programlama ilkesidir.Miras alan sınıfa alt sınıf, miras veren sınıfı ata sınıf olarak isimlendirebiliriz, ata sınıfta tanımlı olan her şeyin alt sınıf için de tanımlı olur.
1# Ana sınıf
2class Hayvan
3attr_accessor :isim, :yas # Nitelikler
4
5def initialize(isim, yas)
6@isim = isim # Instance değişkeni
7@yas = yas # Instance değişkeni
8end
9
10def bilgi
11"İsim: #{@isim}, Yaş: #{@yas}"
12end
13end
14
15# Hayvan sınıfından miras alan çocuk sınıf
16class Kopek < Hayvan
17end
18
19# Hayvan sınıfından miras alan diğer çocuk sınıf
20class Kedi < Hayvan
21end
22
23# Nesne oluşturma
24kopek = Kopek.new("Buddy", 3)
25kedi = Kedi.new("Whiskers", 2)
26
27puts kopek.bilgi # Çıktı: İsim: Buddy, Yaş: 3
28
Polymorphism(Çok Biçimlilik)
Polimorfizm, nesne yönelimli programlamada farklı sınıfların ortak bir ata sınıftan gelen bir metodu kullanarak farklı şekillerde davranmasını sağlar.
1# Ana sınıf
2class Hayvan
3 def ses
4 raise NotImplementedError, "Bu #{self.class} sınıfı bu metoda yanıt veremez."
5 end
6end
7
8# Köpek sınıfı
9class Kopek < Hayvan
10 def ses
11 "Hav!"
12 end
13end
14
15# Kedi sınıfı
16class Kedi < Hayvan
17 def ses
18 "Miyav!"
19 end
20end
21
22# Ses yazdırma metodu
23def hayvan_sesi(hayvan)
24 puts hayvan.ses
25end
26
27# Nesne oluşturma
28kopek = Kopek.new
29kedi = Kedi.new
30
31# Polimorfizm kullanımı
32hayvan_sesi(kopek) # Çıktı: Hav!
33hayvan_sesi(kedi) # Çıktı: Miyav!
34
Abstraction(Soyutlama)
Soyutlama, karmaşık sınıf sistemlerini basitleştirmemize olanak sağlar. Ruby'de soyut sınıflar kullanarak o an ihtiyacımızın olmadığı metodları gizleyebiliriz. Kullanımına örnek vermek gerekirse eğer bizim ata sınıfımız sadece alt sınıflar için bir kutu/organizer görevi görüyorsa, ve ata sınıf için bir nesne oluşturmamıza gerek yoksa burda soyutlama kullanırız.
1# Soyut sınıf
2class Arac
3 def hareket_et
4 raise NotImplementedError, "Bu metot soyutlandı"
5 end
6end
7
8# Alt sınıf: Araba
9class Araba < Arac
10 def hareket_et
11 "Araba hareket ediyor."
12 end
13end
14
15# Alt sınıf: Motosiklet
16class Motosiklet < Arac
17 def hareket_et
18 "Motosiklet hareket ediyor."
19 end
20end
21
22# Kullanım
23araba = Araba.new
24motosiklet = Motosiklet.new
25
26puts araba.hareket_et # Çıktı: Araba hareket ediyor.
27puts motosiklet.hareket_et # Çıktı: Motosiklet hareket ediyor.
28