Stili di codifica quando si utilizzano diverse librerie diverse

9

Sto lavorando su un codice C ++ che usa diverse librerie, incluse alcune librerie C, che hanno tutti stili di codifica differenti. Sarà open source una volta raggiunto uno stadio utilizzabile. Quale potrebbe causare la minima confusione per un contributore a breve termine che controlla il codice per risolvere un bug o aggiungere una funzionalità?

  • Avere uno stile di codifica coerente nell'intera applicazione, anche se occasionalmente non corrisponde allo stile di codifica tipico delle librerie utilizzate.
  • Quando una libreria è molto utilizzata in un determinato modulo, è conforme allo stile di codifica tipico di quella libreria (vale a dire lo stile di codifica utilizzato nel codice e nella documentazione della libreria) in quel modulo.

Il mio pensiero è che quest'ultimo renderà più facile per gli esperti di quella particolare libreria apportare contributi una tantum e semplificare l'integrazione di tutorial / codice di esempio durante lo sviluppo. Tuttavia, rende anche lo stile di codifica incoerente in tutta l'applicazione. Quali sono i pro e i contro di ciascun approccio?

    
posta Karl Bielefeldt 06.12.2013 - 18:15
fonte

4 risposte

10

Penso che dipenda da quanto grande sarà il progetto complessivo.

Ad un estremo, diciamo che hai un progetto 1 Mloc. Per quel grande progetto, è improbabile che un singolo individuo sia un "esperto" in tutte le aree coinvolte. Quindi in questo caso, vorrei attenermi agli stili di codice esistenti per ciascun componente principale. I nuovi sviluppatori sceglieranno un'area, lo apprenderanno ed è improbabile che vedano molti altri componenti che potrebbero avere stili di codice diversi.

Se il progetto è molto più piccolo, dove è è probabile che le persone capiscano l'intera base di codice, allora sceglierei uno stile di codice dominante e lo seguirò. In questo caso, ritengo che la coerenza nell'intero progetto abbia più senso perché i nuovi sviluppatori probabilmente lavoreranno in tutte le aree del progetto.

I progetti di medie dimensioni sono forse i più difficili da prendere per questa decisione. In questo caso, devi valutare i costi per ciascun approccio e decidere quello che pensi sia il meno costoso a lungo termine. La sfida è che i progetti di medie dimensioni sono solitamente cresciuti appena quanto basta per un refactoring di stile completo che sembra proibitivo. Potresti voler dare una seconda occhiata alla struttura ad albero del codice per vedere se è possibile organizzare le cose per raggruppare particolari stili di codice.

In entrambi i casi, la decisione finale dovrebbe riposare con il team che stai mettendo insieme questo pacchetto.

Alcuni dei valori anomali che potrebbero spostare il mio ragionamento dall'alto:

  • Se uno o più moduli hanno uno stile atroce, allora non ha senso mantenerlo, anche su un progetto più ampio. Sì, lo stile è soggettivo, ma se a te e ai tuoi colleghi partecipanti al progetto non piace molto il modo in cui le aree particolari fluiscono, nuke il vecchio stile e ne dà uno migliore.

  • Se tutti gli stili sono ragionevolmente vicini l'uno all'altro, potrebbe essere altrettanto semplice dichiarare "ecco il nuovo modo" e usarlo per tutto il nuovo codice e i significativi refactoring. Questo può rendere le recensioni un po 'dolorose, ma nella mia esperienza la maggior parte delle persone è abbastanza capace di adattarsi a questo approccio. Fornisce inoltre un segnale rivelatore in cui è presente il vecchio codice.

  • A volte lo stile viene spostato in base alla nuova funzionalità aggiunta alla lingua. C ++ ha acquisito una serie di funzionalità nel corso degli anni. Potrebbe essere opportuno rifattorizzare, se necessario, lo stile precedente in uno stile più recente che sfrutta tali caratteristiche.

  • Alcune librerie possono avere un approccio o uno stile particolarmente idiomatico. Se è così, rimango con quello stile per quella libreria anche se potrebbe essere in conflitto con il resto del progetto. L'intento qui è di aumentare le probabilità che qualcuno che lavora su frobnosticators su altri progetti funzionerà anche sul tuo progetto.

Alcuni dei commenti hanno menzionato gli stili imperativo e orientato agli oggetti come una considerazione.

I moduli che sono "pesanti" in uno stile particolare dovrebbero probabilmente rimanere tali se il modulo è di medie o grandi dimensioni. Ho lavorato con i tre stili principali (imperativo, oggettivo e funzionale) e ho rifatto lo stile imperativo pesante in uno stile OO. Con una quantità di codice media o maggiore, il refactoring può essere (eccezionalmente) difficile. La mia esperienza è stata confusa perché non avevo alcun supporto per gli strumenti per aiutare nel refactoring.

Immaginerei che ci sia un'alta correlazione tra i moduli dallo stile strongmente imperativo e quei moduli che sono idiomatici per particolari nicchie di sviluppo, che risalgono all'ultimo punto che ho sollevato con valori anomali. Quindi, il modulo qualsiasi che troverete per quella funzionalità sarà simile a quello, e vorrete che gli esperti di quel dominio possano facilmente lavorare anche sul vostro progetto. Ma se ci sono opzioni e il tuo team non apprezza lo stile di quel modulo, allora vorrei studiare le opzioni.

Allo stesso modo, ho lavorato con un modulo in stile OO pesante in cui i principi OO sono stati presi troppo in là e utilizzati in modo errato. Ad esempio, le interfacce venivano utilizzate come sostituto dell'ereditarietà multipla. E come ci si potrebbe aspettare, è stata un'implementazione cruda. Sono stato in grado di compiere progressi ragionevoli nel refactoring di quel modulo, ma alla fine ho abbandonato questo approccio in quanto ho trovato invece dei pacchetti migliori da usare.

    
risposta data 06.12.2013 - 19:12
fonte
3

Sembra che ci siano più livelli da considerare, almeno:

  1. Le librerie esistenti e eventuali modifiche a esse.
  2. Nuovo codice di test unitario per tali librerie.
  3. Il livello di astrazione.
  4. L'API presentata dal livello di astrazione.
  5. Esempio e codice di prova utilizzando il livello di astrazione.

Assumerò che non ha senso ricondurre tutto il codice a uno stile comune - se così fosse non avresti fatto la domanda.

Assunzione di ciascuno a sua volta:

  1. Per il code-base esistente, probabilmente vorrai attenersi a quello stile.
  2. Il nuovo codice di test unitario per il codice esistente si trova in un'area grigia, in particolare in base a quanto è integrato con il codice precedente. Ma molto probabilmente, proverei a farlo nello "stile preferito".
  3. Il nuovo codice nel livello di astrazione. Assicurandosi che questo sia veramente uno strato di codice separato, non dovrebbe esserci alcuna difficoltà nell'usare uno stile preferito, anche se il codice sta facendo molto l'interfaccia con uno stile o uno stile precedente. La maggior parte del codice deve interfacciarsi con altri stili e non ho mai riscontrato questo problema.
  4. Ovviamente l'API stessa ha bisogno di più pensiero e soddisfa i massimi bisogni di usabilità.
  5. Qualsiasi esempio o codice di prova dovrebbe essere ugualmente in grado di essere scritto nello stile preferito. A seconda della completezza dell'astrazione (cioè se nasconde completamente gli strati inferiori), questo può essere facile o difficile. Naturalmente, assicurarti che il futuro codice client sia leggibile sarà uno dei tuoi obiettivi principali.

Alcune cose che ho trovato personalmente sono quelle con una grande base di codice legacy:

  • Impostando uno stile preferito e applicando le modifiche al codice non lo fa generare magicamente il tutto il vecchio codice che passa al nuovo stile.

  • La maggior parte degli ingegneri preferisce inserire codice (più o meno) in uno stile esistente biblioteca. Richiedere altrimenti si traduce in un sacco di controlli.

  • Richiedere uno stile preferito in una libreria legacy tende a determinare a molta incoerenza nello stile in quella libreria. Quindi per gli standard che sono puramente di presentazione, al contrario di robustezza del codice è anche vedere un sacco di benefici nel richiedere loro.

Come argomento finale (leggermente fuori tema ma penso pertinente), la verità è che alcuni ingegneri lottano per attenersi a qualsiasi standard di stile diverso da quello che conoscono meglio. Consiglio vivamente di coinvolgere la squadra nelle decisioni di stile e di assicurarmi che ci sia un buy in. Dopo averlo fatto, ti trovi in una posizione molto migliore per applicare effettivamente uno standard nel codice misto.

    
risposta data 13.12.2013 - 06:54
fonte
0

Sarò d'accordo con @MetaFight qui nel caso in cui stiate sviluppando un progetto di grandi dimensioni con molti moduli di terze parti.

Consente di mappare il tuo problema con un vero problema di parole: " Immagina di avere uno stile di vita tranquillo in casa. Ti piace che il tuo posto sia tranquillo, non parli mai più strong e mai come nessun membro della tua famiglia. Ma tu interagisci con molte persone diverse ogni giorno per portare qualcosa per la tua casa, non necessariamente parleranno anche con la voce più bassa, in tal caso ti modificherai di conseguenza mentre lavori con queste persone, quindi l'interfaccia o il wrapper per queste persone è altamente flessibile solo per il tuo lavoro da fare. "Esempio stupido ... lol

Ma il mio punto è creare un wrapper per tali librerie secondo il loro standard di codifica in modo tale che tu usi queste librerie attraverso questi wrapper mantenendo lo stile di codifica originale all'interno.

+1 per MetaFight.

    
risposta data 12.12.2013 - 05:10
fonte
0

Ciò causerebbe chiaramente la minima confusione nell'uso di uno stile di codifica unico per tutto il progetto. Il vero scopo di utilizzare uno stile di codifica è innanzitutto quello di semplificare la lettura e la modifica del codice.

Per quanto riguarda lo stile di codice utilizzato internamente in una libreria, non penso sia pertinente. Se la libreria è troppo imperativa, allora scrivere un wrapper OO è ok, ma ciò non richiede che tu usi lo stesso stile di codice degli esempi o degli interni della libreria.

    
risposta data 12.12.2013 - 13:24
fonte

Leggi altre domande sui tag