Il peggior standard di codifica che hai mai dovuto seguire? [chiuso]


77

Hai mai dovuto lavorare a standard di codifica che:

  • Diminuito notevolmente la tua produttività?
  • Originariamente sono stati inclusi per buoni motivi, ma sono stati mantenuti molto tempo dopo che la preoccupazione originale è diventata irrilevante?
  • Erano in una lista così a lungo che era impossibile ricordarli tutti?
  • Ti ha fatto pensare che l'autore stesse solo cercando di lasciare il segno piuttosto che incoraggiare le buone pratiche di programmazione?
  • Non avevi idea del perché fossero inclusi?

In tal caso, qual è la tua regola preferita e perché?


Alcuni esempi qui


4
A proposito, ho già fatto una domanda simile (ma non esattamente la stessa) su SO prima: stackoverflow.com/questions/218123/…
Brian R. Bondy

@Brian, grazie, avevo visto la tua domanda ma me ne ero dimenticato.
finnw,

4
Il vero problema con gli standard di codifica è il tempo e gli sforzi sprecati a discutere se siano corretti o meno. Niente batte una buona guerra tra parentesi graffe per la creazione di conflitti interni ...
MZB

Risposte:


97

Questo può increspare alcune piume, ma gli standard che impongono i commenti a blocchi modellati nella parte superiore di ogni metodo mi danno sempre fastidio.

1) Sono sempre obsoleti poiché sono troppo lontani dal codice che fa il lavoro effettivo per notare quando si aggiornano le cose. I commenti negativi sono peggio di nessun commento.

2) Spesso ripetono solo le informazioni che sono già contenute nello strumento di controllo del codice sorgente, solo meno precise. Ad esempio: Ultima modifica di, elenco di date / motivi della modifica.


12
Trovo (almeno ora, prima a scuola che sembrava strano) che commentare del tutto fosse una cattiva pratica
Shady M. Najib,

14
Non solo, ma ho scoperto che l'overhead associato alla creazione di un nuovo file di classe quando si deve mettere un carico di plateplate in alto dissuade gli sviluppatori dalla creazione di nuove classi e incoraggia enormi classi ingombranti e quindi cattiva progettazione.
Gaz,

13
Disaccordo! Non aggiungiamo informazioni reduntand inutili, ma una vera spiegazione testuale di ciò che fa la funzione (nel file .h) ed è così utile! Naturalmente ci impegniamo a mantenerlo sincronizzato con il codice.
Wizard

5
@Shady M Najib male sempre o male quando viene permesso di andare incontrollato / non mantenuto? Generalmente, un buon codice renderà il suo scopo abbastanza ovvio da evitare la necessità di commenti, ma non è sempre così e ritengo che in questi scenari il commento sia cruciale. Non riesco a pensare a una cattiva ragione per includere i commenti XMLDoc.
Nathan Taylor,

7
Un blocco che spiega cosa fa è buono. Un blocco semplicemente reiterando i tipi e i nomi degli argomenti e il valore restituito è errato. Quando ho dovuto lavorare con uno standard che imponeva quest'ultimo, ho scritto uno script emacs per generare automaticamente la maggior parte di esso.
AShelly,

130

Una volta aveva un professore che ci chiedeva di avere almeno un commento per ogni riga di codice.

//Set x to 3
var x = 3;

//if x is greater than 2
if(x>2){

    //Print x
    Print(x);
}

È stato piuttosto ridicolo.


10
Non è solo così il professore sa che sai esattamente cosa sta succedendo?
John MacIntyre,

80
Penso che sia chiaro cosa stia succedendo, e non è educazione.
Dan Ray,

18
L'esempio che hai sopra è chiaro, ma cosa succede se uno studente copia una chiamata di funzione da un'altra app o un libro o cosa mai, e non lo capisce davvero? Come lo saprà il prof? Questa stupida regola non consente alcuna area grigia (che a sua difesa, probabilmente è stata abusata prima). Ecco come lo interpreto. ... badate che se lo vedessi in un ambiente non accademico, potrebbe spaventarmi un po '. ;-)
John MacIntyre,

4
Sì, tranne che puoi sempre scrivere commenti che ripetono semplicemente il codice e non mostrano alcuna comprensione. Ti rende giusto "// Ending Brace" prima della parentesi finale?
alternativa

6
Cosa succede se hai accidentalmente ricevuto un commento utile nel tuo codice? Devi metterti // commentin fila prima di quello?
configuratore

103

Lo standard di codifica della nostra azienda (C #) prevedeva un ampio uso di #REGIONs (per chi non lo sapesse, segna blocchi di codice sorgente che verranno compressi su una singola riga in Visual Studio). Di conseguenza, hai sempre aperto quella che sembrava essere una classe ben strutturata, solo per trovare pile e pile di immondizia spazzate sotto tappeti profondamente annidati di costrutti #REGION. Avresti persino delle regioni attorno a linee singole, ad esempio dovendo piegare una regione di LOG per trovare una singola dichiarazione del Logger. Ovviamente, molti metodi aggiunti dopo la creazione di alcune regioni sono stati inseriti anche nell'ambito "sbagliato" della regione. L'orrore. L'orrore.

Le regioni sono una delle peggiori funzionalità mai aggiunte a Visual Studio; incoraggia a strutturare la superficie piuttosto che l'attuale struttura OO.

Oggi uccido #REGION a vista.


11
Ho provato a votare questo una dozzina di volte ...
TGnat,

22
Se pensi di aver bisogno di # REGIONE, penso che devi rifattorizzare.
Jay Bazuzi,

23
In genere organizzo il codice per regioni in costruttori, proprietà, eventi, metodi e membri. Rende la gestione e la navigazione della fonte un gioco da ragazzi (specialmente in alcune classi di utility statiche che possono diventare piuttosto grandi). Non li userei più di così però.
Evan Plaice,

26
Abbiamo un semplice standard di codifica: non nidificare mai le regioni. Basta usarli per raggruppare metodi correlati (inizializzazione, serializzazione, proprietà, ecc.)
Jason Williams

6
L'unico buon scopo di #regions è nascondere il codice che non ha bisogno di essere modificato . Potrebbe essere generato codice, o codice con un algoritmo difficile da ottenere che preferiresti che le persone non toccassero, o forse brutti blocchi di codice di debug. Ma non codice su cui le persone lavoreranno. Per quelli bloccati in un negozio #region, ho una macro che collassa alle definizioni ma espande le regioni. Vedi qui: stackoverflow.com/questions/523220/awesome-visual-studio-macros/…
Kyralessa

80

In un lavoro siamo stati costretti a usare una strana forma di notazione ungherese nel database.

Non ricordo i dettagli, ma dalla memoria, ogni nome di campo doveva contenere:

  • Nessuna vocale
  • Tutte le lettere maiuscole
  • Un riferimento alla tabella
  • Un indicatore del tipo di dati
  • Una lunghezza di dati
  • Un indicatore nullable

Ad esempio, la colonna contenente il nome di una persona potrebbe essere chiamata: PRSNFRSTNMVC30X(tabella Persona, colonna Nome, Varchar 30 caratteri, Not Null)


14
Siamo spiacenti, ma cosa succede quando si esegue il refactoring del database o quando si decide che la lunghezza di VARCHAR deve essere diversa. All'improvviso, devi esaminare tutto il tuo codice e cambiare ... oh dio. Sembra orribile.
Tom Morris,

71
Nessuna vocale ??! Stai scherzando vero?
Daniel Cassidy,

39
Le persone che hanno applicato questo standard avevano delle creste sulla fronte e spesso discutevano di onore e battaglia?
Ryan Roberts,

10
Haha, beh, erano DBA, quindi ...;)
Damovisa,

14
Avresti dovuto inviare i nomi delle colonne tramite un abbreviazione di URL. PersonFirstNameVarchar30NotNull = bit.ly/cULlQc
Billy Coover

48

Insistere affinché tutte le parentesi graffe siano seguite da un commento per ciò che termina la parentesi graffa:

per esempio:

for (int i = 0; i < 10; i++)
{
    if (foo > bar)
    {
        printf("Foo greater than bar");
    } // End If (foo > bar)

    while (baz)
    {
       farb();
    } // End while (baz)
} // End For

21
Più sicuro: se hai bisogno di un commento per dire quale fosse l'inizio del blocco, allora il blocco è troppo lungo o il suo contenuto è troppo complesso => ​​refactor.
Richard,

5
Voglio votare in basso, perché blocchi lunghi e nidificati possono essere difficili da risolvere e questi commenti potrebbero essere d'aiuto. Voglio votare, perché quei commenti diventeranno presto (e molto confusi) abbastanza presto, e poiché blocchi lunghi e profondamente annidati sono un segno che devi rifattorizzare, non aggiungere altri commenti.
Jay Bazuzi,

7
è stata una grande idea per un mondo senza potenti IDE.
IAdapter,

9
@Jay in qualsiasi IDE decente puoi evidenziare una parentesi graffa e metterà in evidenza l'altra parentesi graffa corrispondente. Personalmente detesto quando le persone lo fanno.
Evan Plaice,

3
Mentre il tuo esempio è un po 'pazzo (poiché non sono abbastanza lunghi da importare e rallentarti quando cambi la logica), questa non è sempre una cosa negativa. Commenti del genere sono davvero utili per chiudere spazi dei nomi / dichiarazioni endif che coprono un intero file.
jsternberg,

38
#define AND  &&
#define OR   ||
#define EQ   ==

'ha detto Nuff.


9
#Include <iso646.h> non sarebbe una scelta molto migliore?
AndrejaKo

3
@AndrejaKo: questo precedente <iso646.h>; questo è stato un tentativo di far sembrare C FORTRAN.
Niall C.,

2
Era davvero uno standard di codifica? cioè c'era una politica aziendale contro la scrittura diretta degli operatori?
Finnw,

21
Aveva anche #define BEGIN {e #DEFINE END }?
JBR Wilkinson,

3
Questo mi ricorda un articolo del Daily WTF che ho visto che alcuni programmatori C ++ avevano un sacco di definizioni per farlo sembrare Visual Basic (o forse solo Basic, qualche dialetto). #define void Sub, #define} Fine, cose del genere.
Wayne Molina,

37
  • I nomi delle variabili locali sono tutti minuscoli senza caratteri di sottolineatura

Esempi reali: paymentmethodtotalshtml, contracttypechangecontexts, customsegmentspectexts,potentialmsceventref

Il New York Times pesa :

“Gli spazi delle parole non dovrebbero essere dati per scontati. Il greco antico, il primo alfabeto con le vocali, poteva essere decifrato senza spazi di parole se lo suonavi e facevi senza di loro. […] Anche il latino ha cessato di separare le parole dal secondo secolo. La perdita è sconcertante, perché l'occhio deve lavorare molto di più per leggere un testo non separato. Ma come ha spiegato il paleografo Paul Saenger, il mondo antico non desiderava "rendere la lettura più facile e rapida".

3
+1. I fastidi minori si sommano. Inoltre, sono difficili da contestare perché l'editor di standard di codifica o PM può dire "Non è un grande onere quindi non vale la pena cambiarlo".
Finnw,

1
Esattamente. (Anche se in questo caso, la lettura di undici nomi di nomi simili a questo può davvero adduptoquitea greatburden.)
John Siracusa,

57
Divertiti a inventare nomi che essere analizzato in due modi. pagehits, penisup, ecc.
Jay Bazuzi,

4
@Jay * sexchange
configuratore

2
@configurator: quando il team di debugger di Visual Studio stava lavorando su una funzionalità per farti vedere l'eccezione attualmente in volo nella finestra di controllo, stavano per aggiungere una pseudo-variabile chiamata "$ ex". Non ci siamo accorti per molto tempo. Quindi abbiamo rinominato "$ exception", ma l'ho ancora letto come "s".
Jay Bazuzi,

36

Mi è stato chiesto da parte del leader di software di una società per fare " semplice, ri n codice flui ". Era vietato, ad esempio, aggiungere un nuovo parametro a una funzione esistente. Invece hai dovuto duplicare la funzione, lasciando l'originale intatto per evitare regressioni. Ovviamente nessun test formale (perdita di tempo).

Ci è stato anche vietato l'uso del software di unione; ogni file può essere modificato da un solo programmatore alla volta. Il software di controllo delle revisioni era fantascienza, ovviamente.

Il giorno più felice della mia vita è stato quando è stato licenziato (considera che è molto, molto difficile licenziare qualcuno in Italia).


non avrebbe mai sentito la parola "refactoring"
nanda,

3
Non ha mai sentito molte altre parole ...
Wizard79,

Beh, non hai bisogno di test formali perché non hai mai cambiato metodo ...
Configuratore

36

Tutte le interazioni con il database devono essere eseguite tramite procedure memorizzate . Potrebbe avere senso se viviamo nel 1997 e non nel 2010.

Ho appena capito che questo in realtà copre tutti i criteri della domanda originale:

  • Diminuito notevolmente la tua produttività? DAI UN'OCCHIATA. Per favore, basta usare un ORM .
  • Originariamente sono stati inclusi per buoni motivi, ma sono stati mantenuti molto tempo dopo che la preoccupazione originale è diventata irrilevante? DAI UN'OCCHIATA. Il gestore era uno sviluppatore per un server di database 1000 anni fa e ha inserito questo standard di codifica.
  • Erano in una lista così a lungo che era impossibile ricordarli tutti? DAI UN'OCCHIATA. Ciò includeva "la maggior quantità possibile di logica deve essere archiviata nel database".
  • Ti ha fatto pensare che l'autore stesse solo cercando di lasciare il segno piuttosto che incoraggiare le buone pratiche di programmazione? DAI UN'OCCHIATA. Continua a tornare dal gestore come ex sviluppatore di server di database.
  • Non avevi idea del perché fossero inclusi? DAI UN'OCCHIATA.

2
Abbiamo alcune persone in questo campo nel mio posto di lavoro. È divertente quando provano a giocare la performance card e dimostrano quanto siano obsolete le loro conoscenze
Reinstate Monica il

3
aspetta ... con tutta serietà, ho pensato che SP fosse migliore, dal punto di vista delle prestazioni, rispetto alle semplici chiamate SQL da, diciamo, C #?
Sk93,

3
Sembra che tu sappia esattamente perché sono stati inclusi. : P
Mason Wheeler,

4
Quando sono cresciuto ho finalmente capito perché tutto dovrebbe passare attraverso il DB :) In tutta serietà, questo semplifica così tante cose, non provare a reinventare la ruota.
Jé Queue,

3
Ho sentito l'adorabile ragionamento "Non possiamo usare un OR / M perché tutte le interazioni devono usare SP". Un tale spreco di potere umano.
configuratore

33

Non poter utilizzare STL o altre librerie C ++ standard perché il CTO riteneva che "noi" potessimo farlo meglio e più velocemente. Anche costrutti di base come liste e la classe di stringhe.


5
L'unica volta che ho mai sentito parlare di qualcuno che non utilizzava l'STL perché non era abbastanza veloce, ed essendo giusto, era per i giochi. EA ha realizzato la propria implementazione dell'STL per i suoi giochi. Dubito fortemente che sia più importante (i giochi moderni sono limitati dalla GPU) e dubito che lo utilizzino. Ma ancora, era un'implementazione della STL, non una libreria completamente nuova. Stavi ancora usando STL quando usavi EASTL.
Matt Olenik,

1
@Matt: per aggiungere a ciò, il reclamo EA era incentrato sull'uso e l'inizializzazione della memoria. La loro stessa implementazione consumava meno memoria, la rilasciava prima ed evitava di inizializzare oggetti che sarebbero stati inizializzati in seguito.
Matthieu M.

Gli direi di codificarlo da solo.
destra

31

Notazione ungherese

Esempio estratto dalla " spiegazione di Charles Simonyi della convenzione di denominazione dell'identificatore di notazione ungherese " su MSDN.

1 #include "sy.h"
2 extern int * rgwDic;
3 extern int bsyMac;
4 struct SY * PsySz (char sz [])
6 {
7 caratteri * pch;
8 int cch;
9 struct SY * psy, * PsyCreate ();
10 int * pbsy;
11 int cwSz;
12 unshaw wHash = 0;
13 pch = sz;
14 while (* pch! = 0
15 wHash = (wHash11 + * pch ++;
16 cch = pch-sz;
17 pbsy = & rgbsyHash [(wHash & 077777)% cwHash];
18 per (; * pbsy! = 0; pbsy = & psy-> bsySuccessivo)
19 {
20 caratteri * szSy;
21 szSy = (psy = (struct SY *) & rgwDic [* pbsy]) -> sz;
22 pch = sz;
23 while (* pch == * szSy ++)
24 {
25 if (* pch ++ == 0)
26 ritorno (psy);
27}
28}
29 cwSz = 0;
30 if (cch> = 2)
31 cwSz = (cch-2 / sizeof (int) +1;
32 * pbsy = (int *) (psy = PsyCreate (cwSY + cwSz)) - rgwDic;
33 Zero ((int *) psy, cwSY);
34 bltbyte (sz, psy-> sz, cch + 1);
35 ritorno (psy);
36}

5
Ow ow ow ow ow!
Ripristina Monica il

22
Il problema più grande con questo esempio sono i nomi di variabili senza significato. Elimina i prefissi ungheresi e alcuni di essi sono lunghi 1 o anche 0 caratteri.
Finnw,

8
Questo è ungherese di sistema, che è utile in linguaggi di tipo debole (poiché codifica le informazioni di tipo che sono fondamentali per lavorare in questi linguaggi nei nomi) - è inutile in linguaggi fortemente tipizzati. L'alternativa migliore per le lingue fortemente tipizzate è l'ungherese per app, che codifica informazioni importanti sull'uso di una variabile (membro, puntatore, volatile, indicizzatore) - qualcosa per cui la lingua stessa non fornisce supporto.
Jason Williams,

5
Oh per favore. Non ho mai mai confuso un locale con un membro, e io non uso che stupido ungherese per utenti / abitanti / campi / qualunque cosa. Penso che potrebbero essere utili per distinguere tra diversi tipi di stringhe, come "sicuro" e "non sicuro", come nell'esempio di Joel in " Sbagliato codice sbagliato"
configuratore

3
@configurator: l'esempio di Joel è orribile, sarebbe meglio avere tipi diversi, quindi il compilatore imporrebbe l'uso.
Matthieu M.,

28

Una volta ho lavorato a un progetto in cui il responsabile del progetto aveva imposto che ogni variabile - OGNI variabile - fosse preceduta da "v". Quindi, vCount, vFirstName, vIsWarranty, ecc.

Perché? "Perché stiamo lavorando in VBScript e ogni cosa è comunque una variante".

WTF.


93
Una volta ho lavorato in una lingua che richiedeva che ogni variabile - OGNI variabile - fosse preceduta da "$".
no,

6
@nohat: E ti sei reso conto che è stato fantastico, vero?
Josh K,

Una volta ho lavorato in una lingua in cui tutte le mie variabili sono iniziate con punteggiatura come '$' o '%' o '@'. Lo faccio ancora, di tanto in tanto.
David Thornley,

3
Questo diventa davvero un problema solo quando ti viene richiesto di mettere le ffunzioni precedenti, quindi il tuo codice è veramente fUcked (vUp).
Joe D,

1
Sembra varie versioni di Perl ...

26

Quasi dimenticato questo:

Citazione di un manager:

Non correggere o documentare eventuali bug di problemi riscontrati nel proprio codice. Il cliente ci pagherà per identificarlo e risolverlo nei prossimi anni.

Questo non era per il software consumer, ma personalizzato per una singola grande organizzazione. Inutile dire che il cliente ha pagato per anni dopo. Può sembrare banale, ma cercare di ignorare i bug è più difficile che trovarli.


2
Questa è una politica orribile. Spero che questo manager sia stato inscatolato.
Bernard,

@ Bernard-Nella maggior parte delle organizzazioni, la creazione di un flusso di entrate a lungo termine è motivo di rapida promozione. Spero che qualcun altro abbia visto la follia in questo e l'ha accidentalmente investito nel parcheggio.
Jim Rush,

24

Commenti XML forzati su tutti i metodi, costanti, enumerazioni e proprietà non privati.

Ha portato a un po 'di codice piuttosto ingombrante, soprattutto perché il risultato finale è stato che le persone o semplicemente colpivano /// per creare uno stub di commento vuoto per tutto o installare GhostDoc e farlo aggiungere commenti generati automaticamente:

/// <summary>
/// Validations the handler.
/// </summary>
/// <param name="propertyName">The property name.</param>
public void ValidationHandler(string propertyName) 
{
   // whatever
}

[Modifica] Il motivo per cui lo menziono come uno standard ridicolo non è perché penso che i commenti sul metodo siano stupidi, ma perché la qualità di questi commenti non è stata applicata in alcun modo e ha provocato solo la creazione di un sacco di disordine nei file di codice . Esistono modi migliori per creare documenti di codice significativi rispetto ai requisiti di build ciechi "devono avere un commento".


13
' Validations the handler' - uh-oh
Eric

8
+1 Ugh Lo odio. Penso che se usi il software per generare commenti, non ne hai bisogno.
bleevo,

9
Non penso che questa sia una brutta regola. Quando leggo un metodo che devo mantenere per la prima volta, aiuta molto se ho specifiche per tutti gli argomenti. Esistono solitamente sottigliezze (ad esempio cosa succede se l'argomento è null, cosa succede se si tratta di una raccolta vuota, il nome di un file inesistente ecc.) Un'altra buona regola (IMHO) è che i nomi dei metodi dovrebbero essere verbi, ma nel tuo esempio è un sostantivo.
Finnw,

3
@finnw Penso che sia una buona pratica, ma uno standard scadente. Se gli sviluppatori sono a bordo e scrivono commenti significativi sul metodo quando sono garantiti (dettagli sull'eccezione, ecc.), È fantastico. In caso contrario, si finisce con un gran casino. E nel primo caso, non è affatto necessaria l'applicazione a livello di compilazione.
Adam Lear

7
Caso classico di non documentazione. I commenti che non raccontano nulla a parte l'evidentemente ovvio dovrebbero essere eliminati a vista.
Cumbayah,

23

Non proprio uno standard di codifica, ma avevamo un file nel controllo del codice sorgente chiamato 'changelog.txt'

Ogni volta che hai effettuato un check-in, hai dovuto aggiungere manualmente una voce a questo file. Questa voce era il numero di revisione della sovversione e il commento del check-in.

Quando iniziò il nuovo CTO e qualcuno glielo disse, prese prontamente una decisione esecutiva e disse: "Non lo faremo più" e cancellò il file. Questo andava avanti da anni.


6
E nessuno ne era a conoscenza svn log?
Htbaa,

1
Coloro che hanno avviato la politica erano spariti da tempo e quelli che l'hanno seguita hanno continuato. Ho iniziato nella stessa settimana del nuovo CTO (mio amico) e lo abbiamo entrambi visto e detto WTF?
Jim A

20

Alcuni dei posti in cui ho lavorato hanno insistito per commentare il codice inutilizzato o deprecato invece di eliminarlo. Invece di fidarsi del VCS per la storia, ecc. È stato dolorosamente mantenuto nei file attraverso il codice commentato.

Il grosso problema che ho riscontrato è che spesso non hai idea del perché il codice sia stato commentato. Era perché alcuni sviluppatori stavano attivamente apportando modifiche e volevano tenerlo come riferimento o non era più necessario?


3
Recentemente ho cancellato molto vecchio codice commentato.
CoderDennis,

2
Di solito elimino il codice commentato a meno che non sia accompagnato da una buona spiegazione del motivo per cui è commentato e perché dovrebbe essere tenuto in posizione.
Jeremy Wiebe,

Sono totalmente d'accordo. Commentare il codice fino a quando si lavora con esso va bene, ma tutto ciò che va in una versione di rilascio / ramo principale dovrebbe essere privo di codice commentato. Qualcuno mi disse che "gli piaceva sapere come si poteva fare diversamente". Lo trovo irritante per le ragioni menzionate: è obsoleto, una soluzione alternativa, un altro modo di farlo? WTF
Anne Schuessler,

Con VS2013 "Peeks" è tutto fuori dalla finestra. Ma abbiamo inserito un commento che dice "Equazione modificata - Iniziali" o qualcosa del genere, quindi qualcuno si chiedeva quale sarebbe stato il vecchio codice in TFS / VCS se necessario. Quindi è una riga anziché 10 righe commentate. Ma VS2013 è fantastico, mostra la storia di TFS proprio lì per te.
Suamere,

17

Il peggior standard di codifica a cui abbia mai partecipato sono le basi di codice che non ne avevano affatto. Preferirei seguire uno standard di codifica con cui non sono completamente d'accordo piuttosto che lavorare su basi di codice dove non ce ne sono affatto. Rende molto più difficile apprendere nuove parti della base di codice.


16

Forzare i commenti in linea per il controllo della versione riguardava lo standard di codifica più inutile che ho ignorato.

//Changed on 2/2/2004 By Ryan Roberts for work item #2323332
Dim Some Horrendous VB
//End Changed

Il DBA Oracle che ha insistito sull'uso corretto degli spazi bianchi, pur "mantenendo" un database con una tabella altamente contesa che aveva oltre 200 campi e 40 trigger si avvicina.


È piuttosto odioso
Evan Plaice,

5
Mmm. Dim Sum ...
configuratore

L'ho fatto, prima che avessimo il controllo del codice sorgente, ovviamente. Una volta ottenuto il controllo del codice sorgente, era un'abitudine tale, praticamente avevamo bisogno di un intervento affinché il team smettesse di farlo. Alla fine ci siamo fermati ed eliminati tutti quelli esistenti quando li abbiamo trovati.
Scott Whitlock,

Il nostro senior dev tenta ancora di costringerci a farlo. Ignoro la politica ogni volta che penso di riuscire a cavarmela (e talvolta quando so di non poterlo fare).
Joshua Smith,

Abbiamo un ragazzo nel nostro team che lo fa ancora ovunque (include anche enormi "Log delle modifiche" nei nostri script SQL che sono anche sotto controllo della versione). L'argomento, come spiegato a me, è che dopo alcune modifiche / commit non ricordi la data in cui qualcosa è stato cambiato, quindi il registro delle modifiche è buono per notare immediatamente chi ha cambiato cosa e perché quando apri un file.
Wayne Molina,

14

Ho fatto recensioni di codice su un progetto guidato da un primo timer C ++ che ha deciso che tutte le funzioni dei membri della classe dovevano essere precedute dal nome e dalla visibilità della classe:

class MyClass
{
   public:
      void MyClass_Public_setValue(int value);
}

1
Hai chiesto loro perché ? Mi piacerebbe solo conoscere la loro motivazione ..
JBR Wilkinson,

1
Caspita, perché quel ragazzo usa anche le lezioni ?
Mateen Ulhaq,

9

Viene richiesto di indentare tutto il codice di quattro spazi;)


2
Com'è andata male?
Jay Bazuzi,

1
Perché allora ogni riga ha 4 spazi non necessari all'inizio?
no,

Oh, ho capito adesso.
alternativa

21
Sì, StackOverflow ha standard di codifica davvero pessimi. :-)
P Shved l'

I grandi rientri ti costringono a mantenere basso il livello di annidamento del codice. Ho visto trattini di 8 e ha funzionato bene.
Toon Krijthe

9

Ho avuto un lavoro anni fa in cui tutto il nostro codice doveva essere allineato a sinistra, senza rientrare. Al ragazzo che ha escogitato questa politica non piaceva scorrere avanti e indietro in orizzontale quando guardava lunghe righe di codice, equiparandolo a giocare a ping-pong con i suoi occhi.


È uno standard orribile e orribile da seguire. E anche una stupida ragione per questo!
gablin,

4
Se devi scorrere in orizzontale (ad esempio più di mezza pagina), probabilmente c'è anche qualcosa che non va. Nessun rientro non va bene perché rende il codice completamente illeggibile. Cerco di rispettare un limite di 78 col, ma se è necessario superare tale importo, non mi dispiace, ma cerco di evitarlo.
Htbaa,

8

Questo più un esempio di come non avere standard di codifica può danneggiare.

Un appaltatore che lavora in una grande banca ha insistito sul fatto che seguire gli standard era il migliore in assoluto. L'applicazione è stata scritta in dBase / Clipper di cui è stato l'unico sviluppatore e, naturalmente, ha elaborato lo standard.

  • Tutto è in maiuscolo. Intendo tutto, compresi i rari commenti che ha fatto.
  • Nessun rientro.
  • La denominazione delle variabili era qualcosa sulla falsariga di APRGNAME. A = ambito della variabile, ad esempio P per pubblico, PRG = primi tre caratteri del file sorgente che ha creato la variabile, NAME = nome della variabile nei restanti 6 caratteri consentiti da dBase / Clipper.
  • Le prime 4 e le ultime 4 righe del codice sorgente erano lunghe 80 *. Perché? Così ha potuto sentire la stampante ad aghi avviare e terminare la stampa di un file. La memoria è che l'intero programma è stato stampato tramite il mainframe ogni settimana, 20.000 pagine.
  • Sono sicuro che ce ne fossero molti altri che sono riuscito a scaricare dal mio cervello.

A quel punto ero un programmatore autodidatta molto nuovo, ma sapevo abbastanza da non ascoltare lo scienziato pazzo e andarmene da lì prima di chiedere di prendere il controllo del progetto.

E sì, abbiamo detto al management quanto fossero brutte queste pratiche, ma sempre ottenute le solite "stavano pagando questo dollaro in testa all'appaltatore che deve sapere di cosa sta parlando".


7
Non deridere i dinosauri più anziani, per favore. Ci hanno reso possibili.
P Shved l'

4
Sembra sicurezza sul lavoro.
MIA

7
Avere un marcatore audio in modo da sapere quando ogni file è in stampa è geniale. Ora aggiungerò \07all'inizio di ogni file.
configuratore

2
L'uso di uno schema di denominazione come questo (non in maiuscolo) aveva un senso poiché le regole di "scoping" variabili di dBase erano inesistenti. Tutto era effettivamente globale. Un iusato per indicizzare un array in una procedura potrebbe interferire con un iin una procedura chiamante. Devi usare PRIVATE ALL LIKE m*e PRIVATE iprevenire questo "oscuramento"
Gerry,

8

Un'altra esplosione del mio passato.

Citazione dal proprietario dell'azienda:

Non ci sarà alcun codice scritto usando linguaggi interpretativi perché ho perso 25 milioni su quel progetto {expletive} scritto in Java.

Il progetto Java era un sistema di compravendita di azioni progettato per gestire alcune dozzine di azioni, che ora veniva utilizzato per elaborare migliaia. Invece di affrontare i difetti di progettazione o l'hardware scadente, l'intera azienda è stata costretta a convertire tutte le applicazioni non C / C ++ in C / C ++ e tutti i nuovi sviluppi dovevano essere in C / C ++. I linguaggi interpretativi significavano qualsiasi cosa non compilata e il proprietario considerava compilato solo Assembler, C e C ++.

Per un'azienda di 800 persone, in cui la maggior parte del codice era in Java e Perl, ciò significava che l'intera azienda ha trascorso la maggior parte del tempo nei successivi due anni riscrivendo il codice perfettamente corretto in C / C ++.

Abbastanza divertente, una ventina di anni prima di questo fiasco, ero in un'altra società in cui il capo della tecnologia aveva deciso che la nostra logica di ordinamento (era un Bubble Sort) doveva essere ricodificata in assemblatore invece di essere sostituita da Quick Sort perché - Gli algoritmi lo fanno non migliorare le prestazioni. L'unico modo per migliorare le prestazioni era riscrivere la stessa logica in assemblatore.

In entrambi i casi, sono partito poco dopo la caduta dei dettami.


Entrambe le società funzionano ancora oggi?
Finnw,

Quello che si è "spostato" da Java è, l'altro è da tempo scomparso. Non sono mai sopravvissuti al passaggio dal TRS-80 a un PC.
David B,

6

Come molti programmatori (ma non abbastanza), odio la decorazione del codice. Mi fa infuriare quando devo usare un prefisso con il simbolo del dollaro ($) per i nomi delle variabili o il trattino basso per le variabili private, anche senza getter / setter. Se hai bisogno di decorare il tuo codice per capirlo, allora devi andartene!


Bene, come dice "Will", "Anticipo con il carattere di sottolineatura in modo che le mie variabili private siano raggruppate nel mio intellisense. Tuttavia, lo faccio solo per variabili con ambito di un tipo. Le variabili dichiarate in un metodo o ambito più ristretto lascio il carattere di sottolineatura off. Rende facile separarli e tenere insieme le variabili meno utilizzate. " e devo essere d'accordo con lui.
7

1
Non credo che raggruppare le variabili nel tuo IDE proprietario preferito sia una buona ragione per deturpare tutto il tuo codice.
Adam Harte,

Se è il tuo codice, renderlo utilizzabile nel tuo IDE sembra completamente ragionevole. Inoltre, anteporre i trattini bassi è comune in molte lingue, quindi ogni volta che le persone lo vedono, sanno cosa significa.
rjmunro,

1
+1 Usare un buon IDE (uno che può usare la ricerca regex ) ha più senso per me. Scratch IDE, impara ad usare un editor di testo e un terminale e sarai un programmatore molto migliore. Come nota a margine, non mi piacciono particolarmente i sigilli perl, ma almeno hanno un uso, a differenza di quelli PHP.
alternativa

6
Sospiro ... un altro di quei "IDE sono per le fighe".
Nailer,

6

Ho lavorato con un sistema web per un po 'in cui tutti i parametri passati dovevano essere chiamati P1, P2, P3 ecc. Nessuna possibilità all'inferno di sapere a cosa servivano senza una vasta documentazione.

Inoltre - sebbene non sia strettamente uno standard di codifica - nello stesso sistema, ogni singolo file doveva essere chiamato xyz0001.ext, xyz0002.ext, xyz0003.ext, ecc. - dove xyz era il codice dell'applicazione in sé.


6

Questo è stato TANTO tempo fa - 1976 per essere esatti. Il mio capo non aveva mai sentito parlare di Edsger Dijkstra o letto un numero di CACM, ma da qualche parte aveva sentito dire che "GOTO è cattivo", quindi non ci era permesso di usare GOTO nei nostri programmi COBOL. Questo è stato prima che COBOL aggiungesse "end if", quindi al momento aveva solo due e mezzo delle tre strutture di controllo classiche (sequenza, if / then / else, performano (cioè do while)). Consentì a malincuore GOTO nei nostri programmi di base e istruzioni di diramazione nei nostri programmi di linguaggio Assembler.

Mi dispiace che questa sia una specie di storia "dovevi essere lì". Per quanto ne so, ogni lingua inventata dal 1976 ha strutture di controllo adeguate in modo da non dover mai usare GOTO. Ma il punto è che il capo non ha mai saputo PERCHÉ GOTO era considerato dannoso o quale lingua era il disturbo infantile e quale era la malattia fatale.


6

Ho lavorato in un progetto in cui la richiesta principale dell'architetto era quella di scrivere (in modo troppo) codice esplicito. Uno dei peggiori esempi che ho trovato nel codice (e ha felicemente approvato) è stato il seguente.

private string DoSomething( bool verbose )
{
    if ( verbose ) { return someString; }
    else if ( !verbose ) { return otherString; }
    else { return string.Empty; }
}

Anche ReSharper ti ha detto che è sbagliato!


9
Sarebbe difficile ottenere qualcosa da una funzione dichiarata nulla.
Mircea Chirea,

7
@MAttB Considerare a quali condizioni elseverrebbe preso il ramo final ( ).
Richard,

6
else {return string.Empty; } verrà eseguito quando le 2 righe precedenti sono state modificate da uno sviluppatore di manutenzione tra 5 anni. Tuttavia, restituendo string.Empty nasconderà il fatto che era usato per essere una condizione impossibile . Dovrebbe invece generare InvalidOperationException ("Questo codice non era progettato per supportare la logica a tre valori");
Matthew Martedì

1
Questo è orribile. Cosa c'è che non va return verbose ? someString : someOtherString;?
Callum Rogers,

1
@callum L'operatore ternario potrebbe essere stato bandito :) stato lì prima ...
hplbsh

6

Nel mio ultimo lavoro, "standard" sarebbe un termine molto forte per quello che mi è stato dato dal ragazzo che mi ha assunto. Programmando siti Web in ColdFusion e SQL, mi sono stati dati requisiti di codifica come:

  • Non utilizzare include. Mi piace una grande pagina
  • Separare sempre le parole nei nomi delle variabili e delle colonne con caratteri di sottolineatura (tranne isattivo, nome, ecc.)
  • Non usare mai le abbreviazioni: scrivi sempre il nome (ha spesso scritto fname e così via)
  • Non usare nomi confusi (come amount_charged e charge_amount, che misurano cose diverse ma correlate)
  • Non usare DIV e usare un minimo CSS - usa invece tabelle nidificate (ho trovato circa sei livelli in profondità, una volta).
  • Non memorizzare nella cache alcuna query. Mai.
  • Stai per usare una variabile su più di una pagina? Ambito di applicazione
  • Ogni pagina è il proprio blocco try / catch. Non abbiamo bisogno / vogliamo un gestore di errori globale.

Ho iniziato a cambiarli non appena ha smesso.


"Non usare nomi confusi" mi sembra abbastanza giusto ...
8128

1
È assolutamente una linea guida giusta. Il mio punto era che non lo seguiva affatto. Immagino che la sua idea di "non confondere" e la mia fossero diverse.
Ben Doom,

4

Nella mia vita di programmatore C ++, sono state applicate due "regole" davvero brutte:

  1. "Non possiamo usare STL, perché VC ++ 4.1 non lo supporta (e al momento non possiamo passare a VC ++ 6.0)."
  2. "Do Non utilizzare QuickSort, perché può essere O (n ^ 2) nei casi gravi, utilizzare questa implementazione dell'algoritmo heapsort I (nome del responsabile del progetto cancellato) scritto come uno studente."

6
Cosa c'era di sbagliato con il responsabile del progetto HeapSort?
sett

4
In realtà se il codice ha accettato l'input dell'utente esterno QuickSort potrebbe essere errato quando si apre agli O(n^2)attacchi DOS (alimentando l'input nel caso peggiore). Anche perché non è stato possibile passare - era di per sé una valida scusa per non usare STL.
Maciej Piechotka,

4

Sono costretto ad avere la documentazione XML per tutte le classi e i membri della classe. Compreso il privato. Sono entusiasta di usare i commenti ghostdoc predefiniti.

public class User 
{
    /// <summary>
    /// the _userID
    /// </summary>
    private int _userID;
}


Sì. Tutto ciò che mi viene richiesto di commentare anche i membri privati. Il che ha ancora meno senso.
Carl Bergquist,

Incoraggiato a usare ghostdoc ?! Gah
configuratore
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.