SORU
25 EYLÜL 2008, PERŞEMBE


Veritabanı bağlantısı için küresel veya Singleton?

Singleton yerine PHP veritabanı bağlantıları için küresel kullanmanın yararı nedir? Küresel yerine singleton kullanarak kod gereksiz bir şekilde karmaşık hale getirir hissediyorum.

Küresel kod

$conn = new PDO(...);

function getSomething()
{
    global $conn;
    .
    .
    .
}

Singleton ile kod

class DB_Instance
{
    private static $db;

    public static function getDBO()
    {
    	if (!self::$db)
    		self::$db = new PDO(...);

    	return self::$db;
    }
}

function getSomething()
{
    $conn = DB_Instance::getDBO();
    .
    .
    .
}

Eğer küresel veya singleton dışında veritabanı bağlantısı başlatılıyor daha iyi bir yolu varsa, lütfen bunu söz ve avantajları tarif küresel veya singleton bitti.

CEVAP
20 EKİM 2008, PAZARTESİ


Bu eski olduğunu biliyorum, ama Dr8k cevabı olduneredeyseyok.

Kod yazı dikkate alındığında, değiştirmek için gidiyor varsayalım. O gelecekte bir noktada onun üzerine çekilir olacak değişiklikleri türlü varsayıyorsun o, daha ziyade değişim çeşit yapılmayacak anlamına gelmez.

Bu hedef gelecekte değişiklik yapma acıyı azaltmak: bir küresel sabit tek bir yerde yönetmek için, çünkü tehlikelidir. Eğer veritabanı bağlantısı kapsamında gelecekte de haberdar etmek istersem ne olur? Eğer kendini kullanılmış her 5 kez kapatıp istersem ne yapmalıyım. Eğer benim app Ölçekleme faiz 10 bağlantı havuzu kullanmak istiyorum karar verirsem ne olur? Veya bağlantıları yapılandırılabilir bir numara?

Birtek fabrikasize esneklik. O kadar çok fazladan karmaşıklık ayarladım ve daha fazla aynı bağlantı için erişim daha kazanç; bu bağlantı daha sonra basit bir şekilde bana nasıl geçtiğini değiştirmek için yeteneği kazanmak.

Dediğimi unutmayıntek fabrikasadece farklı olaraksingleton. Tek ve küresel bir gerçek değerli arasında çok az fark var. Ve bu yüzden, tek bir bağlantı olması için bir neden yok: neden zaman düzenli bir küresel yerine oluşturabilirsiniz zaman ayarlama mi geçirmek istiyorsun?

Bir fabrika mı olur ne bağlantıları, ve almak için gidiyoruz ne karar için ayrı bir yer almak için bir neden.

Örnek

class ConnectionFactory
{
    private static $factory;
    private $db;

    public static function getFactory()
    {
        if (!self::$factory)
            self::$factory = new ConnectionFactory(...);
        return self::$factory;
    }

    public function getConnection() {
        if (!$this->db)
            $this->db = new PDO(...);
        return $this->db;
    }
}

function getSomething()
{
    $conn = ConnectionFactory::getFactory()->getConnection();
    .
    .
    .
}

Sonra, 6 ay ne zaman app süper ünlü ve dugg ve slashdotted ve sizin karar vermeniz gereken fazla bir tek bağlantı, tüm yapman gereken uygulamak bazı havuzu içinde getConnection() yöntemi. Ya da eğer SQL günlüğü uygulayan bir sarıcı istediğiniz karar verirseniz, PDO sınıfı iletebilirsiniz. Ya da her çağrı için yeni bir bağlantı istediğinize karar verirseniz, bunu yapabilirsiniz. Esnek, yerine katı.

Saatleri ve ürkütücü bir satır aşağı benzer yeniden düzenleme saatlerce kurtaracak kodu, ayraçlar da dahil olmak üzere, 16 satır.

Bu Creep ilk özellik herhangi bir uygulama yapmıyorum çünkü "dolaş. Özellik olarak görmüyorum unutmayın "Gelecek Sürünme", ama bir noktada, "yarın için bugün kodlama". bu fikir, sınır hattı ^em>her zamankötü bir şey benim için dans etmiyor.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ben Schoon

    Ben Schoon

    23 Kasım 2012
  • julioissk84life

    julioissk84l

    18 ŞUBAT 2008
  • kev5124

    kev5124

    9 Kasım 2008