code-reuse

code reuse - ¿Cómo practican los programadores la reutilización del código?



code-reuse (14)

He sido un mal programador porque estoy copiando y pegando. Un ejemplo es que cada vez que me conecto a una base de datos y recupero un conjunto de registros, copio el código anterior y edito, copio el código que establece el datagridview y edito. Soy consciente de la reutilización de código de frase, pero en realidad no lo he usado. ¿Cómo puedo utilizar la reutilización de código para no tener que copiar y pegar el código de la base de datos y el código datagridview.


Al principio, crea 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 unidad. Por lo tanto, es muy fácil encontrar la clase / función / variable / constante correcta.


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


Consulte el libro de Martin Fowler sobre refactorización , o algunos de los numerosos recursos de Internet relacionados con la refactorización (también en ), para descubrir cómo se puede mejorar el código que tiene olores de duplicación.


Depende en cierta medida del lenguaje de programación que esté utilizando. En la mayoría de los idiomas puedes

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

Fácil: siempre que te encuentres copiando y pegando el código, sácalo inmediatamente (es decir, no lo hagas después de que ya hayas codificado el código varias veces) en una nueva función.


Haré esto en dos niveles. Primero dentro de una clase o espacio de nombres, coloque esa pieza de código que se reutiliza en ese alcance en un método diferente y asegúrese de que se está llamando.

El segundo es algo similar al caso que estás describiendo. Ese es un buen candidato para colocar en una biblioteca o una clase de ayuda / utilidad que pueda reutilizarse de manera más amplia.

Es importante evaluar todo lo que está haciendo con una perspectiva de si puede ponerse a disposición de otros para su reutilización. Este debería ser un enfoque fundamental de la programación del 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 devolución y cualquier restricción / limitación / prerrequisito que se necesite deben estar claramente documentados (en código o en archivos de ayuda).


Intente adoptar el hábito de usar las funciones y bibliotecas de otras personas.

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

Incluso si las soluciones que encuentra no encajan a la perfección, probablemente obtendrá mucha información sobre el problema al ver cómo otras personas lo han abordado.


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

Tome una printf humilde, por ejemplo. Imagine si no tiene printf , y solo tiene write , o algo similar:

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

Ahora, es una mierda tener que escribir todo el tiempo, y en realidad es un poco problemático. Así que algún programador inteligente decidió que estaba cansado de esto y escribió una función mejor, que de una sola vez imprimió cosas de improvisación.

printf("%d", theInt);

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

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

Haría el truco directamente. De esta forma, si quiere cambiar print_int para que siempre imprima en 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 a 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ódigos que puede cargar en su programa.

Seguir la práctica de la reutilización de código es la razón por la que incluso tiene una base de datos a la que conectarse: alguien creó código para almacenar registros en el disco, lo volvió a trabajar hasta que otros lo pudieran usar y decidió llamarlo una base de datos.

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


Para el ejemplo que das, la solución adecuada es escribir una función que tome como parámetros lo que sea que edites cada vez que pegues el bloque, luego llama a esa función con los datos apropiados como parámetros.


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

Sin embargo, a medida que envejezco y también tengo más experiencia como desarrollador profesional, me inclino más a ver la reutilización de códigos como la mejor idea, por dos razones:

  1. Es difícil anticipar las necesidades futuras, por lo que es muy difícil definir las API para que realmente las utilices la próxima vez. Puede costarle el doble de tiempo, una vez que lo hace más general solo para que la segunda vez lo reescriba de todos modos. Me parece que especialmente los proyectos de Java últimamente son propensos a esto, parecen estar siempre reescritos en el framework du jour, solo para ser más "más fáciles 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 de su financiación y sus recursos. Por lo tanto, puede ser una gran carga usar código o biblioteca extranjeros. De manera similar, si comparte un fragmento de código con otro equipo, pueden esperar que lo mantenga.

Tenga en cuenta, sin embargo, que estas son más como razones comerciales, por lo que en código abierto, casi invariablemente es bueno ser reutilizable.


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

  1. Dar nombres a las cosas que capturan su esencia. Esto es realmente muy importante
  2. Asegurándose de que solo haga una cosa. Esto realmente regresa al primer punto, si no puedes nombrarlo por su esencia, entonces a menudo está haciendo demasiado.
  3. Localizando la cosa en algún lugar lógico. De nuevo, esto vuelve a ser capaz de nombrar las cosas bien y capturar su esencia ...
  4. Agruparlo con cosas que se basan en un concepto central. Igual que arriba, pero dijo de manera diferente :-)

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 ensamblador por 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 almacenarlo en su propio ensamblaje auxiliar? De esta manera, solo agrega una referencia a estos ensamblajes.


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. Sería simplemente una envoltura alrededor de las conexiones de apertura / cierre y la ejecución del código DB. Luego, en un nivel superior, puede escribir los DBCommands que se ejecutarán.

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

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

En cuanto a cómo prevenir el ole C & P? - Bueno, al escribir su código, necesita revisarlo periódicamente, si tiene bloques de código similares, que solo varían según un parámetro o dos, siempre es un buen candidato para refactorizar en 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


Lo primero que debe tener en cuenta es que al usar copiar y pegar, está reutilizando el código, aunque no de la manera más eficiente. Usted ha reconocido una situación en la que ha encontrado una solución previamente.

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

El hecho de que tenga un fragmento de código que puede 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 cualquier otro lugar. Ese es el momento de convertirlo en una función y hacerlo disponible dentro del proyecto. Idealmente, debería reemplazar todas las apariciones de ese código con su nueva función, de modo que (a) reduzca el código redundante y (b) asegure que cualquier error en ese trozo de código solo necesita ser reparado en una función en lugar de en muchas.

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

Un buen comienzo es organizar el código que es probable que se reutilice en todos los proyectos en archivos fuente que sean lo más autónomos posible. Minimice la cantidad de código de soporte, 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 usted sabe que serán útiles en su entorno. p.ej. Funciones de base de datos comunes si a menudo desarrolla proyectos que dependen de las bases de datos.