Qual è stata la regola standard di codifica più strana che sei stato costretto a seguire? [chiuso]


173

Quando ho posto questa domanda ho quasi sempre un sì definito, dovresti avere standard di codifica.

Qual è stata la regola standard di codifica più strana che sei mai stato costretto a seguire?

E per più strano intendo più divertente, o peggio, o semplicemente strano.

In ogni risposta, indica la lingua, la dimensione della tua squadra e quali effetti negativi ha causato a te e alla tua squadra.


19
Dopo aver letto questa lista all'improvviso, mi sento come se avessi avuto una carriera molto fortunata per evitare questa stronzata standard forzata!
opaco b

La prossima volta che intervisterò per un lavoro, ho intenzione di sfogliare questa domanda per servire come "Bandiera rossa. Corri!" indicatore. Codifica gli anti-schemi standard, anzi.
Stu Thompson,

5
E sono imbarazzato di ammettere che molto presto nella mia carriera, ho imposto una delle risposte a una squadra. Mi dispiace così tanto ragazzi.
JasonFruit

Risposte:


434

Lo odio quando è vietato l'uso di più resi.


26
Qual è il punto presunto di questa regola? Personalmente fallirei una revisione del codice per il codice che potrebbe essere reso più facile da leggere inserendo un altro ritorno.
Mark Baker,

22
D'altra parte, eliminare un'opzione all'inizio come "if (param == null) return null" può ripulire un po 'il tuo codice, proibirlo invece di incoraggiarlo è un po' criminale.
Bill K,

39
Soluzione alternativa: if (! Initialize ()) {RetVal = ERR_BADINIT; vai a ReturnPoint; } (molto più codice) ReturnPoint: return RetVal; } Problema risolto! ;)
Marc Bernier,

9
Fino a poco tempo fa, erano vietati resi multipli. Quindi è stato rivelato il fatto che si trattava di un residuo di C, reso obsoleto da C ++ RAII e funzioni con dimensioni inferiori a 15 righe. Da allora, come Braveheart: "LIBERTÀ !!!!" ... :-p ...
paercebal,

122
La tua scelta: più rendimenti o più istruzioni if ​​nidificate. Prenderò più resi.
Lance Fisher,

333

rientro inverso. Per esempio:

    for(int i = 0; i < 10; i++)
        {
myFunc();
        }

e:

    if(something)
        {
// do A
        }
    else
        {
// do B
    }

152
Oh mio Dio ... Posso incontrare il sociopatico che l'ha inventato? Poteva insegnarmi una o due cose sulla misantropia.
John Rudy,

23
Questo non può essere vero.
Dane,

191
Ogni volta che inverti il ​​rientro, Dio uccide uno sviluppatore di manutenzione.
Chris Vest,

14
OMG, stai scherzando?
Andrea Ambu,

21
salva byte preziosi ... impagabile,
usalo

326

Forse non quello più stravagante che otterrai, ma odio davvero quando devo prefigurare i nomi delle tabelle del database con 'tbl'


5
Non è solo una notazione ungherese per DB?
ARKBAN,

19
Non è come il prefisso delle variabili con var?
Brian R. Bondy,

26
Allo stesso modo, odio quando le colonne ID nei database sono precedute dal nome della tabella, come nella tabella del prodotto ci sarebbe una colonna productid. Ridondanza che a volte rende gli script senza un ORM più un mal di testa di quanto non debba essere
Andrew Ingram,

30
In realtà preferisco che la colonna ID sia preceduta dal nome della tabella. Semplifica la scrittura di query. E per le chiavi esterne puoi avere il campo chiave esterna uguale al campo chiave.
Craig,

38
Allo stesso modo, lo odio quando i nomi delle tabelle devono essere singolari. Il mio istinto è quello di nominare una tabella che contiene, diciamo, clienti, "Clienti", non "Cliente". Sembra minore, finché non ti rendi conto di tutti i problemi che risparmieresti se solo potessi nominare la tua tabella "Transazioni" anziché "[Transazione]".
Atario,

248

Quasi ogni tipo di notazione ungherese.

Il problema con la notazione ungherese è che è molto spesso frainteso. L'idea originale era quella di aggiungere il prefisso alla variabile in modo che il significato fosse chiaro. Per esempio:

int appCount = 0; // Number of apples.
int pearCount = 0; // Number of pears.

Ma la maggior parte delle persone lo usa per determinare il tipo.

int iAppleCount = 0; // Number of apples.
int iPearCount = 0;  // Number of pears.

Questo è confuso, perché sebbene entrambi i numeri siano numeri interi, lo sanno tutti, non è possibile confrontare le mele con le pere.


71
Vedi questo post su Joel on Software su come l' uso corretto della notazione ungherese può aiutare a ridurre i bug: joelonsoftware.com/articles/Wrong.html
flicken

9
Ovviamente usando C ++ invece di C puoi scrivere codice in modo che il compilatore ti dia un errore quando paragona le mele alle pere.
Andreas Magnusson,

5
Sì, Joel ha capito bene. Vorrei che i compilatori potessero essere fatti per imporre la versione di Joel.
Loren Pechtel,

9
Non dovrebbe essere "int cntApples = 0; int cntPeas = 0;"? Vale a dire. Il prefisso è la variabile "tipo".
Blorgbeard esce il

42
Almeno il primo è corretto ... tutto con "Apple" deve essere preceduto da "i". ;)
Johannes Charra,

240

Nessun operatore ternario autorizzato dove attualmente lavoro:

int value = (a < b) ? a : b;

... perché non tutti "capiscono". Se mi dicessi "Non usarlo perché abbiamo dovuto riscriverli quando le strutture diventano troppo complicate" (operatori ternari nidificati, chiunque?), Allora capirò. Ma quando mi dici che alcuni sviluppatori non li capiscono ... um ... Certo.


235
Per tutti, il tuo capo intende se stesso.
Brian R. Bondy,

13
Cadevo in questo campo ... Ma ne sono uscito e ho imparato ad amare l'operatore condizionale (quando è appropriato).
John Rudy,

22
Semmai, la regola dovrebbe essere "usa sempre l'operatore ternario", un operatore di pura bellezza :)
Bobby Jack,

16
Lo adoro, ma il motivo che ottengo più spesso per non usarlo è lo stesso della tua esperienza "la gente non lo capirà". La mia tesi è che non dovrebbero funzionare se non riescono a capire il concetto ...
Aidos,

7
In quale altro modo inizializzeresti condizionalmente una variabile costante senza scrivere una funzione completamente nuova (che non gioverebbe molto alla leggibilità). L'uso di const per le "variabili" locali è molto più utile per comprendere e seguire il codice di un divieto dell'operatore ternario.
Andreas Magnusson,

239

Non rimuovere MAI alcun codice quando si apportano modifiche. Ci è stato detto di commentare tutte le modifiche. Tieni presente che utilizziamo il controllo del codice sorgente. Questa politica non è durata a lungo perché gli sviluppatori erano in subbuglio e su come avrebbe reso il codice illeggibile.


3
Lo odio davvero ... ci sono alcune persone che lo fanno qui (non è uno standard o altro)
brividi42

7
Regole del genere sono il motivo per cui sento il BISOGNO di stampare il codice sorgente che eredito dagli altri a colori. In poche parole, non è molto carino per la mia azienda, ma è l'unico modo in cui posso leggerlo se devo stamparlo. (Abbiamo ereditato molto che ha seguito questa regola ...)
John Rudy,

3
Sembra una regola sviluppata controllo pre-sorgente. O a causa dei programmatori che effettuano il check-in solo una volta alla settimana.
Craig,

6
Adoro leggere queste risposte perché il mio lavoro sembra 100 volte migliore.
rjh

2
Sentiti per te ... siamo su SVN da più di 4 anni, ma lo sviluppatore senior lo odia e controlla circa una volta ogni due mesi, trascorrendo i prossimi tre giorni compleanni con il codice non funzionante: /
Viktor Svub,

204

Una volta ho lavorato sotto la tirannia di Mighty VB King .

Il re VB era il puro padrone di MS Excel e VBA, nonché dei database (da qui il suo cognome: giocava con Excel mentre gli sviluppatori lavoravano con i compilatori e sfidarlo su database poteva avere effetti dannosi sulla tua carriera ... ).

Naturalmente, le sue immense capacità gli hanno dato una visione unica dei problemi di sviluppo e delle soluzioni di gestione dei progetti: sebbene non esattamente codificasse gli standard nel senso più stretto, il VB King aveva regolarmente nuove idee su "standard di codifica" e "migliori pratiche" che ha provato (e spesso è riuscito) a imporci. Per esempio:

  • Tutti gli array C / C ++ devono iniziare dall'indice 1, anziché da 0. In effetti, l'uso di 0 come primo indice di un array è obsoleto ed è stato sostituito dall'intuitiva gestione dell'indice di Visual Basic 6.

  • Tutte le funzioni devono restituire un codice di errore: non ci sono eccezioni in VB6, quindi perché dovremmo averne bisogno? ( cioè in C ++ )

  • Poiché "Tutte le funzioni devono restituire un codice di errore" non è pratico per le funzioni che restituiscono tipi significativi, tutte le funzioni devono avere un codice di errore come primo parametro [in / out].

  • Tutto il nostro codice controllerà i codici di errore ( questo ha portato al peggior caso di indentazione VBScript che abbia mai visto in carriera ... Naturalmente, poiché le clausole "else" non sono mai state gestite, in realtà non è stato trovato alcun errore fino a tardi ).

  • Dal momento che stiamo lavorando con C ++ / COM, a partire da questo giorno, codificheremo tutte le nostre funzioni di utilità DOM in Visual Basic.

  • Gli errori ASP 115 sono malvagi. Per questo motivo, useremo On Error Resume Next nel nostro codice VBScript / ASP per evitarli.

  • XSL-T è un linguaggio orientato agli oggetti. Usa l'ereditarietà per risolvere i tuoi problemi (una stupida sorpresa mi ha quasi aperto la mascella questo giorno ).

  • Le eccezioni non vengono utilizzate e pertanto devono essere rimosse. Per questo motivo, deselezioneremo la casella di controllo che richiede la chiamata del distruttore in caso di svolgimento dell'eccezione ( ci sono voluti giorni per un esperto per trovare la causa di tutte quelle perdite di memoria, e quasi impazzì quando scoprì che avevano volontariamente ignorato (e nascosto) la sua nota tecnica sul controllo di nuovo dell'opzione, inviata alcune settimane prima ).

  • rileva tutte le eccezioni nell'interfaccia COM dei nostri moduli COM e le elimina silenziosamente (in questo modo, invece di arrestarsi in modo anomalo, un modulo sembrerebbe solo più veloce ... Lucente! ... Mentre usavamo la gestione degli errori über sopra descritta, ci è voluto anche del tempo per capire cosa stava realmente accadendo ... Non puoi avere sia la velocità che i risultati corretti, vero? ).

  • A partire da oggi, la nostra base di codice si dividerà in quattro rami. Gestiremo la loro sincronizzazione e integreremo manualmente tutte le correzioni / evoluzioni di bug.

Tutti tranne gli array C / C ++ , le funzioni di utilità VB DOM e XSL-T come linguaggio OOP sono stati implementati nonostante le nostre proteste. Naturalmente, nel corso del tempo, alcuni sono stati scoperti, ahem , rotti e abbandonati del tutto.

Certo, il re VB credibilità di non ha mai sofferto per questo: tra i dirigenti superiori, è rimasto un esperto tecnico "top gun" ...

Ciò ha prodotto alcuni effetti collaterali divertenti, come puoi vedere seguendo il link Qual è il miglior commento nel codice sorgente che tu abbia mai incontrato?


28
Ri: 1-indicizzazione. A volte devi solo alzarti e dire qualcosa di forte come "stupido e sbagliato". Traccia una linea nella sabbia. Dimentica l'ego placante e dillo. Posso quasi garantire che ogni altro programmatore utile inizierà immediatamente ad annuire e ad unirsi.
Kirk Strauser,

31
@jrista: se NON stai commentando l'ortografia del mio testo, ignora quanto segue ... ... ... ... ... ... ... ... Se stai commentando il mio testo, per favore considera (1) proponendo correzioni, (2) correggendo te stesso l'ortografia o (3) considera che non tutti gli sviluppatori del mondo (tutt'altro) sono madrelingua inglese, quindi suppongo che tollerare l'ortografia errata sia il minimo che puoi fare, o prova che puoi fare di meglio mandandomi la traduzione corretta IN FRANCESE ... ^ _ ^ ...
paercebal

4
Se questo ragazzo fosse il mio capo, sarei andato direttamente da ogni membro dell'alta dirigenza con un elenco ben scritto e documentato di lamentele e lo avrei licenziato. -1 per non avere le palle per difenderti.
muusbolla,

34
@muusbolla: chi ti ha detto che non ci siamo lamentati? È aumentato fino a quando una delegazione di due (incluso me) è andata direttamente al CEO per spiegare il problema. Ma mi dispiace doverti dire che c'è una differenza tra un mondo idealista, dove regna la giustizia, e il mondo reale, in cui alcuni capi credono che "la gestione non è mai sbagliata, anche quando lo è", e schiaccerà chiunque oserò contraddire quel dogma. L'unico ricordo felice che ho da quel momento è il giorno in cui mi sono dimesso, quasi tre anni fa, e da quel giorno sono un uomo più felice. Ad ogni modo, se vero, la tua ragione downmod è zoppa. Scusate.
paercebal,

7
@paercebal: In generale, c'è una correzione scritta, come se fosse quel petits erreurs: «squatch»: ça doit être «squash»; «Questo un giorno»: en ce context-là, on dirait «quel giorno»; «Procedure di scorta»: «procedure di scorta»; «Soffocato» s'écrit «soffocato». Auss, dans les commentaires, vous utilisez ° accennato », per il resto« citato »Mais vraiment, tout ça ne giustificable pas une telle plainte. Al contrario, vedrai e monterai un eccellente maîtrise de l'anglais; Félicitations!
intuito

131

Negli anni '80 / '90, ho lavorato per una compagnia di simulatori di aeromobili che utilizzava FORTRAN. Il nostro compilatore FORTRAN aveva un limite di 8 caratteri per i nomi delle variabili. Gli standard di codifica dell'azienda hanno riservato i primi tre a informazioni sullo stile di notazione ungherese. Quindi abbiamo dovuto provare a creare nomi variabili significativi con soli 5 caratteri!


17
Lusso: avevamo solo 6 personaggi; il pacchetto aveva nomi che iniziano con g; tutte le funzioni interne sono iniziate gk; c'erano driver di workstation con codici come 0p (quindi gk0p era l'inizio), lasciandoci due caratteri per il resto del nome Fortran. gk0paa, gk0pab, ...
Jonathan Leffler,

103
"Quando avevo la tua età, avevamo solo 2 personaggi! E non faceva distinzione tra maiuscole e minuscole!"
pookleblinky,

53
Dovevamo alzarci alle 2 del mattino, 3 ore prima di andare a letto, quindi scrivere i nostri compilatori e pagare alla compagnia il privilegio di andare a lavorare. Ci è stato permesso solo la lettera A per i nostri nomi di variabili. Quindi il nostro capo eliminerebbe il nostro codice e ballerebbe sui nostri elenchi cantando alleluia.
David Arno,

12
"50 possibili identificatori dovrebbero essere sufficienti per chiunque": p
Chris Vest,

5
Diamine, gli interpreti BASIC con cui abbiamo lavorato molto tempo fa avevano nomi di variabili a due caratteri. Perché lamentarsi di 5?
David Thornley,

107

Ho lavorato in un posto che ha avuto una fusione tra 2 aziende. Quello "dominante" aveva un server principale scritto in K&R C (cioè pre-ANSI). Hanno costretto i team Java (di entrambi gli uffici - probabilmente 20 sviluppatori in totale) a utilizzare questo formato, che ha ignorato allegramente i 2 pilastri del "dibattito controvento" e diventa matto:

if ( x == y ) 
    {
    System.out.println("this is painful");
    x = 0;
    y++;
    }

18
Penserei che mantenere una maggiore distinzione visiva tra C e Java faciliterebbe le transizioni. (+1 per "e impazzisce").
Jeffrey L Whitledge,

4
Sembra lo stile di Whitesmiths che è stato utilizzato nell'originale 'Windows di programmazione' di Petzold - vai a capire! ;)
Bobby Jack,

7
Trovo che questo sia lo stile di supporto più intelligente. Sfortunatamente, molte persone non lo usano. Se le parentesi graffe hanno un significato semantico, dovrebbero essere trattate allo stesso modo, non bloccate alla fine di una linea e ignorate.
Ryan Lundy,

7
@Kyralessa. Non sono d'accordo ... Non so se le parentesi graffe abbiano un significato semantico, ma possono sicuramente influire sulla corrispondenza dei modelli e sul senso dello spazio. IMO, questa versione lo perde completamente. ad esempio, desidero che il mio segnalibro penetri all'esterno del libro, non sia a filo con le pagine.
Michael Easter,

6
Questo è in realtà il mio stile preferito, ma tutto nel mondo (specialmente Visual Studio) è impostato su altre modalità, quindi ho rinunciato. Perché mi piace? Le parentesi graffe fanno "parte del" codice contenuto - lo costringono a "assomigliare" a una singola istruzione dell'if, che è ciò che si aspetta.
Atario,

104

Vietato:

while (true) {

Permesso:

for (;;) {

4
Altri hanno sostenuto che for (;;) {è un idioma C per il primo.
Robert P,

69
Se capisco correttamente le emoticon moderne e nuove, questo standard fa piangere i poveri, oberati di lavoro per affermazione!
Ben Blank,

15
Questa è una regola di fatto qui. VC6 emette un avviso del compilatore circa while (true), ma non per (;;). Altrimenti sono equivalenti. Quindi scegliamo quello senza preavviso.
user9876

22
Bjarne S. ha detto nel suo libro, "per (;;) dovrebbe essere letto come sempre". Se è abbastanza buono per il creatore di C ++, dovrebbe essere abbastanza buono per te. :-)
Frank Krueger,

58
Nel primo programma C su cui ho lavorato, qualcuno aveva aggiunto #define ever (;;) in modo da poter dire "per sempre {...}"
James Curran,

101

un mio amico - lo chiameremo CodeMonkey - ha ottenuto il suo primo lavoro dal college [ molti anni fa] facendo lo sviluppo interno a COBOL. Il suo primo programma è stato respinto in quanto "non conforme ai nostri standard" perché utilizzava ... [brividi!] Istruzioni IF annidate

gli standard di codifica vietavano l'uso di istruzioni IF annidate

ora, CodeMonkey non era timido ed era certo delle sue abilità, quindi continuò a chiedere a tutti su e giù per il corridoio perché questa regola esistesse. Molti sostenevano di non saperlo, alcuni inventavano cose sulla "leggibilità", e infine una persona ricordava il motivo originale: la prima versione del compilatore COBOL che usavano aveva un bug e non gestiva correttamente le istruzioni IF annidate.

Questo bug del compilatore, ovviamente, era stato corretto per almeno un decennio, ma nessuno aveva contestato gli standard . [baaa!]

CodeMonkey è riuscito a far cambiare gli standard - alla fine!


7
Steven, questo mi ricorda la storia dell'esperimento sulle scimmie: o) freekvermeulen.blogspot.com/2008/08/…
Nick Dandoulakis,

5
@ [Nick D]: sì, anche a me - da qui il nome in codice "CodeMonkey" ;-)
Steven A. Lowe


Il motivo potrebbe essere stato sbagliato, ma è comunque utile evitare if
manojlds

97

Una volta ha lavorato a un progetto in cui i caratteri di sottolineatura sono stati vietati. E intendo totalmente vietato. Quindi nell'app ac # winforms, ogni volta che aggiungiamo un nuovo gestore di eventi (ad es. Per un pulsante) dovremmo rinominare il nome del metodo predefinito da buttonName_Click () in qualcos'altro, solo per soddisfare l'ego del ragazzo che ha scritto il codice standard. Fino ad oggi non so cosa avesse contro l'umile carattere di sottolineatura


23
Forse _ era rotto sulla sua tastiera;)
Roman Plášil,

139
buttonNameUnderscoreClick ()
vitule

9
Ha lo sfortunato effetto collaterale di impedire l'uso di FILE e LINE per il debug. E #if __cplusplus extern "C" nei file di intestazione. E i tipi integrali in stdint.h. E size_t.
Steve Jessop,

8
Meno male che era C # allora
configuratore

4
Scorro seriamente le sottolineature (anche se non nel caso OP elencato sopra. Sono altri due tasti (MAIUSC + _) che preferisco non avermi addosso quando il caso Pascal o Camel andrà bene.
TGnat,

92

Convenzioni di denominazione di database totalmente inutili. Ogni nome di tabella deve iniziare con un numero. I numeri mostrano quale tipo di dati è presente nella tabella.

  • 0: dati utilizzati ovunque
  • 1: dati utilizzati solo da un determinato modulo
  • 2: tabella di ricerca
  • 3: calendario, chat e posta
  • 4: registrazione

Questo rende difficile trovare una tabella se conosci solo la prima lettera del suo nome. Inoltre, poiché si tratta di un database mssql, dobbiamo circondare i tablenames con parentesi quadre ovunque.

-- doesn't work
select * from 0examples;

-- does work
select * from [0examples];

65
Mi dispiace, terribilmente dispiaciuto ...
Kirk Strauser,

1
Caspita. Immagino che usare le lettere fosse fuori discussione? Non che sia UNA buona idea, ma almeno non devi citare tutti i nomi delle tabelle.
Mark Brittingham,

Sconcertante ... chi l'ha inventato? il dba?
dotjoe,

90

Stavamo facendo un progetto C ++ e il capo squadra era un ragazzo di Pascal.

Quindi avevamo uno standard di codifica che include file per ridefinire tutta quella fastidiosa sintassi C e C ++:

#define BEGIN {
#define END }

ma aspetta c'è di più!

#define ENDIF }
#define CASE switch

ecc. È difficile ricordare dopo tutto questo tempo.

Questo ha preso quello che sarebbe stato un codice C ++ perfettamente leggibile e lo ha reso illeggibile a chiunque tranne che al capo della squadra.

Abbiamo anche dovuto usare la notazione ungherese inversa, ad es

MyClass *class_pt  // pt = pointer to type

UINT32 maxHops_u   // u = uint32

anche se stranamente sono diventato così.


22
Costruire codice non
mantenibile

2
La notazione ungherese fatta bene va bene. Fatto male ... ick. Un sistema di tipo corretto batte entrambi.
Thelema,

5
Sai, penso di essere con te su questo. Le verruche ungheresi non sono così discutibili quando attaccate alla fine in quel modo.
TED,

haha mi riporta ai giorni in cui sono passato da Pascal a C ++ (circa 16 anni fa). Ogni volta che ho visto un {ho dovuto dire mentalmente a me stesso "{significa INIZIARE". Almeno per me era solo nella mia testa.
thomasrutter,

6
Quando ho lavorato nel supporto MS VC ++, diversi clienti hanno inviato il codice di riproduzione scritto in questo modo. Ci è voluto un po 'per renderci conto che in realtà era in C ++ (non includevano le #define).
JBR Wilkinson,

88

In un precedente lavoro:

  • Le tabelle "normali" iniziano con T_
  • Le tabelle "Sistema" (di solito le ricerche) iniziano con TS_ (tranne quando non lo fanno perché qualcuno non ne ha avuto voglia quel giorno)
  • Le tabelle di riferimenti incrociati iniziano con TSX_
  • Tutti i nomi dei campi iniziano con F_

Sì, è giusto. Tutti i campi, in ogni singola tabella. In modo che possiamo dire che è un campo.


e non avevi un prefisso speciale per i campi chiave primaria ???
Czimi,

2
@Czimi: ho dimenticato di menzionarlo. Ogni tabella ha un campo chiamato FI_ID usato come chiave primaria.
Jeromy Irvine,

31
Holy sh ... Il T_guy che ha inventato questo incubo dovrebbe essere ucciso con un F_gun e inviato a TSX_hell.
Sergey Skoblikov,

3
Avevamo tbl e fld per tutti i campi e le tabelle. Completamente inutile ...
configuratore

5
@configurator: avevi "tbl" per tutti i campi e "fld" per tutte le tabelle? :-)))
Timwi,

84

Un mio amico ha incontrato questa regola mentre lavorava in un posto di governo. L'uso di ++ (pre o post) è stato completamente vietato. Il motivo: diversi compilatori potrebbero interpretarlo in modo diverso.


5
Bene, a quel punto potresti anche rinunciare, giusto?
Kirk Strauser,

90
Qualcuno è stato morso non capendo la differenza tra postfisso e prefisso, ha affermato il bug del compilatore, quindi l'ha inflitto ad altre persone, penso.
Bernard,

5
In realtà, avevano ragione, in alcune circostanze. Il divieto sembra un po 'esagerato però. Prendiamo ad esempio la riga: a [i] = i ++; posso essere incrementato prima che venga utilizzato per indicizzare a o dopo. La lingua non lo definisce.
TED

9
Ha ragione: l'ordine delle operazioni non è garantito quando si utilizza la stessa variabile altrove nell'istruzione. Basta bandire codice potenzialmente ambiguo, non tutti gli usi, però!
Loren Pechtel,

2
Potrebbe anche essere vietato =in quanto può essere utilizzato per causare comportamenti indefiniti.
configuratore

81

La metà della squadra ha favorito il rientro di quattro spazi; l'altra metà ha favorito il rientro di due spazi.

Come puoi immaginare, lo standard di codifica impone tre, in modo da "offendere tutti allo stesso modo" (una citazione diretta).


42
Ecco perché l'identificazione delle schede è così eccezionale. Tutti possono modificare le dimensioni nel suo editor;)
xardias,

41
Sì, il rientro delle schede è fantastico ... fino a quando non apri effettivamente il file di qualcun altro e trovi cose disallineate perché gli spazi si sono mescolati in dove non avrebbero dovuto o non si sono mescolati in dove avrebbero dovuto. Quindi si riformatta automaticamente e le differenze di controllo della versione diventano brutte. Ugh.
Alan Hensel,

41
ecco perché dovresti usare solo le linguette per rientrare, e solo gli spazi per allineare, e mai i due si incontreranno. e se hai intenzione di apportare una modifica allo spazio bianco in un file, quella deve essere l'unica modifica che apporti per quel particolare check-in.
joh6nn,

16
... e non funziona mai. : P
Robert P

10
Per "offendere tutti allo stesso modo" ... lo adoro. Dovrò ricordarmelo la prossima volta che sarò in qualche modo invaso da una guerra di standardizzazione del rientro.
Michael Burr,

74

Non essere in grado di utilizzare Reflection, in quanto il manager ha affermato che comportava troppa "magia".


10
Sì, la magia è difficile da mantenere, a quanto pare;) LOL, però.
Rik,

19
Questa è probabilmente la regola giusta, per le ragioni sbagliate :)
Bobby Jack,

71
per prestazioni di lettura "magiche" che uccidono un codice da incubo oscuro non mantenibile. Ha ragione.
gbjbaanb,

4
Immagino che non ti sia stato permesso di scrivere codice in .Net allora. Dopotutto, molto di come viene eseguito il framework è attraverso la riflessione.
NotMe,

5
Abbasso quei maghi !! Sempre in giro, con la loro magia , rubando il nostro lavoro, seducendo le nostre donne e corrompendo i nostri bambini!
ZJR,

71

Il più strano che ho avuto e quello che mi ha impiegato parecchio tempo a rovesciarlo, è stato quando il proprietario della nostra azienda ha richiesto che il nostro nuovo prodotto fosse solo IE. Se poteva funzionare su FireFox, era OK, ma doveva essere solo IE.

Questo potrebbe non sembrare troppo strano, tranne per un piccolo difetto. Tutto il software era per un pacchetto software server su misura, in esecuzione su Linux, e tutte le caselle client che il nostro cliente stava acquistando erano Linux. A meno di provare a capire come far funzionare Wine (a quei tempi, molto inaffidabile) su tutte queste scatole e vedere se potevamo far funzionare IE e addestrare i loro amministratori su come eseguire il debug dei problemi di Wine, semplicemente non era possibile per soddisfare la richiesta del proprietario. Il problema era che stava progettando il Web e semplicemente non sapeva come rendere i siti Web conformi a FireFox.

Probabilmente non ti stupirà sapere che la nostra azienda è fallita.


1
Direi che è piuttosto strano.
Brad Gilbert,

14
Tre acclamazioni per il capitalismo!
Starblue,

46
Sì per la sopravvivenza del più adatto ... questo ragazzo non meritava di gestire la propria attività di software.
Mark Brittingham,

10
L'ultima frase è stata fantastica. Come si può prendere sul serio qualcuno quando prendono decisioni come questa?
Mr. Shickadance,

54

Utilizzo di nomi identificativi numerati generici

Nel mio lavoro attuale abbiamo due regole che sono davvero cattive:

Regola 1: ogni volta che creiamo un nuovo campo in una tabella del database, dobbiamo aggiungere campi di riserva aggiuntivi per un utilizzo futuro. Questi campi di riserva sono numerati (perché nessuno sa quali dati manterranno un giorno) La prossima volta che abbiamo bisogno di un nuovo campo cerchiamo prima un campo di riserva non utilizzato.

Quindi finiamo col customer.reserve_field_14contenere l'indirizzo e-mail del cliente.

Un giorno il nostro capo ha pensato di introdurre tabelle di riserva , ma per fortuna abbiamo potuto convincerlo a non farlo.

Regola 2: Uno dei nostri prodotti è scritto in VB6 e VB6 ha un limite del conteggio totale di nomi di identificativi diversi e poiché il codice è molto grande, ci imbattiamo costantemente in questo limite. Come "soluzione" tutti i nomi delle variabili locali sono numerati:

  • Lvarlong1
  • Lvarlong2
  • Lvarstr1
  • ...

Sebbene ciò aggiri efficacemente il limite dell'identificatore, queste due regole combinate portano a un bellissimo codice come questo:

...

If Lvarbool1 Then
  Lvarbool2 = True
End If

If Lvarbool2 Or Lvarstr1 <> Lvarstr5 Then
  db.Execute("DELETE FROM customer WHERE " _ 
      & "reserve_field_12 = '" & Lvarstr1 & "'")
End If

...

Puoi immaginare quanto sia difficile riparare il codice vecchio o di qualcun altro ...

Ultimo aggiornamento: ora stiamo anche utilizzando le "procedure di riserva" per i membri privati:

Private Sub LSub1(Lvarlong1 As Long, Lvarstr1 As String)
  If Lvarlong1 >= 0 Then 
    Lvarbool1 = LFunc1(Lvarstr1)
  Else
    Lvarbool1 = LFunc6()
  End If
  If Lvarbool1 Then
    LSub4 Lvarstr1
  End If
End Sub

EDIT: sembra che questo modello di codice stia diventando sempre più popolare. Vedi questo post The Daily WTF per saperne di più: astigmatismo :)


10
Non sto scherzando. Scommetto che ci è voluta un'eternità per passare e rimuovere tutte quelle iniezioni di SQL. ;-)
Kirk Strauser il

Questa è pura malvagità. Sono sicuro che il tuo capo / TL è un signore supremo che aspetta solo la sua opportunità.
Manuel Ferreria,

5
oh, chi diavolo sarebbe venuto fuori con regole come questa ??? soprattutto: come diavolo fa la tua squadra a programmare ??
hasen

2
Penso che intendesse selezionare tutti i campi per impostazione predefinita in modo da avere anche tutti i campi "riserva", senza la necessità di specificarli tutti.
Mr. Shickadance,

2
maibe potresti usare la pre-correzione del codice, in cui scriveresti il ​​tuo codice usando nomi di variabili significative e poi lo sostituiresti con "quelli corretti" prima di compilare qualcosa come '% s / email / reserve_field_12 / g';)
João Portela,

53

Ai miei tempi in C ++ non ci era permesso usare ==,> =, <=, &&, ecc. C'erano macro per questo ...

if (bob EQ 7 AND alice LEQ 10)
{
   // blah
}

questo ovviamente aveva a che fare con la "vecchia assegnazione accidentale nel bug condizionale", tuttavia avevamo anche la regola "metti le costanti prima delle variabili", quindi

if (NULL EQ ptr); //ok
if (ptr EQ NULL); //not ok

Appena ricordato, lo standard di codifica più semplice che io abbia mai sentito era "Scrivi codice come se il prossimo manutentore fosse uno psicopatico malvagio che sa dove vivi".


1
rofl .. scrivendo fortran in C.
Robert Paulson,

faccio ancora null == variabile in c #. so che non devo preoccuparmene, ma non posso fare a meno. se lo vedo dall'altra parte mi sento nervoso. le vecchie abitudini sono dure a morire.
Troy Howard,

L'ultimo sullo psicopatico avrebbe ucciso alcune persone quasi immediatamente.
Mr. Shickadance,

31
+1 per lo psicopatico malvagio.
rcollyer,

Quando invio codice sui forum, a volte userò cose come LT e SHL, per evitare che gli operatori vengano mungiti come HTML.
supercat

45

Notazione ungherese in generale.


11
Bene, mi piace H / N per il controllo su una pagina. È molto più facile trovare tutti i controlli della casella di testo in un menu a discesa IntelliSense quando tutto ciò che devo cercare è txtFooBar.
cciotti,

20
La notazione ungherese non è malvagia, basta solo usarla
Czimi

1
Concederò rispetto ai controlli. Quindi la notazione ungherese può essere utile. In generale, tuttavia, penso che la notazione ungherese sia obsoleta e generalmente abusata. Si è allontanato dalla sua intenzione originale.
vfilby,

9
Orribilmente abusato, sì. Sbagliato, no.
Loren Pechtel,

2
Molte persone iniziano un nome di interfaccia con un I, IEnumerable, IList ... Nel framework .Net tutte le interfacce iniziano con un I.
tuinstoel

43

Ho avuto molti stupidi regole , ma non molte che ho considerato decisamente strane.

Il più sciocco era in un lavoro della NASA che ho lavorato nei primi anni '90. Questo è stato un lavoro enorme, con oltre 100 sviluppatori. Gli sviluppatori esperti che hanno scritto gli standard di codifica hanno deciso che ogni file sorgente doveva iniziare con un acronimo di quattro lettere e la prima lettera doveva rappresentare il gruppo responsabile del file. Questa è stata probabilmente una grande idea per i vecchi progetti FORTRAN 77 a cui erano abituati.

Tuttavia, questo era un progetto Ada , con una bella struttura gerarchica di librerie, quindi non aveva alcun senso. Ogni directory era piena di file che iniziavano con la stessa lettera, seguita da altre 3 lettere senza senso, un carattere di sottolineatura e quindi parte del nome del file che contava. Tutti i pacchetti di Ada dovevano iniziare con questa stessa verruca di cinque caratteri. Ada clausole "usa" non sono stati autorizzati né (probabilmente una buona cosa in circostanze normali), in modo che significava ogni riferimento a qualsiasi identificatore che non era locale a quel file sorgente anche dovuto includere questo verruca inutile. Probabilmente avrebbe dovuto esserci un'insurrezione al riguardo, ma l'intero progetto era gestito da programmatori junior e appena uscito dai nuovi assunti del college (essendo io stesso quest'ultimo).

Una tipica istruzione di assegnazione (già dettagliata in Ada) finirebbe per assomigliare a questa:

NABC_The_Package_Name.X := NABC_The_Package_Name.X + 
  CXYZ_Some_Other_Package_Name.Delta_X;

Fortunatamente erano almeno abbastanza illuminati da permetterci più di 80 colonne! Tuttavia, la verruca della struttura era abbastanza odiata da diventare un codice a piastre nella parte superiore dei file sorgente di tutti per usare Ada "rinomina" per sbarazzarsi della verruca. Ci sarebbe una rinomina per ogni pacchetto importato ("appassito"). Come questo:

package Package_Name renames NABC_Package_Name;
package Some_Other_Package_Name renames CXYZ_Some_Other_Package_Name;
--// Repeated in this vein for an average of 10 lines or so

Ciò che il più creativo tra noi ha preso a fare è stato cercare di usare la verruca per rendere un nome di pacchetto acutamente sensato (o sciocco). (So ​​cosa stai pensando, ma gli esplosivi non sono stati ammessi e vergogna per te! È disgustoso). Ad esempio, ero nel C ommon gruppo di codice, e avevo bisogno di fare un pacchetto di interfaccia con la W gruppo orkstation. Dopo una sessione di brainstorming con il ragazzo della Workstation, abbiamo deciso di nominare i nostri pacchetti in modo che qualcuno che avesse bisogno di entrambi avrebbe dovuto scrivere:

with CANT_Interface_Package;
with WONT_Interface_Package;

1
Con tutto ciò e la NASA non riusciva ancora a capire se calcolare in chilometri o miglia ...
NotMe

16
Dannazione, e pensavo davvero che avresti fatto di tutto per usare una convenzione di denominazione dei pacchetti CUN * _ e W * NK_. Mi dispiace, ho tourette testuali a fuoco lento, esplosivo. Ma i tuoi erano molto, molto più divertenti!
defmeta,

41

Quando ho iniziato a lavorare in un posto e ho iniziato a inserire il mio codice nel controllo del codice sorgente, il mio capo improvvisamente mi è venuto incontro e mi ha chiesto di smettere di impegnarmi così tanto. Mi ha detto che è scoraggiato fare più di 1 commit al giorno per uno sviluppatore perché sporca il controllo del codice sorgente. L'ho semplicemente guardato a bocca aperta ...

Più tardi ho capito che il motivo per cui mi è venuto in mente è perché il server SVN gli avrebbe inviato (e altri 10 alti dirigenti) una mail per ogni commit che qualcuno fa. E sparpagliando il controllo del codice sorgente ho pensato che menzionasse la sua cassetta postale.


Evidenzia e-mail, fai clic su Elimina,
terminato

Sono sicuramente non un fan dei cosiddetti "check-in grosso". Impegnati quando la modifica è completa, semplice. Mi piace anche impegnarmi alla fine della giornata di lavoro poiché mi viene in mente che il mio codice dovrebbe essere compilabile ed almeno essere eseguibile con il resto del progetto per altri programmatori la mattina successiva.
Jesse C. Slicer,

2
Ottieni il meglio da entrambi i mondi - Impegna la tua filiale locale ogni volta che non vuoi perdere qualcosa. Rebase e schiaccia quelle commit quando sei pronto a metterle nel master. (perdona la terminologia git - sono sicuro che sia possibile anche in altri sistemi e un sacco di altri sistemi)
Michael Anderson,

Sono d'accordo con tutto quanto sopra. È un problema radicato dell'approccio al controllo delle versioni. Non ha soluzione tecnologica. Ho pensato di passare a git-svn, che mi avrebbe permesso di lavorare con un repository locale e quindi di spingere le cose nel repository SVN, ma che avrebbe appena inviato le mail per tutti i miei impegni della giornata in un unico batch, e avrebbe risolto niente per i miei capi.
Avihu Turzion,

34

Esecuzione di tutte le query del database tramite stored procedure in SQL Server 2000. Dalle complesse query multi-tavolo a quelle semplici come:

select id, name from people

Gli argomenti a favore delle procedure erano:

  • Prestazione
  • Sicurezza
  • manutenibilità

So che l'argomento della procedura è piuttosto controverso, quindi sentiti libero di segnare negativamente la mia risposta;)


2
La manutenibilità potrebbe essere migliorata se i nomi di tabella e colonna non sono univoci, ma lo sono i nomi SP. Ciò potrebbe facilitare la ricerca dei riferimenti al codice. Se ci sono altri, migliori vantaggi di manutenibilità, non ne sono consapevole. La sicurezza è il motivo principale per utilizzare SP.
Jeffrey L Whitledge,

2
Sono d'accordo che per scopi generali non è del 100% in peso, ma vedi questo link: codinghorror.com/blog/archives/000292.html
azkotoki

2
"La sicurezza è il motivo principale per utilizzare gli SP" No. Nulla di SP negli SQL Server è più sicuro. Sono sicuri solo quando vengono chiamati come query paremeterizzate, che possono essere eseguite anche con SQL dinamico.
Flory,

4
No, gli sproc sono utili. Mentre a volte può essere una seccatura, si finisce per scrivere un'interfaccia di database migliore e più riutilizzabile. I tuoi dba possono anche semplificare l'analisi dei problemi di prestazioni e aggiornare un sistema di produzione senza una modifica del codice dell'app. Tuttavia, non sostengo la logica biz negli sprocs.
Robert Paulson,

4
seppellire le query nel codice compilato è un tale dolore, sono al 100% indietro rispetto al 100% della politica di sprocs per l'astrazione da sola
annakata

33

Ci devono essere 165 test unitari (non necessariamente automatizzati) per 1000 righe di codice. Questo funziona in un test per circa ogni 8 righe.

Inutile dire che alcune delle righe di codice sono piuttosto lunghe e le funzioni restituiscono questi puntatori per consentire il concatenamento.


In che modo un test unitario non è automatizzato.
pupeno,

Come hanno escogitato il numero magico 8?
Rohit,

1
Cosa succede se hai 164? 166?
Daniel Daranas,

8
Più come 6 linee.
ricorsivo il

1
Dipende da quanto i tuoi test siano finemente granulati, immagino. Considererei function(x).should == 2un singolo test, mentre altri ne raggrupperebbero 10 insieme e lo chiamerebbero un singolo test.
Orion Edwards,

30

Abbiamo dovuto ordinare alfabeticamente tutte le funzioni nelle classi, per renderle "più facili da trovare". Non importa se l'ide ha avuto un calo. Sono stati troppi clic.

(lo stesso responsabile tecnico ha scritto un'app per rimuovere tutti i commenti dal nostro codice sorgente).


3
Beh, certo, perché i commenti sono solo disordinati, dopo tutto ... e pensa a quanti cicli il pre-processore salva al momento della compilazione! (L'app è ancora più divertente della regola. Buona.)
ojrac,

7
Ovviamente! Gli sviluppatori dovrebbero scrivere codice, non perdere tempo a scrivere commenti :)
Daniel Rikowski il

2
Si! E i commenti rendono la compilazione più lenta!
Greg D,

2
Tuttavia, penso che sia una buona regola ordinare i membri per tipo (campi, proprietà, metodi) e per nome
abatishchev

3
Ordino i metodi, i membri, ecc. In ordine alfabetico all'interno dei rispettivi gruppi, sia nell'intestazione che nella fonte ... ma solo perché sono ossessivo.
Jon Purdy,

29

Nel 1987 o giù di lì, ho preso un lavoro con una società che mi ha assunto perché ero una di una manciata di persone che sapevano usare Revelation. La rivelazione, se non ne hai mai sentito parlare, era essenzialmente un'implementazione basata su PC del sistema operativo Pick - che, se non ne hai mai sentito parlare, prende il nome dal suo inventore, il favoloso Dick Pick. Si può dire molto sul sistema operativo Pick, in gran parte buono. Numerosi distributori di supermini (almeno Prime e MIPS) hanno utilizzato Pick o le loro implementazioni personalizzate.

Questa società era un negozio Prime e per i loro sistemi interni utilizzavano le informazioni. (No, quello era davvero il suo nome: era l'implementazione di Pick di Prime.) Avevano un contratto con lo stato per costruire un sistema basato su PC e avevano messo circa un anno nel loro progetto di Rivelazione prima che il ragazzo facesse tutto il lavoro, che era anche il loro direttore del MIS, decise che non poteva più fare entrambi i lavori e mi assunse.

Ad ogni modo, aveva stabilito una serie di standard di codifica per il loro software basato su Prime, molti dei quali derivati ​​da due condizioni di base: 1) l'uso di terminali stupidi a 80 colonne e 2) il fatto che da quando Prime non Non ho un editor visivo, aveva scritto il suo. A causa della magica portabilità del codice Pick, aveva portato il suo editor in Revelation e aveva costruito l'intero progetto sul PC utilizzandolo.

La rivelazione, ovviamente, essendo basata su PC, aveva un editor a schermo intero perfettamente funzionante, e non si oppose quando superasti la colonna 80. Tuttavia, per i primi mesi che ero lì, ha insistito sul fatto che io uso il suo editor e i suoi standard.

Quindi, il primo standard era che ogni riga di codice doveva essere commentata. Ogni linea. Nessuna eccezione. La sua logica era che anche se il tuo commento dicesse esattamente quello che avevi appena scritto nel codice, dovendo commentare significava che almeno pensavi alla riga due volte. Inoltre, come ha sottolineato allegramente, aveva aggiunto un comando all'editor che formattava ogni riga di codice in modo da poter inserire un commento di fine riga.

Oh si. Quando hai commentato ogni riga di codice, è stato con i commenti di fine riga . In breve, i primi 64 caratteri di ogni riga erano per il codice, quindi c'era un punto e virgola e quindi avevi 15 caratteri per descrivere ciò che facevano i tuoi 64 caratteri. In breve, stavamo usando una convenzione del linguaggio assembly per formattare il nostro codice Pick / Basic. Ciò ha portato a cose che sembravano così:

EVENT.LIST[DATE.INDEX][-1] = _         ;ADD THE MOST RECENT EVENT
   EVENTS[LEN(EVENTS)]                 ;TO THE END OF EVENT LIST

(In realtà, dopo 20 anni ho finalmente dimenticato la sintassi di continuazione della linea di R / Basic, quindi potrebbe essere sembrata diversa. Ma hai capito.)

Inoltre, ogni volta che è stato necessario inserire commenti multilinea, la regola era che si utilizzava una fioriera:

************************************************************************
**  IN CASE YOU NEVER HEARD OF ONE, OR COULDN'T GUESS FROM ITS NAME,  **
**  THIS IS A FLOWER BOX.                                             **
************************************************************************

Sì, erano richiesti quegli asterischi di chiusura su ciascuna linea. Dopotutto, se hai usato il suo editor, era solo un semplice comando dell'editor per inserire una fioriera.

Farlo abbandonare e farmi usare l'editor incorporato di Apocalisse fu una vera battaglia. All'inizio ha insistito, semplicemente perché quelle erano le regole. Quando ho obiettato che a) conoscevo già l'editor di Rivelazione b) era sostanzialmente più funzionale del suo editore, c) altri sviluppatori di Rivelazione avrebbero avuto la stessa prospettiva, ribatté che se non mi fossi allenato sul suo editore non lo avrei fatto essere mai stato in grado di lavorare sulla base di codice di Prime, che, come entrambi sapevamo, non sarebbe accaduto fino a quando l'inferno sarebbe rimasto intatto. Alla fine ha ceduto.

Ma gli standard di codifica furono gli ultimi ad andare. I commenti sui fiori in particolare sono stati una stupida perdita di tempo, e mi ha combattuto con le unghie e con i denti, dicendo che se avessi usato l'editor giusto per mantenerli sarebbe stato perfettamente facile. (Il tutto è diventato piuttosto passivo-aggressivo.) Alla fine mi sono arreso in silenzio, e da allora in poi tutto il codice che ho portato alle recensioni ha avuto i suoi preziosi commenti a forma di fiori.

Un giorno, dopo diversi mesi di lavoro, quando mi ero praticamente dimostrato più che competente (soprattutto in confronto alla straordinaria parata di altri programmatori che sono passati attraverso quell'ufficio mentre lavoravo lì), mi guardava alle spalle mentre io ha funzionato e ha notato che non stavo usando i commenti sui fiori. Oh, ho detto, ho scritto un formattatore di codice sorgente che converte i miei commenti nel tuo stile quando li stampo. È più facile che mantenerli nell'editor. Aprì la bocca, rifletté per un momento, la chiuse, se ne andò e non parlammo mai più degli standard di codifica. Entrambi i nostri lavori sono diventati più facili dopo.


14
+1 per il formattatore dei commenti durante la stampa
BradC,

1
La fioriera non deve MAI essere abusata. Lo odio quando sto leggendo il codice, okay bel commento, poi vedo una fioriera che grida "QUESTO FA QUESTO E QUESTO E QUESTO"
TheLQ

26

Al mio primo lavoro, tutti i programmi C, per quanto semplici o complessi, avevano solo quattro funzioni. Avevi il main, che a sua volta chiamava le altre tre funzioni. Non ricordo i loro nomi, ma erano qualcosa sulla falsariga di begin (), middle () e end (). begin () ha aperto i file e le connessioni al database, end () li ha chiusi e middle () ha fatto tutto il resto . Inutile dire che middle () è stato molto funzione lunga.

E solo per rendere le cose ancora migliori, tutte le variabili dovevano essere globali.

Uno dei miei ricordi più orgogliosi di quel lavoro è stato far parte della rivolta generale che ha portato alla distruzione di quegli standard.


2
Immagino che sulla carta in una sala riunioni suonasse bene, ma provo compassione per il programmatore che doveva seguirlo
TheLQ

Deve essere stato progettato da un insegnante di inglese.
yodie,

Deve essere stato progettato da un programmatore COBOL.
bruno,

Deve aver usato un sacco di goto.
nuovo123456,

26

Uno standard di codifica C scritto esternamente che aveva la regola "non fare affidamento sulla precedenza incorporata dell'operatore, usare sempre parentesi"

Abbastanza giusto, l'ovvio intento era vietare:

a = 3 + 6 * 2;

a favore di:

a = 3 + (6 * 2);

Il fatto era che questo era applicato da uno strumento che seguiva le regole della sintassi C che '=', '==', '.' e l'accesso alla matrice sono operatori. Quindi codice come:

a[i].x += b[i].y + d - 7;

doveva essere scritto come:

((a[i]).x) += (((b[i]).y + d) - 7);

2
forse (((a) [(i)]). x) + = (((((b) [(i)]). y) + (d)) - (7)); ?
Behrooz,
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.