2010-08-06 17 views
5

J'ai lu une fois que les classes statiques sont très difficiles et même impossibles à déboguer. Est-ce vrai et pourquoi?J'ai lu une fois que les classes statiques sont très difficiles et même impossibles à déboguer. Est-ce vrai et pourquoi?

Si un exemple aiderait, voici une classe PHP j'utiliser pour accéder à une base de données (je ne pense pas que ce soit une question spécifique à PHP, cependant):

<?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

Espérons que vous êtes prêt pour une guerre ... il y a beaucoup de haine envers les classes/méthodes statiques, et cela devient encore pire quand vous évoquez des singletons ... – Nix

+0

Ça va :-) Je suis curieux de connaître le sujet et attendons avec impatience les réponses que les gens fournissent. –

Répondre

4

Tant que votre classe statique a des méthodes et aucune donnée, c'est juste un espace de noms. Pas de problème là-bas. Mais si vous avez des données statiques, vous rencontrez les mêmes problèmes que les variables globales: vous ne pouvez plus comprendre le comportement du système à partir des informations locales. Particulièrement dans un environnement multithread, vous pourriez avoir un comportement inattendu et un débogage difficile.

+0

Cela a beaucoup de sens! –

1

Je pense que ce vous avez lu était lié à tests ces classes.

Pour une bonne explication approfondie à ce sujet et beaucoup plus, je vous suggère de lire Misco's blog. Je les ai trouvés pour être une source précieuse d'information.

Le problème de base avec les méthodes statiques est il s'agit d'un code de procédure. Je n'ai aucune idée comment tester l'unité de code de procédure. Les tests unitaires supposent que je peux instancier un morceau de mon application en isolation. Pendant l'instanciation je fil les dépendances avec mocks/friendlies qui remplacent les dépendances réelles. Avec la programmation de programmation il n'y a rien à "fil" car il n'y a pas d'objets, le code et les données sont séparées.

+0

Je pense que c'est un problème en deux parties traitant de moquer des classes statiques ou des classes moqueuses qui ont des méthodes statiques. Principalement parce que vous ne pouvez pas les interfacer. – Nix