Evidenza di design errato: funzionalità di aggiornamento A interrompe / interferisce con la funzione esistente B

4

Sto lavorando su una web app Javascript & Sto trovando mentre espongo il programma & aggiungere nuove funzionalità (nuove animazioni) fa sì che le funzionalità esistenti si interrompano o funzionino in modo diverso rispetto all'aggiunta di quella nuova funzionalità. Così, mentre continuo a finire l'app, continua a rompere le vecchie funzionalità e amp; Devo tornare indietro & ripristina / aggiorna queste funzionalità. Quindi sembra che non abbia mai completato una funzione perché ci ritorno sempre così posso farla funzionare bene con altre funzionalità.

Questo è indicativo di una cattiva progettazione delle applicazioni? Oppure questa è una caratteristica normale della programmazione del computer, cioè proprio come in qualsiasi programma si trascorrerà il 20% del tempo a sviluppare il programma & L'80% delle volte risolve bug (o sta mantenendo il programma?)?

Ci sono design e / o altre tecniche che posso utilizzare per evitare che si verifichi questo problema?

L'applicazione è un renderer (che prende un file XML che contiene informazioni sugli oggetti che eseguono le animazioni - si muove, si sbiadisce, ecc.) che crea elementi HTML & li anima.

Il design è OOP, il più vicino possibile alle classi in Javascript utilizzando il prototipo. Impiega molto dell'eredità multipla. Utilizza anche le funzioni anonime dove possibile, quindi penso che sarebbe molto simile a un progetto Java perché entrambi hanno funzioni OOP, anon e amp; ereditarietà. Esiste una classe dedicata esclusivamente all'animazione chiamata AnimatedObject & molti oggetti ereditano da questa classe. È sufficiente eseguire un'animazione semplicemente chiamando una funzione da quella classe come myAnimObj.performFade () o myAnimObj.performRotate ().

    
posta Jake M 05.01.2012 - 06:14
fonte

4 risposte

1

Non è necessario evitare la situazione attuale per sentirsi meglio. Basta chiamarlo: Refactoring .

Il processo di introduzione della nuova funzione A che richiede modifiche nella funzione B esistente è:

  1. cambia B in modo che funzioni ancora come previsto e consenta l'inserimento del futuro A
  2. inserisci A con B aggiornato
  3. test B
  4. prova A

Come vedi, devi avere una buona suite di test di regressione.

    
risposta data 05.01.2012 - 10:02
fonte
1

spend 20% of time developing the program & 80% of the time fixing bugs

No, sicuramente non è normale: è un segno che il progetto ha raggiunto e (lontano) ha superato il punto di ragionevole manutenibilità. Considero anche il 50/50 un brutto segno.

Parlando formalmente, se modificando la caratteristica A si interrompe la caratteristica B, significa che non si capisce il codice. Se lo hai capito, non lasceresti effetti collaterali indesiderati apportando delle modifiche.

Tuttavia, chi si prenderà la colpa per questo? E 'il codice troppo confuso, complesso da comprendere nella sua interezza, o non sei disposto a comprendere il codice? Questa è una domanda importante a cui rispondere prima di sederti e studiare il codice o persuadere la tua gestione che il codice richiede una riscrittura fondamentale.

In generale, il numero uno che contribuisce alla complessità del codice (non alla funzionalità) è troppe variabili statiche o campi di classi. Un programma o un oggetto ha un numero finito di stati, che comprende tutte le possibili combinazioni di valori nelle variabili. Con ogni nuova variabile ottieni una crescita esponenziale del numero di stati possibili, cioè ottieni una crescita di complessità e incomprensibilità per una mente umana.

Un buon design riduce al minimo il numero di possibili stati statici e isola il più possibile i componenti. Guarda il codice da questo punto di vista e vedi se riesci a capire e memorizzare il significato di ogni campo var / member statico e ogni funzione. Se non riesci a ricordare qualcosa il giorno seguente, direi di andare per il refactoring.

    
risposta data 05.01.2012 - 11:56
fonte
0

Da ciò che descrivi, sembra che il vecchio codice dipenda dal codice più recente.

Normalmente, i recenti, componenti meno stabili , dovrebbero dipendere da componenti più vecchi, più stabili , non viceversa.

Controlla il tuo design e assicurati che quest'ultimo non si verifichi.

Una tecnica semplice è disegnare un diagramma e visualizzare le dipendenze con le frecce. Se noti che un componente stabile dipende da uno instabile, considera l'applicazione di tecniche come inversione di dipendenza .

    
risposta data 05.01.2012 - 06:24
fonte
0

Are there design &/or any other techniques I can employ to avoid having this problem occur?

Quando dici che la funzione di aggiornamento A rompe / interferisce con la funzione B esistente, sembra che il codice sia scritto non ortogonale. Generalmente vuoi che il tuo codice sia scritto in modo ortogonale (vedi questa domanda per buoni motivi sul perché).

    
risposta data 05.01.2012 - 12:58
fonte

Leggi altre domande sui tag