Ho cercato di afferrare i concetti di OOP e mentre ottengo le idee generali alla base di molti di loro, spesso mi trovo ad avere bisogno di qualche consiglio riguardo alla loro implementazione pratica. Uno di questi casi è il metodo di fabbrica.Dove implementare un metodo di produzione?
Sto scrivendo un'applicazione PHP che sta per gestire le richieste in arrivo sia da interfaccia web e della riga di comando, così mi si avvicinò con la seguente struttura semplice classe di ereditarietà per coprire entrambi i tipi di richieste:
abstract class Request {
}
class HttpRequest extends Request {
}
class CliRequest extends Request {
}
Ora ho bisogno di un metodo factory che restituire una richiesta di esempio concreto, a seconda del valore restituito da php_sapi_name()
:
public function create() {
if(php_sapi_name() === 'cli')
return new CliRequest();
else
return new HttpRequest();
}
la mia domanda è: dove lo metto? Mi vengono in mente almeno tre possibilità:
1) Metodo statico in una classe separata:
class RequestFactory {
public static function create() {
// ...
}
}
2) metodo regolare in una classe separata (richiederebbe un'istanza della classe prima):
class RequestFactory {
public function create() {
// ...
}
}
3) metodo statico nella classe padre astratta:
abstract class Request {
public static function create() {
// ...
}
}
Quali sono i pro e i contro di ciascuna soluzione e che sarebbero considerati "corretti" e perché?
Opzione 2. Altri non sono nemmeno OOP. –
IMHO, '2)' è il migliore. Tuttavia, dovresti passare 'php_sapi_name' come parametro del metodo' create'. – Touki
Anche se tutti i metodi funzionerebbero bene, raccomanderei l'opzione 1, non richiederebbe un'istanza precedente della classe factory tramite 'new RequestFactory()'. – SaschaM78