私は、型階層のさまざまなレベルでオーバーライドできる仮想メソッド呼び出しのかなり複雑な順序を持つ C# API を使用しています。これらのメソッドの実行順序を文書化できるようにしたいのですが、Trace 書き込みをクラスに追加することなくそれを行う方法があるかどうか疑問に思っています。これらの各クラスの LOC が 2,000 を超えることを考えると、手動で行うのは非常に途方もない作業になります。
一般的なメソッド フローの簡単な例を挙げてみましょう。
public class Base
{
protected void Init()
{
this.BeginInitInternal();
this.OnInit();
this.AfterInitInternal();
}
protected virtual void AfterInitInternal() { }
protected virtual void OnInit() { }
protected virtual void BeginInitInternal() { }
}
public class Derived : Base
{
protected sealed override void BeginInitInternal()
{
// Logic here
this.BeginInit();
}
protected sealed override void AfterInitInternal()
{
// Logic here
this.AfterInit();
}
protected virtual void BeginInit() { }
protected virtual void AfterInit() { }
}
public class Concrete : Derived
{
protected override void BeginInit() { /* Logic here */ }
protected override void OnInit() { /* Logic here */ }
protected override void AfterInit() { /* Logic here */ }
}
実装は API の消費者によって作成されます。Concrete
私は、これらすべての呼び出しの順序を彼/彼女に通知できるようにしたいと考えています (理想的にはコンテキストもですが、それは質問の範囲外です。
UML シーケンス図は必ずしも必要ではありませんが、探しているものに最も近いものを見つけました。
Base.Init()
理想的には、 onの実装を見て、次のようなものを発行するようにツールに指示したいと思いますDerived
。
Derived.BeginInit()
Base.OnInit()
Derived.AfterInit()
VSシーケンス図ジェネレーターを試してみましたが、使用するように指示することはできませんがConcrete
、Base.Init()
. 私も VS Code Map を使用してみましたが、ソリューションの複雑さで窒息し、通常はエラーになります。最後に、NDepend を使用してみました。これは、すべての呼び出しを教えてくれますが、それらの順序は教えてくれません。
他に試すことができるものはありますか、それともどこにでも貼り付けることから始めるべきTrace.WriteLines
ですか?