Secondo la mia modesta opinione, è generalmente qualcosa da evitare in gran parte per il codice di produzione perché in genere non si è tentati di farlo tranne che in sporadiche funzioni che svolgono compiti diversi. Tendo a farlo in qualche codice di scarto usato per testare le cose, ma non trovo alcuna tentazione di farlo nel codice di produzione dove ho pensato in anticipo a cosa dovrebbe fare ogni funzione, da allora la funzione avrà naturalmente un portata limitata rispetto al suo stato locale.
Non ho mai visto esempi di blocchi anonimi usati in questo modo (senza coinvolgere condizionali, un try
blocco per una transazione, ecc.) Per ridurre l'ambito in modo significativo in una funzione che non poneva la domanda sul perché non potesse essere ulteriormente suddiviso in funzioni più semplici con ambiti ridotti se effettivamente beneficiava praticamente di un vero punto di vista SE dai blocchi anonimi. Di solito è un codice eclettico che sta facendo un mucchio di cose vagamente correlate o molto non correlate in cui siamo più tentati di raggiungerlo.
Ad esempio, se stai provando a farlo per riutilizzare una variabile denominata count
, ti suggerisce di contare due cose diverse. Se il nome della variabile sarà breve count
, allora per me ha senso legarlo al contesto della funzione, che potrebbe potenzialmente contare solo su un tipo di cosa. Quindi puoi immediatamente guardare il nome e / o la documentazione della funzione, vedere count
e sapere immediatamente cosa significa nel contesto di ciò che la funzione sta facendo senza analizzare tutto il codice. Non trovo spesso un buon argomento per una funzione per contare due cose diverse riutilizzando lo stesso nome di variabile in modi che rendono ambiti / blocchi anonimi così attraenti rispetto alle alternative. Ciò non suggerisce che tutte le funzioni debbano contare solo una cosa. IO'il vantaggio ingegneristico di una funzione che riutilizza lo stesso nome di variabile per contare due o più cose e utilizza blocchi anonimi per limitare l'ambito di ogni singolo conteggio. Se la funzione è semplice e chiara, non è la fine del mondo avere due variabili di conteggio con un nome diverso con la prima possibilmente con qualche linea in più di visibilità dell'ambito di quanto idealmente richiesto. Tali funzioni generalmente non sono la fonte di errori privi di tali blocchi anonimi per ridurre ulteriormente l'ambito minimo delle sue variabili locali.
Non è un suggerimento per i metodi superflui
Questo non per suggerire di creare con forza metodi né solo per ridurre l'ambito. Questo è probabilmente altrettanto brutto o peggio, e ciò che sto suggerendo non dovrebbe richiedere una necessità di metodi di "aiuto" privati imbarazzanti più di una necessità di scopi anonimi. Questo sta pensando troppo al codice come è adesso e come ridurre l'ambito delle variabili piuttosto che pensare a come risolvere concettualmente il problema a livello di interfaccia in modo da produrre naturalmente una visibilità chiara e breve degli stati di funzione locale senza annidamento profondo dei blocchi e 6+ livelli di rientro. Concordo con Bruno sul fatto che puoi ostacolare la leggibilità del codice inserendo forzatamente 3 righe di codice in una funzione, ma questo a partire dal presupposto che stai evolvendo le funzioni che crei in base all'implementazione esistente, piuttosto che progettare le funzioni senza impigliarsi nelle implementazioni. Se lo fai in quest'ultimo modo, ho trovato poca necessità di blocchi anonimi che non servono a nulla oltre a ridurre l'ambito variabile all'interno di un determinato metodo a meno che tu non stia provando zelantemente a ridurre l'ambito di una variabile con solo poche righe di codice innocuo in cui l'introduzione esotica di questi blocchi anonimi contribuisce probabilmente tanto all'overhead intellettuale che rimuovono.
Cercare di ridurre ulteriormente gli scopi minimi
Se vale la pena ridurre al minimo assoluto gli ambiti delle variabili locali, dovrebbe esserci un'ampia accettazione di codice come questo:
ImageIO.write(new Robot("borg").createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())), "png", new File(Db.getUserId(User.handle()).toString()));
... poiché ciò causa la minima visibilità dello stato, nemmeno creando variabili che possano fare riferimento a esse in primo luogo. Non voglio diventare dogmatico, ma in realtà penso che la soluzione pragmatica sia quella di evitare blocchi anonimi, quando possibile, così come lo è per evitare la mostruosa linea di codice sopra, e se sembrano così assolutamente necessari in un contesto di produzione dal prospettiva di correttezza e mantenimento degli invarianti all'interno di una funzione, quindi penso sicuramente a come stai organizzando il tuo codice in funzioni e progettando le tue interfacce. Naturalmente se il tuo metodo è lungo 400 righe e l'ambito di una variabile è visibile a 300 righe di codice in più del necessario, questo potrebbe essere un vero problema di ingegneria, ma non è necessariamente un problema da risolvere con blocchi anonimi.
Se non altro, l'utilizzo di blocchi anonimi in tutto il luogo è esotico, non idiomatico, e il codice esotico comporta il rischio di essere odiato dagli altri, se non da te stesso, anni dopo.
L'utilità pratica di ridurre la portata
L'utilità finale di ridurre l'ambito delle variabili è di permetterti di ottenere la gestione dello stato corretta e mantenerla corretta e permetterti di ragionare facilmente su ciò che fa una determinata porzione di una base di codice - per essere in grado di mantenere invarianti concettuali. Se la gestione dello stato locale di una singola funzione è così complessa che devi ridurre forzatamente l'ambito con un blocco anonimo nel codice che non è destinato a essere finalizzato e valido, quindi di nuovo, questo è un segno per me che la funzione stessa deve essere riesaminata . Se hai difficoltà a ragionare sulla gestione dello stato delle variabili nell'ambito di una funzione locale, immagina la difficoltà di ragionamento sulle variabili private accessibili a tutti i metodi di un'intera classe. Non possiamo usare blocchi anonimi per ridurne la visibilità. Per me aiuta iniziare con l'accettazione che le variabili tenderanno ad avere una portata leggermente più ampia di quella che idealmente devono avere in molte lingue, a condizione che non sfugga al punto in cui avrete difficoltà a mantenere gli invarianti. Non è qualcosa da risolvere così tanto con blocchi anonimi come lo vedo come accettazione da un punto di vista pragmatico.