¿Cuál es una buena práctica de código para hacer una función / método para pequeños segmentos de código repetitivos?

12

Muchas veces, al escribir programas más grandes, me he preguntado después de cuántas copias y pastas tiene sentido poner el código en una función o método y ¿cuál es una buena regla general? He estado usando una regla general de cuatro líneas o más y apareciendo más de dos veces, luego hago una función / método simple que contiene ese código. ¿Puedes pensar en una mejor práctica u ofrecer alguna sugerencia? Esto es más bien una pregunta de patrón de diseño general en lugar de una pregunta específica del idioma.

    
pregunta 09.08.2011 - 21:51

8 respuestas

29

Utilizo funciones en parte como una forma de documentar el código. Llamar a una función con un nombre significativo hace que sea más fácil entender el código. En algunos casos, incluso una función con una sola línea tiene sentido.

Por ejemplo, en "Clean Code", Robert C. Martin da el siguiente ejemplo: ¿Cuál preferirías ver? Esto:

// Check to see if the employee is eligible for full benefits
if ((employee.flags & HOURLY_FLAG) &&
    (employee.age > 65))

¿O esto?

if (employee.isEligibleForFullBenefits())

No siempre estoy de acuerdo con él, pero en este caso lo hago. El código debe ser legible, no solo cuando lo escribes y conoces todos los detalles, sino también a las 9 pm cuando tienes que corregir errores en el código de otra persona. No es recomendable observar una condición prolongada y tratar de descubrir todos los dobles negativos. Si solo puedes ponerle un nombre (no solo las condiciones, sino cada pieza de código que escribas), se vuelve mucho más simple.

Nunca me arrepentí de haber puesto algo en una función, y si te preocupa el rendimiento, primero haz un perfil.

    
respondido por el omrib 09.08.2011 - 22:17
13

Existe un malentendido generalizado de que las llamadas a funciones solo deben realizarse para evitar segmentos de código repetitivos. Mi regla de oro es que cualquier unidad lógica de trabajo debe convertirse en una función, incluso cuando se utiliza solo en un solo lugar. Esto generalmente conduce a una mejor legibilidad y le permite escribir código de auto-documentación, donde los nombres de las funciones reemplazan los comentarios y no necesita escribir comentarios adicionales que expliquen lo que está haciendo.

    
respondido por el Lie Ryan 10.08.2011 - 02:05
6

Si se usa en más de un lugar, y

  • es probable que cambie, o
  • es difícil hacerlo bien

entonces conviértalo en una función o método. Los fragmentos largos de código repetido, según mi experiencia, caerán naturalmente en una de estas categorías (generalmente la primera, pero luego las categorías se superponen mucho). Por supuesto, todo lo que tenga que estar en la interfaz es también una función / método por derecho propio.

    
respondido por el Fred Foo 09.08.2011 - 21:54
4

Casi siempre, especialmente si cada duplicado representa la misma operación desde un punto de vista conceptual. Si se realiza de la misma manera, pero en diferentes tipos, realice una implementación genérica.

La única razón por la que no puedo hacerlo es para el mantenimiento: a veces puede ser más conveniente evitar la creación de una dependencia entre cosas separadas, incluso a costa de alguna duplicación.

    
respondido por el Nicola Musatti 09.08.2011 - 22:02
1

Una búsqueda de " refactorización " lo llevará a muchos recursos para las "mejores prácticas" de la industria para este proceso muy común. El artículo un tanto famoso, Once and Only Once es una excelente referencia histórica que explica lo que algunos ven como "mejores prácticas" para las inquietudes planteadas por su pregunta. Además, el concepto aún más general se conoce como No repetir (DRY) . Para obtener un conjunto realmente profundo de respuestas a su pregunta, lea el gran clásico de Martin Fowler , Refactorización: Mejora del diseño del código existente , que cubre algunos de los consejos más conocidos para refactoring , que es lo que intentas lograr de manera intuitiva.

    
respondido por el John Tobler 10.08.2011 - 18:32
0

Si el código se repite exactamente en más de una vez y la sección repetida no cambiará en un futuro próximo, entonces lo dividiré en una función.

    
respondido por el Steven D. 10.08.2011 - 02:14
0

Eso depende de la naturaleza de la cohesión del código repetido. Si la sección repetida del código está realizando una función específica, entonces es un excelente candidato para convertirse en un método, en parte debido a que Principio DRY , en parte porque si la función necesita ser optimizada o corregida, entonces solo hay una sección de código para tratar.

Si la asociación es una coincidencia, es mejor repetir el código en lugar de convertirlo en un método. Si necesita agregar algo al medio de una de las secuencias de código para satisfacer uno de los usos de ese fragmento de código, si está en un método, el cambio que realice puede afectar a otros usos de ese método.

Consulte el artículo de Wikipedia sobre el concepto de cohesion de código .

    
respondido por el Jay Elston 05.09.2011 - 07:10
0

Debe distinguir las funciones en el sentido de la programación estructurada y los métodos de una clase.

En su ejemplo, lo que ha mostrado es un método y, como tal, no debe codificarse en línea.

es posible que tenga que validar una cadena para ver si es un número o no, en este caso, use una función y se aplicarán la mayoría de las respuestas anteriores.

Esta distinción es importante especialmente en grandes proyectos.

Tanto como pueda, intente separar las reglas comerciales (que son métodos) de los algoritmos informáticos (que son funciones de programación puras).

    
respondido por el NoChance 05.09.2011 - 10:03

Lea otras preguntas en las etiquetas