5

静的クラスは非常に難しく、デバッグすることさえ不可能であると読んだことがあります。これは本当ですか、なぜですか?

例が役立つ場合は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();
    }
}

?>
4

2 に答える 2

4

静的クラスにメソッドがあり、データがない限り、それは単なる名前空間です。問題ありません。しかし、静的データがある場合は、グローバル変数と同じ問題に遭遇します。ローカル情報を見てシステムの動作を理解できなくなります。特にマルチスレッド環境では、予期しない動作や困難なデバッグが発生する可能性があります。

于 2010-08-06T13:49:49.487 に答える
1

あなたが読んだことは、それらのクラスのテストに関連していると思います。

これに関する詳細な説明については、 Misco のブログを読むことをお勧めします。貴重な情報源であることがわかりました。

静的メソッドの基本的な問題は、それらが手続き型のコードであることです。手続き型コードを単体テストする方法がわかりません。単体テストは、アプリケーションの一部を分離してインスタンス化できることを前提としています。インスタンス化中に、実際の依存関係を置き換えるモック/フレンドリーで依存関係を配線します。手続き型プログラミングでは、オブジェクトがなく、コードとデータが分離されているため、「配線」する必要はありません。

于 2010-08-06T13:46:15.307 に答える