Chi ha bisogno di singoli in PHP?
Si noti che quasi tutte le obiezioni ai singoli derivano da punti di vista tecnici, ma sono anche MOLTO limitate nel loro campo di applicazione. Soprattutto per PHP. In primo luogo, elencherò alcuni dei motivi per utilizzare i singleton, quindi analizzerò le obiezioni all'utilizzo dei singleton. Innanzitutto, le persone che ne hanno bisogno:
- Le persone che stanno codificando un framework / codebase di grandi dimensioni, che verranno utilizzate in molti ambienti diversi, dovranno lavorare con framework / codebase diversi esistenti in precedenza, con la necessità di implementare molte richieste diverse, mutevoli e persino stravaganti da parte di clienti / capi / dirigenti / unità fanno.
Vedi, il modello singleton è auto-inclusivo. Al termine, una classe singleton è rigida su qualsiasi codice in cui la includi e si comporta esattamente come hai creato i suoi metodi e variabili. Ed è sempre lo stesso oggetto in una determinata richiesta. Dal momento che non può essere creato due volte per essere due oggetti diversi, sai qual è un oggetto singleton in un dato punto di un codice - anche se il singleton è inserito in due, tre diverse, vecchie, persino basi di spaghetti. Pertanto, rende più facile in termini di scopi di sviluppo - anche se ci sono molte persone che lavorano in quel progetto, quando vedi un singleton inizializzato in un punto in una data base di codice, sai cosa è, cosa fa, come e lo stato in cui si trova. Se fosse la classe tradizionale, dovresti tenere traccia di dove è stato creato l'oggetto, quali metodi sono stati invocati in esso fino a quel punto nel codice e il suo stato particolare. Ma lascia cadere un singleton lì, e se hai abbandonato i metodi di debug e informazioni e il monitoraggio nel singleton durante la codifica, sai esattamente di cosa si tratta. Quindi, rende più facile per le persone che devono lavorare con basi di codice diverse, con la necessità di integrare il codice che è stato fatto in precedenza con filosofie diverse o fatto da persone con cui non si ha alcun contatto. (vale a dire, fornitore-progetto-azienda-qualunque cosa non ci sia più, nessun supporto nulla). rende più facile per le persone che devono lavorare con basi di codice diverse, con la necessità di integrare il codice che è stato fatto in precedenza con filosofie diverse o fatto da persone con cui non si ha alcun contatto. (vale a dire, fornitore-progetto-azienda-qualunque cosa non ci sia più, nessun supporto nulla). rende più facile per le persone che devono lavorare con basi di codice diverse, con la necessità di integrare il codice che è stato fatto in precedenza con filosofie diverse o fatto da persone con cui non si ha alcun contatto. (vale a dire, fornitore-progetto-azienda-qualunque cosa non ci sia più, nessun supporto nulla).
- Persone che devono lavorare con API , servizi e siti Web di terze parti .
Se guardi più da vicino, questo non è troppo diverso dal caso precedente: API, servizi, siti Web di terze parti sono proprio come basi di codice isolate e esterne sulle quali NON hai controllo. Tutto può succedere. Quindi, con una sessione / classe utente singleton, puoi gestire QUALSIASI tipo di implementazione di sessione / autorizzazione da fornitori di terze parti come OpenID , Facebook , Twitter e molti altri - e puoi fare TUTTI allo stesso tempo dall'oggetto SAME singleton - che è facilmente accessibile, in uno stato noto in qualsiasi momento in qualunque codice lo si inserisca. Puoi persino creare più sessioni per più API / servizi di terze parti diversi per l'utente SAME nel tuo sito Web / applicazione e fare qualsiasi cosa tu voglia fare con loro.
Naturalmente, tutto ciò può anche essere tonificato con metodi tradizionali usando normali classi e oggetti: il problema è che singleton è più ordinato, più ordinato e quindi a causa di ciò gestibile / testabile più facile rispetto all'utilizzo tradizionale di classe / oggetto in tali situazioni.
- Le persone che hanno bisogno di fare un rapido sviluppo
Il comportamento globale dei singleton semplifica la creazione di qualsiasi tipo di codice con un framework che ha una raccolta di singleton su cui basarsi, perché una volta costruite bene le tue classi singleton, i metodi stabiliti, maturi e impostati saranno facilmente disponibili e utilizzabile ovunque, in qualsiasi momento, in modo coerente. Ci vuole un po 'di tempo per maturare le tue lezioni, ma dopo ciò sono solide, coerenti e utili. Puoi avere tutti i metodi in un singleton che fanno quello che vuoi e, sebbene ciò possa aumentare l'impronta di memoria dell'oggetto, porta molti più risparmi di tempo richiesti per un rapido sviluppo - un metodo che non stai usando in una determinata istanza di un'applicazione può essere utilizzata in un'altra integrata, e puoi semplicemente dare uno schiaffo a una nuova funzionalità che il client / capo / project manager richiede solo poche modifiche.
Ti viene l'idea. Ora passiamo alle obiezioni ai singoli e alla cattiva crociata contro qualcosa di utile :
- La principale obiezione è che rende i test più difficili.
E davvero, lo fa in una certa misura, anche se può essere facilmente mitigato prendendo le dovute precauzioni e codificando le routine di debug nei singoli con la consapevolezza che eseguirai il debug di un singleton. Ma vedi, questo non è troppo diverso da QUALSIASI altra filosofia / metodo / modello di codifica che è là fuori - è solo che, i singoli sono relativamente nuovi e non molto diffusi, quindi gli attuali metodi di test stanno comparando incompatibilmente con loro. Ma questo non è diverso in nessun aspetto dei linguaggi di programmazione: stili diversi richiedono approcci diversi.
Un punto in cui questa obiezione è piatta in quanto, ignora il fatto che le ragioni sviluppate dalle applicazioni non sono per il "test", e il testing non è l'unica fase / processo che va allo sviluppo di un'applicazione. Le applicazioni sono sviluppate per l'uso in produzione. E come ho spiegato nella sezione "Chi ha bisogno di singoli", i singoli possono tagliare un GRANDE affare dalla complessità di dover far funzionare un codice CON e ALL'INTERNO molti diversi database / applicazioni / servizi di terze parti. Il tempo che può andare perso durante i test è il tempo guadagnato nello sviluppo e nella distribuzione. Ciò è particolarmente utile in questa era di autenticazione / applicazione / integrazione di terze parti: Facebook, Twitter, OpenID, molti altri e chissà cosa ci aspetta.
Sebbene sia comprensibile, i programmatori lavorano in circostanze molto diverse a seconda della loro carriera. E per le persone che lavorano in aziende relativamente grandi con dipartimenti definiti che curano software / applicazioni diverse e definite in modo confortevole e senza l'imminente castigo di tagli / licenziamenti del budget e la necessità che ne consegue di fare MOLTE cose con molte cose diverse in una moda economica / veloce / affidabile, i singoli non possono sembrare così necessari. E può anche essere fastidio / impedimento a ciò che hanno già.
Ma per coloro che hanno bisogno di lavorare nelle sporche trincee dello sviluppo 'agile', dovendo implementare molte richieste diverse (a volte irragionevoli) dal loro cliente / manager / progetto, i singoli sono una grazia salvifica per ragioni spiegate in precedenza.
- Un'altra obiezione è che la sua impronta di memoria è maggiore
Poiché esiste un nuovo singleton per ogni richiesta di ciascun client, questo potrebbe essere un'obiezione per PHP. Con singleton mal costruiti e usati, l'impronta di memoria di un'applicazione può essere maggiore se molti utenti sono serviti dall'applicazione in un dato punto.
Tuttavia, questo è valido per QUALSIASI tipo di approccio che puoi adottare durante la codifica delle cose. Le domande che dovrebbero essere poste sono: i metodi, i dati che sono conservati ed elaborati da questi singoli non sono necessari? Perché, se SONO necessari in molte delle richieste che sta ricevendo l'applicazione, allora anche se non si usano i singoli punti, tali metodi e dati saranno presenti nell'applicazione in un modo o nell'altro attraverso il codice. Quindi, tutto diventa una questione di quanta memoria risparmierai, quando inizializzi un oggetto di classe tradizionale 1/3 nell'elaborazione del codice e lo distruggi per 3/4 in esso.
Vedi, in questo modo, la domanda diventa piuttosto irrilevante - non dovrebbero esserci metodi non necessari, i dati conservati negli oggetti nel tuo codice in ogni caso - indipendentemente dal fatto che tu usi singleton o meno. Quindi, questa obiezione ai singoli diventa davvero esilarante in questo, ASSUNTA che ci saranno metodi non necessari, dati negli oggetti creati dalle classi che usi.
- Alcune obiezioni non valide come "rende impossibile / più difficile mantenere connessioni multiple al database"
Non riesco nemmeno a comprendere questa obiezione, quando tutto ciò che serve è mantenere più connessioni al database, selezioni multiple di database, query multiple di database, più set di risultati in un dato singleton, è semplicemente tenerli in variabili / array nel singleton fintanto che sono necessari. Questo può essere semplice come tenerli negli array, sebbene tu possa inventare qualunque metodo tu voglia usare per farlo. Ma esaminiamo il caso più semplice, l'uso di variabili e array in un dato singleton:
Immagina che il seguito sia all'interno di un singolo singleton del database:
$ this -> connections = array (); (sintassi errata, l'ho appena digitata in questo modo per darti l'immagine - la dichiarazione corretta della variabile è public $ connections = array (); e il suo utilizzo è $ this-> connections ['connectionkey'] naturalmente)
In questo modo è possibile configurare e mantenere più connessioni in qualsiasi momento in un array. E lo stesso vale per le query, i set di risultati e così via.
$ this -> query (QUERYSTRING, 'queryname', $ this-> connections ['particulrconnection']);
Che può semplicemente fare una query su un database selezionato con una connessione selezionata e archiviarlo nel tuo
$ questo -> risultati
array con la chiave "nome query". Ovviamente, dovrai codificare il tuo metodo di query per questo, il che è banale da fare.
Ciò consente di mantenere un numero virtualmente infinito di (quanto i limiti delle risorse ovviamente consentono) diverse connessioni al database e set di risultati tanto quanto è necessario. E sono disponibili per QUALSIASI pezzo di codice in un dato punto in una data base di codice in cui questa classe singleton è stata istanziata.
Naturalmente, dovresti naturalmente liberare i set di risultati e le connessioni quando non sono necessari, ma questo è ovvio, e non è specifico per i singleton o qualsiasi altro metodo / stile / concetto di codifica.
A questo punto, puoi vedere come puoi mantenere più connessioni / stati verso applicazioni o servizi di terze parti nello stesso singleton. Non così diverso.
Per farla breve, alla fine, i modelli singleton sono solo un altro metodo / stile / filosofia con cui programmare, e sono utili come QUALUNQUE altro quando vengono usati nel posto giusto, nel modo giusto. Che non è diverso da qualsiasi cosa.
Noterai che nella maggior parte degli articoli in cui i singoli vengono colpiti, vedrai anche riferimenti a "globi" che sono "malvagi".
Ammettiamolo: TUTTO ciò che non viene usato correttamente, abusato, abusato, È malvagio. Ciò non si limita a nessuna lingua, nessun concetto di codifica, alcun metodo. Ogni volta che vedi qualcuno che rilascia dichiarazioni coperte come "X is evil", scappa da quell'articolo. È molto probabile che sia il prodotto di un punto di vista limitato - anche se il punto di vista è il risultato di anni di esperienza in qualcosa di particolare - che generalmente finisce per essere il risultato di lavorare troppo in un determinato stile / metodo - tipico conservatorismo intellettuale.
Per questo si possono dare infiniti esempi, che vanno da "i globi sono cattivi" agli "iframe sono cattivi". Circa 10 anni fa, persino proporre l'uso di un iframe in una data applicazione era un'eresia. Poi arriva Facebook, iframe ovunque, e guarda cosa è successo: gli iframe non sono più così malvagi.
Ci sono ancora persone che insistono ostinatamente sul fatto che sono "malvagie" - e talvolta anche per buone ragioni - ma, come puoi vedere, c'è bisogno, gli iframe soddisfano quel bisogno e funzionano bene, e quindi il mondo intero va avanti.
La principale risorsa di un programmatore / programmatore / ingegnere del software è una mente libera, aperta e flessibile.