Nasıl Kötü Are Singletons?

6 Cevap php

Yani ....

Tüm Singletons, Küresel Devlet Değişkenler hakkında sorulan birçok soru, ve tüm bu harika şeyler tabii ki vardır. Benim sorum,

If Singletons and Globals are So Bad, Why are they used so often?

Aşağıdaki örnekler, ben insanların iyi bir yığın tarafından kullanılan inanıyorum kafamın üst kapalı sadece olanlardır.

Sana bir pseudo-tekiz işlevini kullanan CodeIgniter bir işlev vermek:

(\ CodeIgniter \ common.php Hattı 89 sistemi)

/**
* Class registry
*
* This function acts as a singleton.  If the requested class does not
* exist it is instantiated and set to a static variable.  If it has
* previously been instantiated the variable is returned.
*
* ......
*/
function &load_class($class, $instantiate = TRUE)
{
    static $objects = array();

    // Does the class exist?  If so, we're done...
    if (isset($objects[$class]))
    {
        return $objects[$class];
    }
  .......
}

Tek bir kayıt içine her nesne yerleştirerek, bir şey birden çok örneğini oluşturmak için kendi load_class işlevini kullanamazsınız. Veri yapıları olarak sınıflarını kullanmak istediğinizde özellikle sakıncalıdır.

Bütün bu sınıfların yalnızca bir örneği var çünkü Ayrıca, bu Küresel Devlete karşı argüman haline yol açar. Hangi beni götürür .....

Global değişkenler esas çalışan tüm Wordpress Sistemi. Mesaj yoluyla döngü için tüm verilerin çeşitli globalleri hakkında mayınları.

(\ Query.php Hattı 2644 wp-includes)

/**
 * Setup global post data.
 *
 *....
 */
function setup_postdata($post) {
    global $id, $authordata, $day, $currentmonth, $page, $pages, $multipage, $more, $numpages;

    $id = (int) $post->ID;

    $authordata = get_userdata($post->post_author);
    ....
}

Bunlar sistemin tamamı için temel olarak Singleton / Globals kullanmak Altyapıları sadece iki ana örnektir!

Bu sistemler OOP metodolojisi kadar yakalanmış değil çünkü Yani .. bu sadece bir? Eğer dayanarak tüm sistemi yapmak için, Global Değişkenler veya tekiz kullanmak için söylüyorum bu kadar çok insan varken sadece mantıklı değil uygulamalar dedi.

Tabii PHP4 ile geriye dönük uyumluluk konusunda argüman var. Ben hala sınıflar hala mevcut olduğu gibi, PHP4 OOP programlama yapmak için yolları olduğunu düşünüyorum.

6 Cevap

Bu tekiz ile çalışmak oldukça kolay ve olmadan çalışan uygulamanızın yapısının daha ayrıntılı planlama alır çünkü. I question about alternatives bir süre önce sordu ve ilginç yanıtlar aldım.

WP veya CI gibi PHP4-tabanlı uygulamalar içinde Nedenleri OOP PHP4 en kötü destek yapıları kısmen vardır.

Globals ve singletons de basit: Bu doğru cepten uygulamaları ile bina daha global bir şey tokat düşünmeye çok az gerektirir. Bu da onlara erişmek için basit Sadece ismine kodu işaret ve bunun yerine başka bir yere gelen nesne geçmek için ihtiyacı bu.

Küresel devlet (global değişkenler, tekil, vb) bir olumsuz yan etkisi işler çok daha zor birim test yapar olmasıdır.

ps: Genel olarak benim deneyim WordPress kod oldukça kötü bir kalite vardır. Hiçbir şeyden bir ölçüt olarak kullanmak olmaz ...

Muhtemelen çünkü GOF tarafından Design Patterns kitap. Bu çok yaygın olur ve insanlar yanılmaz gibi davranın oluyor.

If Singletons and Globals are So Bad, Why are they used so often?

Ben bunun özü Singletons kolay şeyler yapmak olduğunu düşünüyorum. En azından ilk bakışta. Ben daha yararlı bir şey söylemek madde ile yeterli deneyimi yok, ancak ben şu iyi bir okuma bulundu:

Singleton Considered Stupid (Steve Yegge)

Bu hataların ihtimalini artırır, çünkü insanlar global değişkenler kullanımını vazgeçirmek. Programınızda her fonksiyonu aynı küresel değişkenleri erişen eğer bir yerde bir hata yapmak çok daha kolay ve hata ayıklamak çok zor bulunuyor. Ayrıca test etmek çok zordur.

Çünkü programmers are lazy onlar hala çok sık kullanılan ediyorsunuzdur. Biz kodunu tüm organize ve güzel, we just want to get the job done yapmak kadar ön vakit harcamak istemiyorum. Bu sadece modularize daha ne küresel bir fonksiyon / değişken / yazmak çok daha kolay, ve bu yolda başladıktan sonra bu kadar too much of a pain to go back and refactor. Belki de nedeni: Onlar bu şekilde başladı ve sadece geri döndü asla.

Temizleme sürecinde bir Singleton koyu köşe yerine temizliğinde kir gizleme temsil eder.

O çok iyi bir saklanma sorunlarının işi yapar, çünkü çok yaygın olarak kullanılır.

Bu temiz olanlar için iyi bir şey, ama istemiyorum.

Aslında bir şey temiz kadar olanlar için kötü bir şey.

Consider Dependency Injection http://martinfowler.com/articles/injection.html if a Singleton is causing a problem you can't hide anymore.