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

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

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

person bitbonk    schedule 10.05.2011    source источник


Ответы (2)


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

Формально закон Деметры для функций требует, чтобы метод 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 не применяется.

person Cobaia    schedule 27.08.2012

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

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

(...)
this.internalGrid.MoveEmptyCellBy(this.moveDistance);
(...)
person Adam Adamaszek    schedule 01.10.2012