Qual è il vantaggio di non usare la notazione ungherese?


101

Una delle cose con cui faccio fatica non è usare la notazione ungherese. Io non voglio avere per andare alla definizione della variabile solo per vedere che tipo è. Quando un progetto diventa esteso, è bello poter guardare una variabile con il prefisso 'bool' e sapere che sta cercando vero / falso invece di un valore 0/1 .

Faccio anche molto lavoro in SQL Server. Prefisso le mie stored procedure con 'sp' e le mie tabelle con 'tbl', per non parlare rispettivamente di tutte le mie variabili nel database.

Vedo ovunque che nessuno vuole davvero usare la notazione ungherese, al punto da evitarlo. La mia domanda è: qual è il vantaggio di non usare la notazione ungherese, e perché la maggior parte degli sviluppatori la evita come la peste?


39
Quale lingua / IDE usi? In Visual Studio, non è necessario passare alla definizione per conoscere il tipo di variabile, poiché l'IDE te lo fornisce. Nelle lingue in cui i tipi non vengono applicati, come PHP, non è necessario conoscerli il più delle volte (poiché è possibile assegnare 0 o 1 a un valore booleano).
Arseni Mourzenko,

10
@MainMa Non sono sicuro che sia un buon motivo per non conoscere il tipo di valore in PHP.
Rei Miyasaka,

29
"Quando i progetti diventano estesi" ... non dovrebbe importare. Ci dovrebbe essere solo un piccolo numero di variabili nell'ambito in qualsiasi punto: una manciata di variabili di classe e un'altra manciata di argomenti del metodo. Se non riesci a tenerli dritti, la classe è troppo grande o il metodo è troppo lungo. La notazione ungherese è stata inventata per la programmazione di Windows C, fondamentalmente come soluzione per l'orribile API di Windows. Nulla di simile è mai stato suggerito o voluto per lo sviluppo di Unix.
Kevin Cline il

20
qual è il vantaggio di non usare la notazione ungherese "Non essere odiato dai tuoi colleghi" mi viene in mente ...
Sean Patrick Floyd,

25
adjHungarian nNotation vIs adjHard prepTo vRead.
dan04,

Risposte:


148

Perché la sua intenzione originale (vedi http://www.joelonsoftware.com/articles/Wrong.html e http://fplanque.net/Blog/devblog/2005/05/11/hungarian_notation_on_steroids ) è stata fraintesa ed è stata ( ab) usato per aiutare le persone a ricordare che tipo è una variabile quando la lingua che usano non è tipizzata staticamente. In qualsiasi linguaggio tipicamente statico non è necessario il reattore di prefissi aggiunto per dirti di che tipo è una variabile. In molti linguaggi di script non tipizzati può aiutare, ma è stato spesso abusato al punto da diventare totalmente ingombrante. Sfortunatamente, invece di tornare all'intento originale della notazione ungherese, la gente è appena diventata una di quelle cose "malvagie" che dovresti evitare.

In breve, la notazione ungherese era intesa come prefisso per le variabili con una semantica. Ad esempio, se si hanno coordinate dello schermo (sinistra, in alto, a destra, in basso), si antepongono le variabili con posizioni assolute dello schermo con " abs" e variabili con posizioni relative a una finestra con " rel". In questo modo sarebbe ovvio per qualsiasi lettore quando si passava una coordinata relativa a un metodo che richiede posizioni assolute.

aggiornamento (in risposta al commento di delnan)

IMHO la versione maltrattata dovrebbe essere evitata come la peste perché:

  • complica la denominazione. Quando (ab) si utilizza la notazione ungherese, si terranno sempre discussioni su come devono essere specifici i prefissi. Ad esempio: listboxXYZo MyParticularFlavourListBoxXYZ.
  • allunga i nomi delle variabili senza aiutare a capire a cosa serve la variabile.
  • in qualche modo sconfigge l'oggetto dell'esercizio quando per evitare lunghi prefissi questi vengono abbreviati in abbreviazioni e hai bisogno di un dizionario per sapere cosa significa ogni abbreviazione. È un uinumero intero senza segno? un'interfaccia contata senza riferimento? qualcosa a che fare con le interfacce utente? E quelle cose possono durare a lungo . Ho visto prefissi di più di 15 personaggi apparentemente casuali che dovrebbero trasmettere il tipo esatto di var ma in realtà solo mistificare.
  • diventa obsoleto velocemente. Quando cambi il tipo di una variabile, le persone invariabilmente (lol) dimenticano di aggiornare il prefisso per riflettere la modifica, o deliberatamente non aggiornarlo perché ciò causerebbe cambiamenti di codice ovunque venga usato il var ...
  • complica il parlare di codice perché come "@g". ha detto: I nomi delle variabili con notazione ungherese sono in genere zuppa di alfabeto difficile da pronunciare. Questo inibisce la leggibilità e la discussione del codice, perché non puoi "dire" nessuno dei nomi.
  • ... molto di più che non ricordo al momento. Forse perché ho avuto il piacere di non avere a che fare con l'abuso notazione ungherese da molto tempo ...

9
@ Surfer513: In realtà, preferisco i suffissi per i controlli di denominazione. Per me è molto più interessante trovare tutti i controlli che trattano un argomento / aspetto specifico rispetto a trovare tutti i controlli di modifica ... Quando voglio trovare il controllo in cui l'utente può digitare un nome client, inizierò a cercare client piuttosto che txt, perché potrebbe non essere un txt (modifica) ma un memo o un richedit o un ... Potrebbe anche essere una casella combinata per consentire di trovarlo nei nomi dei client immessi in precedenza ...
Marjan Venema

8
@ Surfer513: E al giorno d'oggi tendo ad usare i suffissi solo per distinguere tra due controlli che trattano la stessa cosa. Ad esempio l'etichetta e la modifica per il nome del cliente. E abbastanza spesso i suffissi non sono correlati al tipo di controllo, ma al suo scopo: ClientCaption e ClientInput per esempio.
Marjan Venema,

3
Vale anche la pena notare che intellisense in VS 2010 ti consente di cercare l' intero nome, non solo l'inizio. Se assegni il nome "firstNameTextBox" al tuo controllo e digiti "textb", troverà il tuo controllo e lo elencherà.
Adam Robinson,

4
'... la versione maltrattata viene evitata come la placca ...' vale a dire, leggermente evitata rispetto al tartaro e alla gengivite? ;-)
Ben Mosher,

4
@Marjan: Naturalmente un compilatore avrebbe potuto raccoglierlo. Se ogni unità è rappresentata da un tipo, non è possibile passarne accidentalmente un'altra. Qui, se si dispone di un AbsoluteXTypee RelativeYType, quindi non si poteva erroneamente passare una Y coordinata relativa per una X assoluto uno. Preferisco che le variabili che rappresentano entità incompatibili siano di tipo incompatibile, piuttosto che avere prefissi incompatibili. Il compilatore non si preoccupa dei prefissi (o dei suffissi).
Matthieu M.,

74

La notazione ungherese è un anti-modello di denominazione negli ambienti di programmazione odierni e nella forma di Tautologia .

Ripete inutilmente le informazioni senza alcun vantaggio e costi di manutenzione aggiuntivi. Cosa succede quando cambi il tuo intin un tipo diverso come long, ora devi cercare e sostituire l'intera base di codice per rinominare tutte le variabili o ora sono semanticamente sbagliate, il che è peggio che se non avessi duplicato il tipo nel nome.

Viola il principio DRY. Se devi aggiungere un prefisso alle tue tabelle del database con un'abbreviazione per ricordarti che si tratta di una tabella, allora sicuramente non nominerai le tue tabelle in modo semanticamente descrittivo. Lo stesso vale per ogni altra cosa con cui stai facendo questo. È solo una digitazione extra e funziona senza alcun vantaggio o beneficio in un moderno ambiente di sviluppo.


2
"Cosa succede quando cambi il tuo intin un tipo diverso come long..." Semplice: <sarcasm> Non cambiare il nome perché non si sa quanti posti il ​​cambiamento si incresperà. </sarcasm> Quindi ora hai una variabile il cui Il nome ungherese è in conflitto con la sua attuazione. Non c'è assolutamente modo di dire quanto saranno diffusi gli effetti della modifica del nome se la variabile / funzione ha visibilità pubblica.
David Hammen,

2
L'articolo collegato è fantastico e merita una lettura. +1
Marty Pitt,

6
@David basta guardare l'API Win32 che è piena di variabili, parametri e persino nomi di metodi che usando la notazione ungherese (che è un requisito in MS) indicano un valore di 8 bit o 16 bit quando in realtà sono stati tutti a 32 bit valori dall'introduzione di Windows 95 nel 1994 (quindi quasi 17 anni fa).
jwenting

2
@ Sicuro: direi che è quello che dovrebbero fare i test automatici. Non programmatori.
Gioele,

2
@Secure forse non in un'applicazione interna, ma se stai mantenendo un'API pubblica come l'API di Windows, è un grosso problema.
jwenting

51

Wikipedia ha un elenco di vantaggi e svantaggi della notazione ungherese e può quindi probabilmente fornire la risposta più completa a questa domanda. Le notevoli opinioni sono anche una lettura piuttosto interessante.

Il vantaggio di non usare la notazione ungherese è fondamentalmente solo l'evitamento dei suoi svantaggi:

  • La notazione ungherese è ridondante quando il compilatore esegue il controllo del tipo. I compilatori per le lingue che forniscono il controllo del tipo assicurano che l'uso di una variabile sia automaticamente coerente con il suo tipo; i controlli ad occhio sono ridondanti e soggetti a errori umani.

  • Tutti i moderni ambienti di sviluppo integrato visualizzano tipi variabili su richiesta e contrassegnano automaticamente le operazioni che utilizzano tipi incompatibili, rendendo la notazione ampiamente obsoleta.

  • La notazione ungherese diventa confusa quando viene utilizzata per rappresentare diverse proprietà, come in a_crszkvc30LastNameCol: un argomento di riferimento costante, che contiene il contenuto di una colonna LastNamedel database di tipo varchar(30)che fa parte della chiave primaria della tabella.

  • Può causare incoerenza quando il codice viene modificato o portato. Se il tipo di una variabile viene modificato, la decorazione sul nome della variabile sarà incoerente con il nuovo tipo o il nome della variabile deve essere modificato. Un esempio particolarmente noto è il WPARAMtipo standard e il wParamparametro formale di accompagnamento in molte dichiarazioni di funzioni del sistema Windows. La "w" sta per "parola", dove "parola" è la dimensione della parola nativa dell'architettura hardware della piattaforma. Originariamente era un tipo a 16 bit su architetture di parole a 16 bit, ma è stato cambiato in un 32 bit su architetture di parole a 32 bit, o un tipo a 64 bit su architetture di parole a 64 bit nelle versioni successive del sistema operativo mantenendo nome originale (il suo vero tipo di base èUINT_PTR, ovvero un numero intero senza segno abbastanza grande da contenere un puntatore). L'impedenza semantica, e quindi la confusione e l'incoerenza del programmatore da una piattaforma all'altra, presuppone che "w" rappresenti 16 bit in questi diversi ambienti.

  • Il più delle volte, conoscere l'uso di una variabile implica conoscerne il tipo. Inoltre, se l'uso di una variabile non è noto, non può essere dedotto dal suo tipo.

  • La notazione ungherese riduce fortemente i vantaggi dell'utilizzo di editor di codice ricchi di funzionalità che supportano il completamento su nomi di variabili, poiché il programmatore deve inserire prima l'intero identificatore di tipo.

  • Rende il codice meno leggibile, offuscando lo scopo della variabile con tipi inutili e prefissi di ambito.

  • Le informazioni aggiuntive sul tipo possono sostituire in modo insufficiente nomi più descrittivi. Ad esempio sDatabase, non dice al lettore di cosa si tratta. databaseNamepotrebbe essere un nome più descrittivo.

  • Quando i nomi sono sufficientemente descrittivi, le informazioni aggiuntive sul tipo possono essere ridondanti. Ad esempio firstNameè molto probabilmente una stringa. Quindi la denominazione sFirstNameaggiunge solo disordine al codice.

Io stesso non uso questa notazione, perché non mi piace il rumore tecnico non necessario. Quasi sempre so con quale tipo ho a che fare e voglio un linguaggio pulito nel mio modello di dominio, ma scrivo principalmente in linguaggi staticamente e fortemente tipizzati.


1
Questa dovrebbe essere la risposta corretta. È così carino. +1
Saeed Neamati,

Sei troppo gentile, Saeed. Apprezzo il tuo apprezzamento, ma anche le altre risposte a questa domanda sono davvero buone.
Falcon,

11
Votato per una sola frase: "Il più delle volte, conoscere l'uso di una variabile implica conoscerne il tipo. Inoltre, se l'uso di una variabile non è noto, non può essere dedotto dal suo tipo. " - IMHO, questo è il motivo numero 1 per evitare la notazione ungherese.
Daniel Pryden,

19

Come problema specifico di MS SQL Server:

Qualsiasi procedura memorizzata con il prefisso 'sp_' viene prima cercata nel database Master piuttosto che in quello in cui è stata creata. Ciò provocherà un ritardo nell'esecuzione della procedura memorizzata.


4
+1 per alcune informazioni molto interessanti lì. Uso "sp" come prefisso proc memorizzato, non "sp_". Ma questo è sicuramente un fatto molto interessante e una ragione concreta per non usare 'sp_' come prefisso proc memorizzato.

2
+1 Non l'ho mai saputo, e quando ho iniziato a lavorare su SQL Server tutti gli SP nel mio posto di lavoro avevano il prefisso, sp_quindi mi sono bloccato con la convenzione.
Michael,

Ottimo punto, ma niente a che fare con questa domanda (utilizzando sq e non _sp). È come tralasciare il nome dello schema per gli oggetti che non si trovano nello schema predefinito.
JeffO,

1
Per le procedure memorizzate dall'utente, ho usato convenzionalmente "usp_". Ciò serviva a evitare il problema citato E a distinguere per il lettore se lo sproc era un sistema o un utente.
Ombrello

15

IMO il più grande vantaggio di non usare l'ungherese è il fatto che ti costringe a usare nomi significativi . Se stai nominando le variabili correttamente, dovresti immediatamente sapere di che tipo è o essere in grado di dedurlo abbastanza rapidamente in qualsiasi sistema ben progettato. Se hai bisogno di fare affidamento su stro comunque blnsu tutti i objprefissi per sapere di che tipo è una variabile, direi che indica un problema di denominazione - nomi di variabili scadenti in generale o troppo generici per trasmettere significato.

Ironia della sorte, per esperienza personale lo scenario principale che ho visto l'ungherese usato è la programmazione "cargo-cult" (ovvero viene usato da altro codice, quindi continuiamo ad usarlo solo perché) o in VB.NET per aggirare il fatto che la lingua sia senza distinzione tra maiuscole e minuscole (ad esempio Person oPerson = new Personperché non è possibile utilizzare Person person = new Personed Person p = new Personè troppo vago); Ho anche visto il prefisso "il" o "mio" invece (come in Person thePerson = new Persono il più brutto Person myPerson = new Person), in quel caso particolare.

Aggiungerò l' unica volta che uso l'ungherese tende ad essere per i controlli ASP.NET ed è davvero una questione di scelta. Trovo molto brutto digitare TextBoxCustomerNameo CustomerNameTextBoxcontro il più semplice txtCustomerName, ma anche quello sembra "sporco". Penso che per i controlli debba essere usato un qualche tipo di convenzione di denominazione in quanto possono esserci più controlli che visualizzano gli stessi dati.


13

Mi concentrerò solo su SQL Server da quando l'hai menzionato. Non vedo alcun motivo per mettere "tbl" davanti a un tavolo. Puoi semplicemente guardare qualsiasi codice tSQL e distinguere una tabella da come viene utilizzata. Non vorresti Select from stored_procedure.o ti piacerebbe mai Select from table(with_param)un UDF o ti Execute tblTableOrViewNamepiacerebbe una procedura memorizzata.

Le tabelle potrebbero essere confuse con una vista, ma quando si tratta di come vengono utilizzate; non c'è differenza, quindi qual è il punto? La notazione ungherese potrebbe farti risparmiare il tempo di cercarla in SSMS (sotto tabella o viste?), Ma questo è tutto.

Le variabili possono presentare un problema, ma devono essere dichiarate e, in realtà, quanto lontano dalla tua dichiarazione dichiari di utilizzare una variabile? Scorrere alcune righe non dovrebbe essere un grosso problema a meno che tu non stia scrivendo procedure molto lunghe. Potrebbe essere una buona idea rompere un po 'il codice lungo.

Quello che descrivi è un dolore, ma la soluzione di notazione ungherese non risolve davvero il problema. Puoi guardare il codice di qualcun altro e scoprire che il tipo di variabile può essere modificato, il che ora richiede una modifica al nome della variabile. Ancora un'altra cosa da dimenticare. E se uso un VarChar, dovrai comunque leggere l'istruzione declare per conoscere la dimensione. I nomi descrittivi ti porteranno probabilmente oltre. @PayPeriodStartDate si spiega praticamente da sé.


2
@Surfer: una chiave primaria è diversa perché "PK" non è il tipo; "PK_TableName" dice "questa è la chiave primaria per TableName", non "questo è un TableName di tipo PK". Per il resto ... non sembra che tu stia davvero ascoltando gli argomenti qui. Smetti di usare questa pratica detestabile che fino ad oggi persiste nel ridurre la qualità collettiva di tutto il codice.
Aaronaught,

2
@Aaronaught, stai specificando un aspetto della Notazione ungherese ( en.wikipedia.org/wiki/Hungarian_notation ). Non è solo il tipo, ma anche l'uso previsto. Quindi il prefisso con 'pk' per una chiave primaria è in realtà Notazione ungherese. Sto ascoltando argomenti qui, ma ci sono eccezioni (come la situazione chiave primaria) in cui sembra che HN sia utile. Forse sì forse no. Sto ancora cercando di avvolgere la mia testa attorno alle cose da fare e non per tutti gli scenari. Oggi ho imparato parecchio e ne ho scatenato grandi pensieri.

3
@Surfer: semplicemente non è corretto. La notazione ungherese descrive il tipo (versione errata) o un uso particolare del tipo (versione meno negativa). PK non è nessuno dei due, non sta semplicemente descrivendo qualcosa sul tipo, sta descrivendo un comportamento . Quando parlo, diciamo, di un'età, è del tutto poco interessante che si tratti di un numero intero, ma quando si parla di un vincolo del database, "chiave primaria per la tabella X" è esattamente ciò che è importante.
Aaronaught,

4
Mi piace il tuo penultimo paragrafo. La logica della mia azienda per l'utilizzo della notazione ungherese è "Ci consente di vedere rapidamente quali variabili sono globali e quali no". E poi guardi le dichiarazioni delle variabili e ci sono 300 variabili per file, alcune m * per modulare (globale), altre v * per locale ANCHE ATTRAVERSO SONO DICHIARATE A LIVELLO MODULARE. "Oh, è perché sono intesi solo per essere usati come gente del posto, non modulari." facepalm
corsiKa

3
@Aaronaught: Nel mio progetto attuale, stiamo usando i nomi delle tabelle con il prefisso tbl_ . Anche se non sono un grande fan di questa pratica, non riesco a vedere come questo sta "abbattendo la qualità collettiva di tutto il codice" . Puoi forse fare un esempio?
Treb,

6

Un'altra cosa da aggiungere è che, quali abbreviazioni useresti per un intero framework come .NET? Sì, è così semplice da ricordare che btnrappresenta un pulsante e txtrappresenta una casella di testo. Tuttavia, cosa hai in mente per qualcosa del genere StringBuilder? strbld? Che dire CompositeWebControl? Usi qualcosa del genere:

CompositeWebControl comWCMyControl = new CompositeWebControl();

Una delle inefficienze della notazione ungherese era che, avendo quadri sempre più grandi, non solo dimostrava di non aggiungere ulteriori vantaggi, ma anche di aggiungere maggiore complessità agli sviluppatori, perché ora dovevano imparare sempre di più i prefissi non standard.


6

Per il mio modo di vedere le cose, la Notazione ungherese è un modo per aggirare un sistema di tipi insufficientemente potente. Nelle lingue che ti consentono di definire i tuoi tipi è relativamente banale creare un nuovo tipo che codifichi il comportamento che ti aspetti. Nell'affermazione di Joel Spolsky sulla Notazione ungherese, egli fornisce un esempio dell'uso per rilevare possibili attacchi XSS indicando che una variabile o una funzione non è sicura (noi) o sicura (e), ma che si basa ancora sul programmatore per controllare visivamente. Se invece disponi di un sistema di tipi estensibile, puoi semplicemente creare due nuovi tipi, UnsafeString e SafeString, quindi utilizzarli come appropriato. Come bonus, il tipo di codifica diventa:

SafeString encode(UnsafeString)

e a corto di accedere agli interni di UnsafeString o utilizzare alcune altre funzioni di conversione diventa l'unico modo per passare da UnsafeString a SafeString. Se tutte le funzioni di output accettano solo istanze di SafeString, diventa impossibile generare una stringa senza escape [escludendo shenanigans con conversioni come StringToSafeString (someUnsafeString.ToString ())].

Dovrebbe essere ovvio il motivo per cui consentire al sistema di tipi di sanità mentale di verificare il codice è superiore a provare a farlo manualmente, o forse occhio in questo caso.

In un linguaggio come C, ovviamente, sei fregato che un int sia un int è un int, e non c'è molto che puoi fare al riguardo. Puoi sempre giocare con le strutture ma è discutibile che si tratti di un miglioramento o meno.

Per quanto riguarda l'altra interpretazione della Notazione ungherese, IE che prefigura il tipo di variabile, è semplicemente stupido e incoraggia pratiche pigre come nominare variabili uivxwFoo invece di qualcosa di significativo come countOfPeople.


Come si potrebbe dichiarare un tipo .NET o Java per descrivere " int[]che può essere liberamente modificato ma mai condiviso" o " int[]che può essere liberamente condiviso solo tra cose che non lo modificheranno mai"? Se un int[]campo fooincapsula i valori si {1,2,3}può incapsulare {2,2,3}senza sapere quale "tipo" di int[]esso rappresenta? Penserei che Java e .NET sarebbero stati molto migliori se - in assenza del supporto del sistema di tipo, avessero almeno adottato una convenzione di denominazione per distinguere quei tipi.
supercat,

4

La notazione ungherese è quasi completamente inutile in una lingua tipizzata staticamente. È una funzione IDE di base per mostrare il tipo di una variabile posizionandoci sopra con il mouse o con altri mezzi; inoltre puoi vedere qual è il tipo osservando alcune righe in alto dove è stato dichiarato, se non c'è inferenza di tipo. L'intero punto dell'inferenza del tipo è di non ripetere il rumore del tipo ovunque, quindi la notazione ungherese è di solito vista come una cosa negativa nelle lingue con l'inferenza del tipo.

Nelle lingue tipizzate dinamicamente, a volte può aiutare, ma per me sembra unidiomatico. Hai già rinunciato alle tue funzioni limitandoti a domini / codomain esatti; se tutte le variabili sono denominate con notazione ungherese, allora stai semplicemente riproducendo ciò che un sistema di tipo ti avrebbe dato. Come si esprime una variabile polimorfica che può essere un numero intero o una stringa in notazione ungherese? "IntStringX"? "IntOrStringX"? L'unico posto in cui abbia mai usato la notazione ungherese era nel codice assembly, perché stavo cercando di recuperare quello che avrei ottenuto se avessi un sistema di tipi, ed è stata la prima cosa che abbia mai codificato.

Ad ogni modo, non mi potrebbe importare di meno di ciò che le persone chiamano le loro variabili, il codice sarà probabilmente ancora altrettanto incomprensibile. Gli sviluppatori sprecano troppo tempo in cose come lo stile e i nomi delle variabili e alla fine della giornata ottieni ancora un sacco di librerie con convenzioni completamente diverse nella tua lingua. Sto sviluppando un linguaggio simbolico (cioè: non basato su testo) in cui non ci sono nomi di variabili, solo identificatori univoci e nomi suggeriti per le variabili (ma la maggior parte delle variabili non ha ancora un nome suggerito perché semplicemente non esiste un nome ragionevole per loro); quando si controlla il codice non attendibile, non è possibile dipendere da nomi di variabili.


È anche piuttosto inutile per le lingue più tipicamente dinamiche!
James Anderson,

2
per gli IDE è persino peggio che per la codifica manuale poiché significa che il completamento del codice è notevolmente rallentato. Se hai 100 variabili intere, digitando int <alt-space> (ad esempio) vengono visualizzate 100 voci da scorrere. Se quello di cui hai bisogno è intVeryLongVariableName, il completamento del codice diventa problematico. Senza ungherese, dovresti semplicemente digitare <alt-space> e avere solo 1 o 2 opzioni.
jwenting

3

Come sempre in questo caso, posterò una risposta prima di leggere le risposte degli altri partecipanti. 

Vedo tre "bug" nella tua visione: 

1) Se vuoi conoscere il tipo di una variabile / parametro / attributo / colonna puoi passare il mouse o fare clic su di esso e verrà visualizzato, nella maggior parte dei moderni IDE. Non so quali strumenti stai usando, ma l'ultima volta sono stato costretto a lavorare in un ambiente che non forniva questa funzionalità nel 20 ° secolo, il linguaggio era COBOL, oops no era Fortran e il mio capo non capivo perché me ne andassi. 

2 / I tipi possono cambiare durante il ciclo di sviluppo. Un numero intero a 32 bit può diventare un numero intero a 64 bit ad un certo punto, per buoni motivi che non erano stati rilevati all'inizio del progetto. Quindi, rinominare intX in longX o lasciarlo con un nome che punta al tipo sbagliato è un cattivo karma. 

3) Quello che stai chiedendo è in effetti una ridondanza. La ridondanza non è un modello di progettazione o un'abitudine molto validi. Anche gli umani sono riluttanti a troppa ridondanza. Anche gli umani sono riluttanti a troppa ridondanza. 


Comprendo l'IDE avanzato / moderno e sono completamente d'accordo con te. Ma per quanto riguarda la progettazione di database? Supponi di avere una colonna o un parametro della procedura memorizzata. Il trucco al passaggio del mouse non funziona davvero con questo genere di cose. Dovresti guardare la tabella / definizione di proc memorizzata. Cosa fai per quello?

3

Credo che avere un disperato bisogno di ungherese sia un sintomo .
Un sintomo di troppe variabili globali ... o di avere funzioni troppo lunghe per essere mantenibili .

Se la tua definizione variabile non è in vista, di solito, hai problemi.
E se le tue funzioni non seguono una convenzione memorabile , ecco di nuovo un grosso problema.

Questo è ... praticamente il motivo per cui molti posti di lavoro lo esplodono, suppongo.

Ha avuto origine nelle lingue che ne avevano bisogno .
In tempi di variabili globali bonanza . (per mancanza di alternative)
Ci è servito bene.

L'unica reale utilizzo che abbiamo per oggi è Joel Spolsky uno .
Per tenere traccia di alcuni attributi particolari della variabile, come la sua sicurezza .

( es. "La variabile safeFoobarha un semaforo verde da iniettare in una query SQL?
- Come si chiama safe, sì")

Alcune altre risposte hanno parlato delle funzionalità dell'editor che hanno aiutato a vedere il tipo di una variabile mentre ci si passa sopra. A mio avviso, anche quelli sono un po ' problematici per la sanità mentale del codice . Credo che significassero solo per il refactoring , come anche molte altre caratteristiche (come la funzione di piegatura) e non dovrebbero essere usate su un nuovo codice.


2

Penso che i motivi per non usare la notazione ungherese siano stati ben coperti da altri poster. Sono d'accordo con i loro commenti.

Con i database utilizzo la notazione ungherese per gli oggetti DDL che vengono usati raramente nel codice, ma che altrimenti si scontrerebbero negli spazi dei nomi. Principalmente questo si riduce al prefisso degli indici e ai vincoli nominati con il loro tipo (PK, UK, FK e IN). Utilizzare un metodo coerente per denominare questi oggetti e si dovrebbe essere in grado di eseguire alcune convalide eseguendo una query sui metadati.


Trovo spesso che questo sia il caso quando ho una tabella di ID. Se avessi TABLE SomeStringById(int somestringId, varchar somestring)l'indice su di esso sarebbe anche logicamente SomeStringByIdma ciò provoca una collisione. Quindi lo chiamo idx_SomeStringById. Quindi, per seguire l'esempio, lo farò idx_SomeStringByValuesolo perché è sciocco avere l' idx_uno e non l'altro.
corsiKa

1

il motivo per cui viene evitato è a causa dei sistemi ungheresi che violano DRY (il prefisso è esattamente il tipo che il compilatore e (un buon) IDE possono derivare)

prefissi OTOH ungheresi di app con l' uso della variabile (ovvero scrxMouse è ax ax coordinate sullo schermo che può essere un tipo int, short, long o persino personalizzato (typedefs ti permetterà anche di cambiarlo facilmente))

l'incomprensione dei sistemi è ciò che ha distrutto l'ungherese come una buona pratica


2
Non sono d'accordo - ciò che ha distrutto l'ungherese come una "migliore pratica" è che non è mai stato vicino alla migliore (o addirittura buona) pratica.
Jerry Coffin,

2
@haylem: ho visto gli articoli e il documento originale di Simonyi e ho letto il codice. Ad ogni modo, è una cattiva idea che non avrebbe mai dovuto vedere la luce del giorno.
Jerry Coffin,

1
Non viola necessariamente DRY in un linguaggio dinamico; è solo unidiomatico. DRY non è necessariamente sempre buono; es: macro C.
Longpoke,

3
IMO ciò che "distrutto" ungherese è il fatto che anche l '"intento" non è utile rispetto all'uso di nomi descrittivi , anche se per essere onesti quando l'ungherese è stato creato non c'è stato un movimento per avere un codice leggibile ...
Wayne Molina

1
@Wayne M: "nomi descrittivi" è facile da dire quando i compilatori ti permetteranno essenzialmente di usare un saggio per un nome di variabile. Quando la lunghezza dei nomi degli identificatori sono stati in realtà limitata ad un basso valore, piuttosto arbitrario (penso che un limite comune era otto o dieci caratteri non che molto tempo fa, mi sembra di ricordare che Turbo C 2 aveva anche un'opzione di configurazione per la lunghezza massima di un nome identificativo!), la codifica di informazioni utili in un nome era solo un po 'più complicata ...
un CVn

1

Diciamo che abbiamo un metodo come questo (in C #):

int GetCustomerCount()
{
    // some code
}

Ora nel codice lo chiamiamo così:

var intStuff = GetCustomerCount();
// lots of code that culminates in adding a customer
intStuff++;

L' int non ci dice molto. Il semplice fatto che qualcosa sia un int non ci dice cosa ci sia dentro. Supponiamo ora che lo chiamiamo così:

var customerCount = GetCustomerCount();
// lots of code that culminates in adding a customer
customerCount++;

Ora possiamo vedere qual è lo scopo della variabile. Imporrebbe se sappiamo che è un int?

Lo scopo originale dell'ungherese, tuttavia, era di farti fare qualcosa del genere:

var cCustomers = GetCustomerCount();
// lots of code that culminates in adding a customer
cCustomers++;

Questo va bene finché sai cosa sta per c . Ma dovresti avere una tabella standard di prefissi e tutti dovrebbero conoscerli e ogni nuova gente dovrebbe impararli per capire il tuo codice. Considerando che customerCounto countOfCustomersè abbastanza ovvio a prima vista.

L'ungherese aveva uno scopo in VB prima che Option Strict Onesistesse, perché in VB6 e VB precedente (e in VB .NET con Option Strict Off) VB avrebbe forzato i tipi, quindi potresti farlo:

Dim someText As String = "5"
customerCount = customerCount + someText

Questo è male, ma il compilatore non te lo direbbe. Quindi se avessi usato l'ungherese, almeno avresti qualche indicatore di ciò che stava accadendo:

Dim strSomeText As String = "5"
intCustomerCount = intCustomerCount + strSomeText  // that doesn't look right!

In .NET, con la digitazione statica, questo non è necessario. E l'ungherese veniva usato troppo spesso come sostituto di una buona denominazione. Dimentica l'ungherese e scegli invece dei bei nomi.


1

Ho trovato molti buoni argomenti contrari, ma uno che non ho visto: ergonomia.

In passato, quando tutto ciò che avevi era string, int, bool e float, i personaggi sibf sarebbero stati sufficienti. Ma con string + short, iniziano i problemi. Utilizzare l'intero nome per il prefisso o str_name per la stringa? (Mentre i nomi sono quasi sempre stringhe, no?) Cosa c'è con una classe Street? I nomi diventano sempre più lunghi e, anche se usi CamelCase, è difficile dire dove finisce il prefisso e dove inizia il nome della variabile.

 BorderLayout boderLayoutInnerPanel = new BorderLayout ();
 panelInner.addLayout (borderLayoutInnerPanel);

Ok, potresti usare le sottolineature, se non le usi già per qualcos'altro, oppure usare CamelCase se hai usato le sottolineature così a lungo:

 BorderLayout boderLayout_innerPanel = new BorderLayout ();
 panel_inner.addLayout (borderLayout_innerPanel);

 Border_layout boder_layoutInner_panel = new Border_layout ();
 panelInner.add_layout (border_layoutInner_panel);

È mostruoso e se lo fai di conseguenza, lo avrai

 for (int iI = 0; iI < iMax-1; ++iI)
     for (int iJ = iI; iJ < iMax; ++iMax) 
          int iCount += foo (iI, iJ); 

O finirai con l'uso di prefissi inutili per casi banali, come variabili-loop o count. Quando di recente hai usato un short o un long per un contatore? Se fai delle eccezioni, perderai spesso tempo, pensando di aver bisogno di un prefisso o meno.

Se hai molte variabili, vengono normalmente raggruppate in un browser oggetti che fa parte del tuo IDE. Ora se il 40% inizia con i_ per int e il 40% con s_ per stringa e sono ordinati alfabeticamente, è difficile trovare la parte significativa del nome.


1

L'unico posto in cui uso ancora regolarmente suffissi ungheresi o analoghi è in contesti in cui gli stessi dati semantici sono presenti in due forme diverse, come la conversione dei dati. Ciò può verificarsi nei casi in cui vi sono più unità di misura o in cui vi sono più forme (ad esempio, stringa "123" e numero intero 123).

Trovo che le ragioni fornite qui per non usarlo siano convincenti per non imporre l' ungherese agli altri, ma solo lievemente suggestivo, per aver deciso la tua pratica.

Il codice sorgente di un programma è un'interfaccia utente a sé stante - che mostra algoritmi e metadati al manutentore - e la ridondanza nelle interfacce utente è una virtù, non un peccato . Guarda, ad esempio, le immagini in " The Design of Everyday Things ", e guarda le porte etichettate "Push" che sembrano tirarle, e ai rubinetti della birra gli operatori hanno violato gli importanti controlli del reattore nucleare perché in qualche modo "passano sopra loro nell'IDE "non era abbastanza buono.

Il "passaggio con il mouse su un IDE" non è un motivo per non usare l'ungherese - solo un motivo per cui alcune persone potrebbero non trovarlo utile. Il tuo chilometraggio potrebbe essere diverso.

L'idea che l'ungherese imponga un onere di manutenzione significativo quando i tipi di variabili cambiano è sciocca: con quale frequenza cambi tipi di variabili? Inoltre, rinominare le variabili è semplice:

Basta usare l'IDE per rinominare tutte le occorrenze. -Gander, rispondendo a Goose

Se l'ungherese ti aiuta davvero a trovare rapidamente un pezzo di codice e a mantenerlo in modo affidabile, usalo. Altrimenti no. Se altre persone ti dicono che ti sbagli sulla tua esperienza, suggerirei che probabilmente sono quelli in errore.

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.