Newsgroup: it.comp.www.php
Titolo: consiglio su ottimizzazione codice

dunque, sono quasi alla fine di un piccolo lavoretto che sto facendo.
per comodita' ho preferito inizialmente scrivere tutto il codice 
"esploso" dentro ogni pagina php, cosi' da vedere tutto quanto a colpo 
d'occhio.
consapevole che dovevo poi rimetterci le mani per ottimizzare il codice, 
adesso e' il momento di farlo.
percio' inseriro' alcune funzioni su dei file che richiamero' con include.
ok, tutto regolare.
mi chiedevo pero', visto che non sono pratico di php, fino a che punto 
e' consigliabile "isolare" le varie parti di codice e soprattutto quali.
ad es. e' consigliabile inserire un loop che stampa a video html, dentro 
una funzione, oppure e' meglio usare la funzione per ottenere dei 
risultati ma looparli direttamente dalla pagina?
e cosi' via..
-- 
sp-
courrier électronique:
[spintop _ chez _ virgilio _ point _ it]


Rispondere alla tua questione è complesso...
In realtà non hai bisogno di una singola risposta ma di una serie di 
informazioni e cosigli.
Credo possa trovare un buono spunto e tante informazioni in articoli online.
Io ti consiglio ad esempio questo:
"Ottimizzare PHP"
http://freephp.html.it/articoli/view_articolo.asp?id=117
Credo sia molto interessante
Ciao
Marcello


qusto e da prove che ho fatto, poi in caso, puoi apiccicare
tutto il codice togliendo spazi tab ecc..., il programma diventa un pattone
ma piu veloce ancora (dev-php lo fa) altra cosa e' la compilazione
imagina il programma srcitto continuo
perde la leggibilita, ma acquisti altri cent di secondo


 }
[cut]
appero', un bel post di me**a eh?
;-)
si, cmq ho capito un po' di piu'.
ho la "fortuna", se la vogliamo chiamare cosi', di aver lavorato in asp 
fino a poco tempo fa', percio' tante cose rimangono "filosoficamente" 
invariate.
ma non avendo praticamente mai avuto bisogno di funzioni (vale a dire 
che sono stati pochi casi e a volte conveniva scrivere dentro al .asp 
anziche' includerlo) adesso vorrei pero' fare le cose un po' meglio.
:)


 risultati ma looparli direttamente dalla pagina?
Io ti consiglio di fare cosě:
Metti in file separati le porzioni di codice che contengono la logica del
tuo progetto (es: queries,  calcoli di media, autenticazione utenti ecc.)
Possibilmente usa l'Object Oriented e crea dei bei oggettini ordinati.
Crea un file da includere per ogni classe e includili solo quando sono
necessari.
Immergi nelle pagine html solo il codice che richiama i metodi delle classi
e ciň che ti serve per visualizzarli.
Buon lavoro.

 Possibilmente usa l'Object Oriented e crea dei bei oggettini ordinati.
umh..... parli di funzioni o di classi?
con le funzioni ci sono, con le classi ancora no ;)
anzi, non ho ben capito che farci :)


 anzi, non ho ben capito che farci :)
Puoi vedere le classi come delle collezioni di funzioni che operano su
variabili interne all'oggetto.
Dovresti leggerti un po' di roba per entrare nella filosofia dell'OO.

 Dovresti leggerti un po' di roba per entrare nella filosofia dell'OO.
vediamo se ho ben capito questo esempio :)
creo una classe "calculator", la quale chiama le varie funzioni.
a tali funzioni vengono passate X variabili.
i risultati delle funzioni sono salvati nella variabile interna "$c" :
<?php
class calculator {
   var $c;
   function addition($a, $b) {
     $this->c = $a + $b;
     return $this->c;
   }
   function subtraction($a, $b) {
     $this->c = $a - $b;
     return $this->c;
   }
   function multiplication($a, $b) {
     $this->c = $a * $b;
     return $this->c;
   }
   function division($a, $b) {
     $this->c = $a / $b;
     return $this->c;
   }
}
?>
"dall'esterno" invio, alla classe $cc, le variabili alle funzioni con:
nomeclasse->nomefunzione(variabili)
<?
$cc = new calculator;
echo $cc->addition(20, 10)."<br>";
echo $cc->subtraction(20, 10)."<br>";
echo $cc->multiplication(20, 10)."<br>";
echo $cc->division(20, 10)."<br>";
?>
giusto?


 
Potresti spiegare meglio questo passaggio?
ciao
-- 
Danilo

 Potresti spiegare meglio questo passaggio?
lo hai gia' spiegato tu stesso :)
"separare la parte di codice che esegue calcolo da quella che visualizza 
i risultati e prende gli input"
percio' loopero' da dentro la pagina .php i risultati ottenuti chiamando 
funzioni/classi da altri file inclusi.
volevi dire qualcosa del genere, immagino.


 e' consigliabile "isolare" le varie parti di codice e soprattutto quali.
Se non l'hai ancora fatto ti consiglio vivamente di utilizzare i 
template per separare la logica di php dal codice html.
All'inizio sembra un po' complesso, ma poi non ne potrai piu' fare a 
meno e velocizzi *di molto* lo sviluppo del codice.
Io mi trovo benissimo con XTemplate
http://sourceforge.net/projects/xtpl/
e' velocissimo, leggero e ha tutte le funzioni che servono.
ciao
Mauro

 volevi dire qualcosa del genere, immagino.
si 
p.s.- benvenuto nella grande famiglia di sviluppatori/appassionati php:)
-- 
Danilo

 i risultati delle funzioni sono salvati nella variabile interna "$c" :
Esatto!
La tua classe calcolatrice è un bell'esempio ma è limitato in quanto è solo
una collezione di metodi e non conserva alcun valore al suo interno.
Se già aggiungi un tasto Memoria (come quello che hanno molte calcolatrici)
allora comincia a venire fuori la comodità dell'OO.
function memoria () {
    $this->memoria = $this->c;
}
A questo punto puoi modificare i tuoi metodi originali per prendere il
valore della memoria se il primo valore non vine passato come argomento.
   function addition($a= $this->memoria, $b) {
     $this->c = $a + $b;
     return $this->c;
   }
Il bello è la permanenza dei valori all'interno dell'oggetto!

 Il bello è la permanenza dei valori all'interno dell'oggetto!
umh.... mi sorge un dubbio.
dal momento che una classe, come una funziona, non puo' esser fine a se 
stessa (altrimenti a che mi serve, o no?) , allora quale scopo potrebbe 
avere mantenere dei valori all'interno dell'oggetto, se poi dovro' 
inviarli ad un certo "output" ?
cap?


 cap?
Perchč cosě puoi istanziare un numero infinito di oggetti ognuno con il suo
spazio variabili dal contenuto diverso.
es:
class libro {
var $titolo;
var $autore;
var $genere;
var $file;
    function stampa () {
        //carica il contenuto da file e lo stampa
    }
}
$libro1 = new libro;
$libro1->titolo = "I Promessi sposi";
$libro1->autore = "Alessandro Manzoni";
$libro1->genere = "Palloso";
$libro1->file = "manzoni.txt";
$libro2 = new libro;
$libro2->titolo = "Canne Al vento";
$libro2->autore = "Grazia Deledda";
$libro2->genere = "stupefacente";
$libro2->file = "deledda.txt";
fin qui č come avere un array associativo...
ma il bello degli oggetti č che contengono sia i valori sia i metodi per
manipolarli
$libro1->stampa(); // Manda in stampa il Manzoni
$libro2->stampa(); // Manda in stampa il la Deledda
E scusa se č poco....

 E scusa se è poco....
mmm... vediamo se ho afferrato...
la stessa cosa si potrebbe fare usando un array associativo (come sopra 
sopra) e usando i dati dell'array in una function, giusto?


 E scusa se è poco....
Ciao, scusa se mi intrometto nella discussione, ma in questo esempio 
usando degli array e stampando con un comando tipo
stampa($libro1);
stampa($libro2);
non c'e' nessuna differenza vero?
Una cosa che non mi e' mai stata molto chiara e' il vantaggio di usare 
una classe al posto di una libreria di funzioni.
Negli esempi complessi dove hai molte variabili "interne all'oggetto" 
capisco la comodita' di non dover passare alle funzioni 5 o 10 argomenti 
ma solo un paio perche' gli altri li istanzio una volta per tutte, ma 
negli esempi semplici (ovvero in tutti quelli che trovi sulle guide che 
spiegano la oop) mi sembra sempre che non ci sia questo grande vantaggio 
ad usare le classi ... cosa mi sto perdendo?
Mauro

 ad usare le classi ... cosa mi sto perdendo?
Secondo me hai colto in pieno il problema. Per brevità e semplicità i
manuali fanno degli esempi elementari. Se però devi realizzare un progetto
complesso e provi a pensarlo in OOP anzichè col tuo solito metodo
procedurale i vantaggi ti vengono in mente da soli (a patto che il progetto
sia sufficentemente complesso).
Provo a farti un nuovo esempio in cui i vantaggi dell'OOP dovrebbero essere
più evidenti.
Devi sviluppare un gioco di carte (tipo magic) in cui ogni giocatore
possiede il suo mazzo.
Definisci una classe giocatore, una per le carte, una per il mazzo, una per
la  mano, una per le carte in gioco e una per il cimitero. Queste ultime si
compongono tutte di carte.
class giocatore {
    proprietà: Nome, punti vita
    costruttore: Istanzia un mazzo, una mano, un campo e un cimitero
all'interno di quest'oggetto.
}
class carta {
    proprietà: Titolo, Costo, Effetto, Stato (tappata o no)
    Proprietà: Luogo in cui si trova al momento (mano, cimitero, mazzo o
campo)
    Metodo: Aziona (chiama altri metodi di gioco che azionano l'effetto
della carta)
    Metodo: Tappa  (cambia lo stato della carta)
    Metodo: Scarta (cambia il luogo della carta verso 'cimitero')
    Metodo: Pesca (cambia il luogo della carta verso 'mano')
    Metodo: Gioca (cambia il luogo della carta verso 'campo')
}
class mazzo {
    proprietà: array di carte che lo compongono
    metodo: mischia (randomizza l'ordine dell'array di carte)
    metodo: verifica composizione
}
class mano{
    proprietà: array di carte che lo compongono
    pesca: pesca le prime x carte del mazzo
    Scarta: scarta le prime x carte dalla mano
}
qui mi fermo....
Una volta create per bene le classi il tuo codice sarà molto più ordinato e
leggibile oltre che molto più funzionale e modificabile.
$giocatore1 = new giocatore ()
$giocatore1->mazzo->mischia();
$giocatore1->mano->pesca(7);
$giocatore1->mano->pesca(1);
$giocatore1->mano->carta[3]gioca();
$giocatore1->campo->carta[0]aziona();
$giocatore1->mano->carta[7]scarta();
Nulla che tu non possa fare con un insieme di array e funzioni... ma devi
fare il giocoliere, passare ogni volta sempre gli stessi argomenti e rischi
di sbagliare un'infinità di volte.
Pant... pant... spero che ti sia più chiaro.

 Pant... pant... spero che ti sia più chiaro.
Decisamente meglio, grazie mille!!!
ciao
Mauro

 di sbagliare un'infinità di volte.
umh... penso di aver capito anche io.
scusa il fiatone ;) , dici che la stessa cosa si puo' fare con insiemi 
di array e funzioni: allora e' per questo motivo che php non e' proprio OO ?
o sto dicendo scemenze? :))))


 OO ?
Risposta filosofica:
Un linguaggio e' piu' o meno OO a seconda di quanto supporti la 
scrittura di codice secondo il paradigma Object Oriented:
ma l'importante e' che *tu progetti il programma in termini di classi ed 
oggetti, prima di scrivere il codice*.
Questo significa che puoi scrivere codice OO anche in fortran, ma con 
(molta) piu' fatica che scrivendolo in C++. Quest'ultimo, tra l'altro, 
all'inizio dei tempi era solo un preprocessore che prendeva del codice, 
lo trasofrmava in C (quindi non ad oggetti) e lo compilava.
Il motivo per cui usare classi (con metodi inclusi) invece che funzioni 
"slegate" e' un motivo di ordine e praticita', che facilita la 
creazione, manutenzione ed evoluzione di grosse applicazioni.
Con l'OO si mette l'accento sull'analisi piu' che sulla scrittura del 
codice, non c'entra niente usare array e funzioni al posto delle classi, 
quello lo puoi fare anche in C++.
Risposta pratica:
chi dice che il PHP non e' completamente OO lo dice perche' il 
linguaggio non prevede (ancora) tutte le features di un linguaggio ad 
oggetti moderno, come indicare il livello di visibilita' di un membro 
della classe. In realta', lo Smalltalk non prevedeva queste cose ed era 
lo stesso definito "object oriented" :)
In definitiva: conta come pensi il programma piu' di con che cosa (o con 
che metodo) lo realizzi. :)
Just my two cents...
-- 
Saluti >^_^<
Hatanaka

 che metodo) lo realizzi. :)
occhei, adesso devo solo imparare php ;)
ehehehe...
grazie :)


 che metodo) lo realizzi. :)
Amen! Parole santissime.

scusate le molte domande ma sto cercando di capire alcune cose :)
mi permetto di fare le mie (probabilmente superficiali) deduzioni.
l'esempio della calcolatrice come dicevi e' solo un insieme di funzioni, 
una classe molto semplice insomma.
ma... dal momento che io passo, ad es., due variabili ad una classe che 
ha delle funzioni, le quali "trattano" le variabili ricevute per 
ottenere un certo "output", che differenza c'e' allora nel far cosi' o 
nel fare un'unica funzione che si occupa di fare tutto?
cosi' a colpo d'occhio direi la "riciclabilita'" delle funzioni, proprio 
perche' sono divise.
ma a quel punto, se le inserisco dentro un'unica classe "calculator", 
quelle funzioni "funzioneranno" (bel giro di parole) solo nell'ambito 
della classe stessa.
quindi e' come avere un'unica funzione!
o no?


 della classe stessa.
Tieni presente che scrivendo un programma "ad oggetti" con un'unica 
classe che contiene tutti i metodi (= funzioni) per fare il lavoro del 
programma, hai scritto in pratica un programma basato su funzioni.
Dentro una classe ci devono finire solo le funzioni che lavorano sui 
campi (=dati) della classe stessa (che sono quelli che interessano a te 
per il compito che ti sei prefisso).
PEr scrivere bene il calculator dovresti scrivere le classi relative 
agli oggetti (reali) che vuoi manipolare. Es. il tuo calculator e' su 
linea di comando? Allora dovrai scrivere la classe Expression, la classe 
Term (termine di una espressione), Operator (operatore) ecc.
-- 
Saluti >^_^<
Hatanaka

 per il compito che ti sei prefisso).
umh... percio' "un programma basato su funzioni" se non ho capito male, 
non e' concettualmente cosi' corretto associarlo (dal punto di vista 
"logico") ad una classe.
cioe', teoricamente, tutto si puo' fare dentro una classe, ma non tutte 
le serie/sequenze procedurali da fare necessitano per forza di operare 
nell'ambito di una classe.
detto stronzata?
^___^


 nell'ambito di una classe.
Ecco, comincia a pensare diversamente: non pensare in termini di "serie 
da fare", ma di chi interagisce con cosa.
"Il calculator deve fare i calcoli" si traduce in "il calculator accetta 
delle espressioni e  le calcola". Ognuno dei nomi che vedi nella frase 
(calculator, espressione) e' una potenziale classe; ogni verbo e' un 
potenziale metodo. E' il calculator che calcola, quindi calcola() sara'
un metodo della classe Calculator, che accetta in input un oggetto della 
classe Espressione e ritorna un valore numerico.
Continua cosi' e passerai a pensare ad oggetti prima che tu possa capirlo :)
-- 
Saluti >^_^<
Hatanaka

 capirlo :)
molto interessante.
ragazzi vi ringrazio tutti moltissimo per la pazienza e le spiegazioni :)
hai mica qualche link da suggerirmi, per approfondire l'OOP?


> hai mica qualche link da suggerirmi, per approfondire l'OOP?
Nessuno che mi venga in mente ora.
Devo decidermi a mettere online il tutorial :)
-- 
Saluti, >^_^<
Hatanaka

 Devo decidermi a mettere online il tutorial :)
eh si si ;)



Mi intrometto in questa simpatica conversazione...
Se hai tantissimo tempo e voglia, ti consiglio di imparare (le basi di)
Java: è completamente e necessariamente a oggetti, e oltre ad essere
didatticamente efficace è anche un ottimo linguaggio.
Altrimenti se non hai tempo da perdere (cosa più probabile) eccoti un link
(verificato) ottenuto da Google con "oop introduzione"
http://www.webmasterpoint.org/php/tutorial/19.asp?id=572&voto=3&cat=guida&dat=20.44.49
Inoltre PHP dalla versione 5 (ora disponibile come release-candidate 2)
disporrà di un miglior supporto per gli oggetti (metodi e membri privati e
protetti, metodi e classi astratte, interfacce, costruttori (ridefiniti) e
distruttori, eccezioni, membri e metodi final... praticamente sarà molto più
object-oriented, un quasi-Java)
http://it2.php.net/zend-engine-2.php
Saluti
LB