Nunca digas nunca"
No creo que sea necesariamente malo, solo es malo si lo haces mal y abusas de él.
Todos necesitamos herramientas y utilidades
Para empezar, todos usamos algunas bibliotecas que a veces se consideran casi ubicuas y imprescindibles. Por ejemplo, en el mundo Java, Google Guava o algunos de Apache Commons ( Apache Commons Lang , Apache Commons Collections , etc.).
Entonces claramente hay una necesidad de estos.
Evite las palabras difíciles, la duplicación y la introducción de errores
Si se piensa en ellas se encuentran prácticamente sólo un gran manojo de estas Util
clases que usted describe, excepto que alguien pasó por un gran esfuerzo para conseguir que la derecha (relativamente), y han sido tiempo - probados y fuertemente ojo en ovillo por otros.
Entonces, diría que la primera regla general cuando sientas ganas de escribir una Util
clase es verificar queUtil
clase en realidad no exista.
El único contraargumento que he visto para eso es cuando quieres limitar tus dependencias porque:
- desea limitar la huella de memoria de sus dependencias,
- o desea controlar estrictamente lo que los desarrolladores pueden usar (sucede en equipos grandes obsesivos, o cuando un marco en particular es conocido por tener una clase súper asquerosa que se debe evitar en algún lugar).
Pero ambos pueden abordarse volviendo a empaquetar la biblioteca con ProGuard o un equivalente, o desarmándola usted mismo (para los usuarios de Maven , el complemento maven-shade-plugin ofrece algunos patrones de filtrado para integrar esto como parte de su compilación).
Entonces, si está en una biblioteca y coincide con su caso de uso, y ningún punto de referencia le dice lo contrario, úselo. Si varía un poco de lo que usted extiende, extiéndalo (si es posible) o extiéndalo, o en el último recurso, vuelva a escribirlo.
Convenciones de nombres
Sin embargo, hasta ahora en esta respuesta los llamé Util
s como tú. No les digas eso.
Dales nombres significativos. Tome Google Guava como un (muy, muy) buen ejemplo de qué hacer, e imagine que el com.google.guava
espacio de nombres es realmente suutil
raíz.
Llame a su paquete util
, en el peor de los casos, pero no a las clases. Si se trata de String
objetos y manipulación de construcciones de cadenas, llámelo Strings
, no StringUtils
(lo siento, Apache Commons Lang , ¡todavía me gusta y lo uso!). Si hace algo específico, elija un nombre de clase específico (como Splitter
oJoiner
).
Prueba de unidad
Si tiene que recurrir a escribir estas utilidades, asegúrese de realizar una prueba unitaria. Lo bueno de las utilidades es que generalmente son componentes bastante independientes, que toman entradas específicas y devuelven salidas específicas. Ese es el concepto. Así que no hay excusa para no probarlos en la unidad.
Además, las pruebas unitarias le permitirán definir y documentar el contrato de su API. Si las pruebas se rompen, o cambiaste algo de la manera incorrecta, o significa que estás tratando de cambiar el contrato de tu API (o que tus pruebas originales fueron basura, aprende de ello y no lo vuelvas a hacer) .
Diseño API
Las decisiones de diseño que tomará para estas API lo seguirán durante mucho tiempo, posiblemente. Entonces, si bien no pasa horas escribiendo un Splitter
clon, tenga cuidado con la forma en que aborda el problema.
Hágase algunas preguntas:
- ¿Su método de utilidad garantiza una clase por sí solo, o es un método estático lo suficientemente bueno, si tiene sentido que forme parte de un grupo de métodos igualmente útiles?
- ¿Necesita métodos de fábrica? para crear objetos y hacer que sus API sean más legibles?
- Hablando de legibilidad, ¿necesitas una API fluida , constructores , etc.?
Desea que estas utilidades cubran una gran variedad de casos de uso, que sean robustas, estables, bien documentadas, que sigan el principio de menor sorpresa y que sean independientes. Idealmente, cada subpaquete de sus utilidades, o al menos todo su paquete de utilidades, se podrá exportar a un paquete para una fácil reutilización.
Como de costumbre, aprende de los gigantes aquí:
Sí, muchos de estos hacen hincapié en las colecciones y las estructuras de datos, pero no me digas que no es dónde o para qué es probable que implementes la mayoría de tus utilidades, directa o indirectamente.
Util
en los nombres de tus clases. Problema resuelto.