Giriş

Veritabanı uygulamaları ile çalışmak, iş kurallarını ve çeşitli işlevleri özelleştiren küresel ayarların erişilmesini gerektirir. Ancak bu ayarları yönetmek zorlu olabilir, özellikle de birim testleri yapmak ve temiz kodu korumak açısından. Birçok geliştiricinin karşılaştığı yaygın bir sorun, küresel değişkenlerin dezavantajlarına düşmeden küresel uygulama ayarlarına etkili bir şekilde nasıl erişileceğidir. Bu blog yazısında, geliştiricilerin küresel ayarlara erişimi düzene sokmalarını sağlarken etkin bir birim testi yapılmasına olanak tanıyan Martin Fowler’ın Servis Lokasyoncusu (Service Locator) desenini kullanarak bir çözüm keşfedeceğiz.

Problem

Uygulama geliştirirken, geliştiriciler belirli görevleri yerine getiren nesneler oluşturur; örneğin karmaşık hesaplamalar. Bu nesneler genellikle veritabanında saklanan küresel ayarlara erişim gerektirir. Geleneksel yaklaşım, ayarları nesneler oluşturulduğunda özellikler olarak geçirmeyi içerir, bu genellikle bir Uygulama Kontrolörü tarafından yönetilir. Bu, küresel Settings nesnesi kullanmak için daha iyi bir alternatif olabilir, ancak kendi zorluklarını getirir:

  • Karmaşık Kurulum: Her nesne için birçok özelliği ayarlamanız gerekebilir, bu da zahmetli olabilir.
  • Özelliklerin İletimi: Özelliklerin alt nesnelere geçilmesi gerekebilir, bu da mimariyi karmaşıklaştırır.
  • Test Zorluğu: Nesneler küresel değişkenlere ve duruma büyük ölçüde bağımlı olduğunda, birim testi zor hale gelebilir.

Çözüm: Servis Lokasyoncusu Desenini Kullanma

Bu problemi ele almanın etkili bir yolu, Martin Fowler’ın Servis Lokasyoncusu desenini uygulamaktır. Bu yaklaşım, küresel ayarlarınıza merkezi bir şekilde erişim sağlarken test sırasında kolay özelleştirmeye olanak tanır.

Servis Lokasyoncusunu Kurma

Adım 1: Servis Lokasyoncusu Sınıfını Oluşturma

PHP’de Servis Lokasyoncusu’nun basit bir uygulanması şöyle olabilir:

class ServiceLocator {
  private static $soleInstance;
  private $globalSettings;

  public static function load($locator) {
    self::$soleInstance = $locator;
  }

  public static function globalSettings() {
    if (!isset(self::$soleInstance->globalSettings)) {
      self::$soleInstance->setGlobalSettings(new GlobalSettings());
    }
    return self::$soleInstance->globalSettings;
  }
}
  • Açıklama: Servis Lokasyoncusu sınıfı, ayarlarınızın tek bir örneğini yönetmenizi sağlar ve uygulama ayarlarınız için tek bir gerçek kaynak olmasını sağlar.

Adım 2: Üretim Kodunda Servis Lokasyoncusunu Başlatma

Servis Lokasyoncusunu üretim ortamınıza yüklemek için şu şekilde yazarsınız:

ServiceLocator::load(new ServiceLocator());

Bu işlem, küresel ayarların uygulamanız boyunca alınabilmesi için servis lokasyoncusunu başlatır.

Test Kodunda Mocklama

Servis Lokasyoncusu deseninin en önemli avantajlarından biri testler için sunduğu esnekliktir. Test kodunuzda, kolayca mock ayarları ekleyebilirsiniz:

ServiceLocator s = new ServiceLocator();
s->setGlobalSettings(new MockGlobalSettings());
ServiceLocator::load(s);
  • Açıklama: MockGlobalSettings ile değiştirme yaparak, nesnelerinizi gerçek veritabanı durumuna bağımlı olmadan veya uygulamanın davranışını etkilemeden test edebilirsiniz.

Sonuç

Servis Lokasyoncusu desenini uygulayarak, küresel uygulama ayarlarına erişimi etkili bir biçimde yönetebilir ve küresel değişkenlerin dezavantajlarından kaçınabilirsiniz. Bu yöntem, nesneleriniz için gereken kurulumu basitleştirirken birim testleri için kolay bir yol sağlar.

Servis Lokasyoncusu deseni, singletonlar için bir depo görevi görür ve test amaçlı uygulamaların değiştirilmesine olanak tanır, böylece kodunuzu temiz ve düzenli tutar. Birçok geliştirici tarafından başarıyla kullanılan bir stratejidir ve uygulama mimarinize mükemmel bir ek olabilir.

Son Düşünceler

Servis Lokasyoncusu gibi desenleri benimsemek, kodunuzun sürdürülebilirliğini artırmanın yanı sıra test stratejilerinizi de geliştirir ve daha sağlam uygulamalar oluşturmanıza yol açar. Programlamaya yeni başladıysanız, bu desenleri öğrenmekten ve denemekten çekinmeyin; onlar uzun vadede size zaman ve çaba kazandırabilir!