Come strutturate i vostri progetti?

Stato
Discussione chiusa ad ulteriori risposte.

Anumalix

Utente Bronze
30 Aprile 2014
21
5
3
44
Salve ragazzi,
ormai da molto ho questo dubbio, ovvero come strutturare il mio progetto!
Voi come lo impostate?

Io utilizzando una classe "cuore" non so come gestire molto bene il tutto, ho dei dubbi se usare singleton o meno.

Il cuore si presenta in questo modo:
PHP:
class my_core {
    // bootstrapping..
    public function __construct() {
        // gestione errori [...]
        // autoload delle classi [...]
        // classe per le impostazioni
        // logger
        // db
        // ....
    }
}

Ovviamente il tutto dev'essere accessibile globalmente.. ma non so proprio se usare il singleton o meno...
inoltre i vari file sono disposti in questo modo:
application/model/ -> ...
application/view/ -> ...
application/controller -> ...
application/lib/ -> config | logger | ecc..
application/my_core.php -> la classe che avvia tutto


ovviamente da quello che si può capire come software pattern utilizzo MVC.





E voi? Come strutturate il vostro progetto?
 
Tip: non devi per forza fare una classe per il bootstrap dell'app, viene meglio farlo in modo procedurale, instanziando le classi che ti servono, injettando le dipendenze nei costrutti etc.
 
  • Mi piace
Reazioni: Anumalix
Tip: non devi per forza fare una classe per il bootstrap dell'app, viene meglio farlo in modo procedurale, instanziando le classi che ti servono, injettando le dipendenze nei costrutti etc.
Hai proprio ragione.. più che altro il mio intento era quello utilizzare quella classe per comunicare in modo più rapido tra loro.. più una mia fissa, insomma.

Visto che a me le classi servono globalmente pensavo di creare tipo una funzione del tipo:
PHP:
function load_class($class)
    {
        static $classes;

        if (isset($classes[$class]))
        {
            return $classes[$class];
        }

        return ($classes[$class] = new $class());
    }

da richiamare in questo modo:
PHP:
$logger = load_class('\system\lib\logger');
e quindi renderle globali (senza passarle come argument) tramite quella funzione da richiamare (che potrei anche usare per inserire tutte le classi necessarie come logger/db/config direttamente nel Controller padre.
Che dici, potrebbe funzionare in questo modo o ci sono metodi alternativi e migliori? Fammi sapere, grazie!
 
Hai proprio ragione.. più che altro il mio intento era quello utilizzare quella classe per comunicare in modo più rapido tra loro.. più una mia fissa, insomma.

Visto che a me le classi servono globalmente pensavo di creare tipo una funzione del tipo:
PHP:
function load_class($class)
    {
        static $classes;

        if (isset($classes[$class]))
        {
            return $classes[$class];
        }

        return ($classes[$class] = new $class());
    }

da richiamare in questo modo:
PHP:
$logger = load_class('\system\lib\logger');
e quindi renderle globali (senza passarle come argument) tramite quella funzione da richiamare (che potrei anche usare per inserire tutte le classi necessarie come logger/db/config direttamente nel Controller padre.
Che dici, potrebbe funzionare in questo modo o ci sono metodi alternativi e migliori? Fammi sapere, grazie!
Perché non usi l'autoload che offre il php insieme alle namespace?
 
Perché non usi l'autoload che offre il php insieme alle namespace?
Ne faccio già uso, il problema è che volevo sapere come globalizzare al meglio il mio core (o meglio le varie classi) , che poi andrò ad estenderlo nei vari controller che avrò, senza molte difficoltà. Ho visto CodeIgniter un attimo e:

fa uso di bootstrapping procedurale (ovvero come mi ha consigliato @Webber) e usa il singleton nel suo base controller per renderlo globale, successivamente lo prende con una funzione (get_instance())..

per le classi invece load_class (per instanziarle) e is_loaded per metterle in lista e/o restituisce un array di esse. al posto di questo pensavo una classe che gestisca queste che le aggiunge (e quindi la rende globale essendo la classe completamente statica..), rimuove e restituisce una lista di esse.. però non so proprio se sia il metodo migliore o ne esistono di migliori..
 
Il singleton é considerato un bad pattern. Facile da utilizzare, ma alla lunga genera problemi sia per la performance sia per la mantenibilità(ovviamente si possono creare varianti come il service locator sfruttando dei dependency container).
Parli spesso di globalizzare.... bestemmia. Una buona OOP segue il principio della encapsulation, ovvero é il suo stato é privato(ovvero non dipende da agenti esterni dalla classe, ma solo da se stessa o dagli oggetti passati nei costrutti/setters).
CodeIgniter non é un granché, ti consiglio symfony2, e anche se non lo userai, leggiti la sua documentazione. Introduce a come sfruttare bene la OOP.
Se hai delle classi globali(services) come una classe mailer o una repository, la cosa ideale sarebbe injettarle solo a chi ne fa uso.
Per fare ciò hai molti modi. Come ad esempio i dependecy containers, oppure sfruttando la programmazione funzionale tramite le anonymous functions/closures(attualmente uso Pimple, very helpfull).
La classe bootstrap che hai scritto, si ci starebbe, ma solo se vuoi implementare più metodi di bootstrap. Questo genere di cose dovrebbe definire tutti i rapporti tra oggetti. Una cosa che mi é venuta in mente ora, é che potresti creare più classi per il bootstrap di ogni ambiente di utilizzo. Oppure semplicemente fai un loader e lo integri nel parent controller e carichi le classi(sfruttando il namespacing e l'autoloader) solo quando ti servono
 
Il singleton é considerato un bad pattern. Facile da utilizzare, ma alla lunga genera problemi sia per la performance sia per la mantenibilità(ovviamente si possono creare varianti come il service locator sfruttando dei dependency container).
Parli spesso di globalizzare.... bestemmia. Una buona OOP segue il principio della encapsulation, ovvero é il suo stato é privato(ovvero non dipende da agenti esterni dalla classe, ma solo da se stessa o dagli oggetti passati nei costrutti/setters).
CodeIgniter non é un granché, ti consiglio symfony2, e anche se non lo userai, leggiti la sua documentazione. Introduce a come sfruttare bene la OOP.
Se hai delle classi globali(services) come una classe mailer o una repository, la cosa ideale sarebbe injettarle solo a chi ne fa uso.
Per fare ciò hai molti modi. Come ad esempio i dependecy containers, oppure sfruttando la programmazione funzionale tramite le anonymous functions/closures(attualmente uso Pimple, very helpfull).
La classe bootstrap che hai scritto, si ci starebbe, ma solo se vuoi implementare più metodi di bootstrap. Questo genere di cose dovrebbe definire tutti i rapporti tra oggetti. Una cosa che mi é venuta in mente ora, é che potresti creare più classi per il bootstrap di ogni ambiente di utilizzo. Oppure semplicemente fai un loader e lo integri nel parent controller e carichi le classi(sfruttando il namespacing e l'autoloader) solo quando ti servono
Segui questa risposta che ti dice solo cose esatte :p Ciaooo! :)
 
  • Mi piace
Reazioni: Anumalix
Il singleton é considerato un bad pattern. Facile da utilizzare, ma alla lunga genera problemi sia per la performance sia per la mantenibilità(ovviamente si possono creare varianti come il service locator sfruttando dei dependency container).
Parli spesso di globalizzare.... bestemmia. Una buona OOP segue il principio della encapsulation, ovvero é il suo stato é privato(ovvero non dipende da agenti esterni dalla classe, ma solo da se stessa o dagli oggetti passati nei costrutti/setters).
CodeIgniter non é un granché, ti consiglio symfony2, e anche se non lo userai, leggiti la sua documentazione. Introduce a come sfruttare bene la OOP.
Se hai delle classi globali(services) come una classe mailer o una repository, la cosa ideale sarebbe injettarle solo a chi ne fa uso.
Per fare ciò hai molti modi. Come ad esempio i dependecy containers, oppure sfruttando la programmazione funzionale tramite le anonymous functions/closures(attualmente uso Pimple, very helpfull).
La classe bootstrap che hai scritto, si ci starebbe, ma solo se vuoi implementare più metodi di bootstrap. Questo genere di cose dovrebbe definire tutti i rapporti tra oggetti. Una cosa che mi é venuta in mente ora, é che potresti creare più classi per il bootstrap di ogni ambiente di utilizzo. Oppure semplicemente fai un loader e lo integri nel parent controller e carichi le classi(sfruttando il namespacing e l'autoloader) solo quando ti servono
Grazie veramente per la dritta! Grazie anche per tutte le tue risposte, veramente molto utili.
Ho approfitato dei tuoi consigli e ho guardato un pocchino i Dependency Injection e i Container..
in effetti quello che stavo cercando di fare era proprio un container..
Ho guardato un po' symfony e visto anche il suo sfServieContainer.. wow!
Avresti un libro in particolare da farmi leggere?
Me ne sono letto uno d'inizio ma che però non spiega chissà quanto la OOP e quindi sono un po'
disorientanto nel lavorare con questi.

Ho appena visto anche Pimple, ancora più utile!



Credo che io la soluzione l'abbia trovata quindi posso anche chiudere,
ma visto che non si finisce mai di imparare se uno vuol dire la sua è il benvenuto


Segui questa risposta che ti dice solo cose esatte :p Ciaooo! :)
Visto visto ahaha :D
 
Stato
Discussione chiusa ad ulteriori risposte.