Sobes.tech
Middle+

Niyə Singleton nümunəsi anti-nümunə hesab olunur?

sobes.tech Süni İntellekt

AI-dan cavab

Singleton SOLID prinsiplərini pozur və test etməyi çətinləşdirir:

  • Yeganə məsuliyyət prinsipi (SRP) pozulur: Sinif həm öz məntiqindən, həm də öz həyat dövrünü idarə etməkdən (yaratmaq və tək nümunəyə giriş) məsuliyyət daşıyır.
  • Açıq/qapalı prinsipi (OCP) pozulur: Singleton sinifinin funksionallığını genişləndirmək, onun kodunu dəyişmədən çətin ola bilər.
  • Liskov yerinə qoyma prinsipi (LSP) pozulur: Singleton sinfinin alt tipləri, Singleton-un xüsusiyyətləri səbəbindən əsas tipin müqavilələrini yerinə yetirməyə bilər.
  • Asılılıqların tərs çevrilməsi prinsipi (DIP) pozulur: Modullar, Singleton-un konkret tətbiqinə bağlıdır, abstraksiyalara yox. Bu, mock və ya stub ilə Singleton obyektini dəyişdirməyi çətinləşdirir.
  • Test zamanı problemlər: Singleton nümunəsi qlobal vəziyyətdir, bu da testlərin paralel icrasını və test ssenarilərinin izoləsini çətinləşdirir. Singleton obyektinin asılılıqlarını dəyişdirmək çətindir.
  • Gizli asılılıqlar: Singleton istifadəsi modullar arasında asılılıqları gizlədir, çünki onlar açıq şəkildə ötürülmür.
  • Çox ipli mühitdə problemlər: Singleton nümunəsinə girişin sinxronlaşdırılması ehtiyacı kodu mürəkkəbləşdirə və potensial səhvlərə səbəb ola bilər.
  • İstifadənin mürəkkəbliyi: Singleton obyektinin həyat dövrünün idarə olunması və onun ləğvi aydın olmaya bilər.

Singleton yerinə, çox vaxt asılılıqların injeksiyası və ya Service Locator istifadə etmək daha yaxşıdır, bu obyektlərin həyat dövrünü və girişini idarə etmək üçün.

Aşağıda, qeyd olunan problemləri göstərən Swift-də tipik Singleton tətbiqi nümunəsi verilir:

// Singleton.swift
class DataManager {
    static let shared = DataManager() // Qlobal giriş nöqtəsi, asılılığı gizlədir
    
    private init() { // Özəl konstruktor, mock obyektlərin yaradılmasını çətinləşdirir
        // Resursların və ya vəziyyətin başlanğıcı
    }
    
    func fetchData() -> [String] {
        // Məlumatların alınması məntiqi (məsələn, şəbəkədən və ya verilənlər bazasından)
        // Bu məntiq vəziyyətin idarə olunması və giriş ilə əlaqəlidir, SRP-ni pozur
        return ["Item 1", "Item 2"]
    }
}

// İstifadə nümunəsi
// DataManager.shared-a birbaşa bağlı modul
class ViewController {
    func displayData() {
        let data = DataManager.shared.fetchData() // Gizli asılılıq
        print(data)
    }
}

// ViewController-in test edilməsi çətinləşir:
// DataManager.shared-ı mock obyekt ilə necə dəyişdirmək olar?
// Testləri izolyasiya etmək üçün necə?