Pregunta

He sido un mal programador porque estoy haciendo una copia y pegar. Un ejemplo es que cada vez que me conecto a una base de datos y recupero un juego de registros, copiaré el código anterior y editaré, copiaré el código que establece la vista de datos y editaremos. Soy consciente de la reutilización del código de la frase, pero en realidad no la he usado. ¿Cómo puedo utilizar la reutilización del código para no tener que copiar y pegar el código de la base de datos y el código de la vista de datos?

¿Fue útil?

Solución

Dependiendo del tamaño del proyecto puede cambiar la respuesta.

Para un proyecto más pequeño , recomendaría configurar una clase DatabaseHelper que haga todo el acceso a su base de datos. Simplemente sería una envoltura alrededor de abrir / cerrar conexiones y la ejecución del código DB. Luego, en un nivel superior, simplemente puede escribir los DBCommands que se ejecutarán.

Se podría usar una técnica similar para un proyecto más grande, pero necesitaría un trabajo adicional, se deben agregar interfaces, DI, así como extraer lo que necesita saber sobre la base de datos.

También puede intentar buscar en ORM, DAAB o en Grupo de Patrones y Prácticas

¿En cuanto a cómo prevenir el ole C & amp; P? - A medida que escribe su código, debe revisarlo periódicamente, si tiene bloques de código similares, que solo varían según un parámetro o dos, eso siempre es un buen candidato para refactorizar su propio método.

Ahora para mi ejemplo de pseudo código:

Function GetCustomer(ID) as Customer
   Dim CMD as New DBCmd("SQL or Stored Proc")
   CMD.Paramaters.Add("CustID",DBType,Length).Value = ID
   Dim DHelper as New DatabaseHelper
   DR = DHelper.GetReader(CMD)
   Dim RtnCust as New Customer(Dx)
   Return RtnCust
End Function

Class DataHelper
  Public Function GetDataTable(cmd) as DataTable
    Write the DB access code stuff here.
    GetConnectionString
    OpenConnection
    Do DB Operation
    Close Connection
  End Function
  Public Function GetDataReader(cmd) as DataReader
  Public Function GetDataSet(cmd) as DataSet
  ... And So on ...
End Class

Otros consejos

La esencia de la reutilización del código es tomar una operación común y parametrizarla para que pueda aceptar una variedad de entradas.

Toma humilde printf , por ejemplo. Imagínese si no tuviera printf y solo tuviera write , o algo similar:

//convert theInt to a string and write it out.
char c[24];
itoa(theInt, c, 10);
puts(c);

Ahora esto apesta tener que escribir cada vez, y en realidad es un tipo de buggy. Así que algunos programadores inteligentes decidieron que estaba cansado de esto y escribieron una mejor función, que de una sola vez, imprimió material a la salida.

printf("%d", theInt);

No necesita ser tan elegante como printf con sus diversos argumentos y su cadena de formato. Incluso solo una rutina simple como:

void print_int(int theInt)
{
    char c[24];
    itoa(theInt, c, 10);
    puts(c);
}

haría el truco sin problemas. De esta manera, si desea cambiar print_int para imprimir siempre a stderr, puede actualizarlo para que sea:

void print_int(int theInt)
{
    fprintf(stderr, "%d", theInt);
}

y todos sus enteros ahora se imprimirían mágicamente con un error estándar.

Incluso podría agrupar esa función y otras que escriba en una biblioteca, que es solo una colección de código que puede cargar en su programa.

Seguir la práctica de reutilizar el código es la razón por la que incluso tiene una base de datos para conectarse: alguien creó un código para almacenar registros en el disco, lo modificó hasta que otros lo pudieron utilizar y decidió llamarlo una base de datos.

Las bibliotecas no aparecen mágicamente. Los programadores los crean para hacerles la vida más fácil y permitirles trabajar más rápido.

Coloque el código en una rutina y llame a la rutina cuando desee que se ejecute ese código.

Consulte el libro de Martin Fowler en refactoring , o algunos de los numerosos recursos de internet relacionados con el refactoring (también en stackoverflow), para descubrir cómo podría mejorar el código que huele a duplicación.

Al principio, cree una biblioteca con funciones reutilizables. Se pueden vincular con diferentes aplicaciones. Ahorra mucho tiempo y fomenta la reutilización.

También asegúrese de que la biblioteca esté probada y documentada. Por lo tanto, es muy fácil encontrar la clase / función / variable / constante correcta.

Una buena regla general es que si usas la misma pieza tres veces, y obviamente es posible generalizarla, en lugar de convertirla en un procedimiento / función / biblioteca.

Sin embargo, a medida que envejezco y también tengo más experiencia como desarrollador profesional, estoy más inclinado a ver que la reutilización del código no es siempre la mejor idea, por dos razones:

  1. Es difícil anticipar las necesidades futuras, por lo que es muy difícil definir las API, así que realmente las usarás la próxima vez. Puede costarle el doble de tiempo: una vez que lo hace más general, la segunda vez lo volverá a escribir de todos modos. Me parece que especialmente los proyectos de Java en los últimos tiempos son propensos a esto, parecen estar siempre reescritos en el framework du jour, solo para que sea más fácil de integrar " o lo que sea en el futuro.

  2. En una organización más grande (soy miembro de una), si tiene que depender de algún equipo externo (ya sea interno o de terceros), puede tener un problema. Su futuro depende entonces de su financiación y sus recursos. Por lo tanto, puede ser una gran carga utilizar un código o una biblioteca extranjeros. De manera similar, si compartes un fragmento de código con algún otro equipo, pueden esperar que lo mantengas.

Sin embargo, tenga en cuenta que estos son más bien motivos comerciales, por lo que en código abierto, es casi invariablemente algo bueno que se pueda reutilizar.

para obtener la reutilización del código, necesitas convertirte en un maestro de ...

  1. Dar nombres de cosas que capturen su esencia. Esto es realmente importante
  2. Asegurarse de que solo haga una cosa. Esto realmente regresa al primer punto, si no puedes nombrarlo por su esencia, a menudo está haciendo demasiado.
  3. Ubicar la cosa en algún lugar lógico. Nuevamente, esto vuelve a poder nombrar las cosas bien y capturar su esencia ...
  4. Agrupándolo con cosas que se basan en un concepto central. Igual que el anterior, pero dijo diferentemente :-)

Lo primero que debes tener en cuenta es que al copiar y pegar, estás reutilizando el código, aunque no de la manera más eficiente. Ha reconocido una situación en la que se le ha ocurrido una solución anteriormente.

Hay dos ámbitos principales que debe tener en cuenta al pensar en la reutilización del código. En primer lugar, reutilización de código dentro de un proyecto y, en segundo lugar, reutilización de código entre proyectos.

El hecho de que tenga un fragmento de código que pueda copiar y pegar dentro de un proyecto debería ser una indicación de que el fragmento de código que está viendo es útil en otros lugares. Ese es el momento de convertirlo en una función y ponerla a disposición dentro del proyecto. Lo ideal es que sustituyas todas las apariciones de ese código con tu nueva función, de modo que (a) reduzca el código redundante y (b) asegure que cualquier error en esa porción de código solo deba solucionarse en una función en lugar de en muchos.

El segundo ámbito, la reutilización de código en los proyectos, requiere un poco más de organización para obtener el máximo beneficio. Este problema ha sido abordado en un par de otras preguntas de SO, por ejemplo. aquí y here .

Un buen comienzo es organizar el código que probablemente se reutilizará en los proyectos en archivos de origen que sean lo más independientes posible. Minimice la cantidad de código de apoyo, específico del proyecto, que se requiere, ya que esto facilitará la reutilización de archivos completos en un nuevo proyecto. Esto significa minimizar el uso de tipos de datos específicos del proyecto, minimizar el uso de variables globales específicas del proyecto, etc.

Esto puede significar la creación de archivos de utilidad que contienen funciones que sabe que serán útiles en su entorno. p.ej. Funciones de base de datos comunes si a menudo desarrolla proyectos que dependen de bases de datos.

Creo que la mejor manera de responder a su problema es crear un ensamblaje separado para sus funciones importantes. De esta manera, puede crear métodos de extensión o modificar el ensamblaje auxiliar en sí mismo. Piense en esta función ...

ExportToExcel (fecha de lista, nombre de archivo de cadena)

este método se puede usar para sus futuras funciones de exportación de Excel, así que, ¿por qué no lo almacene en su propio ensamblaje auxiliar?

Para el ejemplo que da, la solución adecuada es escribir una función que tome como parámetros lo que sea que edite cada vez que pegue el bloque, luego llame esa función con los datos apropiados como parámetros.

Pruebe y adquiera el hábito de usar las funciones y bibliotecas de otras personas.

Por lo general, encontrará que su problema particular tiene una solución elegante y bien probada.

Incluso si las soluciones que encuentras no son perfectas, probablemente obtendrás mucha información sobre el problema al ver cómo otras personas lo han abordado.

Lo haré en dos niveles. Primero dentro de una clase o espacio de nombres, coloque esa parte del código que se reutiliza en ese ámbito en un método separado y asegúrese de que se está llamando.

Segundo es algo similar al caso que estás describiendo. Ese es un buen candidato para ser colocado en una biblioteca o en una clase de ayudante / utilidad que puede reutilizarse de manera más amplia.

Es importante evaluar todo lo que está haciendo con una perspectiva de si puede estar disponible para otros para su reutilización. Este debería ser un enfoque fundamental para la programación que la mayoría de nosotros no nos damos cuenta.

Tenga en cuenta que todo lo que se va a reutilizar debe documentarse con más detalle. Su convención de nomenclatura debe ser distinta, todos los parámetros, resultados de resultados y cualquier restricción / requisito / requisitos previos necesarios deben estar claramente documentados (en el código o en los archivos de ayuda).

Depende un poco del lenguaje de programación que estés usando. En la mayoría de los idiomas puedes

  1. Escriba una función, parametrícela para permitir variaciones
  2. Escriba un objeto de función, con miembros para mantener los datos variables
  3. Desarrolle una jerarquía de (¿objeto de función?) clases que implementen variaciones aún más complicadas
  4. En C ++, también puede desarrollar plantillas para generar las diversas funciones o clases en tiempo de compilación

Fácil: cuando se encuentre copiando y pegando código, sáquelo inmediatamente (es decir, no lo haga después de haber codificado el código varias veces) en una nueva función.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top