Ottenimento di più attività all'interno di un ciclo

2

In relazione a ciò che è considerato un buon principio di progettazione OOP, SOLID, DRY, KISS ecc Mi chiedo se completare più attività all'interno di un ciclo quando è facile.

Il problema è che questo è in conflitto con alcuni principi (SRP), ma potrebbe anche parzialmente appoggiarsi a favore degli altri (ASCIUTTO, BACIO).

Un semplice esempio potrebbe essere

Abbiamo una serie di percorsi di file immagine e vogliamo completare 4 attività complessive per immagine

get size of image
resize the image
apply a watermark to the image
apply a border to the image

Questo potrebbe essere ottenuto usando uno per ogni loop sull'array e applicando ciascuna funzione una dopo l'altra, oppure potremmo farlo con quattro cicli foreach separati, uno per ottenere le dimensioni, uno per ridimensionare e così via per le altre attività.

Sto cercando di aderire il più possibile a questi principi per rimuovere eventuali cattive abitudini e migliorare le mie capacità di codifica.

    
posta cecilli0n 22.01.2014 - 06:38
fonte

2 risposte

0

Mi permetto di dissentire da ciò che dice la Magia Creativa. Sfortunatamente, il nostro mestiere non è facile ed è lo stesso libro che mi porta alla conclusione che non dovresti svolgere questi 4 compiti all'interno del ciclo stesso, poiché questo in effetti viola lo SRP.

Tuttavia, un semplice cambio del tuo disegno soddisfa tutti i tuoi desideri: iniziamo implementando le quattro operazioni da sole, ma per una sola immagine (file). Niente loop, solo il dettaglio nitido e grintoso. A parte forse la prima operazione, tutti prendono un'immagine come input e restituiscono un'immagine leggermente modificata, che, come succede, è l'input per l'operazione successiva.

Matematicamente, la chiamiamo composizione di una funzione. Non so se esiste una libreria PHP per supportare direttamente questo, ma comunque ciò che si finisce è una funzione composta che deve essere applicata a ciascuna delle immagini. Quindi hai un ciclo con una dichiarazione e una responsabilità.

Come esempio di come questo possa apparire in un'altra lingua, considera questo pseudo codice (simile alla libreria guava di Google per Java):

composedFunction = Functions.compose(applyBorderFunction, applyWaterMarkFunction,
                      resizeImageFunction, fileToImageFunction)
resultingImages = allMyImageFiles.transform(composedFunction)

Se la tua lingua non è in grado di esprimere funzioni di ordine superiore, allora puoi pensare alla chiamata transform come a un ciclo, e all'interno di quel ciclo potresti dover ricorrere alle tue singole funzioni. Tuttavia, la responsabilità di tale funzione risultante è non che implementa le singole trasformazioni della tua immagine, ma semplicemente applicando tali operazioni, qualunque esse siano.

Quindi ti ritrovi con una chiara separazione di queste due cose: una, individuale (e ancora correttamente separata) le definizioni delle operazioni che esegui sulle tue immagini, e due, l'applicazione di queste operazioni.

Come al solito, puoi trovare un design che è SOLIDO, e ancora DRY / KISS / qualunque. Ci vuole molta esperienza per giocare con diverse opzioni di design nella tua mente per trovarne una che soddisfi le tue esigenze.

    
risposta data 22.01.2014 - 08:58
fonte
1

Se il tuo programma sta già funzionando e ci si può aspettare un risultato prevedibile (in altre parole non ci sono bug) ti rimangono due cose per migliorare il tuo codice:

1) Ottimizzazione: prova a velocizzare il tuo codice, a consumare meno memoria, a eseguire meno operazioni, ecc. 2) Leggibilità del codice: rendi il tuo codice più leggibile e comprensibile per ridurre la valutazione del WTF al minuto.

La cosa divertente, questi due spesso si contraddicono a vicenda. Per rendere il codice più leggibile, devi separarlo in classi più piccole, dividere le funzioni in funzioni più piccole, ecc. Ottimizzazione, d'altra parte, preferirebbe avere molte cose memorizzate localmente per eseguire meno chiamate ad altre classi, ottenere alcune oggetto annidato in un oggetto padre ecc.

L'esempio è interessante, perché avere 4 loop uno dopo l'altro renderebbe il codice meno leggibile, occuperebbe più spazio (le parentesi graffe spesso prendono una riga ciascuna) ed eseguirà meno se il compilatore non lo compilasse come un ciclo Comunque. Nel tuo caso, PHP non ha un compilatore, quindi potrebbe effettivamente influire sulle prestazioni, anche se un po '.

Un semplice consiglio sarebbe: non sovrastimare, cercare di far funzionare il tuo programma come prima priorità, renderlo leggibile e comprensibile e quindi ottimizzare i colli di bottiglia; sacrificare la leggibilità per l'ottimizzazione del codice critico delle prestazioni fornendo commenti per quella parte.

Un buon libro che ha aiutato molti a capire come essere un programmatore migliore: Pulisci codice: un manuale di software agile Artigianato

    
risposta data 22.01.2014 - 08:00
fonte

Leggi altre domande sui tag