我一直在努力学习OOP技术和设计模式一段时间,我的方法肯定有所改进,但是当我们讨论不同类的交互对象时,我并没有完全点击.我主要使用PHP,但为了学习,我会接受一般性的答案.如果我使用错误的条款,请提前道歉,我在这里自学成才.这是一个例子:
假设我想模拟开车的人.有3个类:
class Car {}
class Driver {}
class Road {}
Run Code Online (Sandbox Code Playgroud)
我希望Car类具有一个功能
public function Drive($time) {}
Run Code Online (Sandbox Code Playgroud)
驾驶应根据道路的速度限制更新驾驶员的位置.我的问题是什么是构造Drive的最佳方式,以便Car与其他对象进行交互.我可以从头顶看到3种可能性:
public function Drive($time, $Driver, $Road) {}
Run Code Online (Sandbox Code Playgroud)
这里的优点是函数本身告诉我需要什么参数.缺点是如果我有很多类似的动作,沿途调用私有函数,添加乘客对象等,我最终可能会传递大量参数.
$Car->setDriver($Driver);
$Car->setRoad($Road);
$Car->Drive($time);
Run Code Online (Sandbox Code Playgroud)
优点是我可以非常简单地调用Drive,它可以访问它需要的任何东西.缺点是我必须记住首先设置驱动程序和路径,因为函数定义没有告诉我.
class Car() {
public function Drive($time) {
$Driver = getDriver($this->DriverID);
$Road = getRoad($this->RoadID);
}
}
function getDriver($DriverID) {
static $DriverArray;
// check isset(), create object and place in array if not
return $DriverArray[$DriverID];
}
function getRoad($RoadID) {} // assume similar
Run Code Online (Sandbox Code Playgroud)
优点是所有逻辑都是内部的,存在DriverID和RoadID,因为它们是来自db的外键.(或者它们可以事先手动设置,但这不是内存问题,因为它是故意分配.)缺点是所有驱动程序操作都必须通过相同的getDriver才能最终得到单独的实例同一个司机.
只是为了完整性我的第四种方法是SELECT <columns> FROM Car_tbl INNER JOIN Driver_tbl on DriverID INNER …