Come presentare il codice nel lavoro accademico?

0

In realtà, sto scrivendo la mia tesi di laurea, che consiste nell'analizzare l'algoritmo BitTorrent e vedere la sua applicazione su Client di trasmissione come esempio di implementazione .

Leggendo il suo codice, scritto in C, puoi vedere molti livelli di funzioni

static const char*
tr_metainfoParseImpl (const tr_session  * session,
                      tr_info           * inf,
                      bool              * hasInfoDict,
                      int               * infoDictLength,
                      const tr_variant     * meta_in)
{
  int64_t i;
  size_t len;
  const char * str;
  const uint8_t * raw;
  tr_variant * d;
  tr_variant * infoDict = NULL;
  tr_variant * meta = (tr_variant *) meta_in;
  bool b;
  bool isMagnet = false;

  /* info_hash: urlencoded 20-byte SHA1 hash of the value of the info key
   * from the Metainfo file. Note that the value will be a bencoded
   * dictionary, given the definition of the info key above. */
  b = tr_variantDictFindDict (meta, TR_KEY_info, &infoDict);
  if (hasInfoDict != NULL)
    *hasInfoDict = b;

  if (!b)
    {
      /* no info dictionary... is this a magnet link? */
      if (tr_variantDictFindDict (meta, TR_KEY_magnet_info, &d))
        {
        (...)

tr_metainfoParseImpl() è la funzione chiamata dopo aver aggiunto un .torrent per file o link magnete. Chiama tr_variantDictFindDict() per trovare qualche stringa "info" da qualche parte nel dizionario dei metadati, in modo da ottenere informazioni su quel file torrent.

Algoritmicamente, non ha alcun valore per me, dal momento che voglio enfatizzare altri aspetti dell'algoritmo BitTorrent oltre alla ricerca stringa, anche se voglio lasciare la sua linea di chiamata solo per illustrare che è felice.

La funzione tr_variantDictFindDict() e il suo figlio sono

bool // func1
tr_variantDictFindDict (tr_variant       * dict,
                        const tr_quark     key,
                        tr_variant      ** setme)
{
  return tr_variantDictFindType (dict, key, TR_VARIANT_TYPE_DICT, setme);
}

static bool // func2
tr_variantDictFindType (tr_variant      * dict,
                        const tr_quark    key,
                        int               type,
                        tr_variant     ** setme)
{
  return tr_variantIsType (*setme = tr_variantDictFind (dict, key), type);
}

Come possiamo vedere, sebbene ciò possa esistere per ragioni di ingegneria del codice, algoritmicamente non ha alcun valore.

Quindi, sto cercando modi ragionevoli, fattibili e pratici per evitare di mostrare questo tipo di codice nel mio lavoro.

Usando il codice sopra come esempio, ho pensato ad alcune opzioni:

  1. metti la parte rilevante della funzione chiamante func1, mostrando la funzione di chiamata di linea1, e dopo quella mostra func2 callee (in cui avrà l'altra parte rilevante del codice.

  2. inserendo il codice del chiamante func1 e il func2 callee "side by side", come se fossero in un'unica grande funzione

  3. programmazione alfabetica dall'inizio

Per favore, sentiti libero di condividere le tue esperienze con questa situazione. Inoltre, si prega di cambiare il sito SX, se necessario, anche se ho cercato il miglior sito SX per porre questa domanda e questo sembrava legittimo.

    
posta paulochf 26.11.2013 - 04:01
fonte

1 risposta

7

Per la mia tesi di laurea, ho avuto una sfida simile e ho dedicato un po 'di tempo a riflettere su cosa stavo cercando di realizzare.

Mettere una quantità non banale di codice in forma stampata fa parecchie sfide.

  • Il codice viene esaminato e manipolato al meglio in formato elettronico, quindi come si fornisce quella manovrabilità all'interno della pagina stampata?

  • Un bel po 'di codice è irrilevante per il problema in questione. File IO, manipolazione della memoria, gestione degli errori, ecc ... sono tutti esempi di cose che devono essere nel codice ma non supportano la tesi stessa.

  • Vuoi / devi fornire tutto il codice in modo che un futuro studente possa raccogliere le tue ricerche e continuare il lavoro. Inoltre, l'Università si aspetta tutto il codice in modo che possano dimostrare che hai effettivamente svolto il lavoro e convalidare i risultati.

La mia tesi consisteva nel prendere un algoritmo esistente, perfezionarlo per le prestazioni e quindi estendere l'algoritmo a una nuova serie di casi d'uso.

All'interno del corpo della mia tesi, ho posto fianco a fianco solo le parti rilevanti delle vecchie e delle nuove routine per fornire una misura di confronto. All'interno del testo, ho poi spiegato le differenze tra le funzioni e le differenze misurabili che avevo trovato. Includerei quindi grafici / grafici / illustrazioni appropriati insieme alla spiegazione per supportare il punto che stavo facendo.

In alcuni casi, ho rifatto il codice esistente in nuove funzioni. A volte aveva senso includere le sezioni di codice rielaborate all'interno del discorso e talvolta no.

Pensa alla tua tesi come a una narrativa. Non includere nulla che non contribuisca direttamente al punto che devi fare all'interno di ciascuna sezione. La tua tesi sarà abbastanza lunga così com'è, e non vorrai sovraccaricare il lettore con dettagli inutili o irrilevanti. Questo aspetto è stato fondamentale per me poiché molti dei miei consulenti non si sono preoccupati tanto del codice e volevano concentrarsi sui risultati.

L'ultimo aspetto da considerare è dove includere l'elenco completo delle fonti. Ho messo la mia fonte in un'appendice alla fine della mia tesi. Ho anche incluso del testo esplicativo sulla compilazione e sull'esecuzione del programma in modo che altri potessero convalidare ciò che avevo fatto. Poiché avevo alcuni set di test di dati che erano necessari per ricreare ciò che avevo fatto, erano inclusi anche nell'appendice.

    
risposta data 26.11.2013 - 17:05
fonte

Leggi altre domande sui tag