如何确定或判断一组类是否是“意大利面条代码”?
当我在 Visual Studio 中的 Architecture 菜单下生成依赖关系图时,我是否应该将我的代码视为意大利面条,并看到有很多弯曲的箭头指向整个地方?
我总是通过尝试减少类之间的依赖关系来避免意大利面条代码的问题。这样做时,是的,依赖关系图确实变得更整洁了。而且当我对某些部分进行更改时,因为类之间几乎没有依赖关系,所以我不必担心会弄乱其他类。
但是,通过这种方法,有时我似乎不得不重复一些代码。例如,我可以将以下对象存储在列表中:
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
对象。所以,我摆脱这种情况的方法之一是在我的内部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
重复内部的每个 getter/setter Datablock
。而且,我也无法访问DataBlock
!
这只是我经常遇到的问题的一个小例子。在更严重的情况下,我发现自己重复了几个类的 getter/设置,只是因为我想减少依赖。
我面临的其他问题会在依赖关系图中显示很多箭头,例如,当我有一个名为ISomeObject
. 因为ISomeObject
是类中的一个流行对象,所以该接口被类的许多其他部分使用。最后,有大量的箭头指向ISomeObject
. 这是否也意味着意大利面条代码?
当我想让我的代码井井有条时,我很难解释我面临的问题。但我希望上面的例子足以说明我想说的。
那么,对于这样的场景,最佳实践是什么?当 Visual Studio 中的依赖关系图显示很多杂乱的弯曲箭头指向各处时,我是否应该确定我的代码是意大利面条?