4

大きなコードを理解するという問題は、以前によく答えられています。しかし、私が直面している問題を尋ねるために、この質問をもう一度する必要があると思います.

私は学生の仕事を始めたばかりです。私は初心者プログラマーで、2 か月前にクラスについて学んだばかりです。仕事で、大きなソフトウェアの一部であるコードを渡されました。そのコードが何をすべきか (ファイルを読み取るため) を理解しています。しかし、数週間かけてコードを理解し、目的の結果を得るためにコードを変更した結果、そのコードの各行を理解する必要があるという結論に達しました。コードは約1300行です。

コードを読み始めると、たとえば、変数が次のように定義されていることがわかります。

VarType VarName

NowはorVarTypeのような型ではありません。これはユーザー定義型なので、クラスに行ってこの型が何であるかを確認する必要があります。intfloat

次の行では、次のような関数が呼び出されていpoints.interpolate(x)ます。ここで、別のクラスに移動して、補間関数が何をするかを確認する必要があります。

これは頻繁に発生するため、コードのごく一部を理解しようとしても、3 つまたは 4 つの異なるクラスに行き、主な目的を失うことなく一度にすべてを念頭に置いておく必要があり、それは困難です。

私は熟練したプログラマーではないかもしれませんが、これができるようになりたいです。これにどのようにアプローチするべきか、いくつかの提案をいただけますか?

また、(これを尋ねると本当にばかげているように聞こえます) デバッガーとは何ですか? これで私の立場を理解していただければ幸いです (そして、この質問をもう一度する必要があります)。:(

4

6 に答える 6

6

運が良ければ、これらの関数とクラスには、その機能を説明するドキュメントが少なくともいくつかあるはずです。それらが何をするかを理解するために、それらがどのように機能するかを知る必要はありません。の使用を見たときinterpolate、それがどのように機能するかを調べ始めないでください。そうしないと、コード ベースを深く最初に検索することになります。代わりに、そのドキュメントを読んでください。そうすれば、それを使用するコードを理解するために知っておくべきことがすべてわかるはずです。

ドキュメントがない場合は、お気の毒に思います。2 つのヒントを提案できます。

  1. 関数またはクラスが何をするかについて、その名前、戻り値の型と引数、およびそれを使用する周囲のコードから、それらの仮定と矛盾する何かが起こるまで、一般的な仮定を立てます。interpolateそれがどのように機能するかを読まなくても、何が機能するかについてかなり良い推測をすることができます。これは、関数またはクラスの名前が十分に自己文書化されている場合にのみ機能します。

  2. 一部のコードがどのように機能するかを深く理解する必要がある場合は、下から上に向かって作業してください。これを行うと、コード ベースを検索するときに、高レベル コードのどこにいたかを思い出す必要がなくなります。これらのタイプの高レベルのアプリケーションを理解する前に、低レベルの基本クラスをよく理解してください。

    これはまた、関数とクラスをそれらにたどり着いたコードのコンテキストではなく、一般的な意味で理解することを意味します。が見つかったら、この特定の引数でこれらの特定にpoints.interpolate(x)何が起こるかを考えるのではなく、それが一般的に何をするかを調べてください。後で、新たに発見した知識を、同じ関数を使用するコードに適用できるようになります。interpolatepointsx

とはいえ、1300 行のコードについては心配する必要はありません。それは基本的に小さなプロジェクトです。例や大学の課題よりも大きいだけです。これらのヒントを考慮に入れると、その量のコードは簡単に管理できるはずです。


デバッガーは、コードのデバッグに役立つプログラムです。デバッガーの一般的な機能を使用すると、コードを 1 行ずつ実行し、変数の値が変化するのを監視できます。関心のあるコードにブレークポイントを設定することもでき、デバッガーはブレークポイントにヒットしたときに通知します。一部のデバッガーでは、実行中にコードを変更することさえできます。さまざまな機能セットを備えたさまざまなデバッガーが多数あります。

于 2013-03-28T13:46:49.910 に答える
5

タイトルに基づいて、コードが何をするかを推測してみてください。たとえば、interpolate関数がポイントを正しく補間するとします。出力が疑わしい場合にのみ、そのコードを掘り下げてください。

于 2013-03-28T13:46:47.600 に答える
1

まず、次の機能を備えたエディター/IDEを入手することを検討してください。

  • 括弧/括弧/括弧の一致
  • 中括弧の間のコード ブロックの折りたたみ/折りたたみ解除
  • タイプの強調表示 (ツールヒント)
  • マクロ展開 (ツールチップまたは別のウィンドウ/パネル)
  • 関数プロトタイプの展開 (ツールチップまたは別のウィンドウ/パネル)
  • 型、関数、クラスへのクイック ナビゲーションと戻る
  • 異なる位置にある複数のウィンドウ/パネルで同じファイルを開く
  • 特定の型、変数、関数、またはクラスのすべての言及/使用を検索し、それをリストとして提示する
  • コール ツリー/グラフの構築/ナビゲーション
  • 単純検索に加えて正規表現検索
  • ブックマーク?

Source Insightはそのようなツールの 1 つです。他にもいるはずです。

2 つ目は、コードに注釈を付けることを検討することです。その際、次の点に注意してください (書き留めてください)。

  • 不変条件 (常に真である、または常に真でなければならないもの)
  • 仮定(チェック/検証の欠落や不当な期待など、真実ではない可能性があるもの)、「もしも」を考える
  • コード片の目的 ( what )
  • 実装の特殊性/詳細 (どのように、例外がスローされるかどうか、どのエラー コードがいつ返されるかなど)
  • コード フローを確認するための簡略化されたコール ツリー/グラフ
  • データフローについても同じことを行います

ダイアグラムを (ASCII または紙/ボードに) 描画します。論文や掲示板の写真を時々撮ります。具体的には、ブロック図ステート マシンを描きます。

さまざまなレベルの抽象化/詳細でコードを操作します。ズームインして詳細を表示し、ズームアウトして構造を表示します。コードのブロックとコール ツリー/グラフの分岐を折りたたむ/折りたたまない。

また、やるべきことのチェックリストを用意してください。行った項目を確認します。必要に応じてさらに追加します。必要に応じて、作業項目に優先順位を割り当てます。


デバッガーは、プログラムをステップごとに実行し、その状態 (変数) を調べることができるプログラムです。また、状態を変更することもでき、これも役立つ場合があります。

コードやプログラミング言語にあまり慣れていない場合は、デバッガーを使用してコードを理解することができます。

もう 1 つの便利な方法は、プログラムのテストまたは入力データ テスト セットを作成することです。ロジックやパフォーマンスに関する問題や制限が明らかになる場合があります。


また、ドキュメンテーション人々をおろそかにしないでください! プロジェクト/コードに関する詳細情報を提供できる何かまたは誰かがいる場合は、その何かまたは誰かを使用してください。アドバイスを求める。


たくさんのことのように聞こえるかもしれませんが、とにかくある時点でこれらのいくつかを実行することになります。十分に大きなプロジェクトを待つだけです。:)

于 2013-03-28T14:18:25.970 に答える
0

多くの素晴らしい答えがすでに与えられています。元学生としての理解 (あまり前ではない) と、コードを理解するために学んだことを追加することを考えました。何年も前に Java で書いたデータベースを C++ に変換するプロジェクトを始めたので、これは特に役に立ちました。

1. **Code Reading** - Do not underestimate this important task.  The ability to write code  
   does not always translate into the ability to read it -- and reading it can be more 
   frustrating than writing it.

時間をかけて、コードの各行が何をするのかを注意深く発見してください。これは、慣れ親しんだコードに出くわし、それをざっと説明できる場合を除き、推測を避けるのに役立ちます。

2. Don't hesitate to follow references, locate declarations, and uncover definitions of 
   code elements you are reading. What you learn about how a particular variable, 
   method call, or class are defined all contribute to learning and ultimately to you 
   being able to perform your task. 

これは特に重要です。なぜなら、発見的かつ効果的な発見作業は、コードの小さな部分を理解するために不可欠な部分であり、将来、より大きな部分をより簡単に把握できるようにするためです。

デバッガーとは何かについての情報を既に投稿している他の人もいますが、デバッガーはコード エラーを追跡する上で非常に貴重な資産であり、コードの読み取り、知識の獲得、および理解に役立つため、成功するプログラマーになることができると思います。

Visual Studio を利用したデバッガー チュートリアルへのリンクを次に示します。これにより、少なくとも当面のプロセスを十分に理解できる可能性があります。

于 2013-03-28T14:58:13.550 に答える
0

基本的に、最初に呼び出される関数の機能を理解する必要がある場合があります。次に、その関数への入力と出力が何であるかを理解する必要があります。たとえば、どのようinterpolateに行われるかを本当に理解する必要がある場合は、詳細に進むことができます。通常、関数の名前は一目瞭然です。コードが適切に記述されていれば、その名前から関数が何をするかについての感覚をつかむことができます。

もう 1 つの方法は、おもちゃの例を実行してコードを確認することです。コードをナビゲートするのに役立つデバッガーまたは IDE を使用できます。大規模なコードを理解するには時間と経験が必要です。

于 2013-03-28T13:54:08.713 に答える
0

「デバッガーアプローチを試す」

[更新: デバッガーは、実行中のプログラムを一時停止して、プログラムの状態 (変数の値/実行中の関数/親関数は誰なのかなど) を調べることができる特別なプログラムです]

私がそれを行う方法は、理解したいユースケースのために、コードをステップデバッグすることです。

Advanced/Mordern IDE を使用している場合、エントリ ポイント (main() や関心のあるポイントなど) にブレークポイントを設定するのは非常に簡単です。そこから、調べたい関数に入るか、関数を踏み越えます。

段階的なアプローチを提供するには

  1. main() メソッド (エントリ ポイント) 開始式にブレーク ポイントを設定します。
  2. デバッグを有効にしてプログラムを実行する
  3. プログラムはブレークポイントでブレークします。
  4. さて、興味深いと思われる関数/式に出くわすまで、一歩進んでみてください。(たとえば、あなたのpoints.interpolate(x);) 関数
  5. 関数にステップインし、変数や関数スタックなどのプログラムの状態をライブで調べます。
  6. 複雑なシステム ライブラリは避けてください。ステップオーバー/ステップアウトするだけです。(例: のようなものは避けてくださいMathLib.boringComputaion())
  7. プログラムが終了するまで繰り返します。

この学習方法は非常に迅速で、複雑なソフトウェアや大規模なソフトウェアをすばやく理解できることがわかりました。

Eclipse を使用するか、それができない場合は、C/C++ の場合は GDB を試してください。人気のあるすべてのプログラミング言語には、まともなデバッガーがあります。

次のような基本的なデバッグ操作を理解すると、次の利点があります。

  1. ブレークポイントの設定。
  2. ブレークポイントで停止します。
  3. 変数を調べる/見る。
  4. 関数スタック (関数呼び出しの階層) を調べる
  5. シングルステップ - コードの次の行に進みます。
  6. 関数にステップ インします。
  7. 関数のステップアウト。
  8. 関数をステップオーバーします。
  9. 次のブレークポイント (関心のあるポイント) にジャンプします。

それが役に立てば幸い!

于 2013-03-28T14:04:02.133 に答える