Come cercare attraverso una serie di oggetti?

2

Sto usando una serie di oggetti per memorizzare i dati per rendere una pagina.

Alcuni esempi del tipo di dati che ogni oggetto può contenere:

  • Percorso file PHP per un include
  • Percorso file CSS per i file CSS
  • Meta dei dati della pagina
  • Dati dell'elemento per costruire elementi della pagina
  • Etc ...

Ho un file modello HTML che analizzo con PHP e sostituisco determinati tag nel modello con i dati memorizzati negli oggetti. Un tag modello assomiglia a:

<!-- @CMS;TYPE=TITLE !-->
<!-- @CMS;TYPE=CSS !-->

Questi tag possono anche avere più attributi:

<!-- @CMS;TYPE=JS-FILES;POS=TOP  !-->
<!-- @CMS;TYPE=JS-FILES;POS=BOTTOM !-->

I tag sopra contengono una posizione e quindi puoi posizionare il tuo contenuto dello stesso tipo nella parte superiore o inferiore del modello.

Gli oggetti dati utilizzano tutti la stessa classe astratta e hanno la stessa funzione di rendering:

class PhpFragment extends FragmentBase {
  public function render() {
    //... render output for this type of data
  }
}

class CssFragment extends FragmentBase {
  public function render() {
    //... render output for this type of data
  }
}

class MetaFragment extends FragmentBase {
  public function render() {
    //... render output for this type of data
  }
}

In questo modo posso utilizzare una funzione universale per eseguire il rendering di tutti gli oggetti, ignorando il tipo di dati che contiene.

La sfida

Ho bisogno di un modo per trovare rapidamente determinati oggetti all'interno dell'array. Quando raggiungo un determinato tag all'interno del modello, devo rendere i dati degli oggetti che corrispondono al tipo (e alla posizione se applicabile) di questo tag.

Nel mio progetto precedente ho usato un oggetto con molte proprietà di classe che contengono istanze di FragmentBase , come:

class pageData {
  protected $mCSS;
  protected $mPHP;
  protected $mJS;
  protected $mMeta;
  protected etc...
}

Ogni proprietà di classe conteneva un array di FragmentBase di istanze di un determinato tipo di dati per recuperare i dati da.

Ma questo design non è molto facile da mantenere e non è molto flessibile. Inoltre, dato che l'oggetto che memorizzava i dati è universale, avevo bisogno di verificare il tipo di dati per poterlo visualizzare con la funzione corretta.

C'è un modo per cercare velocemente una serie di oggetti o dovrei limitarmi a usare pageData object e memorizzare il mio fragment objects in questo?

    
posta Abayob 23.06.2016 - 11:00
fonte

1 risposta

1

Non sono molto sicuro di ciò che vuoi dalla tua domanda, ma qui ci sono due metodi a cui posso pensare, con gli obiettivi di:

  1. fornisce prestazioni ottimali
  2. mantenere la flessibilità attraverso l'astrazione del tipo

Informazioni sul metodo: perché hai creato la classe pageData ? Perché non è possibile memorizzarli in un oggetto dinamico / array associativo? Quindi crea un metodo astratto getTagType() nella classe astratta FragmentBase , con implementazioni come:

public function getTagType() : string{
    return "JS-FILES";
}

Quindi puoi, ad esempio, memorizzare un oggetto come $pageData[$fragment->getTagType()][] = $fragment; , poi dato il tipo dal commento HTML, cercare l'oggetto da quella matrice.

Un altro metodo: che ne dici di assegnare gli ID univoci ai frammenti? Non posso approfondire questo argomento poiché non capisco perché sia necessario cercare un'istanza da un array. Esiste un oggetto corrispondente per frammento (commento HTML)? In tal caso, perché non inserire semplicemente l'ID nel commento, quindi recuperare l'oggetto utilizzando l'ID quando si esegue il rendering della pagina? In questo caso, diventa ancora più veloce perché la chiave numerica diretta per ottenere da una matrice monodimensionale è sempre il metodo più veloce per recuperare un elemento da una matrice.

Terzo metodo: penso che questo sia davvero irrilevante per il tuo caso qui. È possibile utilizzare un database SQL in memoria (come new SQLite3(":memory:") ) per creare una tabella che indicizzi ogni oggetto (ogni oggetto ha bisogno di un ID univoco per essere un segnaposto nella tabella). Quindi puoi facilmente utilizzare una query SQL per cercare tra le molte voci, in modo più efficiente. Tuttavia, penso che SQLite migliori le prestazioni solo quando si elabora una grande quantità di dati (in modo che il tempo di preparare / analizzare le dichiarazioni sia più breve del tempo per la ricerca manuale dei dati), specialmente quando i dati manterranno per molto tempo (quindi non va bene per il pre-elaborazione dei server PHP su HTTP da parte della pagina web) perché l'inizializzazione del database ogni volta richiede molto tempo e i dati devono essere riutilizzati frequentemente in modo da rendere trascurabile il tempo necessario per preparare le dichiarazioni.

    
risposta data 06.07.2016 - 17:55
fonte

Leggi altre domande sui tag