Classi astratte con metodi statici in PHP

1

Pre: Sto guardando un progetto PHP piuttosto grande sviluppato da un'azienda che dobbiamo interagire in parte con la creazione di una nuova webapp.
L'intera applicazione è sviluppata in PHP 5.

La maggior parte delle classi in questo progetto, e in particolare tutte le classi che interagiscono con il database, sono dichiarate abstract e contengono solo static funzioni.

Prendi ad esempio questo file:

abstract class DataHelper_Command
{

    /**
     * @param unknown $id_device
     * @param unknown $latest_command_id
     * @return Command[]
     */
    public static function getCommandsToSend($id_device, $latest_command_id)
    {
        $rows = DBUtility::executePreparedQuery('SPS_COMMANDS_TO_SEND', array(":id_device" => $id_device, ":latest_command_id" => $latest_command_id));
        return DataHelper_Command::commandsFromDataTable($rows);
    }

    public static function getFW()
    {
        $rows = DBUtility::executePreparedQuery('SPS_FW_VERSION');
        return $rows;
    }

    /**
     * @param unknown $rows
     * @return Command[]
     */
    private static function commandsFromDataTable(&$rows)
    {
        $res = array();
        foreach ($rows as &$row)
        {
            $res[] = DataHelper_Command::commandFromDataRow($row);
        }

        return $res;
    }

    /**
     * @param array $row
     * @return Command
     */
    private static function commandFromDataRow(&$row)
    {
        return new Command($row["id_command"], $row["type"], $row["text"]);
    }
}

Non vedo nemmeno traccia di usare un pattern Singleton nel progetto!

Questo mi suona un po 'strano, poiché ho sempre sentito dire che usare le classi statiche è un incubo in termini di prestazioni.
Questo server doveva essere in grado di funzionare su entrambi i server Web standard e su un dispositivo embedded con prestazioni davvero limitate (un ARM in esecuzione a 400 MHz, con 128 MB di RAM).

Mi sto perdendo qualcosa qui? Ci sono casi d'uso in cui ciò è considerato una buona pratica?

    
posta GavinoGrifoni 09.12.2015 - 15:36
fonte

1 risposta

3

Le prestazioni non sono nemmeno il problema più grande qui, dipendono le dipendenze segrete e le API bugiarde.

Da un punto di vista testabile, i metodi statici sono terribili, perché di solito rappresentano uno stato globale, il che, sorprendentemente, è anche terribile, perché significa che se si esegue una funzione due volte, è possibile ottenere risultati diversi anche quando il gli input sono gli stessi (questo è lo stato globale). Come lo test?

Non riesco davvero a vedere alcun caso, dove preferirei metodi statici invece di quelli normali. Se puoi, non usarli, se devi usarli, il tuo design è molto probabilmente sbagliato e necessita di refactoring.

Verifica i discorsi sul codice pulito di Miško Hevery del 2008, sono ancora pertinenti e forniscono spiegazioni sul perché i metodi statici e i singleton dovrebbero essere evitati.

Alcuni riferimenti di YouTube ad alcuni discorsi di Miško Hevery:

risposta data 09.12.2015 - 15:44
fonte

Leggi altre domande sui tag