Dobbiamo scrivere una funzione wrapper per pochi codici di linea?

6

All'inizio, forse solo pochi codici di linea, ma ho visto troppi codici ripetuti e confusi che coinvolgono l'interferenza serializzazione / deserializzazione della logica principale. Quindi cerco di convincere i membri del team a ricoprire una funzione per operazioni come leggere / scrivere / aggiornare i dati, ad esempio:

 void updateCopyTimes(int times)
  { 
    player->getExtendJson["AcopyTimes"] = Json::Value(times);
    player->updateExtendJson();
  }

  int getCopyTimes()
  {
       const int copyTimes = player->getExtendJson["AcopyTimes"].asInt();
       return copyTimes;
  }

Il punto che supporta la mia opinione è:

1) Con una funzione wrapper, possiamo avere una buona gerarchia di codice, possiamo concentrarci sulla logica, rendere la serializzazione / deserializzazione pulita, non diffusa ovunque.

2) Facile da estendere, possiamo facilmente modificare il programma per serializzare in un campo mysql (int / string / date ...), in un altro campo mysql json, facile aggiungere il codice di controllo, con la logica principale immune alla modifica.

Il discommender sostiene che:

1) Nel nostro programma, la possibilità di passare a un altro formato di serializzazione è piuttosto bassa, quasi impossibile. Non vale la pena farlo.

2) Avvolgere una tale funzione è troppo pensante, se lo facciamo, più codice dobbiamo scrivere. E se possiamo finire il lavoro, perché preoccuparsi?

3) E, soprattutto, diversi sviluppatori hanno difficoltà a seguire questa regola.

Quindi in quali condizioni (tipo di operazioni, quantità di codice ...), abbiamo bisogno di una tale funzione wrapper?

    
posta wangdq 05.04.2017 - 09:48
fonte

4 risposte

3

Dovresti separare il codice in una nuova funzione se rende il codice più facile da leggere, ragionare o mantenere.

Questo è indipendente dal numero di linee che avresti spostato nella funzione, ma per piccole sezioni di codice è una chiamata soggettiva che è più facile da leggere.

Se hai spesso marcatori di commenti nel codice come questo

void function_a() {
  some code

  // serialization
  serialization code
  // end serialization

  more code
}

allora questa è un'indicazione che sarebbe bene estrarre il codice tra i marcatori in una funzione a sé stante.

    
risposta data 05.04.2017 - 10:31
fonte
5

Il tuo wrapper scinde la serializzazione dal codice dell'applicazione. Questo mi sembra un puro "buono". Vedi Inversione di dipendenza, singola responsabilità. Non capisco davvero perché le persone resistano alle pratiche basilari di ingegneria del software.

    
risposta data 05.04.2017 - 11:12
fonte
2

Oltre alla risposta di Bart, ho scoperto che il wrapping di tale codice nelle proprie funzioni rende molto più facile il test e il debug in quanto è possibile scrivere facilmente i test unitari per ogni funzione e anche visualizzare i valori dei parametri di input e dei valori di ritorno con punti di interruzione all'inizio e alla fine della funzione.

Per rispondere alla tua domanda, di solito inserisco il codice nella sua funzione alle seguenti condizioni:

  • Il codice da eseguire può essere separato logicamente da altro codice ed esegue una singola attività
  • Il codice viene riutilizzato in più posizioni
  • La logica richiesta per eseguire una singola attività è complicata, ma ha parametri di input chiaramente definiti e valori di ritorno in uscita
  • È possibile che la logica cambi in futuro

Nella maggior parte dei casi, la tua opinione è in linea con le buone pratiche di ingegneria del software. Sebbene sia più utile scrivere codice in questo modo, è meglio per la manutenibilità futura. Questo tipo di mentalità separa anche i semplici programmatori da bravi ingegneri del software.

Il tuo problema non è solo "quando mettere logica / codice nella sua funzione wrapper", ma "come guidare i membri del tuo team ad adottare le migliori pratiche per l'ingegneria del software".

Molte persone che codificano tendono a fare le cose a modo loro, e direi che è molto difficile per te cambiare la loro mentalità. Sfortunatamente, nella maggior parte dei casi, i clienti vogliono solo vedere i risultati e gli ingegneri del software vogliono solo portare a termine il lavoro e prendere la via più semplice, piuttosto che seguire le migliori pratiche.

Quando si tratta di modifiche del software, sembra più "impressionante" dal punto di vista di un non ingegnere che un ingegnere del software si precipita e lavora giorno e notte per 5 giorni per apportare un cambiamento anziché 5 ore perché ha seguito bene principi di ingegneria del software.

Facendo le cose nel modo "giusto", risparmi tempo e fatica ora, piuttosto che dover fare altro lavoro in futuro. Tuttavia, la natura umana, essendo quello che è, tende ad andare per la ricompensa ora piuttosto che il futuro nella maggior parte delle situazioni. Questo è applicabile per la maggior parte degli aspetti della vita (pensa a mangiare ora vs dieta, spesa vs risparmio), non solo ingegneria del software.

Questa situazione probabilmente non cambierà a causa della natura umana, e inoltre, le persone sono pagate per portare a termine il lavoro, per non farlo nel miglior modo possibile. Tuttavia, avrai una migliore possibilità di essere in grado di cambiare questa mentalità una volta che sarai in grado di assumere e licenziare, e potrai scegliere e scegliere ingegneri in grado di fare le cose nel modo migliore possibile.

    
risposta data 06.04.2017 - 04:46
fonte
0

L'estrazione del codice di serializzazione, a meno che non sia davvero banale, ha il vantaggio che tutto il codice di serializzazione si troverà in un unico posto, il che rende più facile individuare errori stupidi o semplifica la modifica di tutti i codici di serializzazione nello stesso modo (ad esempio, aggiungere una corretta gestione dei valori nulli a tutto il codice di serializzazione JSON).

    
risposta data 05.04.2017 - 23:11
fonte

Leggi altre domande sui tag