Domanda

Ho spesso codice basato su uno specifico algoritmo ben definito. Questo viene ben commentato e sembra corretta. Per la maggior parte insiemi di dati, l'algoritmo funziona alla grande.

Ma poi i casi limite, i casi particolari, l'euristica vengono aggiunti per risolvere particolari problemi con particolari insiemi di dati. Come numero di casi particolari crescere, i commenti che diventano sempre più nebuloso. Ho paura di andare indietro e guardando questo codice in un anno o giù di lì e cercare di ricordare il motivo per cui è stato aggiunto ciascun caso particolare particolari o euristica.

A volte mi piacerebbe che ci fosse un modo per incorporare o la grafica di collegamento nel codice sorgente, in modo da poter dire in modo efficace ", nel grafico di questo insieme di dati, questa particolare caratteristica qui stava causando la routine per innescare in modo non corretto, ecco perché questo pezzo di codice è stato aggiunto".

Quali sono alcune delle migliori pratiche per gestire situazioni come questa?

Casi particolari sembrano essere sempre richiesto per gestire questi casi insolito / EDGE. Come possono essere riusciti a mantenere il codice relativamente leggibile e comprensibile?

Si consideri un esempio che fare con il riconoscimento caratteristica dalla foto (non è esattamente quello su cui sto lavorando, ma l'analogia sembra apt). Quando trovo una particolare immagine per la quale l'algoritmo generale non riesce ed è necessario un caso speciale, mi registrare come meglio posso che le informazioni in un commento, (o come qualcuno ha suggerito di seguito, un nome di funzione descrittiva). Ma ciò che è spesso manca è un collegamento permanente al particolare file di dati che presenta il comportamento in questione. Mentre il mio commento deve descrivere il problema, e probabilmente dire "Visualizza file foo.jp per un esempio di questo comportamento", questo file non è mai nell'albero dei sorgenti, e può ottenere facilmente perso.

In casi come questo, la gente aggiungere i file di dati per l'albero dei sorgenti di riferimento?

È stato utile?

Soluzione

Se si dispone di una base di conoscenza o un wiki per il progetto, si potrebbe aggiungere il grafico in esso, collegando ad esso nel metodo come per Fowler di Matteo quot e e anche nel controllo del codice sorgente impegnano messaggio per il cambiamento caso limite.

//See description at KB#2312
private object SolveXAndYEdgeCase(object param)
{
   //modify param to solve for edge case
   return param;
}

Commit Message: Solution for X and Y edge case, see description at KB#2312

E 'più di lavoro, ma un modo per documentare i casi più a fondo di semplici casi di test o commenti poteva. Anche se si potrebbe sostenere basta che i test dovrebbero essere la documentazione, si potrebbe non voler archiviare l'intero set di dati non riuscendo in esso, per esempio.

Ricordate, problemi vaghi portano a soluzioni vaghe.

Altri suggerimenti

Martin Fowler ha detto nel suo libro refactoring che quando si sente il bisogno di aggiungere un commento al codice, prima vedere se si può incapsulare il codice in un metodo e dare il metodo un nome che dovrebbe sostituire il commento.

così come un astratto si potrebbe creare un metodo denominato.

private bool ConditionXAndYHaveOccurred(object param)
{
   // code to check for conditions x and y
   return result;
}

private object ApplySolutionForEdgeCaseWhenXAndYHappen(object param)
{
   //modify param to solve for edge case
   return param;
}

Quindi è possibile scrivere codice come

if(ConditionXAndYHaveOccurred(myObject))
{
    myObject = ApplySolutionForEdgeCaseWhenXAndYHappen(myObject);
}

Non è un esempio concreto duro e veloce, ma sarebbe d'aiuto con la leggibilità in un anno o due.

Unit testing può aiutare in questo. prove hanno che in realtà simulano i casi particolari possono spesso servire come documentazione sul perché il codice fa quello che fa. Questo spesso può essere meglio allora basta che descrive il problema in un commento.

Non che questo sostituisce spostando la movimentazione alle proprie funzioni e commenti decenti caso speciale ...

Di solito non sono un sostenitore di test driven sviluppo e stili simili che stress test troppo, ma questo sembra essere un caso perfetto dove un gruppo di unit test può aiutare molto. E nemmeno in primo luogo per la cattura di insetti da eventuali successive variazioni, ma semplicemente per documentare tutti i casi particolari che devono essere affrontate.

Un test di poche unità di buono con i commenti a loro sono di per sé la migliore descrizione dei casi particolari. E il commento del codice stesso ottiene più facile anche. Si può semplicemente indicare alcuni test di unità che illustrano il problema viene risolto in quel punto del codice.

Il

  

A volte mi piacerebbe che ci fosse un modo per incorporare o la grafica di collegamento nel codice sorgente,   poter dire efficace ", nel grafico di questo insieme di dati, questo particolare   caratterizzato da qui stava causando la routine per far scattare in modo non corretto, ecco perché questo pezzo di   codice è stato aggiunto".

parte:

Se il "grafico" che si desidera incorporare è un grafico, e se si utilizza Doxygen , possono incorporare dot comandi nel tuo commento per generare un grafico nella documentazione:

/**
If we have a subgraph looking like this:
\dot
digraph g{
A->B;
A->C;
B->C;
}
\enddot
the usual method does not work well and we use this heuristic instead.
*/

Don Knuth ha inventato alfabetizzati programmazione per rendere più facile per la documentazione del programma per includere trame, grafici, tabelle, equazioni matematiche, e quant'altro è necessario per far capire. Un programma alfabetizzata è un ottimo modo per spiegare il motivo per cui qualcosa è il modo in cui è e come sia arrivato in quel modo nel corso del tempo. Ci sono molti, molti strumenti literate-programming; la funzione "noweb" è uno dei più semplici e viene fornito con alcune distribuzioni di Linux.

Senza conoscere la natura specifica del problema non è facile dare una risposta, ma nella mia esperienza, la gestione di casi particolari sul codice rigido devono essere evitati. Non hai mai pensato di implementare un motore di regole o qualcosa di simile per la gestione di casi particolari al di fuori il vostro algoritmo di elaborazione principale?

Sembra che tu abbia bisogno di documentazione più approfondita rispetto a pochi commenti del codice. In questo modo qualcuno potrebbe cercare la funzione in questione nella documentazione ed essere presentato con un quadro di esempio che richiede un caso speciale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top