Ama*_*sir 5 php oop design-patterns class object
我一直在努力学习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 JOIN Road_tbl on RoadID,我非常肯定是糟糕的OO设计但是我以前做的是因为它执行的查询更少.
我倾向于接近3但是怀疑我在很大程度上缺少某些东西.随意回答PHP具体或者通常如何考虑这一点.谢谢.
编辑:目前为止感谢答案,包括进一步阅读的链接.让我们假设现在最简单的UseCase,而不是使这个例子过于复杂,但最后可能会使用最复杂的UseCase.因此,例如,速度是现在的功能getRoadSpeedLimit(),但后来被限制getMaxCarSpeed(),并getMaxDriverSpeed()与汽车的需要气体和驾驶者对食物的需求.如果我们使用相同的道路等太多的Driver对象,则道路的速度限制会调整.
Gordon和UmlCat似乎都在推动(可以这么说)使用封装类,是吗?
class RoadTrip_aka_Universe {
// Operates on instances of Car, Driver, Route (which may contain roads)
}
Run Code Online (Sandbox Code Playgroud)
但是这还没有留下问题,是$ Car,$ Driver和$ Route在构造函数中添加,由setter应用,从静态外部引入?无论我们决定哪个类都有这些方法,它如何访问其他对象?
另外我的直觉反应是,如果所有内容都只是在一个更大的类中,那么该类的内部是否开始类似于具有全局变量的大型无类结构?不要把它作为批评,我只是试图理解,因为它感觉像是OOP的字母而不是它的精神.
再次,谢谢.
您通常将方法放在具有最多信息来完成特定任务的类上。因此,就您的情况而言,问问自己那是哪一类。此外,您应该尽量保持类之间的依赖关系较小且易于管理,这样您就可以实现低耦合和高内聚。
至于您的具体用例,我认为您应该首先从编写具体代码中退后一步。相反,首先尝试将您想要实现的目标用简单的英语表达出来。到目前为止你所说的是:
如果您考虑一下这一点,您最终可能会得到一个(不完整的)用例,如下所示:
这应该已经告诉您,拥有 Driver、Car 和 Road 不足以将此 UseCase 转换为代码。正如你所看到的,还有类似 a 的东西Location。但是,没有任何有关“位置”的信息。是吗GPSCoordindates?StreetAdresses?或者仅仅是DistanceTraveled?
我们还可以说您根本不需要Driver,因为它是应用程序的主要用户,并且它采取的所有操作都是通过 UI 进行的。如果是这样,也许应该有另一个领域概念:Roadtrip. 这收集了用过的Car,或者Road更确切地说,收集了Route。并且可以容纳的StartingLocation还有很多Roads,每一种都有一种可能SpeedLimit。
用例没有说明的是,驾驶员是否始终以允许的最大速度行驶,或者汽车是否有可能耗尽汽油的油箱,等等。目前,Car 未向 Roadtrip 提供任何内容。我们真的需要它吗?因此,在深入研究代码之前,请确保您了解正在建模的问题域。
| 归档时间: |
|
| 查看次数: |
1345 次 |
| 最近记录: |