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!