Python’da Abstraction ve Encapsulation

Abstraction ve Encapsulation. Nesne Yönelimli Programlama‘da (OOP) soyutlama (abstraction) ve kapsülleme (encapsulation), yazılım geliştirme sürecinde kodun karmaşıklığını yönetmek ve güvenliği sağlamak için kullanılan iki önemli kavramdır. Bu kavramlar, kodun daha modüler, bakımı kolay ve güvenli olmasını sağlar.

1. Abstraction (Soyutlama)

Soyutlama, gereksiz detayları gizleyerek yalnızca gerekli bilgilerin kullanıcıya sunulmasını sağlayan bir kavramdır. Soyutlama, bir sistemin karmaşıklığını azaltır ve kullanıcıların yalnızca neyin önemli olduğunu bilmesini sağlar.

a. Soyutlama Kavramı

Soyutlama, belirli bir nesnenin veya sistemin temel özelliklerine odaklanmayı ve bu özellikleri kullanarak belirli bir işlevi gerçekleştirmeyi sağlar. Örneğin, bir otomobilde, kullanıcı sadece direksiyon, gaz, fren ve vites ile ilgilenirken, motorun çalışma prensibi, yakıt enjeksiyonu gibi detaylar soyutlanmıştır.

Örnek:
from abc import ABC, abstractmethod

class Sekil(ABC):
@abstractmethod
def alan(self):
pass

@abstractmethod
def cevre(self):
pass

class Dikdortgen(Sekil):
def __init__(self, genislik, yukseklik):
self.genislik = genislik
self.yukseklik = yukseklik

def alan(self):
return self.genislik * self.yukseklik

def cevre(self):
return 2 * (self.genislik + self.yukseklik)

class Daire(Sekil):
def __init__(self, yaricap):
self.yaricap = yaricap

def alan(self):
return 3.14 * (self.yaricap ** 2)

def cevre(self):
return 2 * 3.14 * self.yaricap

dikdortgen = Dikdortgen(10, 5)
print("Dikdörtgen Alanı:", dikdortgen.alan())
print("Dikdörtgen Çevresi:", dikdortgen.cevre())

daire = Daire(7)
print("Daire Alanı:", daire.alan())
print("Daire Çevresi:", daire.cevre())

Bu örnekte, Sekil soyut (abstract) bir sınıftır ve alan ve cevre metotları soyut metotlardır. Dikdortgen ve Daire sınıfları bu metotları kendi ihtiyaçlarına göre uygular. Burada soyutlama, şekillerin alanını ve çevresini hesaplama işlemini, bu şekillerin nasıl oluşturulduğuna dair detayları gizleyerek sağlar.

2. Encapsulation (Kapsülleme)

Kapsülleme, bir nesnenin iç durumunu (özelliklerini) dış dünyadan gizlemek ve bu duruma erişimi yalnızca belirli yöntemler (metotlar) aracılığıyla sağlamak anlamına gelir. Bu, verilerin doğrudan erişimini sınırlayarak onları korur ve nesne içinde güvenli bir ortam yaratır.

a. Kapsülleme Kavramı

Kapsülleme, verilerin ve metodların bir arada tutulmasını ve dışarıdan gelen erişimlere karşı korunmasını sağlar. Bu, nesneye dışarıdan sadece tanımlanan metotlar aracılığıyla erişilebileceği anlamına gelir. Böylece, nesne içindeki verilerin yanlışlıkla değiştirilmesi veya bozulması önlenir.

Örnek:
class Kisi:
def __init__(self, isim, yas):
self.isim = isim # Public özellik
self.__yas = yas # Private (özel) özellik

def yas_goster(self):
return self.__yas

def yas_arttir(self):
self.__yas += 1

kisi1 = Kisi("Ahmet", 30)

print(kisi1.isim) # Ahmet
print(kisi1.yas_goster()) # 30

kisi1.yas_arttir()
print(kisi1.yas_goster()) # 31

# Doğrudan erişim denemesi
# print(kisi1.__yas) # AttributeError: 'Kisi' object has no attribute '__yas'

Bu örnekte, __yas özelliği kapsüllenmiştir ve doğrudan erişime kapalıdır. Yalnızca yas_goster ve yas_arttir metotları ile erişilebilir ve değiştirilebilir. Bu, nesne içindeki verinin güvenliğini sağlar ve yanlışlıkla değiştirilmesini engeller.

b. Getter ve Setter Metodları

Kapsülleme, genellikle getter ve setter metodlarıyla birlikte kullanılır. Bu metotlar, özel özelliklere (private attributes) güvenli bir şekilde erişim sağlar.

Örnek:
class BankaHesabi:
def __init__(self, bakiye):
self.__bakiye = bakiye

def bakiye_goster(self):
return self.__bakiye

def para_yatir(self, miktar):
if miktar > 0:
self.__bakiye += miktar
else:
print("Geçersiz miktar.")

def para_cek(self, miktar):
if 0 < miktar <= self.__bakiye:
self.__bakiye -= miktar
else:
print("Yetersiz bakiye veya geçersiz miktar.")

hesap = BankaHesabi(1000)
print(hesap.bakiye_goster()) # 1000

hesap.para_yatir(500)
print(hesap.bakiye_goster()) # 1500

hesap.para_cek(300)
print(hesap.bakiye_goster()) # 1200

# Doğrudan erişim denemesi
# print(hesap.__bakiye) # AttributeError: 'BankaHesabi' object has no attribute '__bakiye'

Bu örnekte, __bakiye özelliği kapsüllenmiştir ve doğrudan erişime kapalıdır. Getter (bakiye_goster) ve setter (para_yatir, para_cek) metodları aracılığıyla bu özelliğe güvenli bir şekilde erişim sağlanır.

Soyutlama (abstraction) ve kapsülleme (encapsulation), Nesne Yönelimli Programlama’nın (OOP) temel kavramlarındandır ve yazılım tasarımında önemli rol oynar.

  • Soyutlama, bir sistemin veya nesnenin gereksiz detaylarını gizleyerek sadece gerekli olanları kullanıcıya sunar, bu da karmaşıklığı azaltır ve odaklanmayı kolaylaştırır.
  • Kapsülleme, nesnenin iç durumunu korur ve verilerin güvenliğini sağlar. Kapsüllenen veriye sadece tanımlanan metotlar aracılığıyla erişilir, bu da yanlış veya izinsiz değişiklikleri önler.

Bu kavramlar, yazılımın daha güvenli, modüler ve bakımı kolay hale gelmesine katkıda bulunur. Python, bu kavramları destekleyen güçlü bir dil olarak, yazılım geliştiricilerine esnek ve güvenli kod yazma imkanı tanır.

Nesne Yönelimli Programlama (OOP)

Comments

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.