2012-03-05 14 views
6

He estado teniendo este debate con un amigo donde tengo una biblioteca (su pitón pero no incluí eso como una etiqueta ya que la pregunta es aplicable a cualquier idioma) que tiene algunas dependencias. El debate es si proporcionar un entorno predeterminado en la inicialización o forzar al usuario del código a establecer explícitamente uno.¿Debo configurar el entorno por defecto para alguien que usa mi biblioteca?

Mi opinión es forzar al usuario como explícito y evitará confusiones y dejará en claro a qué apuntan.

Mi amigo esto es más seguro y más conveniente para un entorno predeterminado y dejar que el usuario anule si así lo desea.

¿Pensamientos? ¿Hay alguna buena referencia o ejemplos/patrones en bibliotecas populares que respalden alguno de nuestros argumentos? también, ¿algún blog o artículo popular que discuta este punto de diseño de API?

+0

Reflexiones similares a http://stackoverflow.com/questions/1166539/do-you-find-convention-over -configuration-good-or-bad – mguymon

+0

@mguymon: creo que es un tema ligeramente diferente. – leora

+0

El público objetivo es otro gran factor a considerar. ¿Es algo interno de una compañía frente a alguien en la red? Para los usuarios con una mentalidad de diseñador vs mentalidad de ingeniería? Etc. –

Respuesta

6

No tengo ninguna referencia, pero aquí están mis pensamientos como un usuario potencial de dicha biblioteca.

Creo que es bueno tener una configuración predeterminada disponible para permitir a los desarrolladores evaluar rápidamente la biblioteca. No quiero tener que pasar por un montón de configuración solo para ver si la biblioteca hará lo que necesito. Una vez que esté contento de que la biblioteca haga lo que necesito, me complace configurarlo de la manera que quiero.

Un buen ejemplo es el marco ASP.Net MVC de Microsoft. Cuando creas un nuevo proyecto MVC, engancha un proveedor de autenticación y membresía predeterminado, lo que permite al desarrollador obtener rápidamente una aplicación en funcionamiento. También es fácil configurar diferentes proveedores para ser utilizados si los predeterminados no cumplen con los requisitos de la aplicación en cuestión.

Como un ejemplo ligeramente diferente, Atlassian Confluence es un software wiki que admite muchas bases de datos back-end diferentes. Atlassian podría haber elegido no tener una configuración de base de datos predeterminada, sino que Confluence se envía con una base de datos predeterminada, simple y basada en archivos para permitir a los usuarios evaluar el software. Para las instalaciones de producción, puede conectarse a Oracle, SQL Server, mySQL o cualquier otra cosa que desee.

Puede haber casos en los que una configuración predeterminada para una biblioteca no tenga sentido, pero creo que sería un caso especial, en lugar de una regla general.

3

Depende. Si puede proporcionar valores predeterminados razonables, es posible que desee hacerlo: facilitará la vida a los usuarios ocasionales de la biblioteca, ya que pueden establecer solo las configuraciones relevantes, en lugar de todo el entorno (con configuraciones posibles, las implicaciones de las cuales no entiendo completamente (todavía)). Está en lo correcto, que en situaciones es posible que esto lleve a frustración y confusión ya que las configuraciones predeterminadas pueden causar un comportamiento inesperado (inesperado por el usuario (inexperto)) - tiene que sopesar la reducida frustración de conveniencia frente al precio de no- entendido por defecto para hacer la elección de cada una de estas configuraciones posibles de default, que elección podría afectar la elección para otras configuraciones relacionadas también

Por otro lado, si no hay un valor predeterminado razonable (por ejemplo, credenciales de base de datos, dirección remota), debe solicitar al usuario que proporcione esas configuraciones.

La clave en ambos casos es proporcionar suficiente información en la documentación de la biblioteca y en los mensajes de error (ya sea por configuraciones faltantes o conflictivas) que el usuario puede averiguar qué significan esas configuraciones/control sin tener que leer a través del código fuente de la biblioteca.Esta parte es difícil porque 1) es usualmente tediosa desde el punto de vista del desarrollador de la biblioteca (por lo que a menudo se escatima) y 2) la documentación debe escribirse desde la mentalidad de un novato en la biblioteca, que a menudo es diferente desde la mentalidad del desarrollador de la biblioteca: este último conoce las conexiones/implicaciones implícitas, el primero debe ser entendido de manera comprensible.

1

Aunque no exactamente idéntico en términos de dominio del problema, esto me parece el argumento Convention over Configuration.

Ha habido un gran impulso detrás de CoC en los últimos años, y en mi opinión, tiene mucho sentido. Mientras no se pierda la flexibilidad, tiene todo para ganar. Un menor desarrollo de fricción es lo que todos buscamos, y si tengo que configurar cada aspecto de su API para que funcione, me inclino menos a utilizarla sobre otra API de igual funcionalidad.

Me gustan los podcasts de Hanselman, así que si quieres escuchar un poco de luz, mira this podcast.

0

Creo que su pregunta necesita alguna aclaración. Para empezar, no creo que una biblioteca deba tener ninguna configuración de tiempo de ejecución. En términos de dependencias, las dependencias de la biblioteca deben manejarse de una manera apropiada para el entorno para el que se escriben. En Python, esas dependencias deben estar en el archivo setup.py (según los requisitos) y, en última instancia, ese archivo debe cumplir con los requisitos del servicio que planee ponerlo a disposición (es decir, pypi para python).

Para las aplicaciones, está completamente bien requerir la configuración del tiempo de ejecución, pero debe intentar tener valores predeterminados razonables. Si su aplicación depende de las bibliotecas, esa dependencia debe manejarse de la misma manera que se manejaría una dependencia de la biblioteca, incluso si esa información puede ser redundante en el contexto de un instalador (si es necesario). En su mayor parte, las secuencias de comandos de la primera ejecución y las de su clase deben estar separadas del instalador/rpm.

Para Web Frameworks, es típico que su aplicación lleve la configuración, y es probable que tenga que instalarse de una manera diferente a las aplicaciones tradicionales. Aquí, lo único que puede hacer es tratar de seguir las convenciones de cualquier marco en el que esté escribiendo.

Cuestiones relacionadas