Registry tasarım deseni ... iyi ya da kötü?

2 Cevap php

Aşağıdaki kod, bir öğretici (http://net.tutsplus.com/php/creating-a-php5-framework-part-1/), benim değil.

Ben bu kodu hakkında bir kaç soru var ...

  • Makalede "kayıt tasarım modeli" kullanıyor iddia; olduğu sektöründe bu tasarım için evrensel ad?
  • Benzer başka çabuk daha iyi bir seçenek olurdu orada mı?
  • Bu model bir MVC çerçeve bağlamında uygulamak için iyi bir uygulama olarak kabul edilir?

Ben bir MVC framework benim kendi uygulanmasında bu tasarım deseni kullanmak gerekir eğer ben sadece anlamaya istiyorum. Teşekkürler!

<?php
/**
 * The PCARegistry object
 * Implements the Registry and Singleton design patterns
 * @version 0.1
 * @author Michael Peacock
 */
class PCARegistry {

/**
 * Our array of objects
 * @access private
 */
private static $objects = array();

/**
 * Our array of settings
 * @access private
 */
private static $settings = array();

/**
 * The frameworks human readable name
 * @access private
 */
private static $frameworkName = 'PCA Framework version 0.1';

/**
 * The instance of the registry
 * @access private
 */
private static $instance;

/**
 * Private constructor to prevent it being created directly
 * @access private
 */
private function __construct()
{

}

/**
 * singleton method used to access the object
 * @access public
 * @return 
 */
public static function singleton()
{
	if( !isset( self::$instance ) )
	{
		$obj = __CLASS__;
		self::$instance = new $obj;
	}

	return self::$instance;
}

/**
 * prevent cloning of the object: issues an E_USER_ERROR if this is attempted
 */
public function __clone()
{
	trigger_error( 'Cloning the registry is not permitted', E_USER_ERROR );
}

/**
 * Stores an object in the registry
 * @param String $object the name of the object
 * @param String $key the key for the array
 * @return void
 */
public function storeObject( $object, $key )
{
	require_once('objects/' . $object . '.class.php');
	self::$objects[ $key ] = new $object( self::$instance );
}

/**
 * Gets an object from the registry
 * @param String $key the array key
 * @return object
 */
public function getObject( $key )
{
	if( is_object ( self::$objects[ $key ] ) )
	{
		return self::$objects[ $key ];
	}
}

/**
 * Stores settings in the registry
 * @param String $data
 * @param String $key the key for the array
 * @return void
 */
public function storeSetting( $data, $key )
{
	self::$settings[ $key ] = $data;


}

/**
 * Gets a setting from the registry
 * @param String $key the key in the array
 * @return void
 */
public function getSetting( $key )
{
	return self::$settings[ $key ];
}

/**
 * Gets the frameworks name
 * @return String
 */
public function getFrameworkName()
{
	return self::$frameworkName;
}


}

?>

2 Cevap

Makalede "kayıt tasarım modeli" kullanıyor iddia; olduğu sektöründe bu tasarım için evrensel ad?

Evet, ama uygulama açıkçası farklı olabilir. Temel olarak, bir kayıt defteri paylaşılan nesneler için bir kap. Gerçekten temel sürümü, bir dizi kullanabilirsiniz. Gibi, değişken $GLOBALS, bir kayıt defteri denilebilir.

Benzer başka çabuk daha iyi bir seçenek olurdu orada mı?

Bir kayıt iki varyasyonu vardır. (Uzak en yaygın, ve bu bir örnek), küresel kayıt bulunmaktadır. Ve yerel bir kayıt bulunmaktadır. Yerel bir kayıt defteri (statik sınıf, tekil vb) küresel sembolü aracılığıyla elde ziyade, ihtiyaç nesnelere geçirilir. Yerel bir kayıt defteri birleştirme düşük bir derecesi vardır, ama aynı zamanda biraz daha soyut, yani bir takas orada olduğunu.

Ayrıca daha da ileri gitmek ve bunları açıkça ihtiyacı nesneler tüm bağımlılığı geçmek tam bağımlılık enjeksiyon kullanabilirsiniz. Bu daha büyük uygulamalarda biraz sıkıcı olabilir. Sen sınıflar var hangi bağımlılıkları "bilir" kod parçası olan bir bağımlılık enjeksiyon konteyner ile çift bu olabilir. Bu, daha da karmaşık bir yerel kayıt daha ancak bağlantı çok düşük bir derecesine sahiptir.

Bu model bir MVC çerçeve bağlamında uygulamak için iyi bir uygulama olarak kabul edilir?

Bu yaygın bir uygulama. Iyi ya da kötü olup olmadığını bir karar çağrıdır. Şahsen ben ayırmasının karşılığında bazı karmaşıklığı kabul etmeye hazırım, ama ymmv.

Ben genel olarak konuşma olmadığı görüşünde değilim really "kötü örnek" gibi bir thign. Söyleniyor, bazı teknikler daha idareli diğerlerinden daha kullanılması gerektiğini ve bir global kayıt kavramı sık sık zarif azdır biridir. Onunla sorun verilen nesneler arasındaki bağımlılıklar yoluyla ele olmasıdır isim-tabanlı basitçe yerine bağımlılıkları sağlanacaktır alarak strateji ve üçkâğıtla daha, küresel değişkenler benzer olan adresleme - Yaygın ([{olarak anılacaktır ne olduğu 2)]}.

Bu nasıl yeniden ve yazılım esnekliği aslında çok açıktır etkileyebilir. Kimlik doğrulama için bir OAuth2 sağlayıcı ile entegre bir tür istek işleyicisi düşünün. Bu OAuth2 sağlayıcıya isteklerini yapmak için iyi tanımlanmış bir arayüz ile bir nesneyi tanımlamak varsa, aynı arayüzü uygulayan başka bir nesne oluşturarak gelecekte sağlayıcısı değiştirmek için yeteneği var.

Şimdi tartışma uğruna ilk uygulama Facebook erişmesi gerekir diyelim. Ama sonra önümüzdeki hafta, size de aslında oldukça ad değer çiftleri daha yetkilendirme belirteç isteği JSON kullanarak, daha yakından Facebook yaptığından daha uyması bir şekilde OAuth2 uygular Yahoo, desteklemelidir karar. Ve bunun üstüne de, tutulması gereken URL'leri ve Keys ve etajer farklı çiftleri vardır.

Eğer kayıt deseni veya hizmet lokasyon kalıplarını kullanarak adı ile kimlik doğrulama sağlayıcısı aradılar eğer Eh, artık bir sorun var. Öyle Bir kerede hem destek, ya da tuşları etrafında geçen ve tüm bu unsurları bulmak ve bu sapmaları tespit etmek için tüm yerlerde hash tabloları ekleyerek başka bir çözüm bulabilirsiniz kodu kopyalayın ve ona küçük değişiklikler yapmak için ya gerekir. Eğer bağımlılık enjeksiyon kullandıysanız Bu arada, sadece kimlik doğrulama belirteci ayrıştırma küçük varyansını uygulayan kimlik doğrulama sağlayıcısı başka bir uygulama oluşturmak ve yeni bir instance o nesneyi kullanır ve zaten isteğiniz işleyicisi oluşturabilirsiniz test edilmiş ve daha sonra yeni bir yere dağıtmak olmuştur.

Yönlendirme, işe kaydedilen gerekli kod miktarı azalır ve sonuçta yazılım, daha ucuz daha iyi ve daha hızlı yapılabilir.

Bunu dedi, iki desenleri directly değiştirilebilir değil zaman, zamanlar vardır. Örneğin bir XML belgesinin düğümleri olay işleyicileri verdiği çerçeve bir çeşit inşa ediyoruz diyelim. XPath veya CSS seçiciler JQuery'nın uygulamasını kullanarak bir XML belgedeki düğümleri yerleri açıklar. Ama bir olay işleyicisi iliştirmek için, ayrıca bazı kod başvurmak gerekir. Tercihen, bazı nesnenin bazı yönteme başvurmak - de, orada bu yüzden şimdi bir hizmet locator gerekir, bir ad vermeden bu "bazı nesne" bulmak için yolu yok, bu yüzden ismiyle şeyler bakabilirsiniz. Ama bu bile örnekte, ad global olması gerektiğini öngören hiçbir şey olmadığını akılda tutmak yok.

Buradan aradığınız gibi bir yerel hizmet arama, ya da yerel kayıt oluşturma, bu tür bir soruna makul bir çözümdür. Aynı uygulamada kayıt iki durum olması durumunda, yukarıda belirtilen yeniden bazı sorunları bazen hafifletilebilir.