【问题标题】:I once read that static classes are very difficult and even impossible to debug. Is this true and why?我曾经读过静态类非常困难,甚至无法调试。这是真的吗?为什么?
【发布时间】:2010-08-06 13:43:40
【问题描述】:

我曾经读到静态类非常困难,甚至无法调试。这是真的吗?为什么?

如果举个例子有帮助,这里有一个 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();
    }
}

?>

【问题讨论】:

  • 希望你为战争做好准备......对静态类/方法有很多仇恨,当你提出单例时它会变得更糟......
  • 没关系 :-) 我对这个主题很好奇,期待人们提供的答案。

标签: language-agnostic static static-classes


【解决方案1】:

只要你的静态类有方法但没有数据,它就只是一个命名空间。那里没问题。但是如果你有静态的数据,你就会遇到和全局变量一样的问题:你不能再通过查看本地信息来理解系统的行为。特别是在多线程环境中,您可能会遇到意外行为和难以调试。

【讨论】:

    【解决方案2】:

    我认为您阅读的内容与测试这些类有关。

    如需深入了解此内容以及更多内容,我建议您阅读 Misco's 博客。我发现它们是有价值的信息来源。

    静态方法的基本问题是 它们是程序代码。我没有 想法如何对程序代码进行单元测试。 单元测试假设我可以 实例化我的应用程序的一部分 隔离中。在实例化期间 我将依赖项与 模拟/友谊赛取代 真正的依赖。有程序 编程没有什么可以“接线”的 由于没有对象,代码 和数据是分开的。

    【讨论】:

    • 我认为这是处理模拟静态类或模拟具有静态方法的类的两部分问题。主要是因为你无法连接它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    相关资源
    最近更新 更多