Calcolo di un punteggio e una suddivisione del punteggio in luoghi diversi - dovrei usare gli stessi metodi?

2

Sto creando un plug-in che utilizza una metrica per determinare un punteggio su una pagina e consente all'utente di fare clic per visualizzare una suddivisione più dettagliata del punteggio in una pagina separata.

Il problema è: non riesco a decidere se è meglio ri-implementare la logica utilizzata per derivare il punteggio iniziale quando si genera il guasto. Da un lato, la stessa logica dovrebbe essere utilizzata in entrambi i casi. Il punteggio dovrebbe essere lo stesso; il codice di interruzione dovrebbe solo eseguire alcune query aggiuntive per fornire maggiori dettagli su ciò che costituisce il punteggio.

Ri-implementare (ciò che dovrebbe essere) la stessa logica usando nuovi metodi potrebbe eseguire la legge di Segal: "Un uomo con un orologio sa che ore sono: un uomo con due orologi non è mai sicuro". Se qualcosa cambia su come viene calcolata la metrica, i due punteggi (quello mostrato inizialmente e quello nella ripartizione) potrebbero divergere - almeno la logica dovrebbe essere aggiornata in entrambi i punti.

D'altra parte, sembra più pulito avere metodi che hanno un unico scopo (o il minimo possibile). Passare attraverso gli stessi metodi significa usare un flag per determinare se stiamo generando il punteggio semplice o la ripartizione. Regolando il comportamento dei metodi in questo modo, a seconda del flag, rende il codice più complesso, più difficile da vedere lo scopo e più difficile da mantenere. Il punteggio calcolato dovrebbe essere lo stesso. Se non lo è, allora ciò indica un errore nella logica. Una soluzione sarebbe quella di creare nuovi metodi per calcolare la scomposizione e quindi creare alcuni test unitari per verificare che i punteggi corrispondano. Ciò fornisce l'ulteriore vantaggio di rivelare i difetti che altrimenti sarebbero nascosti (un uomo con due orologi è più probabile che sappia quando un dispositivo che indica il tempo è inaffidabile).

Non sto davvero chiedendo una risposta nel mio caso specifico in quanto sono sicuro che dipenderà dai dettagli (quanto lavoro extra è stato fatto nella scomposizione e così via). La domanda è: cosa devo considerare quando si decide come riutilizzare la logica dell'applicazione in una situazione come questa?

    
posta Guambra Feo 04.03.2016 - 11:10
fonte

3 risposte

1

"Dov'è la verità?"

Ci dovrebbe essere un'unica fonte autorevole per il valore del punteggio.

Sembra che tu possa avere due metodi diversi che prendono input diversi, ma possono entrambi calcolare accuratamente il punteggio, ma ciò non è possibile. Entrambi questi metodi di punteggio che tu proponi devono prendere gli stessi input, l'unica differenza è che uno produce più del solo punteggio, produce anche una sorta di oggetto di breakdown. Basta usare il secondo metodo di punteggio e ignorare le informazioni extra restituite. Solo denormalizzare (cioè avere due fonti di verità) se c'è un chiaro vantaggio in termini di prestazioni.

Come analogia, quando si ottiene un oggetto utente, ma si prevede di utilizzare solo un sottoinsieme appropriato dei suoi campi, non si pensa di creare una nuova classe User con solo quei campi. Stessa cosa qui, stai calcolando una suddivisione del punteggio, ma usando solo un sottoinsieme appropriato le informazioni restituite.

    
risposta data 04.03.2016 - 13:52
fonte
0

Potresti implementare un primo metodo, diciamo calculateScore che viene eseguito quando l'utente vede la prima pagina.

Se l'utente vuole vedere più dettagli, dovrebbe essere eseguito un metodo calculateScoreDetails . La sua implementazione sarà una chiamata a calculateScore più alcune query aggiuntive che hai menzionato.

    
risposta data 04.03.2016 - 11:19
fonte
0

Cohesion influenza il codice da entrambe le direzioni. Separa le cose che non sono correlate e raggruppa le cose correlate. Nel tuo caso, il codice che calcola il punteggio completo e quello che calcola il punteggio dettagliato hanno un'elevata coesione. Sono la stessa cosa, solo leggermente diversa. Quindi entrambi dovrebbero essere rappresentati dalla stessa cosa.

MA nel tuo caso, quella cosa sarà probabilmente una classe o un modulo (a prescindere dalla tua lingua). Assumere una funzione come "unità" è troppo limitante, proprio come stai vivendo adesso.

    
risposta data 04.03.2016 - 14:07
fonte