クラスのセットが「スパゲッティ コード」であるかどうかを判断するにはどうすればよいですか?
Visual Studio の [アーキテクチャ] メニューで依存関係グラフを生成するときに、自分のコードをスパゲッティとして見る必要がありますか?
クラス間の依存関係の量を減らそうとすることで、スパゲッティ コードの問題を常に回避しています。そうすることで、確かにディペンデンシー グラフがきれいになります。また、ある部分を変更する場合、クラス間の依存関係がほとんどないため、他のクラスを台無しにする心配がありません。
しかし、この方法を実行すると、コードを繰り返さなければならないように見えることがあります。たとえば、次のオブジェクトをリストに格納できます。
class DataBlock {
public int id;
public string name;
public SomeObject dataObj;
public Object[] Data1 { get { return dataObj.RetrieveInfo(); } }
public Object[] Data2 { get { return dataObj.SomeProperty; } }
public bool DoCompare(obj) { ... }
}
したがって、上記のオブジェクトを構成DataList
するタイプのと呼ばれるリストがあります。List<DataBlock>
次に、 からの情報を含むイベントをディスパッチするとしますDataBlock
。DataBlock
このオブジェクト全体を に含めることができますEventArgs
。ハンドラー関数はこれを行うことができます:
void Handler(MyEventArgs evtArgs) {
DataBlock data = evtArgs.Data;
var firstData = data.Data1;
data.Data2;
firstData.DoCompare(data.Data2)
data.name; //etc, etc
}
これは便利です。ただし、これは、このハンドラーを持つクラスがオブジェクトに依存するようになることも意味しDataBlock
ます。したがって、これを取り除く私の方法の 1 つは、私の 内にあります。次のように、からのすべての情報EventArgs
を繰り返します。DataBlock
class MyEventArgs : EventArgs {
public MyEventArgs(id, name, data1, data2) {
ID = id;
Name = name;
Data1 = data1;
Data2 = data2;
}
public int ID { get; private set; }
public string name { get; private set; }
public Object[] Data1 { get; private set; }
public Object[] Data2 { get; private set; }
}
EventArgs
my をこのように配置することにより、 myEventArgs
とイベントHandler
を持つクラスの両方が に依存しなくなりDataBlock
ます。イベントの発火者だけが について知っておりDataBlock
、データを から取り出して、コンストラクターを介してDataBlock
入れます。MyEventArgs
ただし、現在、これの問題は、MyEventArgs
が内にあるすべてのゲッター/セッターを繰り返しDatablock
ていることです。また、 !内のすべてのヘルパー メソッドにもアクセスできなくなります。DataBlock
これは、私がよく直面する問題のほんの一例です。依存関係を減らしたいという理由だけで、いくつかのクラスのゲッター/設定を繰り返していることに気付いた、より深刻なものがあります。
ディペンデンシー グラフに多くの矢印が表示されるその他の問題は、たとえば、 というインターフェイスがある場合ISomeObject
です。はクラス内でよく使用されるオブジェクトであるためISomeObject
、インターフェイスはクラスの他の多くの部分で使用されます。最後に、 を指す矢印がたくさんありISomeObject
ます。これはスパゲッティ コードも意味するのでしょうか?
コードを整理しておきたいときに直面する問題を説明するのは難しいです。しかし、上記の例が、私が伝えたいことを説明するのに十分であることを願っています.
では、このようなシナリオのベスト プラクティスは何ですか? Visual Studio の Dependency Graph であちこちに乱雑な曲線の矢印が多数表示されている場合、自分のコードがスパゲッティであると判断する必要がありますか?