2015-11-14 23 views
10

Ho una classe che contiene 10 metodi. Ho sempre bisogno di utilizzare uno di questi metodi. Ora voglio sapere, quale approccio è migliore?Quando dovrei usare metodi statici?

class cls{ 
    public function func1(){} 
    public function func2(){} 
    . 
    . 
    public function func10(){} 
} 

$obj = new cls; 
$data = $obj->func3(); // it is random, it can be anything (func1, or func9 or ...) 

O

class cls{ 
    public static function func1(){} 
    public static function func2(){} 
    . 
    . 
    public static function func10(){} 
} 

cls::func3(); // it is random, it can be anything (func1, or func9 or ...) 

risposta

19

È un argomento interessante. Ti darò una risposta orientata al design.

A mio parere, non si dovrebbe mai utilizzare una classe/funzione statica in una buona architettura OOP.

Quando si utilizza statico, si tratta di chiamare una funzione senza un'istanza della classe. La ragione principale è spesso quella di rappresentare una classe di servizio che non dovrebbe essere istanziata molte volte.

vi darò 3 soluzioni (dal worste al meglio) per raggiungere tale:

Statico

una classe statica (con funzioni solo statiche) impedisce di utilizzare molte caratteristiche OOP come eredità, implementazione dell'interfaccia. Se pensi veramente a cosa sia una funzione statica, è una funzione nominata dal nome della sua classe. Hai già spazi dei nomi in PHP, quindi perché aggiungere un altro livello?

Un altro grande svantaggio è che non è possibile definire dipendenze chiare con la classe statica e le classi che la utilizzano, il che è un aspetto negativo per la manutenibilità e la scalabilità dell'applicazione.

Singleton

Un Singleton è un modo per forzare una classe di avere una sola istanza:

<?php 

class Singleton { 
    // Unique instance. 
    private static $instance = null; 

    // Private constructor prevent you from instancing the class with "new". 
    private function __construct() { 
    } 

    // Method to get the unique instance. 
    public static function getInstance() { 
     // Create the instance if it does not exist. 
     if (!isset(self::$instance)) { 
      self::$instance = new Singleton(); 
     } 

     // Return the unique instance. 
     return self::$instance; 
    } 
} 

Si tratta di un modo migliore, perché è possibile utilizzare l'ereditarietà, le interfacce e il metodo sarà chiamato su un oggetto istanziato. Ciò significa che è possibile definire contratti e utilizzare low coupling con le classi che lo utilizzano. Tuttavia alcune persone considerano lo singleton as an anti pattern soprattutto perché se si desidera avere 3 istanze della classe con proprietà di input diverse non è possibile.

Servizio

Un servizio è un'istanza di una classe standard. È un modo per razionalizzare il tuo codice. Questo tipo di architettura è chiamato SOA (architettura orientata ai servizi). Vi faccio un esempio:

Se si desidera aggiungere un metodo per vendere un prodotto in un negozio a un consumatore e si hanno classi Product, Store e Consumer. Dove dovresti istanziare questo metodo? Posso garantire che se pensi che sia più logico in una di queste tre classi oggi potrebbe essere qualsiasi altra cosa domani. Questo porta a molte duplicazioni e una difficoltà a trovare dov'è il codice che stai cercando. Invece, puoi usare una classe di servizio come ad esempio SaleHandler che saprà come manipolare le tue classi di dati.

È consigliabile utilizzare un framework che aiuti a iniettarli gli uni negli altri (dependency injection) al fine di utilizzarli al massimo delle loro potenzialità. Nella comunità PHP, ad esempio, si ha un buon esempio di implementazione di questo in Symfony2.


Per riassumere:

  • Se non si dispone di un quadro, single sono certamente una buona opzione.

  • Se si dispone di un framework, utilizzare la sua funzione di iniezione delle dipendenze per eseguire questo tipo di operazioni.

  • Non utilizzare il metodo statico. Se hai bisogno di un metodo statico in una classe, questo significa che puoi creare un nuovo singleton/servizio contenente questo metodo e iniettarlo nell'istanza delle classi che ne hanno bisogno.

+1

Quindi, invece di utilizzare una funzione che è nativa e semplice da usare, dovremmo usare singleton che è più complesso, prolisso e soggetto a errori ?. Non sono d'accordo. – magallanes

2

Quindi, v'è una differenza molto di base in static metodi.

Per utilizzare le funzioni statiche, non è necessario inizializzare la classe come oggetto. Ad esempio, Math.pow(), qui .pow() (in Java, ma la spiegazione continua a essere valida) è un metodo statico.

La regola generale è di rendere i metodi di supporto static.

Quindi, ad esempio, se si dispone di una classe matematica, non si vuole riempire il garbage collector con classi che aiutano solo altre classi più importanti.

Puoi usarlo come inizializzatori dinamici, se vuoi!

Supponiamo di avere una classe RSAEncryptionHelper, ora è generalmente possibile inizializzarla senza alcun parametro e questo genererà un oggetto con una dimensione della chiave di (diciamo) 512 bit; ma si ha anche un sovraccarico oggetto costruttore che ottiene tutti gli oggetti di altre classi:

$a = new RSAEncryptionHelper::fromPrimeSet(...); 
+0

Sì, lo sapevo, la mia domanda è, ho una classe che contiene 10 metodi. E il punto è: ho sempre bisogno di uno di quei metodi. Quindi, quale approccio è più appropriato per me? usando i metodi 'static' o scrivendo normalmente quei metodi? – stack

+2

L'utilizzo del metodo statico sarà migliore; otterrai un accesso più semplice a questi metodi, meno raccolta di dati inutili, un piccolo incremento delle prestazioni. :) – weirdpanda

+0

Ok, grazie ..! +1 – stack

1

La risposta dipende da ciò che questi metodi fanno. Se li stai utilizzando per mutare lo stato dell'oggetto a portata di mano, devi utilizzare le chiamate al metodo di istanza. Se sono funzionalità indipendenti, allora puoi usare le versioni statiche, ma poi mi chiedo perché fanno parte di una classe.

+0

ok, grazie, ma non ho capito: * ma poi mi chiederei perché fanno parte di una classe. * I metodi/funzioni – stack

+0

non devono necessariamente far parte di una classe in PHP. È difficile determinare dall'esempio semplificato, ma se sono tutti correlati alla classe e ciò che rappresenta, allora è bene avere i metodi nella classe. Se sono preoccupazioni separate, allora suddividerle sarebbe meglio. –

+0

ah vedo, grazie, +1 – stack

Problemi correlati