#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);
(...)