Pregunta

A menudo me encuentro en una situación en la que tengo un concepto representado por una interfaz o clase, y luego tengo una serie de subclases / subinterfaces que se extienden ella.

Por ejemplo: Un genérico "DoiGraphNode" A "DoiGraphNode" que representa un recurso Un "DoiGraphNode" que representa un recurso de Java A "DoiGraphNode" con una ruta asociada, etc., etc.

Se me ocurren tres convenciones de nombres, y agradecería comentarios sobre cómo elegir.


Opción 1: Comience siempre con el nombre del concepto

.

Por lo tanto:. DoiGraphNode, DoiGraphNodeResource, DoiGraphNodeJavaResource, DoiGraphNodeWithPath, etc.

Pro: Es muy claro lo que estoy tratando, es fácil ver todas las opciones que tengo

En contra: No muy natural? Todo tiene el mismo aspecto?


Opción 2: Colocar el material especial en el inicio

.

Así: DoiGraphNode, ResourceDoiGraphNode, JavaResourceDoiGraphNode, PathBaseDoiGraphNode, etc., etc.

Pro: Es muy claro cuando lo veo en el código

Con: encontrar que podría ser difícil, especialmente si no me acuerdo el nombre, la falta de coherencia visual


Opción 3: Coloque el material especial y eliminar parte del texto redundante

Así: DoiGraphNode, ResourceNode, JavaResourceNode, GraphNodeWithPath

Pro: No hay mucho que escribir y leer Con: Parece que cr * p, muy inconsistente, puede entrar en conflicto con otros nombres

¿Fue útil?

Solución

Nombre de ellos por lo que son.

Si nombrarlos es difícil o ambigua, es a menudo una señal de que la clase está haciendo demasiado (Responsabilidad solo principio).

Para evitar conflictos de nombres, elegir los espacios de nombres de manera apropiada.

Personalmente, me gustaría usar 3

Otros consejos

Usar lo que quiera, es una cosa subjetiva. Lo importante es dejar en claro lo que cada clase representa, y los nombres debe ser tal que las relaciones de herencia tienen sentido. Realmente no creo que sea tan importante para codificar las relaciones en los nombres, sin embargo; eso es lo que la documentación es para (y si sus nombres son apropiadas para los objetos, las personas deben ser capaces de hacer buenas conjeturas en cuanto a lo que hereda de qué).

Por lo que vale, que suelen utilizar la opción 3, y desde mi experiencia mirando opción de código de otras personas 2 es probablemente más frecuente que la opción 1.

Se puede encontrar alguna orientación en un documento de estándares de codificación, por ejemplo, existe el documento IDesign para C # aquí .

En lo personal, yo prefiero la opción 2. Esta es generalmente la forma en que los nombres de .NET Framework sus objetos. Por ejemplo mirar a clases de atributos. Todos ellos terminan en Atributo (TestMethodAttribute). Lo mismo ocurre con los manejadores de sucesos:. OnClickEventHandler es un nombre recomendado para un manejador de eventos que gestiona el evento Click

Por lo general tratan de seguir esto en el diseño de mi propio código y las interfaces. Así, un IUnitWriter produce una StringUnitWriter y una DataTableUnitWriter. De esta manera siempre sabe cuál es su clase base es y se lee de forma más natural. código de auto-documentado es el objetivo final para todos los desarrolladores ágiles por lo que parece que funciona bien para mí!

Por lo general nombre similar a la opción 1, especialmente cuando las clases se utilizarán polymophically. Mi razonamiento es que el bit de información más importante aparece en primer lugar. (Es decir, el hecho de que la subclase es básicamente lo que es el antepasado, con (por lo general) extensiones 'añadidos'). Me gusta esta opción también porque al ordenar las listas de nombres de clase, las clases relacionadas se muestran juntos. Es decir. Por lo general un nombre a la unidad de traducción (nombre de archivo) lo mismo que El nombre de clase de archivos de clase de manera relacionada, naturalmente, se muestran juntos. Del mismo modo que esto es útil con la búsqueda incremental.

A pesar de que yo tendía la opción 2 para utilizar antes en mi carrera de programación, lo evito ahora porque como usted dice que es 'inconsistente' y no parecen muy ortogonal.

A menudo utilizo la opción 3 cuando la subclase proporciona una extensión o especificación sustancial, o si los nombres sería bastante larga. Por ejemplo, mi archivo de clases de nombre de sistema se derivan de cuerdas sino que se extienden en gran medida la clase String y tienen una significativamente diferente uso / significado:

Directory_entry_name derivado de cadena añade una amplia funcionalidad. Nombre de archivo derivado de Directory_entry_name tiene funciones más bien especializados. Directory_name derivado de Directory_entry_name también tiene funciones más bien especializados.

También junto con la opción 1, que suelen utilizar un nombre no calificado de una clase de interfaz. Por ejemplo puede ser que tenga una cadena interence clase:

  • Texto (una interfaz)
  • Text_abstract (resumen (base) clase generalización)
  • Text_ASCII (clase concreta específica para la codificación ASCII)
  • Text_unicode (clase concreta específica para la codificación Unicode)

me gusta más que la interfaz y la clase base abstracta aparecen automáticamente en primer lugar en la lista ordenada.

La tercera opción sigue más lógicamente del concepto de herencia. Dado que está especializada la interfaz o clase, el nombre debe indicar que está dejando de usar la implementación base (si existe).

Hay una multitud de herramientas para ver lo que una clase hereda de, por lo que un nombre concisa indicando que la función real de la clase van a ir más allá de tratar de empacar demasiada información de tipo en el nombre.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top