Является ли это нарушением Закона Деметры?

#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?         
}
  

Ответ №1:

Закон Деметры гласит:

Более формально, Закон Деметры для функций требует, чтобы метод m объекта O мог вызывать методы только следующих типов объектов:

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 не применяется.

Ответ №2:

Это если не нарушение, то небольшое отклонение от Закона Деметры.

Вы могли бы попробовать реализовать это таким образом, чтобы вы могли вызывать:

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