2010-08-06 5 views
5

Ich habe einmal gelesen, dass statische Klassen sehr schwierig und sogar unmöglich zu debuggen sind. Ist das wahr und warum? Ich habe einmal gelesen, dass statische Klassen sehr schwierig und sogar unmöglich zu debuggen sind. Ist das wahr und warum?

Wenn ein Beispiel würde helfen, hier ist eine PHP Klasse verwende ich eine Datenbank zuzugreifen (ich das nicht glaube, ist eine PHP-spezifische Frage, obwohl):

<?php 

class DB 
{ 
    private static $instance; 

    private function __construct() { } 

    public static function getInstance() 
    { 
     if(!self::$instance) 
     { 
      self::$instance = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';', DB_USER, DB_PASS); 
     } 
     return self::$instance; 
    } 

    public static function getPreparedStatement($query) 
    { 
     $db = self::getInstance(); 
     return $db->prepare($query); 
    } 

    public static function query($query) 
    { 
     $stmt = self::getPreparedStatement($query); 
     $stmt->execute(); 
    } 

    public static function getResult($query) 
    { 
     $stmt = self::getPreparedStatement($query); 
     $stmt->execute(); 
     return $stmt; 
    } 

    public static function getSingleRow($query) 
    { 
     $stmt = self::getPreparedStatement($query); 
     $stmt->execute(); 
     return $stmt->fetch(); 
    } 

    public static function getMultipleRows($query) 
    { 
     $stmt = self::getPreparedStatement($query); 
     $stmt->execute(); 
     return $stmt->fetchAll(); 
    } 
} 

?> 
+0

Hoffe, du bist bereit für einen Krieg ... es gibt eine Menge Hass gegen statische Klassen/Methoden, und es wird noch schlimmer, wenn du Singletons bringst ... – Nix

+0

Das ist okay :-) Ich bin neugierig auf das Thema und freue mich auf die Antworten, die die Menschen geben. –

Antwort

4

Solange Ihre statische Klasse Methoden und keine Daten hat, ist es nur ein Namespace. Kein Problem dort. Aber wenn Sie statische Daten haben, stoßen Sie auf die gleichen Probleme wie globale Variablen: Sie können nicht mehr das Verhalten des Systems von lokalen Informationen zu verstehen. Insbesondere in einer Umgebung mit mehreren Threads können unerwartete Verhaltensweisen und schwieriges Debugging auftreten.

+0

Das macht viel Sinn! –

1

Ich würde denken, dass das, was Sie lesen wurde bezogen auf Testen diese Klassen.

Für eine gute eingehende Erklärung zu diesem und vielem mehr, würde ich vorschlagen, dass Sie Misco's blog lesen. Ich habe festgestellt, dass sie eine wertvolle Informationsquelle darstellen.

Das grundlegende Problem mit statischen Methoden ist sie sind Verfahrenscode. Ich habe keine Idee, wie Verfahrenscode pro Einheit zu testen. Unit-Test geht davon aus, dass ich ein Stück meiner Applikation instanziieren kann isoliert. Während der Instantiierung verdrahte ich die Abhängigkeiten mit Mocks/Friendlies, die die realen Abhängigkeiten ersetzen. Mit prozeduralen Programmierung gibt es nichts zu "verkabeln" da es keine Objekte gibt, sind der Code und Daten getrennt.

+0

Ich denke, es ist ein zweiteiliges Thema, das sich mit dem Spotten statischer Klassen oder Spottungsklassen beschäftigt, die statische Methoden haben. Hauptsächlich weil man sie nicht verbinden kann. – Nix