Однажды я прочитал, что статические классы очень сложны и даже невозможно отладить. Это правда и почему? - PullRequest
5 голосов
/ 06 августа 2010

Однажды я прочитал, что статические классы очень сложны и даже невозможно отладить. Это правда и почему?

Если пример поможет, вот класс PHP, который я использую для доступа к базе данных (хотя я не думаю, что это специфический для PHP вопрос):

<?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();
    }
}

?>

Ответы [ 2 ]

4 голосов
/ 06 августа 2010

Пока у вашего статического класса есть методы и нет данных, это просто пространство имен. Нет проблем там. Но если у вас есть статические данные , вы столкнетесь с теми же проблемами, что и глобальные переменные: вы больше не сможете понять поведение системы, глядя на локальную информацию. Особенно в многопоточной среде вы можете столкнуться с неожиданным поведением и трудной отладкой.

1 голос
/ 06 августа 2010

Я думаю, что то, что вы прочитали, было связано с тестированием этих классов.

Для хорошего подробного объяснения этого и многого другого, я бы посоветовал вам прочитать блог Misco . Я считаю, что они являются ценным источником информации.

Основная проблема со статическими методами это процессуальный кодекс. У меня нет Идея, как провести модульное тестирование процедурного кода. Юнит-тестирование предполагает, что я могу создать экземпляр моего приложения в изоляции. Во время создания Я связываю зависимости с издевательства / товарищеские матчи, которые заменяют реальные зависимости. С процедурным программировать нечего «проводу» так как нет объектов, код и данные раздельные.

...