Nesne Yönelimli Programlama Kavramı OOP¶
Nesne Yönelimli Programlama(Object Oriented Programming)
Nedir?¶
OOP, bir bilgisayar programlama tasarım felsefesi veya metodolojisidir. Yazılım tasarımını işlevler ve mantık yerine veriler veya nesneler etrafında düzenler ve modeller. OOP, bir grup veri özniteliğini işlevler veya yöntemlerle nesne adı verilen bir birimde birleştirir. Bir nesne, benzersiz niteliklere (özellikler) ve davranışlara (işlevler, yöntemler) sahip bir veri alanı olarak adlandırılır. Özellikler, nesnenin durumudur. Davranışlar, nesnemizin gerçekleştirdiği eylemlerdir. Davranışlar genellikle nesnenin özelliklerini değiştirir. OOP'nin sütunları soyutlama, kapsülleme, kalıtım ve polimorfizmdir. Bir nesnenin nitelikleri ve işlevleri vardır. Sınıf, bir nesnenin planı veya şablonudur.
Neden kullanırız?¶
OOP, programı küçük parçalara ayırmayı sağlar. Böylece problemler kolayca çözülecektir. OOP sistemleri, küçük sistemlerden büyük sistemlere kolayca yükseltilebilir. OOP, programcı üretkenliğini, yazılım kalitesini artırır ve bakım maliyetini düşürür. Programları, sıfırdan kod yazmaya başlamak yerine birbiriyle iletişim kuran standart çalışma modüllerinden oluşturabiliriz. Bağımlılıkları azaltmanın harika bir yolu olduğu için büyük ölçekli uygulamaları çok daha basit hale getirir.
Ne zaman kullanırız?¶
OOP, değiştirilebilir durumu kapsüllemekle ilgilidir ve bu nedenle etkileşimli uygulamalar, GUI'ler ve API'ler değiştirilebilir durumu açığa çıkarmak için daha uygundur. Her bir bileşeni anlaması gerekmeyen birden fazla programcınız var. Paylaşılabilecek ve yeniden kullanılabilecek çok sayıda kod var Projenin sık sık değişmesi ve zaman içinde eklenmesi beklenmektedir. Farklı bölümler, veri kaynağı ve donanım gibi farklı kaynaklardan yararlanabilir.
Nasıl kullanırız?¶
OOP'de bir problemi nesneler açısından modellediğimizde, sistemimizde olmasını istediğimiz nesne türlerini temsil eden soyut tanımlar yaratırız.
Örneğin, bir okulu modelliyor olsaydık, profesörleri temsil eden nesnelere sahip olmak isteyebilirdik. Her profesörün bazı ortak özellikleri vardır: Hepsinin adı ve öğrettikleri bir konu vardır. Ayrıca her profesör belirli şeyler yapabilir. Örneğin hepsi bir ödeve not verebilir ve sene başında öğrencilerine kendilerini tanıtabilirler.
Profesör, sistemimizde bir sınıf olabilir ve sınıfın tanımı, her profesörün sahip olduğu verileri (öznitelikler, özellikler) ve yöntemleri listeler.
Pseudo(sahte/fake) kod olarak, bir Profesör sınıfı şu şekilde yazılabilir:
- Tek başına bir sınıf bir şey yapmaz. Bir türün somut nesnelerini oluşturmak için bir şablondur. - Oluşturduğumuz her somut profesör, Profesör sınıfının bir örneği olarak adlandırılır. - Bir nesne, sınıfın bir örneği olarak adlandırılır. - Bir örneğin oluşturulma süreci, bir yapıcı olarak adlandırılan özel bir işlev tarafından gerçekleştirilir. - Aşağıdaki örnekte OOP felsefesi takip edilerek bir Python programı oluşturulmuştur.from abc import ABCMeta, abstractmethod
class WorkerInterface(metaclass=ABCMeta):
@classmethod
def __subclasshook__(cls, subclass):
return (
hasattr(subclass, 'work') and
callable(subclass.work) and
hasattr(subclass, 'calculate_salary') and
callable(subclass.calculate_salary) or
NotImplemented
)
@abstractmethod
def work(self) -> None:
raise NotImplementedError
@abstractmethod
def calculate_salary(self) -> float:
raise NotImplementedError
class Employee(WorkerInterface):
BASE_SALARY = 1000
def __init__(self, no, name, year) -> None:
super().__init__()
self.__no = no
self.__name = name
self.__year = year
@property
def name(self):
return self.__name
def work(self):
print(f"Employee {self.name} is working.")
def calculate_salary(self):
return self.__year * self.BASE_SALARY
class Manager(Employee):
MANAGEMENT_PAYMENT = 10_000
def __init__(self, no, name, year, department) -> None:
super().__init__(no, name, year)
self.__department = department
def work(self) -> None:
print(f"Manager {self.name} is working.")
self._manage()
def _manage(self) -> None:
print(f'Manager {self.name} is managing.')
def calculate_salary(self) -> float:
return self.MANAGEMENT_PAYMENT + super().calculate_salary()
class Director(Manager):
def __init__(self, no, name, year, department, bonus) -> None:
super().__init__(no, name, year, department)
self.__bonus = bonus
def work(self) -> None:
print(f"Director {self.name} is working.")
self._manage()
self._make_a_strategic_plan()
def _manage(self) -> None:
print(f'Director {self.name} is managing.')
def _make_a_strategic_plan(self):
print(f'Director {self.name} is making a strategic plan.')
def calculate_salary(self) -> float:
return self.__bonus + super().calculate_salary()
class HumanResources:
def pay_salary(self, worker: WorkerInterface) -> None:
salary = worker.calculate_salary()
print(f'Paying {worker.name}, salary: {salary}')
if __name__ == '__main__':
try:
e = Employee(1, 'Adnan', 10)
m = Manager(2, 'Kaya', 5, 'R&D')
d = Director(3, 'Ibrahim', 3, 'Company', 20_000)
e.work()
m.work()
d.work()
print('_________HR__________')
hr = HumanResources()
hr.pay_salary(e)
hr.pay_salary(m)
hr.pay_salary(d)
except Exception as e:
raise e
"""Output
Employee Adnan is working.
Manager Kaya is working.
Manager Kaya is managing.
Director Ibrahim is working.
Director Ibrahim is managing.
Director Ibrahim is making a strategic plan.
_________HR__________
Paying Adnan, salary: 10000
Paying Kaya, salary: 15000
Paying Ibrahim, salary: 33000
"""