4 Domanda: Funzioni vs. Metodi statici

domanda creata a Fri, Jan 14, 2011 12:00 AM

Ho alcune funzioni che si occupano di cookie. Sarebbe un'idea orribile raggrupparli spostandoli in una classe a parte e usarli come metodi statici?

Funzioni:

 
function cookie_get(){}
function cookie_set(){}
function cookie_delete(){}

Metodi statici:

 
class cookie
{
    static function get(){}
    static function set(){}
    static function delete(){}
}
    
13
  1. Tieni in considerazione le solite "classi statiche /singleton sono il nemico dei test unitari" che potresti incontrare.
    2011-01-14 11: 29: 12Z
4 risposte                              4                         

Sì, sarebbe un'idea orribile perché I metodi statici sono difficili da testare e simulare . Perché non creare una vera classe di cookie che puoi configurare in fase di esecuzione con questi metodi come metodi regolari.

Se vuoi raggruppare queste funzioni in un pacchetto, puoi anche usa Namespaces .


Modifica : poiché l'hai portato nei commenti: sì, per qualsiasi scopo di test le funzioni regolari sono non testabili come statica. Quindi la tua situazione iniziale è "orribile" come cambiarla per usare una classe statica. Persino lo pseudo namespace non ti dà alcun vantaggio, perché lo hai già applicato alle tue normali funzioni. cookie_get è buono o cattivo come Cookie::get.

    
8
2017-05-23 12: 15: 24Z
  1. + 1 per aggiungere nel riferimento. Buono a sapersi.
    2011-01-14 11: 34: 17Z
  2. I namespace troppo brutti non sono disponibili fino al PHP 5.3.
    2011-01-14 11: 44: 48Z
  3. @ Gordon, mi dispiace se non ha senso, ma non sono regolari anche le funzioni statiche? Voglio dire, come è cookie::get() più statico (o più difficile da testare) di cookie_get()?
    2011-01-14 13: 05: 52Z
  4. @ Emanuil In realtà ha perfettamente senso. Poiché una classe è dichiarata nell'ambito globale, chiamare un metodo di classe staticamente equivale sostanzialmente a chiamare una funzione globale. Almeno a scopo di test, sono ugualmente cattivi. Avrai sempre un accoppiamento con l'ambito globale e non puoi prenderli in giro facilmente. Ciò significa che avere le funzioni in primo luogo è tanto grave quanto trasformarle in metodi di classe statici. Non otterrai nulla da ciò. Ma non hai chiesto se averli è una buona idea, quindi non ne ho parlato:)
    2011-01-14 13: 26: 47Z
  5. @ Gordon, grazie per il chiarimento!
    2011-01-14 14: 59: 14Z

Sarebbe una grande idea, a condizione che tu sia pienamente consapevole dei avvertimenti implicati . Questo è noto come Pattern di utilità :

  

Buoni candidati per le classi di utilità   sono metodi di convenienza che possono essere   raggruppati funzionalmente.

    
10
2017-05-23 12: 16: 58Z
  1. Grazie, è bello saperlo. Mi chiedo, però, perché donLe funzioni native di PHP lo usano. Perché il str_replace() non è str::replace()?
    2011-01-14 11: 29: 07Z
  2. PHP è un linguaggio procedurale, con le funzionalità di OOP aggiunte come ripensamenti. Si tratta di funzioni integrate (con convenzioni di denominazione altamente incoerenti) rispetto alle classi di helper statiche che raggruppano le funzioni correlate insieme.
    2011-01-14 11: 33: 27Z
  3. @ EmanuilRusev Il core dell'API PHP è mal progettato in generale, ma soprattutto quando si tratta di spazi dei nomi perché non erano disponibili fino alla recente versione di PHP5. La forma str :: replace () sarebbe sicuramente preferibile, ma dubito seriamente che qualcuno li aggiunga retroattivamente al core in qualsiasi momento nel prossimo futuro.
    2012-12-11 23: 01: 30Z

In realtà è buona pratica organizzare funzioni del genere. Un'alternativa moderna sarebbe utilizzare un spazio dei nomi .

    
9
2011-01-14 11: 24: 02Z

Sarebbe un ottimo modo per organizzare il codice, ma perché utilizzare le funzioni statiche, basta creare una classe per la funzionalità richiesta.

O come detto sopra uso gli spazi dei nomi, ma non ho una particolare familiarità con i pro /contro di essi.

$cookie->get() è più bello lavorare con cookie_get() a mio parere

    
3
2011-01-14 11: 29: 46Z
fonte posta Qui