Kafayı global state'le bozmuştum arkadaş. Her yerde singleton'lar, her yerde statik çağrılar. Test yazmak imkansız, bağımlılık izi sürülmüyor. "Yeter!" dedim, kolları sıvadım. Temiz, test edilebilir kod için dependency injection'a sarılacaktım. Meğer kendimi nasıl bir çukura attığımı bilmiyormuşum.
İlk hedefim, veritabanı bağlantılarını yönetmekti. Direkt new Database() dağıtmak yerine, bir DatabaseFactory yazdım. Güzel, temiz. Sonra cache layer için CacheFactory geldi. Onun da config'e ihtiyacı vardı, o ayrı bir factory'den gelsin.
Derken, bu factory'lerin kendileri de başka servislere bağımlı hale geldi. Ana servisim, hem database factory'sine, hem cache factory'sine, hem de logger factory'sine ihtiyaç duyuyordu. Her biri ayrı ayrı inject edilmeliydi. Constructor'ımın imzası kabarmaya başladı:
Java:
public AnaServis(DatabaseFactory dbFactory, CacheFactory cacheFactory, LoggerFactory loggerFactory, ConfigFactory configFactory, HttpClientFactory clientFactory) { ... }
İşte o an geldi. "Ya, ben bunları üst seviyede bir kere oluşturup, onları üreten merkezi bir şey yapsam?" dedim. Ve FactoryProvider diye bir sınıf yarattım. Bu provider, tüm factory örneklerini tutacak ve dağıtacaktı.
Ama sonra düşündüm, bu provider'ın kendisi de farklı senaryolara göre (test, production) farklı factory'ler sağlamalıydı. Ve böylece, FactoryProviderFactory doğdu. Şaka gibi ama, gerçek oldu.
Bir gün debug ederken, basit bir servis instance'ı oluşturmak için call stack'te 12 katman geçtiğimi gördüm. Her şey bir factory'nin içinden çıkıyor, ama hiçbir şey basit değildi. Amacım karmaşıklığı azaltmaktı, ama kendi yarattığım soyutlama cehenneminde kaybolmuştum.
Çözüm, her şeyi tek bir "sihirli" factory'ye bağlamak değilmiş. Bazen, kontrollü miktarda manual injection veya sadece new kullanmak daha okunabilir oluyormuş. Veya hafif bir DI konteyner kütüphanesi (Spring veya benzeri hafif bir şey) kullanmak, bu kendi kendime yaptığım "framework"ten katbekat iyiymiş.
Siz de "temiz kod" uğruna, kodu anlaşılmaz bir labirente dönüştürdüğünüz oldu mu? Bu factory çılgınlığından nasıl kurtuldunuz? Basitlik ile esneklik arasındaki o ince çizgiyi nasıl buluyorsunuz?