S – Tek Sorumluluk İlkesi (Single Responsibility Principle): Bir sınıfın ya da modülün tek bir sorumluluğu olmalıdır. Bu prensip, bir bileşenin değişmesi gerektiğinde diğerlerini etkileme olasılığını azaltır ve kodun bakımını ve anlaşılabilirliğini artırır.
class FileHandler:
def read_file(self, filename):
# Dosyayı oku ve içeriği döndür
pass
def write_file(self, filename, data):
# Dosyaya veriyi yaz
pass
class DataProcessor:
def process_data(self, data):
# Veriyi işle
pass
O – Açık/Kapalı Prensibi (Open/Closed Principle): Yazılım varlıkları (sınıflar, modüller, fonksiyonlar vb.), genişletmeye açık ancak değişime kapalı olmalıdır. Yani, mevcut kodu değiştirmeden yeni davranışlar ekleyebilmelisiniz.
class Shape:
def area(self):
pass
class Rectangle(Shape):
def init(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
class Circle(Shape):
def init(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius * self.radius
L – Liskov Yerine Geçme Prensibi (Liskov Substitution Principle): Alt sınıflar, üst sınıfların yerine kullanılabilmelidir. Yani, alt sınıflar, üst sınıfların tüm yerine geçmelidir ve beklenen sonuçlar aynı olmalıdır.
class Bird:
def fly(self):
pass
class Duck(Bird):
def fly(self):
# Duck uçar
pass
class Penguin(Bird):
def fly(self):
raise NotImplementedError(“Penguins can’t fly”)
Liskov Yerine Geçme Prensibine uygun kod:
def make_bird_fly(bird):
bird.fly()
I – Arayüz Ayrım Prensibi (Interface Segregation Principle): İstemciler, ihtiyaç duymadıkları arayüzlerden bağımsız olmalıdır. Yani, genel arayüzler, belirli kullanım senaryoları için daha küçük ve spesifik arayüzler haline getirilmelidir.
class Printer:
def print(self, document):
pass
class Scanner:
def scan(self, document):
pass
class Fax:
def fax(self, document):
pass
İstemci, Printer’ın sadece print metodu ile ilgileniyor:
class SimplePrinter(Printer):
def print(self, document):
# Belgeyi yazdır
pass
D – Bağımlılıkların Tersine Çevrilmesi Prensibi (Dependency Inversion Principle): Yüksek seviyeli modüller, düşük seviyeli modüllere bağımlı olmamalıdır. İkisi de soyuta bağımlı olmalıdır. Bu, kodun daha esnek ve yeniden kullanılabilir olmasını sağlar.
class DBConnection:
def connect(self):
pass
class MySQLConnection(DBConnection):
def connect(self):
# MySQL veritabanına bağlan
pass
class OracleConnection(DBConnection):
def connect(self):
# Oracle veritabanına bağlan
pass
class DataManager:
def init(self, db_connection):
self.db_connection = db_connection
def fetch_data(self):
# Veriyi veritabanından al
self.db_connection.connect()
pass