He estado trabajando en mi trabajo durante aproximadamente un año. Principalmente trabajo en nuestra interfaz GUI que usa métodos de un servidor C, pero generalmente no tengo que lidiar con ellos excepto por los valores de retorno. Nuestra GUI está estructurada de manera bastante razonable, dadas nuestras limitaciones.
Me encargaron agregar una función a la parte de la línea de comando del programa. La mayoría de estas funciones son como 300 líneas de largo y difíciles de usar. Estoy tratando de reunir partes de ellos para obtener información específica de alarma, y tengo problemas para mantenerme organizado. Sé que estoy haciendo mis pruebas más complicadas al hacerlo en una sola función larga.
¿Debería mantener todo en una gran función según el estilo de las funciones existentes, o debería encapsular las alarmas en sus propias funciones?
No estoy seguro de si es apropiado ir en contra de las convenciones de codificación actuales o si debería morder la viñeta y hacer que el código sea un poco más confuso para mí.
En resumen, estoy comparando
showAlarms(){
// tons of code
}
en contra
showAlarms(){
alarm1();
alarm2();
return;
}
alarm1(){
...
printf(...);
return;
}
EDITAR: Gracias por el consejo de todos, decidí que voy a diseñar mi código factorizado, y luego preguntar qué quieren, y si lo quieren todo en uno, puedo cortar mi código factorizado y volver a convertirlo en 1 Gran función. Esto debería permitirme escribirlo y probarlo más fácilmente, incluso si quieren todo el código en una sola definición.
ACTUALIZACIÓN: Terminaron siendo felices con el código factorizado y más de una persona me ha agradecido por establecer este precedente.
fuente
Respuestas:
Esto es realmente entre usted y sus compañeros de equipo. Nadie más puede decirte la respuesta correcta. Sin embargo, si me atrevo a leer entre líneas, el hecho de que llame a este estilo "malo" proporciona información que sugiere que es mejor tomarlo con calma. Muy pocos estilos de codificación son realmente "malos". Hay algunos que no usaría, pero siempre tienen una rima o razón para ellos. Esto sugiere, para mí, que hay más en la historia de lo que has visto hasta ahora. Preguntar sería una decisión muy acertada. Alguien puede saber algo que tú no.
Me encontré con esto, personalmente, en mi primera incursión en la codificación de misión crítica en tiempo real. Vi un código como este:
Siendo el desarrollador OO C ++ brillante y brillante que era, inmediatamente los llamé sobre los riesgos de errores que tenían al bloquear y desbloquear mutexes manualmente, en lugar de usar RAII . Insistí en que esto era mejor:
Mucho más simple y es más seguro, ¿verdad? ¡Por qué exigir a los desarrolladores que recuerden desbloquear sus mutex en todas las rutas de flujo de control cuando el compilador puede hacerlo por usted!
Bueno, lo que descubrí más tarde fue que había una razón de procedimiento para esto. Tuvimos que confirmar que sí, el software funcionó correctamente y que había una lista finita de herramientas que teníamos permitido usar. Mi enfoque puede haber sido mejor en un entorno diferente, pero en el entorno en el que estaba trabajando, mi enfoque multiplicaría fácilmente la cantidad de trabajo involucrado en la verificación del algoritmo diez veces porque acabo de incorporar un concepto C ++ de RAII en una sección de código eso estaba sujeto a estándares que eran realmente más susceptibles al pensamiento de estilo C.
Entonces, lo que parecía malo, francamente peligroso, estilo de codificación para mí en realidad estaba bien pensado y mi "buena" solución era en realidad la peligrosa que iba a causar problemas en el futuro.
Entonces pregunta por ahí. Seguramente hay un desarrollador senior que puede trabajar con usted para comprender por qué lo hacen de esta manera. O bien, hay un desarrollador senior que puede ayudarlo a comprender los costos y beneficios de un refactor en esta parte del código. De cualquier manera, ¡pregunta por ahí!
fuente
Honestamente, ¿crees que tener funciones que son difíciles de usar, con 300 líneas, es solo una cuestión de estilo? Entonces, ¿seguir el mal ejemplo podría mantener el programa general en un mejor estado debido a la consistencia? Supongo que no lo crees, de lo contrario no hubieras hecho esta pregunta aquí.
Supongo que estas funciones son tan largas porque en nuestro negocio hay muchos programadores mediocres que simplemente agrupan características sobre características, sin preocuparse por la legibilidad, la calidad del código, el nombre adecuado, las pruebas unitarias, la refactorización, y nunca han aprendido a crear abstracciones adecuadas. . Tienes que decidir por ti mismo si quieres seguir a ese rebaño o si quieres ser un mejor programador.
Addendum, debido a los comentarios: "300 líneas" y "difícil de usar" son, en mi humilde opinión, fuertes indicaciones de código incorrecto. Según mi experiencia, es muy poco probable que haya alguna "razón técnica oculta" por la cual dicho código no se puede implementar de una manera más legible, comparable al ejemplo de la respuesta de Cort Ammon. Sin embargo, estoy de acuerdo con Cort en que debe discutir esto con los responsables del equipo, no para encontrar razones oscuras por las que el código o este "tipo de estilo" no se pueden cambiar, sino para descubrir cómo se puede refactorizar el código de manera segura sin romper las cosas. .
fuente
No.
En el libro Programador pragmático, el autor habla sobre la teoría de la ventana rota .
Esta teoría dice:
En el libro, el autor escribe un paralelo entre esta teoría y el código. Una vez que encuentra un código como este, se detiene y se pregunta esa misma pregunta.
Y la respuesta es no.
Una vez que salga de esta ventana rota, en nuestro caso, código incorrecto, esto creará el efecto de que todos dejarán ventanas rotas.
Y un día el código colapsará.
Entregue una copia de Clean Code y Clean Coder a todos.
Y mientras está en el tema, una copia de TDD también es buena.
fuente
Sí, adelante. Estructura! = Estilo
Estás hablando de estructura, no de estilo. Las pautas de estilo no prescriben (generalmente) la estructura, ya que la estructura generalmente se elige por su idoneidad para un problema específico, no por la idoneidad de una organización.
Ten cuidado
Solo tenga la seguridad de que no está causando consecuencias negativas en otras áreas que quizás no se le hayan ocurrido. Por ejemplo,
Sé gentil
Recuerde que usted es parte de un equipo, y si bien un buen código es importante, también es muy importante que los miembros de su equipo puedan mantener las cosas que escribió cuando se va de vacaciones. Trate de mantener un flujo que tenga sentido para las personas que están acostumbradas al viejo estilo. ¡Solo porque eres el tipo más inteligente de la sala no significa que debas hablar por encima de la cabeza de todos!
fuente
No veo esto como una convención de código. Veo esto como alguien que no comprende cómo escribir código que se pueda mantener y que sea fácil de entender. Desglosaría su código en diferentes funciones a medida que sugiera y eduque a su equipo sobre los beneficios de hacer esto mientras trato de entender por qué consideran que las funciones de 300 líneas son aceptables. Estaría muy interesado en escuchar su razonamiento.
fuente
La respuesta está en la revisión del código.
La verdadera pregunta es si entregas un código bien factorizado, ¿vas a ser el único dispuesto a trabajar con él?
Yo, como la mayoría de las personas aquí, creo que 300 funciones de línea son una abominación. Sin embargo, llevar Windex a un vertedero no va a hacer mucho bien. El problema no es el código, son los codificadores.
Solo tener razón no es suficiente. Necesitas vender personas en este estilo. Al menos al leerlo. Si no lo haces, terminas como este pobre tipo: despedido porque tus habilidades están muy por encima de tus compañeros de trabajo
Empieza pequeño. Pregunte y descubra si alguien más favorece las funciones más pequeñas. Mejor aún, husmee en la base del código y vea si puede descubrir quién escribe los más pequeños (puede encontrar que el código más feo es el código más antiguo y los codificadores actuales están escribiendo un código mejor). Hable con ellos sobre esto y vea si tiene un aliado. Pregúnteles si conocen a alguien más que sienta lo mismo. Pregúnteles si conocen a alguien que odie las funciones pequeñas.
Reúna a este pequeño grupo y hable acerca de hacer cambios. Muéstreles el tipo de código que le gustaría escribir. Asegúrese de que puedan leerlo. Tome cualquier objeción en serio. Haz los cambios. Obtenga su código aprobado. Ahora tiene el poder de una reunión detrás de usted. Un poco más de estos y puede producir un documento de una página que acepte explícitamente el nuevo estilo que ha introducido.
Las reuniones son cosas sorprendentemente poderosas. Pueden producir influencia. La influencia es lo que usarás para luchar contra aquellos que se oponen a este movimiento. Y eso es lo que es esto en este momento. Un movimiento. Estás luchando por el derecho a mejorar el status quo. La gente teme al cambio. Tendrás que hablar dulcemente, engatusar y pinchar. Pero con un poco de suerte, serás aceptado y aceptado.
fuente
A veces tienes que ir con la corriente.
Como dijiste, te encargaron implementar una función en una base de código de trabajo existente.
Independientemente del desorden, y entiendo que es tentador limpiarlo. pero en el mundo de los negocios no siempre tienes la oportunidad de refactorizar el código.
Yo diría que solo haga lo que se le ha pedido que haga y siga adelante.
Si cree que vale la pena refactorizar o reescribir, entonces debe mencionarlo para discutirlo con el equipo.
fuente
Antes de hacer la declaración de que las prácticas son malas, primero daría un paso hacia la comprensión de la razón de los grandes métodos y otras prácticas que podrían parecer malas.
Luego, deberá asegurarse de que la cobertura de la prueba sea bastante alta o muy alta (en la medida de lo posible sin una refactorización importante). Si no es así, trabajaría para hacer que la cobertura sea realmente alta aunque no haya escrito el código. Esto ayuda a construir una buena relación y el nuevo equipo tuyo te tomará más en serio.
Una vez que tenga estas bases cubiertas, nadie en su sano juicio lo desafiará. Como elemento de bonificación, haga algunos micro-benchmarking y eso realmente se agregará a su caso.
A menudo, la forma en que lo redactas contribuye en gran medida a cambiar la cultura del código. Predicar con el ejemplo. O mejor aún, espere un código que pueda escribir (refactor y prueba unitaria y viola) se le escuchará.
fuente
Este tipo de pregunta es básicamente " lee por favor a mis compañeros de equipo ". Las personas aleatorias en Internet no pueden hacer eso, por lo que todas las respuestas que obtendrá son solo opiniones personales de las personas sobre el estilo de codificación. El consenso es que los métodos más cortos son preferibles, pero parece que ya lo crees, así que no es necesario que lo repitas.
Entonces, la base de código actual parece usar un estilo de codificación diferente al que usted prefiere. Que deberias hacer Primero necesitas descubrir:
Solo hay una manera de descubrirlo. Preguntar .
Podría haber múltiples razones para tener funciones largas. Podría ser porque el equipo cree que las funciones largas son mejores que las funciones cortas múltiples. También podría deberse a que es un código heredado, y el equipo prefiere que el nuevo código siga un diseño más limpio. Por lo tanto, cualquiera de las dos opciones podría ocasionarle problemas como desarrollador, si no habla con el equipo y comprende su razonamiento.
fuente
Hay diferentes niveles de "estilo".
En un nivel, generalmente parte de las convenciones de codificación, esto significa dónde colocar espacios en blanco, líneas en blanco, corchetes y cómo nombrar cosas (mayúsculas y minúsculas, guiones bajos, etc.).
En otro nivel está el modelo de programación, a veces cosas como evitar la estática, o usar interfaces sobre clases abstractas, cómo exponer dependencias, tal vez incluso evitar algunas características del lenguaje esotérico.
Luego están las bibliotecas y los marcos en uso por el proyecto.
A veces habrá un límite máximo en el tamaño de la función. ¡Pero rara vez hay un límite mínimo! Por lo tanto, debe averiguar cuáles de estas cosas los poderes que se consideran importantes, y tratar de respetar eso.
Debe averiguar si el equipo es adverso a la refactorización del código existente, lo que debe hacerse independientemente de agregar un nuevo código cuando sea posible.
Sin embargo, incluso si no quieren refactorizar el código existente, es posible que pueda introducir algunas capas en abstracciones para el nuevo código que agregue, lo que significa que con el tiempo puede desarrollar una mejor base de código y tal vez migrar el código antiguo como mantenimiento de lo que requiere.
fuente