Qual è un buon modello di design per la mia nuova classe?

5

Sono un programmatore principiante che, dopo aver provato a gestire oltre 2000 righe di codice procedurale per PHP, ora ha scoperto il valore di OOP. Ho letto alcuni libri per aggiornarmi sulla teoria iniziale, ma vorrei qualche consiglio sull'applicazione pratica.

Quindi, per esempio, supponiamo che ci siano due tipi di oggetti di contenuto: un annuncio e un evento del calendario. la mia applicazione esegue la scansione di diversi siti Web (un elenco predefinito) e, quando trova un annuncio o un evento, estrae i dati e li salva in un database. Tutti i miei oggetti condivideranno un $ title e $ description. Tuttavia, l'oggetto pubblicitario avrà un prezzo $ e l'oggetto Event avrà $ startDate. Dovrei avere due classi separate, una per ogni oggetto? Dovrei avere una "superclasse" con $ title e $ description con due altre classi di annunci ed eventi con le loro proprietà? Quest'ultima è almeno la direzione in cui mi trovo ora.

La mia seconda domanda su questo disegno è come gestire la logica che estrae i dati per $ title, $ description, $ price e $ date. Per ogni sito web nel mio elenco predefinito, esiste un'espressione regolare specifica che restituisce il valore desiderato per ciascuna proprietà. Attualmente, ho una dichiarazione switch molto grande nel mio costruttore che determina quale sito Web sono proprietario, imposta le variabili regex di conseguenza e continua. Non solo, ma ora devo ripetere la logica per determinare quale sito sono nel costruttore di ogni classe. Questo non mi sembra giusto. Devo creare un altro Algoritmo di classe e memorizzare la logica lì per ogni sito? Le funzioni di gestire questa logica dovrebbero essere in questa classe? o specifico per le classi le cui proprietà hanno impostato?

Voglio prendere in considerazione nel mio progetto due cose: 1) Aggiungerò diversi oggetti di contenuto in futuro che condividono $ title e $ description, ma avranno le loro proprietà, quindi, voglio essere in grado di facilmente coltivali come necessario. 2) Aggiungerò costantemente più siti Web (ciascuno con i propri algoritmi per l'estrazione dei dati), quindi mi piacerebbe pianificare l'efficienza gestendo e lavorando con questi ora. Ho pensato di estendere la classe degli annunci o degli eventi con la classe "websiteX" e di memorizzare le sue funzioni lì. Ma questo non mi sembrava giusto ora che devo gestire centinaia di piccoli file di classe specifici per il sito web.

Nota, non sapevo se questo fosse il sito corretto o lo stackoverflow fosse la scelta migliore. Se è così, fammi sapere e io posterò lì.

    
posta user66662 02.10.2012 - 02:49
fonte

3 risposte

3

avvertimento : tutti i suggerimenti di progettazione sono basati su ciò che pensavo tu abbia scritto e su un sacchetto di ipotesi infondate. Codifica qualcosa che funziona e rifattalo finché non emerge un modello "buono": finirai per farlo indipendentemente da dove inizi, quindi scegli qualcosa che abbia un senso sulla carta o nella tua mente e comincia da quello.

avvertimenti a parte, sembra che tu abbia le seguenti classi:

  • annuncio
  • Sito web
  • Evento
  • Scanner

Lo scanner esegue la scansione di un elenco di siti Web, alla ricerca di annunci ed eventi. L'espressione regex / logic è specifica per un particolare sito Web (eliminando quindi l'istruzione switch), ma se l'estrazione è sempre un'espressione regolare, è possibile estrarla da una tabella di database per creare istanze di siti Web come necessario (o semplicemente estrarre l'espressione regolare da una tabella db o in memoria).

In altre parole, soft-code il sito web regex se possibile, quindi non devi avere una sottoclasse per ogni sito web

non preoccuparti dell'efficienza finché non funziona e sei soddisfatto del modello sottostante, quindi utilizza un profiler per vedere dove è necessario ottimizzare l'implementazione, se necessario

sospetto che un modello "buono" sia naturalmente efficiente

buona fortuna!

    
risposta data 02.10.2012 - 03:29
fonte
1

Prenderò anche il tuo secondo approccio ad annunci ed eventi, dove sono entrambe classi separate con una superclasse che ha titolo e descrizione. Quindi aggiungi sottoclassi aggiuntive secondo necessità.

Se ho capito il resto del tuo post, sembra che tu abbia più espressioni regolari per ogni sito web che estraggono le informazioni necessarie. In questo caso, per quanto possa essere doloroso, creerei una classe individuale per ogni sito Web responsabile dell'analisi di ciascun sito. Posso facilmente vedere che devi modificare la tua espressione regolare quando un sito cambia, o scoprire che una regex è inadeguata e hai bisogno di una logica aggiuntiva per estrarre le informazioni che ti servono. Ogni volta che devi apportare modifiche a qualsiasi logica di analisi, saprai esattamente a quale file andare poiché si riferisce direttamente a quel sito. Tuttavia, definirei un'interfaccia che questi siti Web implementano che contengono proprietà / metodi comuni di cui avrai bisogno, in modo che la parte del programma che utilizza questi siti web possa trattare con un tipo generico di "Sito web" per ottenere gli annunci e gli eventi (e gli oggetti futuri) invece di dover conoscere ogni specifico tipo di sito nella tua applicazione.

Come per creare il tipo specifico di sito di cui hai bisogno, è qui che entra in gioco lo schema di fabbrica. Passa un URL, recupera un tipo generico di "Sito web". Internamente, la tua fabbrica fa il lavoro di mappare un URL a un tipo specifico. Sembra che questo sia un po 'quello che stai facendo nel tuo gigantesco costruttore, quindi lo sposterei e lo trasformerei in un factory class.

Capisco che potrebbe essere orribile mantenere centinaia di file di classe per singoli siti, ma se tutti questi siti sono unici non so cosa dire. In un modo o nell'altro dovrai avere un codice univoco per ognuno di essi. A meno che un sacco di annunci o eventi condividano qualcosa in comune, come se ci fosse un gruppo di annunci DoubleClick e tutti hanno lo stesso identico codice di analisi, allora puoi ridurre il numero di classi sfruttandone il vantaggio.

    
risposta data 02.10.2012 - 05:57
fonte
0

Risposta rapida: utilizza il tuo approccio se fa funzionare il tuo software. Tuttavia, prendi cura dei blocchi di codice ripetuti , perché potresti spostarli in una classe comune (o in un livello aziendale) in seguito. In tal modo, garantirai costantemente il refactoring e il perfezionamento del tuo codice.

In questa situazione, cerco di attenermi ai principi di KISS e YAGNI - che significa "Keep it Simple Stupid" e "You Is Not Gonna Need It".

KISS - si riferisce al mantenimento del codice con costrutti semplici e di facile comprensione, più semplice è il codice, più facile da mantenere è a lungo termine. YAGNI - si riferisce al principio di mantenere il tuo codice fuori da un eccesso di ingegnerizzazione con una quantità inutile di codici, che pensi possano essere utilizzati per lo sviluppo futuro.

    
risposta data 02.10.2012 - 03:47
fonte