¿Debería mi pequeña biblioteca de software evitar el uso de otras bibliotecas?

13

Acabo de lanzar una pequeña biblioteca Java que ofrece solo unas pocas clases y métodos. Desde que construí el proyecto con Maven, inmediatamente utilicé varias bibliotecas de terceros para lograr mis objetivos, específicamente:

  • commons-lang3 (para algunas cosas generales de Java)
  • slf4j-api (para iniciar sesión)
  • commons-io (para un poco de material de archivo, literalmente leer un archivo una vez, creo)

No quiero que mi biblioteca parezca hinchada a los ojos de los demás. ¿Debería intentar eliminar mi dependencia de estas bibliotecas para minimizar mi huella? ¿Algún consejo sobre qué tipos de bibliotecas sería mejor evitar al considerar usar más en el futuro?

Duncan Jones
fuente
1
parte concreta de su pregunta parece responsable: su proyecto más libs concretas más si está bien. El problema es que lo deletreaste junto con la parte general "debería ... pequeño ... evitar". Tal como está actualmente, esta pregunta no es adecuada para nuestro formato de preguntas y respuestas. Esperamos que las respuestas estén respaldadas por hechos, referencias o experiencia específica, pero esta pregunta probablemente solicitará debate, argumentos, encuestas o discusión extendida. Si cree que esta pregunta puede mejorarse, consulte las Preguntas frecuentes para obtener orientación.
mosquito
1
@gnat Mis disculpas. Como usuario habitual de Stack Overflow, había tendido a asumir que las preguntas un poco subjetivas eran aceptables para los programadores. ¿Existe un sitio de Stack Exchange donde tales problemas están bien? Mientras tanto, eliminaré cualquier imprecisión de mi pregunta.
Duncan Jones el
2
@gnat Esta pregunta está bien, incluso en su forma original.
Thomas Owens
@ThomasOwens con el debido respeto, no lo creo; para la versión original , rápidamente calculé dos respuestas con recomendaciones opuestas, ambas razonablemente justificadas: juego de votación de bienvenida
mosquito
1
@gnat ¿Solo dos? Esta bien. Deja que se publiquen y voten. Dos respuestas potencialmente correctas con justificación y razonamiento opuestas no hacen que la pregunta sea mala. Tampoco 3 o 4 o incluso 5. Es una pregunta bien formada que es un problema que los desarrolladores de bibliotecas deben tratar, y luego la carga recae en las respuestas para que sean buenas respuestas .
Thomas Owens

Respuestas:

8

Estoy respondiendo esto considerando tu situación específica. Yo diría que está bien usar esas bibliotecas. Solo asegúrese de que su slf4j-api no traiga consigo la implementación. Con eso, me refiero a marcar la dependencia de implementación como "prueba". P.EJ:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.2</version>
    <scope>test</scope>
</dependency>

Esto se describe en detalle en las preguntas frecuentes de SLF4j.

En cuanto a los otros dos, IME, siempre son compatibles con versiones anteriores. Por lo tanto, si dentro de 5 años necesito usar su biblioteca pero está usando una versión anterior de esas, solo puedo excluir sus dependencias y nuestro código seguirá funcionando. En otras palabras, al usar estas bibliotecas específicas no introducirás jar-hell para otros.

Si uso su biblioteca a través de Maven, no notaré si su biblioteca está hinchada o no. Solo dependeré de la tuya y la usaré. Creo que es más importante que su código funcione correctamente que su huella más pequeña. Prefiero que uses commons-io en lugar de reinventar la rueda con un error.

Daniel Kaplan
fuente
Gracias por la respuesta, creo que estamos ampliamente de acuerdo con el enfoque que debo adoptar. Solo para corregir un bit: la forma en que se debe incluir slf4j en un proyecto de biblioteca es simplemente incluir slf4j-apiy no otros artefactos relacionados, proporcionados o no. Ver slf4j.org/manual.html#projectDep .
Duncan Jones
Recuerdo algunos ejercicios que dañan el cerebro (millones de excludes iirc) que tuve que hacer cuando determinados módulos de mis dependencias no podían "ponerse de acuerdo" en una versión slf4j. Según su respuesta, parece que si los diseñadores de módulos lo expongan provided, no habría problemas como ese, ¿correcto?
mosquito
2
@gnat Normalmente eso se resolvería (al menos en Maven), declarando una versión preferida en su POM. Maven toma la versión "más cercana" definida para un artefacto y el POM inmediato supera las dependencias transitivas. Posiblemente este fue un cambio de comportamiento durante una versión de Maven 2.x.
Duncan Jones
1
+1 para especificar slf4j como provided- muy discreto.
Gary Rowe
@ DuncanJones gracias, probablemente me perdí esto en ese entonces. Mi versión de Maven era 2.2 o 2.3, no recuerdo cuál (aunque sí recuerdo cómo mvn dependency:analyzefue traer versiones basura hasta que se excluyó :)
mosquito
1

No.

"Hinchazón" es un mito. No importa cuánto código haya en su biblioteca, si parte de ese código nunca se usa, no se paginará, no tendrá ningún impacto ni en el rendimiento ni en la huella de la memoria.

Por otro lado, si necesita esa funcionalidad adicional, tiene dos opciones. Puede escribirlo usted mismo y dedicar mucho tiempo y esfuerzo a resolver problemas que otros ya han resuelto antes, o puede optar por usar la solución que ya existe (y ha sido probada / depurada / etc.).

Eso nos deja con el tamaño de descarga y la huella de espacio en disco, y a menos que esté hablando de números tontos, en 2013 son dos factores que deberían estar cerca del final de la lista de cosas por las que debe preocuparse.

Maximus Minimus
fuente