Best practice nei metodi helper / util: contenitore IoC o metodi statici?

3

Quindi sto sviluppando un'applicazione che utilizza un contenitore IoC. Ora ho bisogno di alcuni metodi di supporto per la manipolazione degli array come set, get, ecc. Vedo due possibili modi per andare:

  1. Uso di una classe con metodi statici.
  2. Uso di una classe con metodi non statici registrati nel contenitore IoC.

Quando usi il metodo 1, sarà simile a questo:

$arr = array(); // Defining $arr
Arr::set($arr, 'a', 'b'); // Sets 'a' => 'b' in $arr
echo Arr::get($arr, 'a'); // Outputs 'b'

E usando il metodo 2, per prima cosa registrerò una nuova classe Arr nel contenitore IoC, e il suo utilizzo sarebbe simile a questa:

$arr = array(); // Defining $arr
$app['arr']->set($arr, 'a', 'b'); // Sets 'a' => 'b' in $arr
echo $app['arr']->get($arr, 'a'); // Outputs 'b'

Secondo i miei benchmark, il metodo 1 è quasi due volte più veloce del metodo 2. Quindi in termini di metodo di esecuzione 1 è la strada da percorrere (credo). Ma i metodi statici sono generalmente considerati cattive pratiche. Quindi, in termini di best practice, dovrei usare il metodo 2 per evitare metodi statici.

La mia domanda è se dovrei usare il contenitore IoC per i metodi di supporto o semplicemente usare i metodi statici.

    
posta Jacob van Eijk 06.12.2015 - 02:22
fonte

2 risposte

6

Non c'è niente di sbagliato con i metodi statici. Questa è una di quelle cose che la gente dice di sembrare intelligente e scioccante, ma la realtà è molto più sottile e non può essere spiegata nel titolo di un post sul blog!

Quindi perché non i metodi statici? I metodi statici non possono essere parte di un contratto. Ciò significa che non è possibile implementare più di una versione e non è possibile scambiare senza problemi quelle versioni dietro il contratto. Il fatto è che potrebbe non avere importanza. Avresti mai avuto bisogno di più di una versione di una funzione matematica minima? Spero di no.

Fai attenzione però, non è sempre semplice decidere se hai bisogno di più di una versione di una funzione. Prendi la manipolazione dei file. Dovresti avere sempre solo bisogno di una versione di quelle funzioni, giusto? Bene, ehm, no. Il problema si presenta quando vuoi testare il tuo codice. Supponiamo che tu abbia un piccolo frammento di codice che vuoi testare e che abbia una dipendenza da una funzione di file. Testare quel codice diventa complicato se il tuo sistema non è configurato esattamente come lo sviluppatore che ha originariamente scritto il test. Forse ti manca un file o il tuo file è leggermente diverso o le tue autorizzazioni di file sono diverse o ... Diventa complicato abbastanza veloce. Presto, ti rendi conto che stai testando quella stupida funzione di file più di quanto stai testando la funzione che dipende da esso. Non va bene.

La soluzione è fornire una seconda versione della funzione file che sia perfettamente prevedibile. Se si comporta sempre allo stesso modo, sei libero di testare il codice che dipende da esso senza preoccuparti che potrebbe zigare quando ti aspetti di zagare. Problema risolto; ma ricorda, non puoi avere due versioni di un metodo statico.

Quindi torna alla tua domanda. Dirò questo:

  1. Non preoccuparti delle prestazioni finché non hai confermato che si tratta di un problema. Il codice bello e mantenibile è più importante delle prestazioni a questo punto del gioco.
  2. La manipolazione delle matrici è un candidato perfetto per i metodi statici. Non avrai mai bisogno di più di una versione perché ci dovrebbe essere solo un modo per eseguire le attività che stai definendo e non ci sono dipendenze che rovinino il test sul file system, sul database, sulla rete, ecc ...
risposta data 06.12.2015 - 04:32
fonte
1

In entrambi i casi funziona. Personalmente, ho scritto classi simili per cose come la manipolazione degli array e le funzioni matematiche. Ho usato metodi statici perché quelle cose sono vere funzioni e non operano su dati incapsulati, quindi sembrava avere un senso più concettuale. Inoltre, non volevo istanziare un oggetto ogni volta che chiamavo uno di questi metodi.

Alcuni dicono di evitare metodi statici. È vero che possono avere un rovescio della medaglia. La mia opinione personale è che i metodi statici vanno bene per cose come le classi di utilità come quello che sembra scrivere.

    
risposta data 06.12.2015 - 03:34
fonte