Sono uno sviluppatore PHP e cosa fanno gli sviluppatori PHP? Loro creano framework, quindi sto facendo il mio modo con il mio piccolo progetto di framework mvc e mi sono imbattuto in un problema di design su cui vorrei avere delle opinioni.
Per i miei modelli ho scelto di prendere il percorso degli oggetti dati (se questa è la terminologia corretta), non un grande fan del record attivo. In sostanza esiste un modello di gateway che gestisce la persistenza e il modello è solo lì per contenere i dati.
Il problema è, come faccio a ottenere questi dati nel modello.
Attenzione: questo comporta internals PHP e la mia ossessione performance
Questo è quello che avevo inizialmente.
abstract class Model {
public function __construct(array $data = []) {
foreach($data as $key => $value) $this->$key = $value;
}
}
Dopo aver scritto quel codice, il mio disturbo legato alle prestazioni ha iniziato a calare e ho pensato che questa iterazione fosse completamente superflua e potrei sostituirla con un incarico.
abstract class Model {
public $props;
public function __construct(array $data = []) {
$this->props = $data;
}
}
L'esecuzione di benchmark in entrambi i casi ha giustificato il mio ragionamento in quanto il primo si è rivelato fino a 20 volte più lento (a seconda delle dimensioni di $data
), quindi naturalmente ho deciso che avrei continuato con il singolo incarico. p>
Non passò molto tempo prima che questo introducesse un nuovo problema: come diavolo accederò alle proprietà. Non posso andare a chiamare $model->props['property']
per un sacco di motivi - prima è brutto, secondo non riesco a ottenere il completamento del codice su questo e più il codice è aperto a errori come qualcuno (in futuro mi denigrerà) chiamando $model->props = 'not so smart assignment'
e poi comincerò a ricevere errori dappertutto. Quindi ho pensato che dovevo proteggere questa proprietà e dare il giusto accesso ad essa, come con getter e setter:
abstract class Model {
protected $props;
public function __construct(array $data = []) {
$this->props = $data;
}
public function __get($name) { ... }
public function __set($name, $value) { ... }
}
Ma non ci vuole un genio (ovviamente, io) per rendermi conto che chiamare queste funzioni direttamente sarà molto più veloce che avere PHP a capire cosa sto cercando di fare e chiamarle per me, così ho lasciato cadere la magia parte e lascia solo i metodi get()
e set()
. Ora ho risolto il problema relativo all'accesso a props
ma non ho risolto il problema riguardante il completamento del codice e il ragazzo che sarebbe un doloroso refactoring, se mai dovessi farlo, in futuro. Inoltre ho deciso di confrontare quale sarebbe stata la differenza tra l'accesso alla proprietà di un oggetto direttamente invece di ottenerlo da props
con get()
, risultati: la funzione di chiamata è 6 volte più lenta dell'accesso diretto.
In pratica, come vedo la decisione che devo prendere ora devo scegliere tra l'assegnazione dei dati del modello lento e il recupero dei dati del modello lento.
C'è qualcosa che mi manca, sono aperto a qualsiasi tipo di suggerimento.