hkucuk

SOLID - Single-Responsibility Principle

25 Mayıs 2021 • ☕️ 3 dk okuma • 🏷 bilgisayar, yazılım

Yazar tarafından şu dillere çevrildi: English


Single-responsibility prensibi, bir sınıfın veya fonksiyonun sadece bir görevi olması gerektiğini öngören bir programlama prensibidir. Bu prensip, programlarımızın daha az hata olasılığına sahip, daha kolay anlaşılabilir ve bakımının daha kolay olmasını sağlar.

Eğer geliştirdiğimiz sınıf ya da fonksiyon birden fazla amaca hizmet ediyorsa, bu kurala aykırı bir geliştirme sürecinde olduğumuz anlamına geliyor. Bunu farkettiğimizde amaçlara uygun olarak parçalamanız gerekmektedir.

Örnek olarak, bir sınıfın sadece bir veritabanı erişim nesnesi olması gerektiğini düşünelim. Bu sınıfın sadece veritabanına erişim ile ilgili işlevsellikleri içermesi gerekir. Örneğin veritabanına kayıt ekleme, veritabanından veri okuma gibi. Bu sınıfın, veritabanına erişim dışındaki herhangi bir işlevselliği içermemesi gerekir.

PHP’de, Single-responsibility prensibini uygulamak için aşağıdaki gibi bir örnek verilebilir:

<?php

// Sadece veritabanı erişim nesnesi olan bir sınıf
class Database {
  public function connect() {
    // Veritabanına bağlanma
  }

  public function insert() {
    // Veritabanına kayıt ekleme
  }

  public function select() {
    // Veritabanından veri okuma
  }
}

$db = new Database();
$db->connect();  // Veritabanına bağlanır
$db->insert();  // Veritabanına kayıt ekler
$db->select();  // Veritabanından veri okur

Bu örnekte, Database sınıfı sadece veritabanına erişim ile ilgili işlevsellik içermektedir ve diğer işlevsellikleri içermemektedir. Bu nedenle, Database sınıfı Single-responsibility prensibini uygulamaktadır.

Aşağıdaki PHP kodu ise Single-responsibility prensibini ihlal eden bir sınıf örneğidir.

<?php

// Veritabanı erişim ve veri işleme işlevselliğini içeren bir sınıf
class Database {
  public function connect() {
    // Veritabanına bağlanma
  }

  public function insert() {
    // Veritabanına kayıt ekleme
  }

  public function select() {
    // Veritabanından veri okuma
  }

  public function processData() {
    // Verileri işleme
  }
}

$db = new Database();
$db->connect();  // Veritabanına bağlanır
$db->insert();  // Veritabanına kayıt ekler
$db->select();  // Veritabanından veri okur
$db->processData();  // Verileri işler

Bu örnekte, Database sınıfı hem veritabanı erişim işlevselliğini hem de veri işleme işlevselliğini içermektedir. Bu nedenle, Database sınıfı Single-responsibility prensibini ihlal etmektedir.


GoLang dilinde, Single-responsibility prensibini uygulamak için aşağıdaki gibi bir örnek verilebilir:

// Sadece veritabanı erişim nesnesi olan bir sınıf
type Database struct {}

// Veritabanına erişim işlevselliği
func (d *Database) Connect() {
  // Veritabanına bağlanma
}

func (d *Database) Insert() {
  // Veritabanına kayıt ekleme
}

func (d *Database) Select() {
  // Veritabanından veri okuma
}

db := &Database{}
db.Connect()  // Veritabanına bağlanır
db.Insert()  // Veritabanına kayıt ekler
db.Select()  // Veritabanından veri okur

Bu örnekte de Database sınıfı sadece veritabanına erişim ile ilgili işlevsellik içermektedir ve diğer işlevsellikleri içermemektedir. Bu nedenle, Database sınıfı Single-responsibility principle’ını uygulamaktadır.

PHP örneğine benzer şekilde, aşağıdaki GoLang kodu da Single-responsibility prensibini ihlal eden bir örnektir.

// Veritabanı erişim ve veri işleme işlevselliğini içeren bir sınıf
type Database struct {}

// Veritabanına erişim işlevselliği
func (d *Database) Connect() {
  // Veritabanına bağlanma
}

func (d *Database) Insert() {
  // Veritabanına kayıt ekleme
}

func (d *Database) Select() {
  // Veritabanından veri okuma
}

// Veri işleme işlevselliği
func (d *Database) ProcessData() {
  // Verileri işleme
}

db := &Database{}
db.Connect()  // Veritabanına bağlanır
db.Insert()  // Veritabanına kayıt ekler
db.Select()  // Veritabanından veri okur
db.ProcessData()  // Verileri işler

Bu örnekte de Database sınıfı hem veritabanı erişim işlevselliğini hem de veri işleme işlevselliğini içermektedir. Bu nedenle, Database sınıfı Single-responsibility prensibini ihlal etmektedir.


Kaynaklar