FP思考に慣れている人は命令型コードをどのように読むべきですか?


14

私は約5か月前に大学を卒業し、過去4か月間地元の新興企業で働いています。大学にいる間、私はHaskellやF#などを自分で勉強しました。私たちは大学でJavaを教えられましたが、すぐに関数型プログラミングに触れるようになり、命令型プログラミングよりもはるかに多くの時間を費やしました。その結果、私の脳は機能的思考のために配線されています。私が参加した会社はPythonを使用しており、コードは非常に重要です。私は命令型コードを読むのに非常に苦労しています。変異を追跡することはできません。for-if-else-for -...のネストが4レベルを超える深さになると、コードで何が起こっているかを完全に把握できなくなります。さらに、Pythonは動的言語であるため、コードには型がありません。それ' コードベースの一部(おそらく「適度に複雑な」)を理解しようとしてから数週間が経ちましたが、これまでのところ理解できるほどの進展はありませんでした。そのコードを理解する方法についての実用的なテクニックをいくつか教えてください。前もって感謝します!

編集:
コードに実際にはあまりコメントがなく、名前もあまり直感的ではないことを言及する必要があります。


1
コメントや不正確なコメントはありませんか?あなたが言及した条件下では、コメントは十分に古くなるとは思わない。
ラリーコールマン

「自己コメント」と見なされるコードの非常に小さなサブセットにコードが含まれていない限り、少なくともいくつかのコメントが必要です。しかし、それは私だけです!
ジョントブラー

2
命令型のプログラマでさえ、少なくとも直感的に副作用を制限し、小さなメソッドを書く傾向があります。あなたは理想的ではないコードベースにたどり着いたと思います。
マウリシオシェファー

回答:


14

レガシーコードを理解するのは難しいです。これは、機能的vs手続き的とはほとんど関係ありません。

  1. 何らかのマップを作成します。Pythonパッケージとモジュールのコンポーネント図。モジュールごとに、クラス図を作成する必要があります。

  2. Pythonインタープリターを使用します。モジュールをインポートし、オブジェクトを作成し、それらをインタラクティブに実行できる必要があります。それがPythonが人気がある理由です。印刷type(x)して、変数(x)が実際にどのタイプであるかを確認できます。

  3. 疑わしい場合は、必ずユニットテストコードを読んでください。単体テストコードがない場合、新しいコードベースの学習に加えて、大きな、迫り来る問題があります。

  4. ものを書き留めます。サイドドキュメントから始めます。次に、何が起こっているかわかっていると思ったら、関数、メソッド、およびクラスにdocstringコメントを追加します。これらを早期かつ頻繁に追加します。

  5. Sphinxと「autodoc」を使用して、学習内容を収集します。

最も重要な部分はこれです。物事を頭の中に留めるのは難しい。ドキュメントファイルに物事を保存する方が簡単です。


6
+1。たとえよく書かれていても、レガシーコードを理解することは困難です。
quant_dev

12

私は命令型コードを読むのに非常に苦労しています。for-if-else-for -...のネストが4レベルを超える深さになると、コードで何が起こっているかを完全に把握できなくなります。

待って...だれでも、このような深いネストレベルでコードを完全に追跡できなくなります。または、Linus Torvaldsが言ったように:

3レベル以上のインデントが必要な場合は、とにかくねじ込まれてしまい、プログラムを修正する必要があります。

また、コードにはあまりコメントがなく、名前もあまり直感的ではないことにも言及する必要があります。

これは、会社が一般的なベストプラクティスを順守しているようには聞こえません。

私があなたなら、規律と力でコードベースを理解しようとするだけです。何度も何度も何度も掘り下げてください。おそらく何かのようです。今、あなたは水中にいるように感じ、呼吸することはできませんが、コードベースを調べ続けるとすぐに水面に泳ぎます。

あなたの質問には、コードベースを理解する方法に関する良いアドバイスを提供するための技術的な詳細が欠けていると思いますが、経験豊富な同僚と数回のセッションでそれを経験することは決して間違っていません。全体的なアーキテクチャと、さまざまなコンポーネントが相互にどのように相互作用するかを、彼らが行った実装の決定とともに説明します。

関数型言語から命令型/オブジェクト指向言語への移行に関する一般的なアドバイスを与えることは困難です。確かに、「オブジェクトの状態と動作について考える必要がある」など、いくつかの華やかなフレーズを挙げることができますが、これらはあまり役に立ちません。これはあなたが経験しなければならないことだと思います。


インデントの問題はさらに悪化する可能性があります:言語が(RPGのような)カラムナーコードであり、実際のインデントがない場合。いくつかのツールはこれを修正しようとします...
Clockwork-Muse

2

(あなたが説明する悪い慣習からの大きな場合)単体テストがある場合は、それらを見て、コードがどのようにテストされるかを確認できます。これは、コードが何をするかについての良い洞察を提供できます。

そうでなければ、より一般的なpythonコードを読んで、その記述方法に慣れることをお勧めします。


2

いくつかのフラグメントをPythonから疑似Haskellなどに変換してみてください。これにより、どのような必須の構成がどの機能的な構成に大まかにマッピングされているかを把握できます。あなたがより多くの経験を積むにつれて、命令的な構造はよりネイティブに感じ始めます。

私はOCamlとHaskellのプログラミングからJavaとPythonのプログラミングに行きましたが、私の経験では、命令型プログラミングは動的型付けほど大きな飛躍ではなく、今日では異質だと感じています。


1

ブレークポイントを置いて、(デバッグしている場合のように)Nextコマンドを使用することをお勧めします。これにより、フローを理解するのに役立ちます(おそらくブランチ上で、取得する可能性の高いパスがあります。コードの一般的なアイデア)。

(私はとの良好な結果だったEclipseを一緒にPyDevは Eclipseのプラグインとして)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.