java - descargar - ¿Es bueno tener la clase "Utils" en su proyecto de software?
java jdk (11)
¿Es una buena práctica?
En la mayoría de los casos, lo uso de esta manera.
al igual que con toda la programación orientada a objetos, debe apuntar a la máxima cohesión, al acoplamiento mínimo.
No elimine su productividad siguiendo estrictamente esas reglas, puede ver que muchos marcos excelentes los rompen.
Generalmente, durante el desarrollo de software, hay todo tipo de funciones de utilidad que necesito. Al igual que un archivo comprimido, extraer un archivo comprimido, iniciar el navegador web, obtener una imagen escalada ...
Lo que hice es colocar todas estas funciones de utilidad como una función estática dentro de una sola clase llamada "Utils"
https://github.com/yccheok/jstock/blob/master/src/org/yccheok/jstock/gui/Utils.java
¿Es una buena práctica? ¿Las cosas crecerán inmanejables cuando la cantidad de funciones crezca más y más?
¡Es absolutamente una buena práctica! no desea combinar todas esas funciones de utilidad con el resto de la lógica empresarial de su aplicación. Sin embargo, a medida que crecen sus archivos y / o clases de utilidades, se recomienda agruparlos de acuerdo con la función que proporcionan.
Por ejemplo, en una aplicación web podría terminar con una estructura de paquete como esta.
org.sample.web.model
org.sample.web.utils
org.sample.web.validators
org.sample.web.validators.utils
En realidad, el concepto de las clases Utils
y Helper
se debe a la incapacidad de escribir funciones gratuitas en entornos en los que cada función debe pertenecer a una clase (ya sea por el idioma o por restricciones del proyecto). La clase Utils
con nada más que funciones estáticas termina desempeñando el papel de un paquete con funciones gratuitas.
Debido a que es un fenómeno recurrente en muchos proyectos de software, lo considero una especie de expresión idiomática para los diseños de POO y, por lo tanto, una buena práctica porque las personas se relacionan con él. Como señalan otras respuestas, una mejora beneficiosa sería factorizar las clases de Utils
para un proyecto separado para facilitar la reutilización y el mantenimiento.
Estoy de acuerdo con el comentario de Mike. Yo uso C #, pero la implementación similar. Tengo un proyecto util que mantengo en secreto y luego solo suelto la DLL en el nuevo proyecto. De esa forma, a medida que se producen errores / cambios, puedo actualizar proyectos simplemente reemplazando DLL.
Mantengo una clase separada para diferentes áreas de la aplicación, como Mike sugirió en su comentario.
Las clases de utilidad generalmente tienden a producir código de estilo de procedimiento. El ir contra las convenciones puras de OO. Sin embargo, simplifican tu vida así que úsalos. Pero haz que cada uno haga lo suyo, de lo contrario, terminarás con una clase de Dios que se convertirá en una trampa para todos los métodos que parecen no encajar en el objeto en el que deberían residir.
Mi práctica es tener clases de *Utils
y clases de *Helper
. El primero contiene funciones estáticas reutilizables (para el caso de Java y PHP) que no están relacionadas con la aplicación, mientras que las últimas son lógicas de dominio / aplicación reutilizables: métodos no estáticos y generalmente con dependencias de otros servicios / beans / managers.
Estas son algunas reglas que aplico antes de crear un método o una clase de *Utils
:
- ¿El lenguaje en sí ya lo apoya?
- ¿Apache Commons lo apoya? (o algunas otras bibliotecas comunes, porque alguien podría haber escrito algo que lo hace mejor que tú)
- ¿Cómo puedo hacer que sea reutilizable (proyecto / aplicación neutral) para que mis otros proyectos puedan usarlo?
- ¿Cómo lo nombraré? (Sí, siempre se categorizará y se separará, ya que estas clases eventualmente crecerán y es posible que pierda el control sobre ellas cuando más desarrolladores le agreguen más métodos).
No, no creo que las clases de servicios públicos sean una buena práctica. Psicológicamente, la palabra ''Utilidades'' es demasiado amplia e incluso si la divides en varias clases * Util se convertirá en un basurero para cosas que son ''demasiado difíciles'' para encajar en un diseño de clase adecuado.
Para un ejemplo, tome una clase de pseudo-ficticia StringUtils. Podría tener cientos de métodos para codificar / decodificar para diferentes esquemas, transformaciones de casos, manejo de espacios en blanco, etc. Creo que un mejor enfoque es utilizar el patrón de estrategia para manejar estas transformaciones, lo que potencialmente permitiría la posibilidad del cliente Código que introduce nuevas transformaciones sin necesidad de editar / recompilar el código original. Obtienes un sistema más potente, más flexible y más fácil de mantener.
Romper las utilidades es un buen enfoque. En general, debes evitar convertir tus clases en blobs.
Sí, las clases de utilidad son una buena idea pero, al igual que con toda la programación orientada a objetos, debe apuntar a la máxima cohesión, al acoplamiento mínimo.
La cohesión máxima significa que todo en una sola clase debe estar fuertemente relacionado entre sí. Un acoplamiento mínimo significa que no debe haber dependencias innecesarias entre clases.
En otras palabras, agrupar la compresión con la manipulación de imágenes o el lanzamiento de procesos externos en una sola clase es una mala idea. Por supuesto, tenga una clase de utilidad de compresión y una clase de utilidad de manipulación de imágenes, pero no las junte.
Hacerlo es similar a usar el patrón singleton como un objeto de dios, un ghetto donde simplemente tiras toda tu basura que debería estar mejor organizada. Yo diría que está bien usar una clase de utilidad súper durante el desarrollo, pero asegúrese de que su código esté mejor organizado antes del envío. El mantenimiento será mucho más fácil.
¿Es una buena práctica?
No, no a largo plazo, aunque es útil cuando se hace temporalmente.
¿Las cosas crecerán inmanejables cuando la cantidad de funciones crezca más y más?
Sí, no hay duda al respecto.
Si es al menos estático , entonces tiene sentido en una clase de Util
. ¡Eso es fácil! La cohesión y el acoplamiento están destinados a hacer tu vida más fácil , esta es una situación clara en la que no lo harían, por lo que te sugeriría que sigas así.
Una clase util (o paquete de clases) es muy útil. Generalmente tiendo a separar mis utilidades por funcionalidad en clases, por lo que puedo tener FileUtils, DatabaseUtils, etc.
Sin embargo, sugeriría encarecidamente que mantengas tus utilidades en un frasco o proyecto separado (muy fácil con Eclipse). Si terminas teniendo varios proyectos que usan las mismas utilidades, es una buena idea evitar la replicación de código. Tener un proyecto o un frasco para incluir no tiene precio.