这是否违反了德墨忒尔法则?

发布于 2024-11-05 23:24:06 字数 534 浏览 0 评论 0原文

这是否违反了德墨忒尔法则

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

Is this a violation of the Law of Demeter?

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

How about this one?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

﹏雨一样淡蓝的深情 2024-11-12 23:24:07

德墨忒尔定律说:

更正式地说,函数的德米特定律要求有一个方法
对象 O 的 m 只能调用以下类型的方法
对象:

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

(...) 也就是说,代码 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 不适用。

Law of Demeter says:

More formally, the Law of Demeter for functions requires that a method
m of an object O may only invoke the methods of the following kinds of
objects:

O itself
m's parameters
Any objects created/instantiated
within m
O's direct component objects
A global variable,
accessible by O, in the scope of m

(...) That is, the code a.b.Method() breaks the law where
a.Method() does not.

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; // Method of // O itself.
Return a RowIndex object with no behavior, and so Demeter does not apply.

别闹i 2024-11-12 23:24:07

如果没有打破的话,那就是稍微弯曲了德米特定律。

您可以尝试以某种方式实现它,以便您可以调用:

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

It is if not breaking, then it is slightly bending the Demeter Law.

You could try implementing it in a way so that you can call:

(...)
this.internalGrid.MoveEmptyCellBy(this.moveDistance);
(...)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文