2009-07-17 12 views
5

Estoy escribiendo un proyecto academico sobre extremely long functions in the Linux kernel.¿Has escrito funciones muy largas? Si es así, ¿por qué?

Para este propósito, estoy buscando ejemplos para funciones de la vida real que sean extremadamente largas (pocos cientos de líneas de código), que no considere mala programación (es decir, no se beneficiarán de la descomposición o uso de una tabla de envío).

¿Alguna vez ha escrito o visto tal código? ¿Puedes publicar o vincular a él, y dar una explicación de por qué es tan largo?

He estado recibiendo una increíble ayuda de la comunidad aquí - cualquier idea que se tomará en el proyecto se acreditará correctamente.

Gracias,

Udi

+3

Probablemente deberías hacer esta wiki de la comunidad, ya que esta es una pregunta personal. – Brandon

+0

Él no lo hará. Y ahora está publicando engaños, lo que no es probable que ayude en su proyecto de investigación. Ver sus otros mensajes para evidencia. –

+0

Tienes razón. Veo que incluso hizo la misma sugerencia en uno de sus temas anteriores. – Brandon

Respuesta

10

Las funciones más largas que he escrito todos tienen una cosa en común, una sentencia switch muy grande. Hay momentos en los que tiene que activar una larga lista de elementos y solo haría las cosas más difíciles de entender si intentara refactorizar algunas de las opciones en una función separada. Tener declaraciones de interruptor grandes hace que la complejidad de Cyclomatic vaya por las nubes, pero a menudo es mejor que las implementaciones alternativas.

3

Un trabajo anterior: una declaración de caso extremadamente larga, IIRC 1000+ líneas. Esto fue mucho antes que los objetos. Cada opción tenía solo unas pocas líneas de largo. Romperlo lo habría dejado menos claro. En realidad, había un par de rutinas que realizaban cosas diferentes para el mismo conjunto subyacente de tipos de datos.

Lo siento, ya no tengo el código y no es mío para publicar, de todos modos.

0

Me imagino que cuando la velocidad es importante (como cuando se mantiene algún tipo de bloqueo en el kernel) no querrá romper una función debido a la sobrecarga debido a una llamada funcional. Cuando se compila, los parámetros tienen que ser colocados en la pila y los datos tienen que aparecer antes de regresar. Por lo tanto, puede tener una función grande por razones de eficiencia.

+0

Tal vez, pero como Neil comentó anteriormente, la respuesta a este problema es inline. –

2

La función más larga que no vi como horrible sería el método clave de una máquina virtual de la CPU personalizada. Al igual que con @epotter, esto implicó una gran declaración de cambio. De hecho, diría que hay muchos métodos que considero que la resistencia a ser limpiada o mejorada en legibilidad involucra declaraciones de cambio.

1

Desafortunadamente, con frecuencia no encontrará este tipo de subrutina registrada o publicada en algún lugar si se genera automáticamente durante un paso de compilación utilizando algún tipo de generador de código.

Busque proyectos que tengan C generado desde otro idioma.

3

Fue el último antes de que me despidieran.

1

Además del rendimiento, creo que el tamaño de la pila de llamadas en el espacio Kernel es de 8K (verifique el tamaño). Además, hasta donde yo sé, el código en kernel es bastante específico. Si es poco probable que algún código sea reutilizado en el futuro, por qué molestarse en hacerlo una función considerando la sobrecarga de llamadas de función.

Cuestiones relacionadas