2009-03-02 17 views
35

¿Existe una forma estándar de diseñar un archivo C#? Como en, Campos, luego Propiedades, luego Constructores, etc.¿Cuál es la mejor forma de diseñar una clase C#?

Esto es lo que normalmente hago, ¿pero me pregunto si hay una forma estándar?

  1. clases o enumeraciones anidadas
  2. Campos
  3. Properties
  4. Eventos
  5. Constructores
  6. Métodos públicos
  7. métodos privados

hacer grupo de personas sus campos juntos, o re o ellos los ponen con las propiedades? ¿O la gente no se preocupa por un pedido? Visual Studio parece hacerlo tan difícil de hacer.

Editar: Movido otra parte sobre ReSharper aquí: Make Resharper respect your preference for code order.

+0

Puedes usar XArrange 2012, es gratis. Descargue disponible en: http://visualstudiogallery.msdn.microsoft.com/43a29648-409a-4225-988c-a64d01eb8386 Método, propiedad, etc., ordenando es posible ... –

Respuesta

51

que tienden a utilizar Microsoft StyleCop, que tiene un orden establecido de acuerdo con la regla SA1201:

Causa un elemento dentro de un código C# archivo está fuera de servicio en relación con los otros elementos en el código.

Descripción de la regla Una violación de esta regla se produce cuando los elementos de código dentro de un archivo no siguen un esquema de ordenamiento estándar.

Para cumplir con esta regla, los elementos en el nivel de la raíz del archivo o dentro de un espacio de nombres deben colocarse en el siguiente orden:

  • Externos Alias ​​Directivas
  • Utilización de directivas
  • espacios de nombres
  • Delegados
  • Enumerados
  • Interfaces
  • estructuras
  • Clases

Dentro de una clase, estructura o interfaz, elementos deben ser colocados en el siguiente orden:

  • campos
  • Constructors
  • Finalizadores (Destructors)
  • Delegados
  • Eventos
  • enumeraciones
  • Interfaces
  • Properties
  • Indexadores
  • Métodos
  • estructuras
  • Clases

cumple con un estándar de ordenar esquema basado en el tipo de elemento puede aumentar la legibilidad y mantenimiento del archivo y fomentar la reutilización de código.

Cuando se implementa una interfaz, que es veces es conveniente agrupar todos miembros de la interfaz próximos a uno otra. Esto a veces requerirá que viole esta regla, si la interfaz contiene elementos de diferentes tipos. Este problema se puede resolver mediante el uso de de clases parciales.

  1. Añadir el atributo parcial a la clase, si la clase no está ya parcial.

  2. Agregue una segunda clase parcial con el mismo nombre. Es posible colocar en el mismo archivo, justo debajo de la clase original , o dentro de un segundo archivo .

  3. Mover la herencia de la interfaz y todos los miembros de la interfaz implementación a la segunda parte de la clase.

+1

Desafortunadamente, StyleCop también tiene reglas de pedido adicionales que también afectan a esta estructura. Por ejemplo, recomienda agrupar a los miembros estáticos. –

+1

Personalmente, considero que eso es algo bueno ... pero ciertamente puedo entender los argumentos en contra. – chills42

7

creo que no hay mejor manera . Hay dos cosas importantes a considerar cuando se trata de diseño. Lo primero y más importante es la consistencia. Elija un enfoque y asegúrese de que todo el equipo esté de acuerdo y aplique el diseño. En segundo lugar, si su clase es lo suficientemente grande como para buscar dónde viven esas propiedades molestas (o tienen que implementar regiones para que sean más fáciles de encontrar), entonces su clase probablemente sea demasiado grande. Considere olfatearlo y refactorizar según lo que huele.

Para responder a la pregunta reshaper, comprobar debajo Tipo distribuir los miembros en Opciones (bajo el nodo C#). No es simple, pero es posible cambiar el orden del diseño.

+0

Gracias, lo siento, moví la parte de la parte de reafilado basada en JaredPar's realimentación. Publique allí su segunda parte de la respuesta y le daré otro voto positivo. – Ray

+0

Las regiones también tratan de introducir una estructura coherente (especialmente en este contexto). –

+0

@scott estuvo de acuerdo, pero se vuelven mucho más necesarios a medida que aumenta el tamaño de los archivos de clase. La progresión de la maldad es: 1) sin regiones, 2) regiones, 3) clases parciales –

1

Tiendo a agrupar datos privados y tienden a agrupar métodos/propiedades relacionados en grupos funcionales.

public class Whatever { 
    // private data here 
    int _someVal = kSomeConstant; 

    // constructor(s) 
    public Whatever() { } 

#region FabulousTrick // sometimes regionize it 
    // fabulous trick code 
    private int SupportMethodOne() { } 
    private double SupportMethodTwo() { } 
    public void PerformFabulousTrick(Dog spot) { 
     int herrings = SupportMethodOne(); 
     double pieces = SupportMethodTwo(); 
     // etc 
    } 
#endregion FabulousTrick 
    // etc 
} 
0

Lo que lo hace más productivo. A algunos les gustan los campos privados junto a los que tienen acceso a la propiedad, algunos como los campos juntos por encima de los constructores. Lo más importante que puede ayudar es agrupar elementos "me gusta". Personalmente me gusta reunir métodos privados, propiedades privadas, etc.

Pruebe algunas cosas una y otra vez, lo que sienta lo hace más productivo y lo ayuda a mantener su código.

2

No creo que las regiones sean necesariamente un signo de código incorrecto. Pero para determinar que tendrá que revisar lo que tiene. Como dije here, así es como regionalicé mi código.


Manipuladores Enumeraciones
Declaraciones
Constructores
Métodos
eventos
Properties

Pero lo más importante es mantenerlo constante y con un propósito.

+2

Veo regiones (grandes) principalmente como un indicador para usar clases parciales en múltiples archivos. Un ejemplo común es poner todos los datos en un archivo y algoritmos en otro. Eso también allana el camino para dividir la clase en la línea. –

+1

Me encantaría ver los eventos-propiedades duo venir por encima de los métodos :) – nawfal

+1

@DavidSchmitt: (me doy cuenta de que esta publicación es bastante antigua, pero ...) ¿no sería una gran región (o clase) un indicador más de refactorización de código? – Paul

0

Cada uno por su cuenta, pero tiendo a seguir el mismo orden que sigue la ayuda de MSDN.

Tampoco me gusta anidar clases o enumeraciones, en su lugar crear archivos separados para ellos, que también hace que las pruebas de unidad de escritura sean más fáciles (ya que es fácil encontrar el archivo de prueba asociado cuando necesita agregar/corregir/refactorizar prueba).

En mi humilde opinión, el orden no es tan importante porque VS hace que sea muy fácil encontrar todos los miembros (especialmente si sigues el enfoque de una clase/interfaz/enum por archivo), y Sandcastle los agrupará si quieres compilar documentos , así que estaría más preocupado por darles nombres significativos.

+0

El orden sigue siendo importante porque introduce consistencia. Al seguir siempre el mismo diseño en todas sus clases, es más fácil ubicar las cosas. –

+0

Ese es mi punto acerca de VS, si navega por la fuente en lugar de a través de la lista desplegable de Miembros, entonces para cualquier clase no trivial, está perdiendo el tiempo. Los marcadores también aceleran el cambio de desarrollo entre miembros y/o tipos. Estoy de acuerdo con la coherencia, por lo que sigo el orden de MSDN :) – si618

0

Además de mantener un conjunto coherente de las regiones en los archivos de clase, sigo todos los componentes de una región en orden alfabético. Tiendo a tener un poco de "memoria visual" cuando se trata de leer el código y me vuelve loco tener que usar el menú desplegable de navegación para encontrar el código en un archivo porque está por todos lados.

0

utilizo la siguiente distribución:

eventos globals/campos de toda clase privada interna/ propiedades métodos públicas/protegidas propiedades métodos clases anidadas (aunque intento de evitar estos siempre que sea posible)

También creo firmemente en 1 código "cosa" (clase, interfaz o enumeración) por archivo, con el nombre del archivo igual al nombre "cosa". Sí, hace un proyecto más grande pero hace que sea infinitamente más fácil encontrar cosas.

1

Puede intentar Regionerate para ayudar con esto. Me gusta mucho y es una elección de Scott Hanselman.

1

Como dije, no creo que haya una mejor manera como tal. Pero alguna organización lo ayuda a usted al programador.

¿Con qué frecuencia en un proyecto largo ha pasado tiempo subiendo y bajando uno o más archivos fuente tratando de encontrar una de sus funciones.

así que hago uso de la #region mucho que en este tipo de camino -

  1. región Eventos: Todas las referencias caso de que esto usos de clase (al menos en esta clase parcial en particular) .

  2. Controles de región: todas las funciones que interactúan directamente con los controles en un formulario.

  3. región MDI: establecer el MDI hasta

    Entonces habrá algunos que ver con la funcionalidad en lugar de interfaz,

  4. región Regex busca

en cierto modo me de hacerlo a medida que avanzo, pero usando el mismo patrón que uso siempre. Debo decir que me han dicho algunos programadores que recogen mi trabajo que es fácil de seguir y otros que está desordenado.

Puedes complacer a la mitad de las personas la mitad del tiempo y la otra mitad un cuarto de las veces y el otro cuarto del tiempo confundes a todos, incluyéndote a ti. Creo que Winston Chrchil dijo eso.

Cuestiones relacionadas