这违反了得墨忒耳法吗?

时间:2011-05-10 08:17:52

标签: law-of-demeter

这违反了Law of Demeter吗?

private void MoveEmptyCells()
{
     IEnumerable<Cell> cells = this.internalGrid.GetAllEmptyCells();
     foreach(Cell cell in cells)
     {
          cell.RowIndex += this.moveDistance; // violation here?
     }
}

这个怎么样?

private void MoveEmptyCell()
{
     Cell cell = this.internalGrid.GetEmptyCell();
     cell.RowIndex += this.moveDistance; // violation here?         
}

2 个答案:

答案 0 :(得分:0)

Law of Demeter说:

  

更正式地说,Demeter法则的功能需要一种方法   对象O的m只能调用以下类型的方法   对象:

     

O本身的m参数
任何创建/实例化的对象   在m中O的直接分量对象
一个全局变量,   可以通过O访问,在m的范围内

     

(...)也就是说,代码a.b.Method()违反了法则   a.Method()没有。

Cell cell = this.internalGrid.GetEmptyCell(); // is O's direct component Object
cell.RowIndex += this.moveDistance; // Cell is a object created/instantiated within m

this.moveDistance; // // O本身的方法。
返回没有行为的RowIndex对象,因此Demeter不适用。

答案 1 :(得分:0)

如果没有断裂,那么它会略微弯曲德米特定律。

您可以尝试以某种方式实施它,以便您可以致电:

(...)
this.internalGrid.MoveEmptyCellBy(this.moveDistance);
(...)