2009-08-13 16 views
17

¿Tiene alguna información sobre cómo organizar y nombrar las clases de utilidad?Convención de nomenclatura y estructura para clases de utilidad y métodos

Cada vez que me encuentro con alguna duplicación de código, podría tratarse de un par de líneas de código, las muevo a una clase de utilidad.

Después de un tiempo, tiendo a obtener un montón de pequeñas clases estáticas, por lo general con un solo método, que generalmente pongo en un espacio de nombres utility que se llena de clases.

Ejemplos:

ParseCommaSeparatedIntegersFromString(string) 
CreateCommaSeparatedStringFromIntegers(int[]) 
CleanHtmlTags(string) 
GetListOfIdsFromCollectionOfX(CollectionX) 
CompressByteData(byte[]) 

Por lo general, las convenciones de nombres le dicen el nombre de su clase como un sustantivo. A menudo termino con muchas clases como HtmlHelper, CompressHelper pero no son muy informativas. También traté de ser realmente específico, como HtmlTagCleaner, que generalmente termina con una clase por método de utilidad.

¿Tiene alguna idea sobre cómo nombrar y agrupar estos métodos de ayuda?

Respuesta

12

creo hay un continuo de complejidad, hay para las organizaciones correspondientes. Los ejemplos siguen, eligen en función de la complejidad de su proyecto y sus utilidades, y adaptarse a otras restricciones:

  1. Una clase (llamada ayudante), con unos métodos
  2. Un paquete (llamado ayudante), con una pocas clases (llamadas XXXHelper), cada clase con algunos métodos. Alternativamente, las clases se pueden dividir en varios paquetes no auxiliares si caben.
  3. Un proyecto (llamado ayudante), con algunos paquetes (llamados XXX), cada paquete con ... Alternativamente, los paquetes se pueden dividir en varios paquetes que no sean de ayuda, si corresponden.
  4. Varios proyectos de ayuda (divididos por nivel, por biblioteca en uso o de otro modo) ...

En cada nivel de agrupación (paquete, clase):

  • la parte común del significado es el nombre del nombre de la agrupación
  • códigos internos no necesitan que significa más (por lo que su nombre es más corto, más centrado, y no necesita abreviaturas, usa nombres completos).

Para proyectos, generalmente repito el significado común en un nombre de superpaquete. Aunque no es mi elección preferida en teoría, no veo en mi IDE (Eclipse) de qué proyecto se importa una clase, por lo que necesito que se repita la información. El proyecto es en realidad sólo se utiliza como:

  • una unidad de transporte: algunos entregables o productos tendrán el frasco, los que no es necesario que no lo hará),
  • para expresar dependencias: por ejemplo, una el proyecto empresarial no depende de los ayudantes de nivel web; Habiendo expresado que en las dependencias de los proyectos, hicimos una mejora en la complejidad aparente, buena para nosotros; o encontrando tal dependencia, sabemos que algo está mal, y comenzamos a investigar ...; También, mediante la reducción de las dependencias, podemos acelerar la compilación y la construcción ....
  • para categorizar el código, para encontrarlo más rápido: sólo cuando es enorme, estoy hablando de miles de clases en el proyecto

Tenga en cuenta que todo lo anterior también se aplica a los métodos dinámicos, no solo a los estáticos. En realidad, son nuestras buenas prácticas para todo nuestro código.


Ahora que he tratado de responder a su pregunta (aunque en un sentido amplio), permítanme añadir otro pensamiento
(Sé que no pidió para eso).

Los métodos estáticos (excepto los que usan miembros de clase estáticos) funcionan sin contexto, todos los datos deben pasarse como parámetros. Todos sabemos que, en código OO, esta no es la forma preferida. En teoría, deberíamos buscar el objeto más relevante para el método y mover ese método a ese objeto. Recuerde que el uso compartido de código no tiene que ser estático, solo tiene que ser público (o de lo contrario visible).

ejemplos de dónde mover un método estático:

  1. Si hay sólo un parámetro, para ese parámetro.
  2. Si hay varios parámetros, elegir entre mover el método en:
    • el parámetro que se utiliza más: el uno con varios campos o métodos utilizados, o utilizado por los condicionales (idealmente, algunos conditionnals serían eliminados por subclases anulando) ...
    • un objeto existente que ya tiene buen acceso a varios de los parámetros.
    • construir una nueva clase para esa necesidad

Aunque este método en movimiento puede parecer para OO-purista, nos encontramos con esta realidad nos ayuda en el largo plazo (y resulta muy valiosa cuando queremos subclase esto, para alterar un algoritmo). Eclipse mueve un método en menos de un minuto (con todas las verificaciones), y ganamos mucho más de un minuto cuando buscamos algún código, o cuando no codificamos nuevamente un método que ya fue codificado.

Limitaciones: algunas clases no se pueden ampliar, generalmente porque están fuera de control (JDK, bibliotecas ...). Creo que esto es la justificación de ayuda real, cuando necesitas poner un método en una clase que no puedes cambiar.

Nuestra buena práctica es, entonces, para nombrar el ayudante para con el nombre de la clase para extender, con el sufijo ayudante. (StringHelper, DateHelper). Esta coincidencia cercana entre la clase en la que deseamos que esté el código y el Ayudante nos ayuda a encontrar ese método en unos segundos, incluso sin saber si alguien más en nuestro proyecto escribió ese método o no.

7

Helper sufijo es una buena convención, ya que se utiliza en muchos idiomas (al menos en Java, los rieles IIRC lo usan).

La intención de su ayudante debe ser trasported por el nombre del método, use la clase solo como marcador de posición. Por ejemplo ParseCommaSeparatedIntegersFromString es un nombre mal para un par de razones:

  • demasiado tiempo, realmente
  • es redundante, en un lenguaje de tipos estáticos puede quitar FromString sufijo ya que se deduce de la firma

¿Qué piensa acerca de:

CSVHelper.parse(String) 
CSVHelper.create(int[]) 
HTMLHelper.clean(String) 
... 
+7

Personalmente puedo cambiar el nombre CSVHelper a CommaSeparatedValues. Es más largo pero solo ayuda a sux sus 6 caracteres que no agregan nada mientras que CommaSe ... s es significativo. IDE se completa automáticamente así que a quién le importa si es un poco largo. –

Cuestiones relacionadas