Singleton

Une évidence qui ne m’avait pas sauté aux yeux immédiatement et qui est remontée à la surface hier alors que je regardais le code de Dotclear :

Classe Core en singleton, disponible n’importe ou dans le code.

Piqué chez JcDenis1 qui bouscule toute la structure de Dotclear et qui au passage implémente de bonnes choses comme celle-ci !

Parce qu’évidemment on n’instancie qu’une seule fois la classe dcCore et que ça permet ensuite d’utiliser dcCore::app() partout au lieu d’injecter l’instance, voire de la stocker dans une variable globale.

Exit donc les global $core; et autres $GLOBALS['core'] partout dans le code !

final class dcCore
{
    private static $instance = null;

    …

    public function __construct($driver, $host, $db, $user, $password, $prefix, $persist)
    {
        // Singleton mode
        if (self::$instance) {
            throw new Exception('Application can not be started twice.', 500);
        }
        self::$instance = $this;

        …
    }

    /**
     * Get dcCore singleton instance
     *
     * @return     dcCore
     */
    public static function app(): dcCore
    {
        return self::$instance;
    }

    …
}

Ça va donc être mis en place pour la 2.23, si j’ai suffisamment de temps avant la release dans un mois, mais sans casser l’existant, c’est-à-dire qu’on pourra continuer à utiliser la variable globale si besoin (compatibilité assurée avec les plugins et thèmes tiers).

Et il n’est pas impossible que la 2.24 suivante casse un peu les signatures des méthodes pour faire sauter ce $core passé en paramètre un peu partout.

Par ailleurs ce n’est pas la seule variable globale qui traine dans le code, je pense en particulier à $_ctx ; il va falloir que je me penche sur son cas aussi !

Plus généralement je suis en train de me dire que ça milite pour une convergence entre la version « officielle » et celle de JcDenis, pour assurer une transition plus facile du code tiers le moment venu.


  1. Ce n’est certainement pas la seule bonne idée que je vais lui piquer ;-) ↩︎

Ajouter un commentaire

Les champs suivis d'un * sont obligatoires

Les commentaires peuvent être formatés en utilisant la syntaxe Markdown Extra.

Ajouter un rétrolien

URL de rétrolien : https://open-time.net/trackback/15410

Haut de page