C# 如何确定或判断一组类是否为;意大利面代码;?
如何确定或判断一组类是否是“意大利面代码” 当我在VisualStudio的“体系结构”菜单下生成依赖关系图时,是否应该将代码视为意大利面,并看到有许多弯曲的箭头指向所有地方 我总是通过减少类之间的依赖关系来避免意大利面代码的问题。这样做时,依赖关系图确实变得更整洁了。当我对某些部分进行更改时,因为类之间几乎没有依赖关系,所以我不必担心会弄乱其他类 但是,通过使用这种方法,有时,我不得不重复一些代码。例如,我可以将以下对象存储在列表中:C# 如何确定或判断一组类是否为;意大利面代码;?,c#,oop,design-patterns,architecture,C#,Oop,Design Patterns,Architecture,如何确定或判断一组类是否是“意大利面代码” 当我在VisualStudio的“体系结构”菜单下生成依赖关系图时,是否应该将代码视为意大利面,并看到有许多弯曲的箭头指向所有地方 我总是通过减少类之间的依赖关系来避免意大利面代码的问题。这样做时,依赖关系图确实变得更整洁了。当我对某些部分进行更改时,因为类之间几乎没有依赖关系,所以我不必担心会弄乱其他类 但是,通过使用这种方法,有时,我不得不重复一些代码。例如,我可以将以下对象存储在列表中: class DataBlock { public i
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
对象包含到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
,我的EventArgs
和具有事件处理程序的任何类都不会依赖于数据块。只有事件的触发方知道数据块
,它从数据块
中剥离数据,并通过其构造函数将其放入MyEventArgs
。然而,现在的问题是,MyEventArgs
正在重复Datablock
中的每个getter/setter而且,我也无法访问数据块中的所有帮助程序方法
强>
这只是我经常面临的问题的一个小例子。还有一些更严重的问题,我发现自己重复了一些类的getter/设置,只是因为我想减少依赖性
我面临的其他问题在依赖关系图上显示了很多箭头,比如说,当我有一个名为isomoObject
的接口时。由于类中的isomoObject
是一个流行对象,因此类的许多其他部分都使用该接口。最后,有大量的箭头指向isomobject
。这是否也意味着意大利面代码
当我想保持代码的条理性时,我很难解释我所面临的问题。但我希望上面的例子足以说明我想说的
那么,对于这样的场景,最佳实践是什么?当Visual Studio中的依赖关系图显示大量杂乱的曲线箭头指向各处时,我是否应该确定我的代码是意大利面条?我建议阅读独立白皮书和文档
在此处查看代码结构、设计、依赖项部分:
我真诚地相信,spaguetti代码与依赖项或更高级别的东西无关
Spaguetti代码是一种反模式,它创建一个高度耦合的代码,没有顺序,完全不合理,这意味着作者-程序员很难为您解释代码流
意大利式代码最重要的症状之一是无法维护:如果您修复了一个bug,它会创建一个或多个bug。当你修复这些错误时,你会得到更多的错误。最后,通过对到处都是垃圾进行硬编码来修复代码
同样,我怀疑一个具有大量依赖关系的大型对象图是否是“意大利式代码”。为了避免getter/setter,我会为它们创建接口,在类中实现接口,并且只在eventargs中使用接口。不,我不认为对接口的依赖是意大利面代码的标志。@Maarten,谢谢!因此,我将在DataBlock
中实现一个接口,比如说IAttributes
,并且IAttributes
具有所有getter/setters/helper方法。接口的具体实现仍将在Datablock
中,但当传递到EventArgs
时,我将传递IAttributes
。这样,EventArgs
和DataBlock
都将依赖于IAttributes
,但对接口的依赖性很强是可以的。我没听错吧?