Cominciamo con un po 'di analisi testuale, mette in evidenza da me:
corro un sito Arcade e sopra le ultimi anni
pensare a quanto si sono in grado di affrontare e con cosa si sta trattando.Comprendi anche che nel corso degli anni hai acquisito la conoscenza specifica su sito arcade in esecuzione. Hai guadagnato la professione nella tua zona. Non sottovalutare mai la tua posizione e le tue risorse, è la base da cui stai operando e introdurrai cambiamenti. Questo include la base utente del tuo sito.
Ha avuto molte caratteristiche aggiunto, è ottenuto al punto in cui la programmazione procedurale sembra proprio troppo complicato e l'aggiunta di nuove funzioni o fare semplici modifiche di progettazione possono essere molto difficile.
Se i sistemi crescono, diventano sempre più complicati. Quello è non specifico per la programmazione procedurale solo, è un dato di fatto. Poiché gestisci il sito da molti anni, sai come sono cambiate le cose, specialmente nell'area in cui l'utente si interfaccia con il tuo sito.
Perciò ho deciso di provare e ricodificare il sito da zero con le stesse caratteristiche ma in un formato OOP.
Si dice che potrebbe essere possibile utilizzare le tecniche OOP per rendere il software riutilizzabile, non c'è (e non può essere) alcuna prova di ciò.
Ma ci sono solo pochissimi esempi nello sviluppo di software commerciale in cui la riscrittura dell'intera applicazione da zero è stata un successo. Molto pochi. Le regole dello sviluppo del software commerciale potrebbero non essere applicabili nel tuo caso specifico, quindi basta dire.
Pensaci due volte prima di ricodificare il sito. Fare un sacco di lavoro solo per raggiungere lo stesso è in qualche modo infruttuoso e può essere deludente. Probabilmente invece guardi in modo più specifico quale del tuo attuale design sta introducendo il problema più grande che vorresti cambiare.
E 'possibile con PHP per mescolare procedurali e object-oriented stile, che può essere particolarmente utile quando si hanno (codice di una definizione comune di codice legacy è w/o test automatizzati) codice legacy.
Il problema che ho è in ripresa le classi,
provo a riformulare che: Per quale scrivere le classi per?
ho capito OOP e come dovrebbe funzionare, ma sembrano sempre avere problemi di iniziare.
L'inizio è sempre il passo più difficile. Sei nella posizione pronta a prendere decisioni ora, ma non puoi guardare al futuro. Ridurre il rischio eliminando la parte più rischiosa. Probabilmente hai iniziato a fare una domanda qui per ottenere un feedback su cui basare le tue decisioni, ma questo probabilmente non ridurrà l'onere e potrebbe portare a confusione.Tuttavia, essere istruiti è spesso una buona cosa.
non sono sicuro se devo essere cercando di fare le funzioni per le classi come ad esempio una classe utente con accesso a funzioni utente o se la classe utente dovrebbe essere solo per aggiungere/aggiornamento/mostra dettagli utente e il log in parte sarebbe meglio in una classe di sistema?
Ciò dipende in gran parte dalla natura dell'applicazione e dalla natura dell'utente. Probabilmente la maggior parte del tuo script ha solo bisogno di sapere se un utente è concreto o anonimo (un utente anonimo non ha effettuato il login), è ID, nome o nickname.
L'applicazione deve fornire tale utente a qualsiasi componente che consuma, quindi ogni comando/script non deve occuparsi di a) ottenere informazioni e gestire gli utenti (come l'accesso), b) verificare se il componente è valido per l'utente utente (controllo di accesso). Questo dovrebbe essere collocato altrove, ad es. nello application controllerPofEAA.
Ciascuno degli script/comandi con l'oggetto controller dell'applicazione può chiedere all'utente e interagire con l'utente.
Tuttavia, questo è solo tecnicamente parlando. Affronta il fatto che tu stesso non sei sicuro, lavora con quella informazione. Cerca di formulare meglio il tuo problema concreto, elencare vantaggi e svantaggi per un modo specifico di risolverlo, allontanati di nuovo dal codice concreto prima di iniziare a codificare. Quindi confrontare i pro ei contro. Cerca di rendere le cose più semplici e meno complicate.
Probabilmente scrivere in parole semplici cosa dovrebbe accadere invece di scrivere codice.
Al momento ho iniziato con la classe seguente e funzioni ma si inseriscono in questa categoria **? **
Il codice è abbastanza spoglia, quindi è difficile per dire molto - specialmente perché non so qual è il tuo sito arcade (e di che categoria si scrive). È ancora buono per un esempio, probabilmente. Ciò che può essere visto nei tuoi corsi è che tu integri strettamente tutto l'uno con l'altro.
Ad esempio, si inizia con il DB. Questo è comune, perché il DB è un componente centrale per qualsiasi applicazione. L'applicazione richiede il funzionamento del DB. Tuttavia, si desidera mantenere le cose liberamente accoppiate in modo che tutti i comandi possano essere eseguiti con un altro DB o un nuovo oggetto utente collegato a qualche altro DB rispetto al resto degli oggetti dati dell'applicazione.
$application->getDB();
Poiché l'utente è un argomento così centrale in ciascuna applicazione, dovrebbe avere un'interfaccia molto semplice. Tutti i dettagli di gloria sull'autenticazione, recupero delle proprietà degli utenti, ecc dovrebbero essere delegate in un'altra classe/componente, in modo da poter modificare l'implementazione in cui sono memorizzati gli utenti e come si autenticano:
/**
* @package command.modules.games
*/
function ListGamesCommand(Request $request, Response $response)
{
$application = $request->getApplication();
$user = $application->getSession()->getUser();
$games = $application->getModels()->build('games');
$games = $games->findByUser($user);
$response->setProp('games', $games);
}
come mostra questo esempio , puoi aggiungere la funzionalità quando ne hai bisogno. Per esempio. finché l'applicazione non ha bisogno di accedere effettivamente agli utenti, perché preoccuparsi di come è scritta ora?
Creare una fabbrica che sta producendo l'utente per l'oggetto applicazione - qualunque cosa avrà bisogno ora o in futuro (vedere le due pile di oggetti in The Clean Code Talks — Inheritance, Polymorphism, & Testing). Se è quindi necessaria l'autenticazione, aggiungerla all'oggetto di sessione o all'interfaccia dell'oggetto utente.
L'autenticazione stessa sarebbe comunque implementata in una classe a sé stante, il Authenticator
. Quindi puoi rivedere le tue interfacce anche in seguito, spostando l'invocazione dell'autenticazione dalla sessione all'utente o da qualsiasi altra cosa. Solo una minima parte dei tuoi comandi dovrà occuparsi di questi compiti specifici e poiché tutto il nuovo codice è sottoposto a test automatici, poiché desideri riscrivere e trarre vantaggio da OOP, hai assicurato che tutti i luoghi siano coperti e adeguatamente riprogettati.
Lo stesso vale per l'accesso alle variabili di richiesta. Se vuoi sfruttare i vantaggi di OOP - che è altamente connesso con l'indirezione (e ogni livello di riferimento indiretto ha un prezzo) - devi prima di tutto operare le tue classi base su dati specifici e non su dati (come globals e superglobals, ho visto $_POST
nel tuo codice di esempio).
Quindi attivare il nuovo codice di operare su una richiesta e offrire una risposta (ingresso - Processing - Output):
$request = new Request($_SERVER, $_GET, $_POST, $_COOKIE, $_FILES, $_ENV);
$response = new Response;
esempio tratto dal BankAccount - Sample application used for PHPUnit training
Ora tutto sotto di questo può funzionare su un Request
e un oggetto Response
- input di processo e trasformarlo in uscita. Il comando di dominio (i tuoi script/comandi che eseguono la cosa) non devono più preoccuparsi di estrarre l'input dalla richiesta HTTP come utilizzando $_POST
o $_GET
possono prenderlo direttamente dallo Request
- o se scrivi una classe di comandi propri - questo può essere ancora più personalizzato. E alcuni comandi possono operare su richieste e risposte proprie.
Il prossimo grande argomento è l'interfaccia utente. Si scrive che si desidera:
ho deciso di provare a ricodificare il sito da zero con le stesse caratteristiche, ma in un formato OOP.
Ho già scritto che una tale azione può essere infruttuosa. Avere un vantaggio del codice OOP significherebbe che la prossima volta che si cambia il codice, si è ancora in grado di riutilizzare i componenti. Poiché il software cambia costantemente, questa volta è già la prossima volta. Quindi vuoi riutilizzare già il codice esistente. Presumo che una parte del codice esistente sia la logica di output. Quindi la logica di uscita esistente deve interfacciarsi con l'esemplare Request
e Response
precedente.
Scommetto che ami i siti web. Ti piace farli funzionare e sembrano grandi. Hai costruito il tuo sito nel corso degli anni e anche se non tutto è come vorresti che fosse, non vuoi lasciarlo cadere. Quindi è fondamentale per la tua riscrittura che non distruggi tutto ma puoi preservare la sua forma di lavoro da ora al futuro (Vedi anche Preserve a Working Application; last point of the list).
In webapps la vista è una parte così cruciale. Se perdi la vista, il tuo sito perderà la sua identità.Se ne modifichi troppo, il tuo sito perderà gli utenti che sono a loro agio nell'usarlo oggi.
Se lo rompi,
- vi accorgono neppure?
- puoi aggiustarlo?
D'altra parte si desidera il codice dell'applicazione (le caratteristiche, le funzionalità) per non essere così strettamente legata ad essa più per avere un beneficio nel riscrivere il codice. Come si vuole riscrivere la vostra applicazione, diamo uno sguardo:
.---------. .-------------.
| website | ---> [interface in ] ---> | application |
| user | <--- [interface out] <--- | |
`---------´ `-------------´
Come questo schema mostra, per rendere l'applicazione più indipendente a tutto ciò che l'interazione si presenta come (può essere un sito web, una GUI (smartphone) o sistema di ticketing), il codice dell'applicazione dovrebbe essere sostituibile. Non si desidera codificare la logica per ottenere giochi per gli utenti, ad esempio per ogni tipo di interfaccia utente nel nuovo codice dell'applicazione, ma si è fatto nel vecchio codice dell'applicazione.
Prendendo come esempio l'oggetto User
. Il modo in cui si autentica e dove viene memorizzato non dovrebbe essere qualcosa a cui il nuovo codice dei comandi dell'applicazione è preoccupato. È lì solo se il comando ne ha bisogno. Non globalmente ma specificamente se il comando lo richiede.
Dove-come le procedure di registrazione e password perse fanno parte dell'applicazione esistente e continuano ad esistere.
Ora è necessario riunire il vecchio e il nuovo codice.
Quindi probabilmente inizierai con un'interfaccia per le richieste HTTP e una risposta HTTP. La visualizzazione inizia con Interface Out. Assegni/passi tutti i dati necessari per la vista tramite tale interfaccia, la tua applicazione non conosce la vista più a lungo. Non ti occupi di alcun codice CSS, Javascript o HTML all'interno del tuo nuovo codice applicazione. Questo è solo lo zucchero in cima per l'output. La tua applicazione dovrebbe interfacciarsi anche tramite console/telnet in formato testo o come servizio XMLRPC remoto, endpoint AJAX - qualunque cosa.
Quindi è possibile semplicemente generalizzare il proprio codice di vista e inserire variabili in esso. Scrivere un livello di visualizzazione potrebbe essere semplice come includere un file PHP. Funziona su variabili disponibili all'interno del suo ambito. Può utilizzare le funzioni "helper" (macro modello) disponibili nel suo ambito. Può utilizzare visualizzare gli oggetti del modello. È anche possibile scrivere la propria lingua per la visualizzazione (lingua dei modelli, una lingua di dominio specifica (DSL)).
Ma ciò è possibile solo se si crea un'interfaccia che consenta al codice dell'applicazione di farlo.
Quindi quello che fai ora è spostare via HTTP/HTML/CSS/JS dalla tua applicazione in un adattatore di sua proprietà. Tale adattatore è in grado di formulare il comando generico che può essere passato a qualsiasi applicazione tramite l'interfaccia in.
L'applicazione si occuperà solo di eseguire il comando e consegnare la risposta tramite interfaccia. Quindi hai ora due domini: la tua applicazione e il sito web.
È possibile iniziare a creare questi due nuovi domini e quindi offrire un'interfaccia in entrata e in uscita per il codice legacy e uno per il nuovo codice.
Si dispone anche di "due" applicazioni una accanto all'altra. Finalmente sono legati insieme (invisibili nel loro codice) con il tuo database che si occupa di tenere in ordine i dati del tuo sito. E questo è ciò che il database è per. Separa i dati dal tuo codice, così puoi cambiare il tuo codice nel tempo.
Inoltre, se si desidera ricodificare, tracciare un bordo tra il codice esistente e il nuovo codice.
Buona fortuna! E spero di leggere questo ti mostrerà alcune opzioni per il tuo caso specifico. Si noti inoltre che non si trasformano i controller in un'altra facciata del database. Probabilmente hai i migliori benefici (non conosci il tuo più grande problema concreto) utilizzando una leggera astrazione HTTP e un livello di visualizzazione solo come potrebbe essere che la tua applicazione sia solo per i siti web.
Perché, come in HTTP/PHP:
[Interface In] Plain Text HTTP request
[Application] Free to go
[Interface Out] Plain Text HTTP response
di solito usati solo alcune funzionalità per analizzare l'input e l'output costruire.
Inoltre, l'assenza di modelli di grasso ha il vantaggio di accedere ai dati rapidamente e in modo sequenziale, ad es. se non è necessario passare l'output in una sola volta (bufferizzato, un blocco), è possibile trarre vantaggio dal flusso dell'output sul server.
È necessario decidere quali parti sono importanti per il refactoring per la propria applicazione, non per OOP o meno. Come procedurale, anche l'OOP deve essere fatto bene. Se oggi ti imbatti in problemi scrivendo codice procedurale, il codice OOP potrebbe non essere la risposta al tuo problema. Potrebbe essere necessario scrivere un codice procedurale migliore. Solo dicendo, non è facile refactoring di un'applicazione e si dovrebbe identificare il problema reale prima.
- Se lo rompi, te ne accorgi?
- Se lo rompi, puoi aggiustarlo?
La parte cruciale è che puoi notare e che hai tutto a portata di mano per fare la correzione.
Ottieni il tuo sito Web sotto test, in modo che tu possa dire se cambiare codice qui o là sta effettivamente facendo del bene. Essere in grado di trasformare qualsiasi cambiamento in caso di luce non funziona (meglio).
Ciò consente di decidere facilmente una nuova funzione o meno. Finché non è necessario introdurre nuove funzionalità, non è necessario modificare nulla nella modalità di scrittura delle funzioni. E fino a lì, non puoi pianificare le nuove funzionalità.
Quindi meglio pensarci due volte prima di riscrivere l'applicazione. Come scritto, questo può uccidere il progetto.
Vedere anche:How to implement MVC style on my PHP/SQL/HTML/CSS code?SO Q&A
ho le funzioni codificate ma semplificare questo esempio sono stati rimossi. – Dan