Como alguém acostumado ao pensamento de FP deve ler o código imperativo?


14

Eu me formei na universidade há cerca de cinco meses e tenho trabalhado em uma startup local nos últimos quatro meses. Enquanto estava na universidade, estudei Haskell, F # etc sozinho. Fomos ensinados Java na universidade, mas eu fui exposto à programação funcional muito em breve e passamos muito mais tempo com ele do que com programação imperativa. Como resultado, meu cérebro está preparado para um pensamento funcional. A empresa na qual ingressou usa Python, e o código é altamente imperativo. Estou com dificuldades para ler o código imperativo. Não consigo acompanhar as mutações. Quando um aninhamento for-if-else-for -... tem mais de quatro níveis de profundidade, perco completamente a noção do que está acontecendo no código. Para adicionar, Python é uma linguagem dinâmica, portanto, não há tipos no código. Isto' Faz semanas que eu tenho tentado entender uma parte da nossa base de código (que é supostamente 'moderadamente complexa'), mas eu não fiz nenhum progresso apreciável até agora. Por favor, me ofereça algumas técnicas práticas sobre como devo entender esse código. Desde já, obrigado!

Edit:
Talvez eu deva mencionar também que não existem muitos comentários no código, e os nomes também não são muito intuitivos.


1
Você prefere não ter comentários ou comentários imprecisos? Tenho certeza de que os comentários não envelheceriam bem nas condições mencionadas.
Larry Coleman

A menos que o código esteja nesse subconjunto extremamente pequeno de código que pode ser atribuído como "auto-comentário", eu preferiria ter pelo menos alguns comentários, que podem pelo menos incluir várias dicas úteis para me guiar por meio de bobagens indecifráveis! Mas sou só eu!
John Tobler 27/09

2
Mesmo programadores imperativos tendem a limitar seus efeitos colaterais, pelo menos intuitivamente, e escrevem métodos pequenos. Eu acho que você acabou de pousar em uma base de código abaixo do ideal.
Mauricio Scheffer

Respostas:


14

Compreender o código legado é difícil. Não tem quase nada a ver com funcional versus processual.

  1. Crie um mapa de algum tipo. Um diagrama de componentes dos pacotes e módulos do Python. Para cada módulo, você precisará criar diagramas de classes.

  2. Use o intérprete Python. Você deve poder importar módulos, criar objetos e exercitá-los interativamente. É por isso que o Python é popular. Você pode imprimir type(x)para ver que tipo de variável ( x ) realmente é.

  3. Em caso de dúvida, leia o código do teste de unidade. Se não houver código de teste de unidade, você terá problemas grandes e iminentes, além de aprender uma nova base de código.

  4. Anote as coisas. Comece com documentos paralelos. Então, quando você achar que sabe o que está acontecendo, adicione comentários de sequência de caracteres às funções, métodos e classes. Adicione-os cedo e frequentemente.

  5. Use o Sphinx com 'autodoc' para coletar o que você está aprendendo.

A parte mais importante é essa. É difícil manter as coisas na sua cabeça. É mais fácil manter as coisas nos arquivos de documentação.


6
+1. É difícil entender qualquer código legado, mesmo que seja bem escrito.
quant_dev 27/09/11

12

Estou com dificuldades para ler o código imperativo. Quando um aninhamento for-if-else-for -... tem mais de quatro níveis de profundidade, perco completamente a noção do que está acontecendo no código.

Espere ... alguém perde completamente o controle do código com níveis tão profundos de aninhamento. Ou como Linus Torvalds coloca:

Se você precisar de mais de três níveis de indentação, você está ferrado de qualquer maneira e deve corrigir seu programa.

Talvez eu deva mencionar também que não existem muitos comentários no código, e os nomes também não são muito intuitivos.

Isso não soa como se sua empresa estivesse seguindo as práticas recomendadas comuns.

Se eu fosse você, tentaria entender a base de código por disciplina e força. Apenas entre nela, de novo e de novo e de novo. Provavelmente é como qualquer coisa. No momento, você sente que está embaixo da água e não consegue respirar, mas continua examinando a base de código e logo vai nadar até a superfície.

Receio que sua pergunta não tenha os detalhes técnicos para oferecer um bom conselho sobre como entender a base de código, mas nunca é errado analisá-la com colegas experientes em algumas sessões. Deixe-os explicar a arquitetura geral e como os diferentes componentes interagem entre si, juntamente com as decisões de implementação que eles tomaram.

É difícil dar conselhos gerais para a transição de linguagens funcionais para linguagens imperativas / OO. Claro, eu poderia mencionar algumas frases floridas como "Você precisa pensar em estados e comportamentos de objetos", mas isso não ajudará muito, acho que isso é algo que você precisa experimentar.


O problema do recuo pode ser pior: quando o idioma é um código colunar (como RPG) e não recuo real. Algumas ferramentas tentam consertar isso ...
Clockwork-Muse

2

Se (grande se pelas práticas inadequadas que você descreve) houver testes de unidade, você poderá ver como o código é testado. Isso pode oferecer uma boa idéia do que o código faz.

Caso contrário, eu sugeriria a leitura de código python mais genérico para se acostumar com a maneira como ele é escrito.


2

Você pode tentar traduzir alguns fragmentos do Python para pseudo-Haskell ou o que quiser. Isso pode lhe dar uma idéia do que construções imperativas mapeiam livremente em quais construções funcionais. À medida que você ganha mais experiência, as construções imperativas começam a parecer mais nativas.

Passei da programação OCaml e Haskell para a programação Java e Python, e minha experiência é que a programação imperativa não é um salto tão grande quanto a digitação dinâmica, que até hoje parece estranha.


1

Sugiro que você coloque pontos de interrupção e comece a usar o comando Avançar (como se estivesse depurando), isso ajudará você a entender o fluxo (provavelmente em ramificações, existem caminhos com maior probabilidade de serem seguidos, naqueles que você deve se concentrar para obter a ideia geral do código).

(Eu tive bons resultados com o Eclipse, juntamente com o PyDev como plugin do Eclipse)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.