2

これはデメテルの法則に違反していますか?

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

2 に答える 2

0

それは壊れていなければ、デメテルの法則をわずかに曲げています。

次のように呼び出すことができるような方法で実装してみることができます。

(...)
this.internalGrid.MoveEmptyCellBy(this.moveDistance);
(...)
于 2012-10-01T14:08:24.690 に答える
0

デメテルの法則は次のように述べています。

より正式には、関数のデメテルの法則では、オブジェクト O のメソッド m は、次の種類のオブジェクトのメソッドのみを呼び出す必要があります。

O 自体
m のパラメータ m
内で作成/インスタンス化されたすべてのオブジェクト
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 は適用されません。

于 2012-08-27T12:32:10.027 に答える