2

関数からいくつかの C コードを使用したいのですが、関数には 300 行以上のコードと 20 個の変数があり、対処するのが本当に頭を悩ませています。

小さな関数を大きな関数から自動的に分離(リファクタリング)できるツールがあるかどうか疑問に思っています。そうすれば、そのような長い関数を処理する時間を大幅に節約できます。

(このツールは変数が最初に定義された位置と最後に変数が使用された位置を分析するだけでよいので、それほど難しいことではないと思います。その後、分割する場所についていくつかの提案をしてください.. )

4

2 に答える 2

6

問題は、関数の目的が何であるかをコンピュータが知るのが難しいことです。1 つのタスクに 20 個すべての変数と 300 行のコードがすべて必要であり、そのタスクを分割する意味がない場合、それは適切な関数です。想像するのは少し難しいですが、それでも。

長いからといって、何かを分割しないでください。そうするのが理にかなっているので、それを分割してください。関数は 1 つのことだけを実行するようにします。今のところ、コンピューターは関数の目的を理解できるほど賢くなく、特に、合理的に分割できる関数のサブセクションが何であるかを判断できるほど賢くありません。

于 2012-05-05T04:16:43.417 に答える
1

はい、それができるツールがあります。必要なのは、CをASTに解析し、関数内のデータフローを判別し、データフローをガイドとして使用してASTを変換し、変換されたツリーからテキストを再生成できるプログラム変換ツールです。

直面しなければならない問題の1つは、関数を分割する場所をツールに指示する方法です。サブ機能としてどの部分が必要ですか?間違いなく、任意のセットを指定できます関数内の関数(割り当て、部分式、またはステートメント)の操作をサブ関数に入れるには、一般にそれだけの制御が必要です。これは、かなり長く詳細な説明になる可能性があります(おそらく行/列のペアのセット)。ただし、「操作のみをサポートするすべてのものを置く」などの自動選択が必要になることがよくあります。データフロー分析を備えたツールは、操作から後方スライスを計算し、後方スライスのどの部分が操作にのみ使用されているかを調べ、対応するコードを移動できます。実際問題として、これらのアイデアを組み合わせる必要があります。いずれの場合も、ツールは何を移動する必要があるかを認識します。指定されたコードをサブルーチンに移動することは、「単なる」一連の標準的なプログラム変換です。ほとんどのコンパイラには、これを行うための内部機構があります。

この決定を下せるように、ツールにコードのインタラクティブなグラフィカルスライスビューを提供することもできます。(Grammatechは、まさにこれを行うCodeSurferと呼ばれるCスライシングツールを提供しています)。

このようなスライスを計算してコード変換を実行できるツールは、 Cフロントエンドを備えたDMSソフトウェアリエンジニアリングツールキットです。(CodeSurferのようにインタラクティブではありませんが、CodeSurferはコードを変更できません)。その特定のタスクを実装するようにDMSを構成する必要があります。上記のすべての機械があります。実際問題として、これは、1つの機能を手作業で分割するのにかかる労力よりも多くの作業になる可能性があります。

そうは言っても、あなたはまだ関数を分割する方法を決めることに固執しています。そして、それはツールではなく、あなたが抱えている実際の問題のようです。

于 2012-05-05T06:49:13.507 に答える