[解決済み】11000行のC++ソースファイルはどうすればいいのか?
質問
私たちのプロジェクトには、この巨大な(11000行もある?)mainmodule.cppのソースファイルがあり、私はそれを触るたびにぞっとするのです。
このファイルは非常に中心的で大きいので、どんどんコードが蓄積されていき、実際に縮小し始める良い方法が思いつきません。
このファイルは、私たちの製品のいくつかの(> 10)保守バージョンで使用され、活発に変更されているので、リファクタリングするのが本当に難しいです。もし私がこのファイルを3つのファイルに分割するとしたら、メンテナンスバージョンからの変更をマージするのは悪夢となるでしょう。また、このように長く豊かな歴史を持つファイルを分割すると、古い変更点を
SCC
の歴史は突然難しくなります。
このファイルには基本的にプログラムの "メインクラス" (主な内部作業のディスパッチと調整) が含まれているので、機能が追加されるたびにこのファイルにも影響が及び、そのたびに大きくなってしまいます :-(
このような場合、あなたならどうしますか?を混乱させることなく、新しい機能を別のソースファイルに移動させる方法について、何かアイデアがあれば教えてください。
SCC
ワークフロー
(ツールに関する注意 C++を使用し
Visual Studio
を使用します。
AccuRev
として
SCC
が、タイプは
SCC
は、ここではあまり重要ではありません。
Araxis Merge
を使用して、実際のファイルの比較とマージを行います)。
解決方法は?
-
ファイルの中で、比較的安定しており(変化が少なく、ブランチ間であまり変わらない)、独立したユニットとして成り立つコードをいくつか見つけます。これを、すべてのブランチで、独自のファイル、さらには独自のクラスに移動します。安定したファイルなので、あるブランチから別のブランチに変更をマージする際に、元々作成されたファイルとは別のファイルに適用しなければならない、quot;awk" マージが発生することはないでしょう。繰り返してください。
-
ファイルの中から、基本的に少数のブランチにしか適用されず、単独で実行可能なコードを見つけます。ブランチの数が少ないので、それが急速に変化しているかどうかは問題ではありません。これを独自のクラスとファイルに移動します。これを繰り返す。
つまり、どこでも同じようなコードと、特定のブランチに特有のコードを取り除いたわけです。
つまり、どのブランチでも必要なのに、ブランチごとに異なる (あるいは常に変化しているので、あるブランチが他のブランチより遅れている) コードが、ひとつのファイルに入っていて、ブランチ間でマージしようとしてもうまくいかない、という状態です。そんなことはやめましょう。ファイルをブランチ 永続的に おそらく各ブランチで名前を変更することで、そのブランチを作成します。これはもう "main" ではなく、"main for configuration X" となります。マージによって同じ変更を複数のブランチに適用する機能は失われますが、いずれにせよ、マージがあまりうまく機能しないコードの核となる部分です。コンフリクトに対処するために手動でマージを管理しなければならないのなら、各ブランチで独立して手動で適用することは損失ではありません。
SCCの種類は関係ないというのは間違いだと思います。例えばgitのマージ能力は、あなたが使っているマージツールよりも優れているはずだからです。つまり、核となる問題である「マージが難しい」というのは、SCCが異なると発生するタイミングが異なるということです。しかし、SCCを変更できる可能性は低いので、この問題はおそらく関係ないでしょう。
関連
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み】npm 5で作成されたpackage-lock.jsonファイルはコミットするのでしょうか?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] ファイルをリセットしたり、特定のリビジョンに戻したりするにはどうすればよいですか?
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] ルール・オブ・スリーとは?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】Enterキーを押して続行する
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較