Atomic Query Construction (AQC) tasarım kalıbı, kesinlik, açıklık ve öngörülebilirlik ile ilgilidir. Zamanla, AQC sınıfları için tutarlı bir yapı geliştirdim. İlk bakışta kısıtlayıcı gibi görünebilir, ancak her kısıtlama pratik bir amaca hizmet etmektedir. AQC sınıflarının neden bu şekilde tanımlandığını inceleyelim.
1. Constructor Olmadan: Dependency Injection’dan Kaçınma
1. Constructor Olmadan: Dependency Injection’dan Kaçınma
Pek çok tasarım kalıbında, bağımlılıkları enjekte etmek için constructor’lar kullanılır—hizmetler, repository’ler veya diğer nesneler. AQC sınıfları kasten constructor kullanmaktan kaçınmaktadır. Neden? Çünkü AQC felsefesi, temel hizmetin veya sorgu oluşturucunun içsel olarak değişmeyeceğini varsayar.
Constructor aracılığıyla bir bağımlılığı enjekte etmek, sınıfın her bir örneği için değiştirilebileceği veya yapılandırılabileceği anlamına gelir. AQC sınıfları için bu gereksiz bir fazla yük oluşturur. Mantık atomik, deterministik ve izole bir biçimde kalır. Constructor gerektirmemek, gereksiz kodu ortadan kaldırır, yapılandırma hatalarını azaltır ve sınıfı yalnızca sorgu mantığına odaklar.
Ayrıca, tanımlamayı basitleştirir. Gerektiğinde yalnızca bir örnek yaratabilirsiniz, asla değişmeyecek olan hizmetleri veya yapılandırma parametrelerini geçme derdinde olmazsınız.
$getUsers = new GetUsers(); // basit ve öngörülebilir
$result = $getUsers->handle(['status' => 'active']);
2. Non-Static Yöntemler: Örnek Tabanlı Açıklığı Teşvik Etme
2. Non-Static Yöntemler: Örnek Tabanlı Açıklığı Teşvik Etme
Bazı geliştiriciler merak edebilir: neden handle() statik hale getirilmesin? Statik bir yöntem, kurulumu atlar ve daha basit görünür. Ancak statik yöntemlerin gizli maliyetleri vardır: durumu bulanıklaştırır, test etmeyi zorlaştırır ve küresel bağımlılığı teşvik eder.
Non-static yöntemler kullanmak, her örneğin bağımsız olmasını sağlar, hatta durum tutmuyor olsalar bile. Bu bir tasarım disiplini. handle() çağrılmadan önce her zaman bir nesne oluşturulması, kodun niyetini iletir: “bu kendi kendine yeterli, yeniden kullanılabilir bir atomik sorgu birimidir.”
3. Tek Genel Yöntem (handle) ve Parametreler Dizisi
3. Tek Genel Yöntem (handle) ve Parametreler Dizisi
handle() yöntemi, AQC sınıfının tek genel arayüzüdür. Bu, API’yi son derece öngörülebilir kılar: hangi yöntemin çağrılacağını veya hangi yöntemlerin sorguyu etkilediğini tahmin etmek gerekmez.
params dizisi girişi standartlaştırır. Sorgunun bir filtreye, sıralama düzenine veya sayfalamaya ihtiyacı olup olmadığından bağımsız olarak, her şey tek bir dizi aracılığıyla geçilir. Bu, yöntem imzalarının yayılmasını engeller ve sınıfı atomik kalır.
$params = [
'status' => 'active',
'role' => 'admin',
'sort' => 'created_at'
];
$result = (new GetUsers())->handle($params);
Özel yöntemler, iç adımaları, örneğin birleştirme, filtreleme koşulları oluşturma veya sütunları seçme gibi işlemleri yönetir. Dışarıdan görünmezler, bu da sınıf sözleşmesini basit tutar ve bakıcıların yalnızca handle yöntemine odaklanmasını sağlar.
4. Bu Kalıbın İşe Yaraması
4. Bu Kalıbın İşe Yaraması
Bu tasarım üç ana hedefe ulaşır:
Öngörülebilirlik: Her AQC sınıfı aynı görünümlü ve davranışlıdır.Basitlik: Gereksiz constructor, dependency injection veya birden fazla genel yöntem yoktur.Esneklik: Sınıf dışarıdan basit olmasına rağmen, özel yöntemler karmaşık sorgu yapılandırmasına olanak tanır.
Bu kurallara uyarak, ekipler AQC sınıflarını okuyabilir, kullanabilir ve bakımını yapabilir, gizli durumlardaki, bağımlılıklardaki veya tutarsız genel API’lerden endişe etmeden çalışabilirler.
Son Düşünceler
Son Düşünceler
AQC sınıflarının yapısı—constructor olmadan, non-static yöntemler kullanarak, tek bir handle() genel yöntemi ve bir params dizisi kabul ederek—kasıtlıdır. Atomiklik, basitlik ve öngörülebilirliği teşvik eder; bunlar Atomic Query Construction tasarım kalıbının temel prensipleridir. Her sınıf, aşırı mühendislik veya gereksiz karmaşa olmadan, kolayca yeniden kullanılabilir, test edilebilir ve bakım yapılabilir bir birim haline gelir.
Kaynak: Orijinal Makale



