Является ли это нарушением Закона Деметры ?
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? }
Если оно не нарушается, то оно слегка изгибает Закон Деметры.
Вы можете попробовать реализовать его таким образом, чтобы вы могли позвонить:
(...) this.internalGrid.MoveEmptyCellBy(this.moveDistance); (...)
Закон Деметры говорит:
Более формально, закон Деметры для функций требует, чтобы метод m объекта O мог вызывать методы только следующих типов объектов: O непосредственнопараметры мЛюбые объекты, созданные / созданные в течение мПрямые составляющие объекты ОГлобальная переменная, доступная O, в области видимости m (...) То есть код abMethod () нарушает закон, а a.Method () этого не делает.
Более формально, закон Деметры для функций требует, чтобы метод m объекта O мог вызывать методы только следующих типов объектов:
O непосредственнопараметры мЛюбые объекты, созданные / созданные в течение мПрямые составляющие объекты ОГлобальная переменная, доступная O, в области видимости m
(...) То есть код abMethod () нарушает закон, а 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 не применяется.