1. ホーム
  2. c++

[解決済み】11000行のC++ソースファイルはどうすればいいのか?

2022-04-05 09:54:51

質問

私たちのプロジェクトには、この巨大な(11000行もある?)mainmodule.cppのソースファイルがあり、私はそれを触るたびにぞっとするのです。

このファイルは非常に中心的で大きいので、どんどんコードが蓄積されていき、実際に縮小し始める良い方法が思いつきません。

このファイルは、私たちの製品のいくつかの(> 10)保守バージョンで使用され、活発に変更されているので、リファクタリングするのが本当に難しいです。もし私がこのファイルを3つのファイルに分割するとしたら、メンテナンスバージョンからの変更をマージするのは悪夢となるでしょう。また、このように長く豊かな歴史を持つファイルを分割すると、古い変更点を SCC の歴史は突然難しくなります。

このファイルには基本的にプログラムの "メインクラス" (主な内部作業のディスパッチと調整) が含まれているので、機能が追加されるたびにこのファイルにも影響が及び、そのたびに大きくなってしまいます :-(

このような場合、あなたならどうしますか?を混乱させることなく、新しい機能を別のソースファイルに移動させる方法について、何かアイデアがあれば教えてください。 SCC ワークフロー

(ツールに関する注意 C++を使用し Visual Studio を使用します。 AccuRev として SCC が、タイプは SCC は、ここではあまり重要ではありません。 Araxis Merge を使用して、実際のファイルの比較とマージを行います)。

解決方法は?

  1. ファイルの中で、比較的安定しており(変化が少なく、ブランチ間であまり変わらない)、独立したユニットとして成り立つコードをいくつか見つけます。これを、すべてのブランチで、独自のファイル、さらには独自のクラスに移動します。安定したファイルなので、あるブランチから別のブランチに変更をマージする際に、元々作成されたファイルとは別のファイルに適用しなければならない、quot;awk" マージが発生することはないでしょう。繰り返してください。

  2. ファイルの中から、基本的に少数のブランチにしか適用されず、単独で実行可能なコードを見つけます。ブランチの数が少ないので、それが急速に変化しているかどうかは問題ではありません。これを独自のクラスとファイルに移動します。これを繰り返す。

つまり、どこでも同じようなコードと、特定のブランチに特有のコードを取り除いたわけです。

つまり、どのブランチでも必要なのに、ブランチごとに異なる (あるいは常に変化しているので、あるブランチが他のブランチより遅れている) コードが、ひとつのファイルに入っていて、ブランチ間でマージしようとしてもうまくいかない、という状態です。そんなことはやめましょう。ファイルをブランチ 永続的に おそらく各ブランチで名前を変更することで、そのブランチを作成します。これはもう "main" ではなく、"main for configuration X" となります。マージによって同じ変更を複数のブランチに適用する機能は失われますが、いずれにせよ、マージがあまりうまく機能しないコードの核となる部分です。コンフリクトに対処するために手動でマージを管理しなければならないのなら、各ブランチで独立して手動で適用することは損失ではありません。

SCCの種類は関係ないというのは間違いだと思います。例えばgitのマージ能力は、あなたが使っているマージツールよりも優れているはずだからです。つまり、核となる問題である「マージが難しい」というのは、SCCが異なると発生するタイミングが異なるということです。しかし、SCCを変更できる可能性は低いので、この問題はおそらく関係ないでしょう。