コードを理解するソース管理用のマージツールはありますか?

StackOverflow https://stackoverflow.com/questions/802504

  •  03-07-2019
  •  | 
  •  

質問

最近、大規模なコードベースに取り組み、リファクタリングを行い、一般的にデザインを改善してカバレッジを拡大しています。また、かなりの数のファイルで、余分なusingステートメントを削除し、同様の機能が近くなるようにメソッドを移動し、リージョンを追加しましたが、実際にはファイル内のコードの機能を変更しませんでした。

一方、チームの他の場所で、他の開発者がバグを修正し、コードの行をあちこちで変更しています。行番号が一致しなくなり、メソッドが移動した可能性があるため、マージに関しては明らかに問題になります。

今、ソース管理された環境ではメソッドを移動することは危険なことであるという一般的なルールを理解しており、利益がコストを上回ると判断しました。しかし、私が理解していないのは、なぜこのようにすべきかということです。

最初のファイルは単純な電卓だとしましょう:

public class Calculator
{
    public int Subtract(int a, int b)
    {
        return a + b;
    }

    public int Add(int a, int b)
    {
        return a + b;
    }
}

そして、メソッドをアルファベット順にしたいと決めました:

public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }

    public int Subtract(int a, int b)
    {
        return a + b;
    }        
}

減算メソッドのバグを別の開発者が修正している間

public class Calculator
{
    public int Subtract(int a, int b)
    {
        return a - b;
    }

    public int Add(int a, int b)
    {
        return a + b;
    }
}

標準のマージツールでは、おそらくこれら2つのファイルを手動でマージする必要がありますが、コードの機能を理解している場合は、これら2つの変更を簡単に調整できます。同じことは、他のメソッド、コメント、リージョンの削除または追加、またはステートメントの使用にも適用されます。

では、(最終的に)質問に答えます。コードの機能をインテリジェントに理解し、人間の介入なしで上記の2つのファイルをマージできるマージツールはありますか?そうでない場合は、なぜですか?これを解決不可能な問題にする複雑な問題はありますか(もちろん、私が示唆しているほど単純ではないことを理解しています-しかし、私が見ることができない何らかの理由で不可能ですか?)

ソースコードでC#を使用しており、C#で動作するものが好きですが、プログラミングの世界のどこかに存在するかどうかに興味があります...


この質問の長さについてはすでに心配していますが、インテリジェントソースシステムの動作を期待する方法を追加するように編集しました。

システムで初期計算機ファイルがチェックされると、ファイルが解析され、クラスの階層が作成されます。

File: Calculator.cs
|
|--Class[0]: Calculator
    |
    |--Method[0]: Subtract
         |
         |--Line[0]: return a + b;
    |
    |--Method[1]: Add
         |
         |--Line[0]: return a +b;

(中括弧などのために追加の行がある...)

コードをチェックインする(メソッドをアルファベット順にする)と、上の階層が更新され、SubtractがMethod [1]に、AddがMethod [0]になります。

2番目の開発者はコードをチェックインし(明らかにソース管理システムは元のコードに基づいていることを知っています)、subtractの最初の行の変更に気付きます。今、ファイル全体で行番号ごとにその行を見つけるのではなく、Calculator.cs / Calculator / Subtract / 0を見つけることができることを知っており、メソッドが場所を変更したという事実は重要ではありません。作業をマージします。

役に立ちましたか?

解決

データベースのソースコードは、あなたの質問に対する潜在的な答えの1つだと思います。一般的な考え方は、ファイルをバージョン管理せず、コードのブロックをバージョン管理するということです。バージョン管理システムはコードDOMを認識しており、コードDOMを照会して、関数、クラス、what-have-you、編集、コンパイルなどをチェックアウトできます。

メソッドの順序は必ずしも重要ではないため、メソッドは順序を考慮してデータベースに保存されません。クラスをチェックアウトするときに、最適な順序(アルファベット順、パブリック/保護/プライベートなど)を指定できます。重要な変更は、 + -に切り替えた場合などです。メソッドの順序を変更しても競合することはありません。

残念ながら、SCIDはまだ非常に若く、そのためのツールはあまりありません。ただし、コードを表示および編集する方法は非常に興味深い進化です。

編集: ここにもう1つありますSCIDのリファレンス

他のヒント

Plastic SCMのアプローチはまだ「完全」ではありませんが、すでにリリースされており、このような状況で役立ちます。 Xmerge をご覧ください。もちろん、フィードバックは歓迎以上のものであり、いくつかの無料ライセンスを付与します;-)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top