一個很簡單的一點:這也違反了德米特法則?或者這會扭曲它的矯枉過正?
class Point
{
private $x, $y;
public function __constructor($x, $y)
{
$this->x = $x;
$this->y = $y;
}
public function getX()
{
return $this->x;
}
public function getY()
{
return $this->y;
}
}
和一個圓
class Circle
{
private $r;
private $point;
public function __constructor (Point $point, $r)
{
$this->point = $point;
$this->r = $r;
}
public function getPoint() // here is the law breaking
{
return $this->point;
}
}
$circle = new Circle(new Point(1,2), 10);
$circle->getPoint()->getX(); // here is the law breaking
$circle->getPoint()->getY(); // here is the law breaking
當然
它打破了迪米特法則。因此,讓我折射它:
class Circle
{
private $r;
private $point;
public function __constructor (Point $point, $r)
{
$this->point = $point;
$this->r = $r;
}
public function getPointX()
{
return $this->point->getX();
}
public function getPointY()
{
return $this->point->getY();
}
}
$circle = new Circle(new Point(1,2), 10);
$circle->getPointX();
$circle->getPointY();
除了它看起來更好,我沒有看到任何好處 - 只是兩個額外的包裝功能部件。從技術上講,我再次可以完全訪問Point
,並且沒有辦法將更多方法添加到Point
。是否仍然值得使用第二折射方法?
如果您將Point更改爲3D點,您現在必須更改使用Point的每個類?這似乎是一個向後移動 - 恕我直言。 –
@NigelRen將2D點改變爲3D點使得繼電器沒有意義恕我直言。如果他需要3D點,他可以通過'class Point3D extends Point'從2D點繼承一個3D點。 – Webdesigner
即使您確實定義了一個子類,在第二個設計中該如何照顧?至於從二維到三維的點 - 當然,整個觀點是你不在乎點是什麼 - 我應該能夠改變它到15D點,第一個設計工作,第二個設計失敗! –