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.
Bir yanıt yazın