Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确定或判断一组类是否为;意大利面代码;?_C#_Oop_Design Patterns_Architecture - Fatal编程技术网

C# 如何确定或判断一组类是否为;意大利面代码;?

C# 如何确定或判断一组类是否为;意大利面代码;?,c#,oop,design-patterns,architecture,C#,Oop,Design Patterns,Architecture,如何确定或判断一组类是否是“意大利面代码” 当我在VisualStudio的“体系结构”菜单下生成依赖关系图时,是否应该将代码视为意大利面,并看到有许多弯曲的箭头指向所有地方 我总是通过减少类之间的依赖关系来避免意大利面代码的问题。这样做时,依赖关系图确实变得更整洁了。当我对某些部分进行更改时,因为类之间几乎没有依赖关系,所以我不必担心会弄乱其他类 但是,通过使用这种方法,有时,我不得不重复一些代码。例如,我可以将以下对象存储在列表中: class DataBlock { public i

如何确定或判断一组类是否是“意大利面代码”

当我在VisualStudio的“体系结构”菜单下生成依赖关系图时,是否应该将代码视为意大利面,并看到有许多弯曲的箭头指向所有地方

我总是通过减少类之间的依赖关系来避免意大利面代码的问题。这样做时,依赖关系图确实变得更整洁了。当我对某些部分进行更改时,因为类之间几乎没有依赖关系,所以我不必担心会弄乱其他类

但是,通过使用这种方法,有时,我不得不重复一些代码。例如,我可以将以下对象存储在列表中:

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
,但对接口的依赖性很强是可以的。我没听错吧?