2010-08-27 8 views
24

Il modo comunemente accettato per formattare C# codice sembra essere come segue:Come evitare di sprecare spazio sullo schermo scrivendo codice C# sparse?

namespace SomeNamespace 
{ 
    namespace SomeSubNamespace 
    { 
     class SomeClass 
     { 
      void SomeFunction() 
      { 
       using (var someFile = new StreamWriter(somePath)) 
       { 
        try 
        { 
         lock(someCriticalSection) 
         { 
          using (var someDisposableThing1 = new DisposableThing()) 
          { 
           DoSomething();        
           using (var someDisposableThing2 = new DisposableThing()) 
           { 
            lock(someOtherCriticalSection) 
            { 
             DoSomethingMore(); 
            } 
           } 
          } 
         } 
        } 
        catch(Exception e) 
        { 
         Log(e); 
        } 
      } 
     } 
    } 
} 

Questo spreca una grande quantità di spazio sullo schermo, sia orizzontalmente che verticalmente. Non sono sicuramente la prima persona che nota. La mia domanda è: ci vivi o hai sviluppato uno stile di formattazione diverso per evitare un eccesso di spazio bianco?

PS: Nota che non ho nemmeno usato una sola istruzione if!

+8

Se ti dà davvero fastidio, ti suggerisco di dividere il codice in diversi metodi. – kemiller2002

+9

Il refettorio mi fa male agli occhi finché sembra carino. Ma sono solo io :) – devnull

+0

refactor + narrange = yummy. –

risposta

7

Io tendo a scrivere classi piccole, metodi brevi con un livello piccolo di annidamento. Non solo puoi vedere tutto sul tuo schermo, anche il codice è migliore!

5

Ho un 24" widescreen monitor. Io preferisco di gran lunga 'pretty-printing' over recuperare lo spazio. Abbreviato, il codice stipati-insieme è difficile da leggere e fa male il mio cervello.

+0

+1 Difficile da mantenere, difficile per i colleghi a prenderlo dopo aver finito. È icky. –

19
  1. Non mi capita spesso vedi namespace annidati in quel modo - forse succede, non dove lavoro
  2. Io vivo con esso. E soprattutto non scrivo codice così profondamente annidato. Avere metodi più brevi, o metodi con meno nesting, certamente riduce il problema degli spazi bianchi orizzontali e avere metodi suddivisi in parti più piccole significa che puoi ottenere informazioni più importanti in una determinata quantità di spazio verticale
+4

concordato. Non penso di aver mai visto uno spazio dei nomi annidato in quel modo. –

+2

Non ho mai visto qualcuno annidare spazi dei nomi del genere, l'unica ragione per farlo al posto dello spazio dei nomi SomeNamespace.SomeSubNamespace sarebbe di aggiungere una classe in ciascuno degli spazi dei nomi, nel qual caso hai due classi in un file che è un no-no, soprattutto se entrambe le classi si trovano in spazi dei nomi diversi: i loro file dovrebbero quindi trovarsi in cartelle diverse. –

+0

Purtroppo ho visto namespace del genere. –

10

Beh ho comprato un monitor HD;)

Ma l'unico modo per affrontare lo distingue da utilizzando meno rientro sarebbe quello di spostare un po 'di codice nei propri metodi.

3

Se ho intenzione di provare/catturare qualcosa, vorrei combinare con qualsiasi adiacente utilizzando blocchi. Allo stesso modo, vorrei aggregare spazi dei nomi, quindi qualcosa di più vicino:

namespace SomeNamespace.SomeSubNamespace 
{ 
    class SomeClass 
    { 
     void SomeFunction() 
     { 
      StreamWriter someFile; 
      try 
      { 
       someFile = new StreamWriter(somePath); 

       lock(someCriticalSection) 
       { 
        using (var someDisposableThing1 = new DisposableThing()) 
        { 
         DoSomething();        
         using (var someDisposableThing2 = new DisposableThing()) 
         { 
          lock(someOtherCriticalSection) 
          { 
           DoSomethingMore(); 
          } 
         } 
        } 
       } 
      } 
      catch(Exception e) 
      { 
       Log(e); 
      } 
      finally 
      { 
       if(someFile != null) 
       { 
        someFile.Dispose(); 
       } 
      } 
     } 
    } 
} 
3

non credo che sembra così male;) disporre delle funzioni più brevi ma in realtà è un punto. In particolare, è bello se si può fare cose come la sostituzione

if (condition) 
{ 
    // bla 
} 
else 
{ 
    // blub 
} 

da

void someFunction() 
{ 
    if (condition) 
    { 
    // bla 
    return 
    } 
    // blub 
} 
+0

Assolutamente !!! Odio vedere nidificato 'if's ovunque. – Dave

+2

Non sono sicuro che faccia molta differenza, e direi che riduce la leggibilità se '// bla' ha una lunghezza significativa. Però non lo farò -1 perché ammetto che è piuttosto soggettivo ... –

+0

Dan: Per me è più importante se // blub sia di una lunghezza significativa perché poi trarrai vantaggio da un sacco di // blub che viene rientrato di un livello inferiore (modifica, misread il tuo punto all'inizio, io sono d'accordo ma peserei ancora a beneficio di // blub. Penso che abbia più senso se // bla è la gestione degli errori e potrebbero esserci anche clausole // bla1 // bla2 etc) – Nicolas78

16

Mi spiego in questo modo. Se ti capita davvero di incontrare un costrutto di codice annidato così profondo come quello che mostri sopra, il problema probabilmente non è la formattazione ma la struttura del codice.

Si dovrebbe considerare dare un'occhiata a questo: Refactoring by Martin Fowler

Con extracting methods a migliorare non solo il "sprecato" spazio sullo schermo, ma si aumenta notevolmente la leggibilità troppo;)

Un'altra soluzione è sempre: Alt +Maiusc +Inserisci in Visual Studio per entrare in modalità a schermo intero

+1

ALT + * SHIFT * + INVIO a schermo intero VS –

+0

@matthew : thx :) ha dimenticato lo spostamento, ma lo ha corretto ora – Juri

+1

Alt + Maiusc + Invio in VS; Ctrl + M in Eclipse –

2

Sono d'accordo con le altre risposte che fondamentalmente vivo con esso - per il mio team abbiamo monitor ad alta risoluzione o due monitor (o entrambi), quindi non è come stiamo sviluppando su 800x600.

Ma una cosa da tenere a mente è che il vostro tabulazione sarebbe meglio se si è utilizzato distanza effettiva, come alcuni sviluppatori di utilizzare 2 spazi per una scheda, alcuni 4, alcuni 6. Così, mentre il codice formattato può sembrare bene su una IDE dello sviluppatore, potrebbe non sembrare così bello da un altro. (Ho visto alcuni risultati orribili da questo.)

VS2010 ha un bel plug-in da Gestione estensioni chiamato Strumenti di produttività che rileva quando si ha un mix di schede e spazi nel file e consente di convertire tutto a schede o spazi ("Correggi le schede miste"). Aiuta davvero a ripulire il tuo file (anche se non sembra che faccia qualcosa!). È fantastico se condividi il codice tra i team.

+0

Perché il downvote? Nessun commento - tipo di scortese. –

10

Strumenti> Opzioni> Editor di testo> All Languages> Schede> dimensioni rientro> 1
Non una grande soluzione ...: P

+3

Un ragazzo con cui lavoro cambia le sue schede in 2 ... funziona per lui – Martin

+0

in realtà, le schede a 2 spazio sono un'ottima soluzione. +1 – tenfour

+0

@Martin - Sì, di solito seleziono il pulsante di opzione "Inserisci spazi" (e imposta le "Dimensioni tab" e "Dimensioni dell'indice" sullo stesso valore). Odio quelle schede! :) – SwDevMan81

1

uso CodeRush, si farà la navigazione attraverso il vostro codice di molto meglio

si otterrà qualcosa di simile alt text

3

ho visto parentesi aperte sulla linea all'inizio di un blocco di codice come in:

namespace SomeNamespace { 
    class SomeClass { 
     void SomeFunction() { 
      using (var someFile = new StreamWriter(somePath)) { 
       try { 
        lock(someCriticalSection) { 
         using (var someDisposableThing1 = new DisposableThing()) { 
          DoSomething();        
         } 
        } 
       } catch(Exception e) { 
        Log(e); 
       } 
      } 
     } 
    } 
} 

Meno immobiliare, ma penso che sia brutto.

+8

Davvero brutto. BLECH. –

+2

Sì, un consulente al mio ultimo posto ha imprecato su questa formattazione. Volevo vomitare ogni volta che guardavo le sue cose. –

+0

La bellezza è negli occhi di chi guarda. Ma questa è davvero roba fugace. –

10

Si consiglia di leggere Clean Code di Bob Martin. Aiuta con questo problema. In questo caso, SomeFunction() fa più di una cosa. Dividi ogni cosa che fa nel suo stesso metodo.

namespace SomeNamespace.SomeSubNamespace 
{ 
    class SomeClass 
    { 
     void WriteToFile() 
     { 
      using (var someFile = new StreamWriter(somePath)) 
      { 
       lock(someCriticalSection) 
       { 
        ExecuteCriticalSection(); 
       } 
      } 
     } 
     void ExecuteCriticalSection() 
     { 
      using (var someDisposableThing1 = new DisposableThing()) 
      { 
      DoSomething(); 
      ExecuteFinalCriticalSection(); 
      } 
     } 

     void ExecuteFinalCriticalSection() 
     { 
      using (var someDisposableThing2 = new DisposableThing()) 
      { 
      lock(someOtherCriticalSection) 
       { 
       DoSomethingMore(); 
       } 
      } 
     } 
    } 
} 

Inoltre, non prendere uno System.Exception; non sai mai cosa fallirà e non dovresti cercare di individuare le eccezioni che non puoi gestire. Lasciali gonfiare e morire orribilmente.

+9

+1 per System.Exception, devo discuterne continuamente. –

+1

Cosa c'è di meglio in un'applicazione enterprise? Catturare System.Exception, registrarlo e salvarlo o inviarlo per supportare o avere utenti che gestiscono il messaggio di eccezione .NET che non si preoccupano nemmeno di leggere e crash dell'applicazione? – Grozz

+0

@Grozz Se si cattura un'eccezione di sistema e la si registra, si potrebbe avere uno stato danneggiato nel registro; per non parlare poi spetta agli sviluppatori controllare il registro. Con l'eccezione di un'orribile eccezione che fa impazzire gli utenti, è più facile trovare problemi nell'applicazione che non è stata trovata in fase di sviluppo. –

1

In aggiunta a ciò che altri hanno detto qui, l'unica cosa che faccio per attenuare l'effetto è usare un carattere con spaziatura proporzionale. Il testo è più leggibile, ma non altrettanto ampio. Ti costringe anche a usare tabulazioni sopra gli spazi per l'allineamento (che è, naturalmente, perché il buon Dio ci ha dato schede in primo luogo)

Personalmente uso Comics Sans MS, ma che guida davvero i colleghi pazzi ....

+0

Abbiamo uno spazio orizzontale in abbondanza, è lo spazio verticale che è premium. L'uso di un font con spaziatura proporzionale fa apparire il codice strano e difficile da leggere. Forse è perché sono stato codificato da molto tempo prima che ci fossero i font con spazi proporzionali (prima che fossero disponibili le modalità video diverse dalla modalità testo). – Tergiver

+0

haha ​​comic sans. In realtà ho provato i font proporzionali e non sono così fastidiosi come mi aspettavo.Ma è qualcosa su cui abituarsi, e al momento ci sono troppe cose nel mio lavoro che si basano su un allineamento mono-spaziatura per apparire belli. Non ho alcun problema con il codice essendo troppo largo però. – tenfour

+0

L'OP ha specificamente menzionato lo spazio orizzontale, il pozzo e il vertice. E @Tergiver, ho 6 anni su di te su quei monitor. –

3

L'istruzione using è molto utile, ma se il codice diventa più difficile da leggere si può fare a meno:

namespace SomeNamespace.SomeSubNamespace 
{ 
    class SomeClass 
    { 
     void SomeFunction() 
     { 
      StreamWriter someFile = new StreamWriter(somePath); 
      DisposableThing someDisposableThing1 = null; 
      DisposableThing someDisposableThing2 = null; 

      try 
      { 
       lock (someCriticalSection) 
       { 
        someDisposableThing1 = new DisposableThing(); 
        DoSomething(); 
        someDisposableThing2 = new DisposableThing(); 
        lock (someOtherCriticalSection) 
        { 
         DoSomethingMore(); 
        } 
       } 
      } 
      catch (Exception e) 
      { 
       Log(e); 
      } 
      finally 
      { 
       // requires SafeDispose extension method 
       someFile.SafeDispose(); 
       someDisposableThing1.SafeDispose(); 
       someDisposableThing2.SafeDispose(); 
      } 
     } 
    } 
} 
1

alcune idee generali:

  • combinare questi blocchi dello spazio dei nomi in una sola.
  • Raccogliere le dichiarazioni using in un posto, se è possibile.
  • Se non sei un fanatico "Anche le singole istruzioni devono includere {} s!", è possibile eliminare le parentesi tra i blocchi using e try..catch.
  • Pensa se i nidificati di lock s sono realmente necessari o se il più esterno lock è sufficiente.

Questi potrebbe risultato nel codice seguente (prendere atto che il significato del codice esempio ipotetico potrebbe non essere esattamente conservato):

namespace SomeNamespace.SomeSubNamespace 
{ 
    class SomeClass 
    { 
     void SomeFunction() 
     { 
      using (var someFile = new StreamWriter(somePath)) 
      try 
      { 
       lock(someCriticalSection) 
       { 
        using (var someDisposableThing1 = new DisposableThing()) 
        using (var someDisposableThing2 = new DisposableThing()) 
        { 
         DoSomething();        
         DoSomethingMore(); 
        } 
       } 
      } 
      catch(Exception e) 
      { 
       Log(e); 
      } 
     } 
    } 
} 

(si potrebbe anche spostare i due using s per l'altra dichiarazione using al di fuori dello lock, se il codice lo consente.È inoltre possibile sostituire le istruzioni using con chiamate esplicite a Dispose in un blocco finally, come suggerito in un'altra risposta.)

+0

Grazie per la tua risposta interessante. Una piccola osservazione: la portata dei lucchetti deve essere generalmente ridotta al minimo a causa delle prestazioni e per evitare deadlock. Pertanto sembra improbabile che sia possibile combinare più mutex. –

+0

_ @ Dimitri: _ Forse non capisco il 'lock' come meglio dovrei: posso vedere il punto di mantenere le serrature più corte possibile; tuttavia, non vedo perché * avresti * il blocco interno, poiché il blocco esterno garantisce già che il codice venga eseguito solo da un thread alla volta ... Inoltre, la durata del blocco esterno è * non * aumentato rimuovendo il blocco interno. - Cosa sto sbagliando qui? – stakx

Problemi correlati