zucchero sintattico in PHP con funzioni statiche

2

Il problema che sto affrontando è: dovrei usare le classi statiche per i componenti di un'applicazione solo per ottenere API più belle?

Esempio: il modo "normale":

// example component
class Cache{
  abstract function get($k);
  abstract function set($k, $v);
}

class APCCache extends Cache{
  ...
}    

class application{

  function __construct()
    $this->cache = new APCCache();
  }

  function whatever(){
    $this->cache->add('blabla');
    print $this->cache->get('blablabla');
  }

}

Nota quanto è brutto this->cache->... . Ma diventa più brutto quando cerchi di rendere l'applicazione estensibile tramite plugin, perché devi passare l'istanza dell'applicazione ai suoi plugin e ottieni $this->application->cache->...

Con funzioni statiche:

interface CacheAdapter{
  abstract function get($k);
  abstract function set($k, $v);
}

class Cache{

  public static
    $ad;

  public function setAdapter(CacheAdapter $a){
    static::$ad = $ad;
  }

  public static function get($k){
    return static::$ad->get($k);
  }

  ...

}

class APCCache implements CacheAdapter{
  ...
}


class application{

  function __construct(){
    cache::setAdapter(new APCCache);
  }

  function whatever()    
    cache::add('blabla', 5);
    print cache::get('blabla');
  }

}

Qui sembra più bello perché basta chiamare cache::get() ovunque. Lo svantaggio è che perdo la possibilità di estendere questa classe facilmente. Ma ho aggiunto un metodo setAdapter per rendere la classe estendibile ad un certo punto. Sto facendo affidamento sul fatto che non avrò bisogno di riscrivere per sostituire il wrapper della cache, mai, e che non avrò bisogno di eseguire più istanze di applicazioni simultaneamente (è fondamentalmente un sito - e nessuno lavora con due siti al stessa ora)

Quindi, sto sbagliando?

    
posta Anna 09.10.2012 - 14:16
fonte

3 risposte

4

Penso che le tue intenzioni siano buone, ma forse non il metodo. Innanzitutto, consideriamo l'ovvio:

I'm relying on the fact that I won't need to rewrite to replace the cache wrapper, ever, and that I won't need to run multiple application instances simultaneously (it's basically a site - and nobody works with two sites at the same time)

Queste sono ipotesi . A volte le ipotesi sono valide, a volte non lo sono, e quando non lo sono, fanno male . In generale, rimuovere la flessibilità non è un'idea particolarmente bella. Molti progetti di grandi dimensioni iniziano come "dammi solo una pagina in cui posso acquisire X", quindi non essere così frettoloso da prevedere il futuro.

Ancora più importante, potresti andare contro pratiche standard. C'è molto da dire per le convenzioni e gli standard. Sono lontano da un esperto di PHP, ma da quello che ho visto, "$ this- >" è il tipo di schema che gli sviluppatori imparano a ignorare dopo un po 'di pratica. Vale veramente la pena fare a meno di accorciarlo un po '? Se prendiamo per scontato quel bit, solo il commento del plugin rimane con "$ this- > application- > cache". C'è qualche ragione per cui una variabile cache non può essere impostata in questo caso per accorciarla in "$ this- > cache"?

Quanto sopra è solo una guida generale, ma in realtà ciò di cui dovremmo davvero parlare qui è l'iniezione di dipendenza. Le varie classi non dovrebbero essere consapevoli di quale cache stanno utilizzando, ma solo che hanno una cache e che è possibile accedervi tramite $ this- > cache. Facendo riferimento a un'implementazione statica, stai violando questa regola e, proprio per questo, è una brutta cosa.

Per riassumere, direi - prova ad abbreviare il codice a $ this- > cache dove puoi, ma non di più. Credo che la sintassi sia abbastanza idiomatica in PHP, e andare oltre non è necessario.

Modifica: dovrei aggiungere "non ingannare le piccole cose" - penso davvero che tu stia pensando troppo a questo problema (anche se ti ho assecondato e aggiunto il mio fondamento logico). Questo è un problema relativamente insignificante di cui preoccuparsi, e sono sicuro che ci sono modi migliori per spendere le tue energie:)

    
risposta data 09.10.2012 - 15:50
fonte
2

Se pensi che una caratteristica della lingua principale sia brutta, finirai per scrivere codice molto scadente cercando di evitarlo. Per favore basta andare oltre o passare a un'altra lingua più adatta al tuo stile.

Qualcos'altro ci ferisce tutti.

    
risposta data 09.10.2012 - 20:25
fonte
1

Beh, dipende da come verrà utilizzata la tua classe e in quale contesto.

Con il rischio di essere svalutato da alcuni, ti consiglio di dare un'occhiata a 2 modelli di progettazione che potrebbero aiutarti:

risposta data 09.10.2012 - 14:35
fonte

Leggi altre domande sui tag