2010-08-27 6 views
24

La forma más comúnmente aceptada para dar formato a código C# parece ser como sigue:¿Cómo evitar el desperdicio de espacio en la pantalla al escribir código C# escaso?

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); 
        } 
      } 
     } 
    } 
} 

Esto desperdicia una gran cantidad de espacio en la pantalla, tanto horizontal como verticalmente. Seguramente no soy la primera persona que nota. Mi pregunta es: ¿Vives con ella o has desarrollado un estilo de formato diferente para evitar un exceso de espacio en blanco?

PD: ¡Tenga en cuenta que ni siquiera utilicé una única declaración if todavía!

+8

Si realmente te está molestando, te sugiero dividir el código en diferentes métodos. – kemiller2002

+9

Refactor lo que duele mis ojos hasta que se vea bonito. Pero solo soy yo :) – devnull

+0

refactor + narrange = delicioso. –

Respuesta

7

tiendo a escribir pequeñas clases, métodos cortas de pequeño nivel de anidamiento. ¡No solo puedes ver todo en tu pantalla, también el código es mejor!

5

Tengo un 24" monitor de pantalla ancha. Yo preferiría en gran medida 'de impresión legible' sobre la recuperación del espacio. Condensada, código-abarrotado juntos es difícil de leer y me duele el cerebro.

+0

+1 Es difícil de mantener, difícil para que los colegas lo recojan después de que haya terminado. Es asqueroso. –

19
  1. no lo hago a menudo ver espacios de nombres anidados de esa manera - tal vez sucede, no donde trabajo
  2. que vivo con ella y en su mayoría no escribir dicho código profundamente imbricada que presenta los métodos más cortos, o métodos con menos de anidación sin duda reduce el problema de espacio en blanco horizontal.. y tener métodos rotos en pedazos más pequeños significa que puede obtener la información más importante en una determinada cantidad de espacio vertical.
+4

De acuerdo. Tampoco creo que haya visto espacios de nombres anidados así. –

+2

Nunca he visto a alguien anidar espacios de nombres como ese, la única razón para hacerlo en lugar del espacio de nombres SomeNamespace.SomeSubNamespace sería agregar una clase a cada uno de los espacios de nombres, en cuyo caso tienes dos clases en un archivo que es un no-no, especialmente si ambas clases están en espacios de nombres diferentes; sus archivos deben estar en diferentes carpetas. –

+0

Lamentablemente, he visto espacios de nombres como ese. –

10

Bueno He comprado un monitor HD;)

Pero la única manera de tratar con él, aparte de usar menos sangría sería mover un código en sus propios métodos.

3

Si voy a tratar/catch algo, me gustaría combinar con cualquier utilizando bloques adyacentes. Del mismo modo, me gustaría agregar espacios de nombres, de manera algo más cercano a:

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

no creo que se ve tan mal;) haciendo funciones más cortas sin embargo sí que es un punto. En particular, es bueno si se puede hacer cosas como la sustitución de

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

por

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

¡¡¡Absolutamente !!! Odio ver 'si's anidado en todas partes. – Dave

+2

No estoy seguro de que haga mucha diferencia, y yo diría que reduce la legibilidad si '// bla' tiene una longitud significativa. Aunque no lo haré -1, porque admito que es bastante subjetivo ... –

+0

Dan: Para mí es más importante si // blub es de longitud significativa porque entonces se beneficia de una gran cantidad de // blub siendo sangrado un nivel más bajo (editar, malinterpretar su punto al principio, estoy de acuerdo, pero aun así pesaría en beneficio de // blub. Creo que tiene más sentido si // bla es el manejo de errores y puede haber incluso cláusulas // bla1 // bla2 etc.) – Nicolas78

16

Me explico como este. Si realmente encuentras un constructo de código anidado tan profundo como el que muestras arriba, entonces el problema probablemente no sea el formato, sino la estructura de tu código.

Usted debe considerar tomar un vistazo a esto: Refactoring by Martin Fowler

Por extracting methods a mejorar no sólo el "desperdiciado" espacio en la pantalla, pero se aumenta drásticamente la legibilidad también;)

Otra solución es siempre: Alt + Shift + Ingrese en Visual Studio para pasar al modo de pantalla completa

+1

ALT + * SHIFT * + ENTER para pantalla completa VS –

+0

@matthew : thx :) olvidó el cambio, pero lo corrigió ahora – Juri

+1

Alt + Shift + Intro en VS; Ctrl + M en Eclipse –

2

Estoy de acuerdo con las otras respuestas en las que básicamente vivo; para mi equipo, o bien tenemos monitores de alta resolución o monitores duales (o ambos), así que no es como si estuviéramos desarrollando en 800x600.

Pero una cosa a tener en cuenta es que su tabulación sería mejor si utilizó el espaciado real, ya que algunos desarrolladores usan 2 espacios para una pestaña, algunos 4, algunos 6. Así que mientras que el código formateado puede verse bien en uno IDE del desarrollador, puede no verse tan bien en el otro. (He visto algunos resultados horribles de eso.)

VS2010 tiene un buen complemento del Administrador de Extensiones llamado Productivity Tools que detecta cuando tienes una combinación de pestañas y espacios en tu archivo y te permite convertir todo a pestañas o espacios ("Fix Mixed Tabs"). Realmente ayuda a limpiar su archivo (incluso si no parece que haga nada). Es genial si compartes código entre equipos.

+0

¿Por qué el voto a favor? Sin comentarios, algo grosero. –

10

Herramientas> Opciones> Editor de texto> Todos los Idiomas> aquí> Tamaño sangría> 1
No una gran solución ...: P

+3

Un chico con el que trabajo cambia sus pestañas a 2 ... funciona para él – Martin

+0

Actualmente, las pestañas de 2 espacios son una gran solución. +1 – tenfour

+0

@Martin - Sí, generalmente selecciono el botón de opción 'Insertar espacios' (y establezco el 'Tamaño de pestaña' y 'Tamaño de sangrado' en el mismo valor). ¡Odio esas pestañas! :) – SwDevMan81

1

uso CodeRush, que va a hacer la navegación a través de tu código mucho mejor

obtendrá algo como esto alt text

3

que he visto soportes abiertos en la línea de inicio de un bloque de código como en:

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); 
       } 
      } 
     } 
    } 
} 

Menos bienes raíces, pero creo que es feo.

+8

Feo de hecho. blech. –

+2

Sí, un consultor en mi último lugar juró arriba y abajo por este formato. Quería vomitar cada vez que miraba sus cosas. –

+0

La belleza está en los ojos del espectador. Pero esto es algo realmente feo. –

10

Debería leer Bob Martin's Clean Code. Ayuda con este problema En este caso, SomeFunction() hace más de una cosa. Dividir cada cosa que hace en su propio método.

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(); 
       } 
      } 
     } 
    } 
} 

Además, no coger un System.Exception; nunca se sabe lo que va a fallar, y no se debe tratar de detectar excepciones que no se pueden manejar. Déjalos burbujear y morir horriblemente.

+9

+1 para System.Exception, tengo que debatir eso todo el tiempo. –

+1

¿Qué es mejor en una aplicación empresarial? ¿Capturar System.Exception, iniciar sesión y guardar o enviar para admitir o hacer que el usuario se ocupe del mensaje de excepción .NET que ni siquiera se molestan en leer y se bloquea la aplicación? – Grozz

+0

@Grozz Si captura una excepción del sistema y lo registra, podría haber estado dañado en su registro; sin mencionar que es responsabilidad de los desarrolladores verificar el registro. Con una horrible excepción apareciendo y enloqueciendo a los usuarios, es más fácil encontrar problemas en la aplicación que no encontraste en el desarrollo. –

1

Además de lo que otros han dicho aquí, una de las cosas que hago para disminuir el efecto es utilizar una fuente de espaciado proporcional. El texto es más legible, pero no tan ancho. También te obliga a usar pestañas sobre los espacios para la alineación (que es, por supuesto, por qué el buen Señor nos dio pestañas en primer lugar)

Yo personalmente uso Comics Sans MS, pero eso enloquece a tus compañeros de trabajo ....

+0

Tenemos espacio horizontal en abundancia, es el espacio vertical el que es premium. El uso de una fuente de espaciado proporcional hace que el código parezca extraño y difícil de leer. Tal vez sea porque he estado codificando desde mucho antes de que hubiera fuentes con espaciado proporcional (antes de que estuvieran disponibles modos de video distintos del modo de texto). – Tergiver

+0

haha ​​comic sans. En realidad, he probado fuentes proporcionales y no son tan molestas como esperaba.Pero es algo a lo que acostumbrarse, y actualmente hay demasiadas cosas en mi trabajo que dependen de la alineación monoespaciada para que luzcan bonitas. Sin embargo, no tengo ningún problema con que el código sea demasiado amplio. – tenfour

+0

El OP mencionó específicamente el espacio horizontal y el pozo y el vertículo. Y @Tergiver, tengo 6 años contigo en esos monitores. –

3

La instrucción using es muy práctico, pero si se convierte en código más difícil de leer se puede prescindir de él:

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

Algunas ideas generales:

  • combinar esos bloques de espacio de nombres en una sola.
  • Reúna las declaraciones using en un solo lugar, si puede.
  • Si no es un fanático "Incluso las declaraciones individuales deben incluir {} s!", podría deshacerse de los corchetes entre los bloques using y try..catch.
  • Piensa si realmente se requieren lock s anidados, o si el lock más externo será suficiente.

Estos podría resultado en el siguiente código (tener en cuenta que el significado de su código de ejemplo hipotético no puede conservarse exactamente):

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); 
      } 
     } 
    } 
} 

(incluso se podría mover los dos using s a la otra instrucción using fuera del lock, si su código lo permite. Puede reemplazar las declaraciones using con llamadas explícitas al Dispose en un bloque finally, como se sugiere en otra respuesta)

+0

Gracias por su interesante respuesta. Sin embargo, una pequeña observación: el alcance de los bloqueos generalmente debe hacerse lo más pequeño posible debido al rendimiento y para evitar interbloqueos. Por lo tanto, parece poco probable que sea posible combinar múltiples mutexes. –

+0

_ @ Dimitri: _ Tal vez no entiendo 'lock' tan bien como debería: puedo ver el punto de mantener los bloqueos lo más cortos posible; sin embargo, no veo por qué * necesitarías * el bloqueo interno, ya que el bloqueo externo ya se asegura de que el código solo se ejecute por un hilo a la vez ... Además, la duración del bloqueo externo es * no * aumentado al quitar el bloqueo interno. - ¿Qué me estoy equivocando aquí? – stakx

Cuestiones relacionadas