web-dev-qa-db-ja.com

誰かがFP命令型コードを読むことを考えるのにどのように慣れるべきですか?

私は約5か月前に大学を卒業し、過去4か月間地元のスタートアップで働いています。大学在学中、HaskellやF#などを独学で勉強しました。大学でJava)と教えられましたが、すぐに関数型プログラミングに触れ、命令型プログラミングよりもはるかに多くの時間を費やしました。その結果、私の脳は配線されています。関数型の考え方です。私が参加した会社はPythonを使用しており、コードは非常に不可欠です。命令型コードの読み取りに非常に苦労しています。変異を追跡できません。for-if-else-for-の場合。 ..ネストが4レベル以上深くなると、コードで何が起こっているのか完全に把握できなくなります。それに追加するには、Pythonは動的言語であるため、コードには型がありません。コードベースの一部(「適度に複雑」であると思われる)を理解しようと試みてから数週間が経過しましたが、これまでのところ、理解できるほどの進歩はありません。具体的な手法を教えてください。そのコードを理解する必要があります。よろしくお願いします。

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

14

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

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

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

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

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

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

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

14
S.Lott

命令型コードを読むのに非常に苦労しています。 for-if-else-for -...の入れ子が4レベル以上深くなると、コードで何が起こっているのか完全に追跡できなくなります。

ちょっと待ってください…そのような深い入れ子のレベルでは誰でも完全にコードの追跡を失います。または、Linus Torvaldsが言ったように:

レベルを超えるインデントが必要な場合は、とにかく失敗しているので、プログラムを修正する必要があります。

多分私はまた、コードにはコメントがあまり多くなく、名前もあまり直感的ではないことにも触れなければなりません。

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

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

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

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

12
Falcon

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

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

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

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

ブレークポイントを設定し、(デバッグしているように)[次へ]コマンドの使用を開始することをお勧めします。これは、フローを理解するのに役立ちます(おそらくブランチでは、取得するために集中する必要があるパスがあります。コードの一般的な考え方)。

(私は EclipsePyDev をEclipseプラグインとして使用すると良い結果が得られました)

1
Liran Orevi