¿Cómo debería alguien acostumbrado a pensar en FP leer el código imperativo?

14

Me gradué de la universidad hace unos cinco meses y he estado trabajando en una startup local durante los últimos cuatro meses. Mientras estaba en la universidad, estudié Haskell, F # etc por mi cuenta. Nos enseñaron Java en la universidad, pero me expusieron a la programación funcional muy pronto, y pasé mucho más tiempo con ella que con la programación imperativa. Como resultado, mi cerebro está conectado a un pensamiento funcional. La compañía a la que me he unido usa Python, y el código es muy imperativo. Me está costando mucho leer el código imperativo. No puedo hacer un seguimiento de las mutaciones. Cuando un anidamiento for-if-else-for -... tiene más de cuatro niveles de profundidad, pierdo completamente el rastro de lo que está sucediendo en el código. Para agregarlo, Python es un lenguaje dinámico, por lo que no hay tipos en el código. Han pasado semanas desde que intenté entender una parte de nuestro código base (que supuestamente es 'moderadamente complejo'), pero hasta ahora no he logrado ningún progreso apreciable en su comprensión. Por favor, ofrezca algunas técnicas prácticas sobre cómo debo ir para entender ese código. Gracias de antemano!

Editar:
Tal vez debería mencionar que realmente no hay muchos comentarios en el código, y los nombres tampoco son muy intuitivos.

    
pregunta an0nym0us c0ward 27.09.2011 - 13:15

5 respuestas

14

Comprender el código heredado es difícil. No tiene casi nada que ver con funcional vs. procedural.

  1. Crea un mapa de algún tipo. Un diagrama de componentes de los paquetes y módulos de Python. Para cada módulo, deberá crear diagramas de clase.

  2. Usa el intérprete de Python. Debes poder importar módulos, crear objetos y ejercitarlos interactivamente. Es por eso que Python es popular. Puede imprimir type(x) para ver qué tipo es realmente una variable ( x ).

  3. En caso de duda, asegúrese de leer el código de prueba de la unidad. Si no hay un código de prueba de unidad, tiene grandes problemas que se avecinan además de aprender una nueva base de código.

  4. Escribe cosas. Comience con documentos laterales. Luego, cuando crea que sabe lo que está pasando, agregue comentarios de la cadena de documentos a las funciones, métodos y clases. Añade esto temprano y con frecuencia.

  5. Usa Sphinx con 'autodoc' para recopilar lo que estás aprendiendo.

La parte más importante es esta. Es difícil mantener las cosas en tu cabeza. Es más fácil mantener las cosas en los archivos de documentación.

    
respondido por el S.Lott 27.09.2011 - 15:52
12
  

Me está costando mucho leer el código imperativo.   Cuando un anidamiento for-if-else-for -... tiene más de cuatro niveles de profundidad, yo   perder completamente la pista de lo que está sucediendo en el código.

Espere ... cualquiera pierde completamente la pista del código con niveles de anidación tan profundos. O como lo expresó Linus Torvalds:

Si necesitas más de 3 niveles de sangría, estás jodido de todos modos y deberías arreglar tu programa.

  

Tal vez debería mencionar que no hay muchos comentarios en   El código y los nombres tampoco son muy intuitivos.

Esto no suena como si su empresa se adhiriera a las mejores prácticas comunes.

Si yo fuera tú, solo trataría de entender el código base por disciplina y fuerza. Solo profundiza en ello, una y otra vez y otra vez. Probablemente sea como cualquier cosa. En este momento, sientes que estás bajo el agua y no puedes respirar, pero continúas examinando el código base y pronto nadarás hacia la superficie.

Me temo que su pregunta carece de los detalles técnicos para ofrecerle un buen consejo sobre cómo entender el código base, pero nunca está mal repasarlo con colegas experimentados en algunas sesiones. Permítales que le expliquen la arquitectura general y cómo los diferentes componentes interactúan entre sí, junto con las decisiones de implementación que tomaron.

Es difícil dar consejos generales para la transición de lenguajes funcionales a imperativos / OO. Claro, podría mencionar algunas frases floridas como "Tienes que pensar en los estados y comportamientos de los objetos", pero esto no te ayudará mucho, creo que esto es algo que debes experimentar.

    
respondido por el Falcon 27.09.2011 - 13:33
2

Si (a pesar de las malas prácticas que describe) hay pruebas unitarias, puede mirarlas para ver cómo se prueba el código. Esto puede ofrecer una buena idea de lo que hace el código.

De lo contrario, sugeriría leer más código Python genérico para acostumbrarse a la forma en que está escrito.

    
respondido por el Sardathrion 27.09.2011 - 13:44
2

Puedes intentar traducir algunos fragmentos de Python a pseudo-Haskell o lo que quieras. Eso le puede dar una idea de lo que las construcciones imperativas se asignan libremente a las construcciones funcionales. A medida que adquiera más experiencia, las construcciones imperativas comenzarán a sentirse más nativas.

Pasé de la programación de OCaml y Haskell a la programación de Java y Python, y mi experiencia es que la programación imperativa no es un salto tan grande como la escritura dinámica, que hasta el día de hoy se siente ajena.

    
respondido por el Robert Tupelo-Schneck 27.09.2011 - 20:17
1

Le sugiero que coloque puntos de interrupción y comience a usar el comando Siguiente (como si estuviera depurando), esto le ayudará a comprender el flujo (probablemente en las ramas, hay caminos que es más probable que se tomen, en los que debería concentrarse para obtener la idea general del código).

(Obtuve buenos resultados con Eclipse junto con PyDev como complemento de Eclipse)

    
respondido por el Liran Orevi 28.09.2011 - 00:19

Lea otras preguntas en las etiquetas