Convención de nomenclatura de clases de C #: ¿Es BaseClass o ClassBase o AbstractClass

117

¿Cuál es el enfoque recomendado para nombrar clases base? ¿Es prefijar el nombre del tipo con " Base " o " Resumen " o simplemente lo añadiríamos como "Base"?

Considera lo siguiente:

escribir: ViewModelpor ejemplo MainViewModel , ReportViewModel

clase base: BaseViewModelo ViewModelBaseoAbstractViewModel

Considere también:

tipo: Productpor ejemplo , VirtualProduct , ExpiringProduct

clase base: BaseProducto ProductBaseoAbstractProduct

¿Cuál crees que es más estándar?

class Entity : EntityBase
{
}

o

class Entity : BaseEntity
{
}
Soni Ali
fuente

Respuestas:

90

Hay ejemplos en el marco con el sufijo base, por ejemplo System.Configuration.Provider.ProviderBase, System.Web.SessionState.SessionStateStoreProviderBase.

Pero de ninguna manera todas las clases base abstractas en el Marco siguen esta convención (por ejemplo System.Data.Common.DbParameter, System.Data.Common.DbCommand).

Personalmente, evitaría usar el sufijo a menos que quisiera enfatizar el hecho de que es una clase abstracta y siento que, de lo contrario, los usuarios de la clase podrían esperar que el nombre indique una implementación concreta.

Joe
fuente
" Avoidnombrar clases base con un Basesufijo si la clase está destinada a utilizarse en API públicas". Pautas de diseño del marco, página 174
Yousha Aleayoub
47

Ninguna de las anteriores. Considere qué propósito proporciona su clase base; nombrarlo así. Por ejemplo, la clase base de Automóvil y Bicicleta podría ser Vehículo.

Si está creando clases base solo para tener una clase base de una clase, y sin otro propósito o razón más que eso, probablemente esté haciendo algo mal.

Paul Sonier
fuente
15
Ese no es siempre el caso y encontrará muchas clases Base * en el marco. CollectionBase, DictionaryBase .... etc
Chad Grant
1
Buen punto, los objetos del mundo real deberían encajar exactamente en los artefactos. La abstracción de los bienes comunes debe basarse como un vehículo, los detalles deben ir detrás, pero también son exactos.
ruslander
45
Vale la pena señalar que algunas de las clases en .NET Framework con un sufijo "Base" se nombraron antes de la versión 1.0 y Microsoft ya no sigue esas convenciones ... pero ahora no pueden cambiar los nombres. El libro Framework Design Guidelines de Microsoft, sección 6.2 (que cubre las clases base), recomienda específicamente no usar el sufijo "Base".
Warren Rumak
5
La práctica que he visto que se utiliza con mayor frecuencia en varios lenguajes de OO en varias empresas es que "Base" designa las clases base que solo deben heredarse, no para usarse directamente. Con su ejemplo, una clase llamada "Vehículo" suena como algo que se puede usar y "conducir": afirma ser un vehículo. Sin embargo, si la clase base se denominó "Piezas de vehículo" o "Elementos esenciales del vehículo" o "Kit de vehículo", sabemos que no es algo que se pueda utilizar directamente, sino una base para una variedad de vehículos.
Slipp D. Thompson
4
Como lo menciona Warren, libro de Pautas de diseño de Microsoft Framework, sección 6.2 sobre Clases base: msdn.microsoft.com/en-us/library/ms229003(v=vs.110).aspx Dicen que se debe evitar el sufijo base: "EVITAR nombrar clases base con un sufijo "Base" si la clase está destinada a utilizarse en API públicas ".
cwills
5

Si habla de clases base virtuales, el estándar de Microsoft es ClassnameBase (como CollectionBase).

Sí, ese Jake.
fuente
3

Creo que es una cuestión de elección. Yo diría que si está creando muchas clases base, entonces tal vez sea mejor usar BaseClassname siempre porque de esa manera SIEMPRE puede averiguar qué clases base puede comenzar a usar simplemente escribiendo Base y obteniendo el resto de la ayuda de Intellisense. ¿Qué pasa si tiene 20 clases Base y agrega Base como sufijo y olvida cuál era el nombre de la clase base? ¿Desea crear un diagrama de clases primero desde VS y averiguar qué clases base están disponibles? Está bien llamarlos ClassBase cuando es solo una o dos clases.

Lo mismo ocurre con la decisión entre GetItems y la función ItemsGet. Yo diría que al menos por el bien de la legibilidad, opte por GetItems. Siga las convenciones :)


fuente
1
Las clases 'base' son un truco de OO, vea el comentario de Paul . A menudo son útiles y a veces necesarios, pero aún así son un truco. Si siente la necesidad de buscar todas las clases base disponibles, ¿por qué? ¿Qué comparten que crea tu necesidad de verlos a todos juntos? La respuesta podría ayudarlo a encontrar un mejor nombre.
Iain
1
@Abhishek: La analogía con GetItemsno funciona: “Get” es solo un verbo y, por lo tanto, solo tiene sentido gramatical en inglés como prefijo, mientras que “Base” funciona como adjetivo (prefijo) o como sustantivo (sufijo).
Slipp D. Thompson
1
@Iain: La razón por la que la gente usa "Base" en los nombres de las clases no es para poder encontrar todas las clases base; la razón es más cercana a lo contrario. Es así que la clase base de varias clases relacionadas se destaca de ellas, de la misma forma que el prefijo "I" está destinado a distinguir una interfaz de las clases que la adoptan. He visto que el prefijo / sufijo "Base" se usa con mayor frecuencia cuando la clase base no es funcional por sí sola: resumen por uso previsto, independientemente de una aplicación abstract.
Slipp D. Thompson
@ SlippD.Thompson sí, "encontrar todas las clases" fue una respuesta a Abhishek. Respondí a la respuesta de Paul.
Iain
2

Usamos BaseEntity, pero creo que es su preferencia. Frecuentemente veo al otro.

Simplemente sea coherente con su contexto, ya sea su proyecto, espacio de nombres o, si es posible, su equipo. Diferentes convenciones son peores que una mala convención en mi humilde opinión.

Gary.Ray
fuente
2

Personalmente, recomendaría no agregar la palabra base en absoluto. Nunca se sabe cuándo tendrá que cambiar el código y ya no será el objeto base. Dicho esto, hemos hecho esto en el pasado, anteponemos la palabra Base al frente. Parece fluir mejor.

kemiller2002
fuente
-1

BaseEntity se parece mucho al caso camel: strName, bseEntity. Yo elegiría EntityBase ya que define el tema primero, lo que te ayudará a identificar su función más rápido.

Mike Robinson
fuente
10
Estás hablando de notación húngara, no de carcasa de camello. La notación húngara resultó estar en caja de camello, pero son cosas completamente diferentes.
sliderhouserules
-5

Piense siempre en la alfabetización cuando nombre cosas. Realmente no me gusta mirar un servidor SQL y cada procedimiento almacenado se llama usp [algo]. En la misma línea, no use en exceso Get y Set como nombres principales para una función. En lugar de GetItems o PlaceOrder, piense en nombrarlos como ItemsGet o OrderPlace.

Entonces, en general, ClassnameBase / EntityBase sería una mejor opción.

marcc
fuente
9
Discrepar; Legibilidad. GetItems tiene mucho más sentido que ItemsGet.
Nathan Ridley
2
No estoy de acuerdo ... la misma razón que la anterior ... pero no
puedo
Contrariamente a los otros comentarios, marcc NO ha sugerido algo como itemgsGet (). Escribió ítems ().
Hontvári Levente