2009-02-04 10 views
26

¿Es aceptable usar la palabra 'Base' en un nombre de clase que está en la parte inferior del árbol de herencia?Usando "Base" en un Nombre de clase

Siempre me ha resultado un poco difícil, solo me pregunto si alguien está de acuerdo conmigo.

Por ejemplo, si estoy refabricando ciertos elementos de MyClassA y MyClassB en una clase base común, estaría tentado de crear un MyBaseClass del que los dos hereden.

¿Pero qué sucede si alguna vez necesito refactorizar MyBaseClass? MyBaseBaseClass? Ahora eso es tonto.

Sé que a Rocky Lhotka no le molesta su marco CSLA, pero siempre me incomodan las 'definiciones' en la programación.

¿Pensamientos?

Déjenme aclarar por qué Estoy preocupado por esto.

Tengo dos espacios de nombre: MySpecificNamespace y MyCommonNamespace. MyNamespace usa MyCommonNamespace, como era de esperar.

Ahora, me gusta utilizar al máximo los espacios de nombres siempre que sea posible para describir el contexto del problema y evitar agregar el contexto al nombre de la clase. Entonces, por ejemplo, considere que tengo una clase en MyNamespace que desciende de una en MyCommonNamespace.

Opción A

que podía llamada esta

MySpecificClass: MyClass 
{ 
} 

Pero entonces yo estoy añadiendo 'específico' (el contexto) al nombre - que es redundante, ya que ya se encuentra en MySpecificNamespace.

Opción B

MyClass: MyCommonNamespace.MyClass 
{ 
} 

se puede ver cómo podíamos conseguir confuso aquí, ¿verdad?

Opción C

El que yo creo que es a pescado:

MyClass: MyBaseClass 
{ 
} 
+0

buena pregunta. gracias – frameworkninja

+0

Gracias por la pregunta. Ha aparecido como una segunda entrada en una consulta que ingresé en Google, que quería ver si alguien me había preguntado lo mismo, que solo estaba cambiando el nombre de las clases y me estaba haciendo decir "¡Yuk!" :) –

+0

También vea http://stackoverflow.com/questions/429470/naming-conventions-for-abstract-classes – nawfal

Respuesta

0

creo que, probablemente, se debe evitar en lo posible en favor de un identificador que describe realmente lo que es!

Esta pregunta es difícil de responder porque es abstracta. Podría, por ejemplo, considerar llamar a la base de MyClassA y MyClassB, "MyClass".

+0

Gracias por su comentario - ¡espero haber ayudado a aclarar la pregunta un poco! – Duncan

3

Creo que vale la pena wiki-fying esta pregunta.

FWIW, estoy de acuerdo. Normalmente trato de encontrar un término más "genérico" para mis clases base. Entonces, si tengo una clase de "Cliente" y necesito introducir una nueva clase base para ella, elegiría "Contacto" o algo en lugar de "CustomerBase".

8

Me aparece el "no" por exactamente el motivo de refactorización que ha citado.

Una clase debe tener el nombre de lo que representa lógicamente, y nada más que la clase Object es realmente realmente Base. Metafísica ftw :)


re: Opción B, no hay nada confuso acerca

namespace MySpecificNamespace 
{ 
    MyClass: MyCommonNamespace.MyClass 
    { 
    } 
} 
9

tiendo a añadir un sufijo base al nombre de la clase base sólo si existe desde la perspectiva técnica (compartir algún código), y realmente no constituye ninguna clase utilizable en sí misma (por lo que todas estas clases son abstractas). Sin embargo, estos son casos bastante raros, y deberían evitarse como las clases de Helper.

2

También estoy de lado con el no campamento ... coloque una Base ahí hoy y en 6 meses alguien golpeará una clase MyDerivedClass en su código base mientras no esté buscando.

3

yo también sugieren que no hay, pero no inamovible ...

mantra siguiente OO, su sistema de nombres debería representar mejor los objetos subyacentes que se supone que el código que se encapsula. Realmente no debería haber un 'metalenguaje', relacionado con la composición sintáctica real del lenguaje de programación elegido aquí.

Dicho esto, si su objeto es realmente abstracto y realmente no lo ve cambiar pronto, existe el argumento de que agregar 'Base' ayuda con la legibilidad general.

Al igual que con la mayoría de las cosas, no existe una respuesta correcta y incorrecta: depende del diseño general de su código base, qué se supone que representa este código específico y el estilo interno que tiene. Solo trata de ser consistente.

¿Se utiliza la base en otro lugar?

0

"Resumen" prefijo ¿quizás?

+0

casi con certeza, pero no resuelve el problema del espacio de nombres – annakata

1

En Java tiendo a proporcionar una implementación básica de una interfaz Foo en una clase abstracta FooBase. Creo que está perfectamente bien y hace que la conexión a la interfaz sea muy clara y regular.

Sin la interfaz, llamaría a la clase base abstracta Foo.

0

Normalmente utilizo IFoo para la interfaz y AbstractFoo para la implementación del esqueleto, que es una mezcla de convenciones de .NET y Java.

+0

Hmmm, no veo cuál es la diferencia entre la fijación previa con Abstract y post-fijación con Base. – Duncan

1

Estoy de acuerdo, AbstractFoo es una solución decente. Intento elegir nombres que no necesiten adjetivos adicionales. Me rehusaría a usar Base.

5

Las clases que tienen el mismo nombre que sus clases principales me molestan sin fin. En Java java.sql.Date extiende java.util.Date. Esto es muy molesto porque debe especificar la clase exacta que desea importar o especificar el nombre de clase por completo (incluido el paquete/espacio de nombres).

Personalmente prefiero nombrar las cosas como son; si una clase base o abstracta existe solo para proporcionar una implementación parcial de algo, y no representa la interfaz para esa cosa, a menudo es aceptable poner la palabra abstracta o base en su nombre. Sin embargo, si esa clase también representa la interfaz, entonces debería nombrarla después de lo que hace.

Por ejemplo, en Java, tenemos la interfaz de conexión (para conexiones DB). Simplemente se llama Connection, no IConnection. Usted utilizar de esta manera:

Connection con = getConnectionFromSomewhere(); 

Si va a realizar un controlador JDBC y la necesidad de poner en práctica la conexión, usted podría tener un ConnectionBase o AbstractConnection que es la capa inferior del detalle de implementación de la conexión en particular. Es posible que tenga

abstract class AbstractConnection implements Connection 

class OracleConnection extends AbstractConnection 

o algo así. Los clientes de su código, sin embargo, nunca ven AbstractConnection ni ven OracleConnection, solo ven Connection.

Por lo tanto, en general, las clases que generalmente son útiles deben nombrarse después de lo que representan/hacen, mientras que las clases que son auxiliares para el mantenimiento/organización de código pueden nombrarse después de lo que son.

* ps Odio nombrar Interfaces con I. ¿Las personas nombran todas sus clases con C? ¡Es 2009! su IDE puede decirle qué tipo de objeto es, en el caso extraño, incluso si es una interfaz o una clase.

4

"Todas sus bases de clase son propiedad nuestra".

Yo lado con un no definitivo, con una sola excepción. Si estás escribiendo una aplicación para administrar instalaciones militares o estadios de béisbol, apúntate.

Cuestiones relacionadas