3

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

当我在 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 中的依赖关系图显示很多杂乱的弯曲箭头指向各处时,我是否应该确定我的代码是意大利面条?

4

2 回答 2

1

我建议阅读 NDepend WhiteBooks 和文档。

在此处查看代码结构、设计、依赖项部分: http ://www.ndepend.com/Tips.aspx#Design

于 2012-10-22T06:22:41.137 回答
1

老实说,我相信 spaguetti 代码与依赖关系或更高级别的东西无关。

Spaguetti 代码是一种反模式,它包括创建没有顺序且完全不合理的高度耦合代码,这意味着作者 - 程序员 - 几乎不会为您解释代码流。

spaguetti 代码最重要的症状之一是它是不可维护的:如果你修复了一个错误,它会产生一个或多个错误。当你修复这些错误时,你会得到更多的错误。最后通过硬编码垃圾来修复代码。

同样,我怀疑具有很多依赖关系的大型对象图会是“意大利面条代码”。

于 2012-10-22T06:51:45.467 回答