Devo accoppiare queste lezioni?

1

Sto programmando in Python. Ho diversi file XML complicati / difficili da capire che descrivono la struttura di un'elezione. Sto cercando di scrivere un wrapper python che renda più semplice l'accesso a questi dati.

La struttura delle entità che sto cercando di modellare è: c'è un'elezione. Le elezioni hanno corse. Le gare sono composte da candidati che ottengono risultati nelle circoscrizioni. I confini sono organizzati in contee.

L'ho prima creato in modo che la classe di elezione abbia una serie di oggetti razze che contengono matrici di oggetti candidati e oggetti risultato. Ma ora sto iniziando a scrivere test unitari ed è difficile testare i candidati o le gare (perché sono accoppiati con le elezioni).

L'elezione ha informazioni sulle gare, che alimenta il costruttore di ogni razza. La gara ha informazioni sui candidati (vale a dire per cosa stanno correndo), che alimenta ai loro costruttori.

So che è generalmente una buona idea avere classi disaccoppiate, ma in questo caso c'è una gerarchia naturale nel dominio e mi chiedo in quale misura abbia senso che il mio codice rifletta questa gerarchia. L'obiettivo finale è scrivere "risultati" in json (per un'app Web) che sono molto più semplici da analizzare rispetto all'XML. I risultati cambieranno ogni pochi minuti man mano che entrano (su un nuovo file xml di elezione). Mi piacerebbe qualche consiglio di design.

    
posta bernie2436 23.10.2014 - 21:30
fonte

1 risposta

4

Premessa 1: molte applicazioni sono strettamente Elaborazione dati nella definizione degli anni '60. Il coltellino svizzero per il trattamento dei dati è il modello di database relazionale .

Lemma 1: Terzo modulo normale è un modo efficace di rappresentare i dati.

Una contea ha-a di Precinct, ma nessun'altra relazione se ne preoccupa. Crea una mappatura (dict) tra Precinct e County che non è correlata a nessun altro binding.

L'Elezione deve avere una collezione di Razze ma non ha bisogno di altre informazioni.

Una Razza ha bisogno (Candidato, Ufficio, Partito?) ma è disgiunta dal Voto.

Un voto ha bisogno (Race, Candidate, Precinct) ma non di più.

Ho disaccoppiato le classi di dati, oh no! Tuttavia, ho normalizzato i dati che rendono la composizione in dati ben strutturati molto più facili da pensare, il che produrrà un JSON più sensato. A meno che tu non stia votando per la frenesia hoopiest, probabilmente vorrai memorizzare questa roba in un database, ed è già nella forma corretta per farlo.

Il design come lo hai descritto si basa su un god-object , Elezione, e raramente è una buona idea. Se trovi che un costruttore di classi ha bisogno di un po 'di dati da passare ad un gruppo di altri costruttori, sei sulla strada per un oggetto-dio. Otterrai maggiore flessibilità e test dell'unità più semplici con disaccoppiamento di implementazione.

Morale: non ignorare gli approcci tradizionali di fronte a un problema tradizionale.

    
risposta data 23.10.2014 - 22:14
fonte

Leggi altre domande sui tag