这可能会多次讨论,但我想知道OOP如何帮助我改进代码。 我曾经以程序方式编码。但是有一个合理的逻辑。整个项目中使用的代码片段都包含在函数中。但是所有函数都放在一个大的functions.php文件中(我觉得效率不高)。 例如,这是检查销售是否已过期的功能:
function is_sales_expired($salesId, PDO $conn) {
$now=time();
$sql="SELECT * FROM specialoffers WHERE id=:id";
$st=$conn->prepare($sql);
$st->bindvalue(":id",$salesId,PDO::PARAM_STR);
$st->execute();
$sales_array=$st->fetchAll();
if($now<$sales_array[0]['finishdate'] && $now>$sales_array[0]['startdate']) {
return FALSE;
} else {
return TRUE;
}
}
现在我决定转到OOP并将我的代码转换为OOP。所以我创建了类并将与特定行为相关的函数放入每个类中。例如,具有is_sales_expired()
的销售类以及与销售相关的其他方法。属性和构造函数如下所示:
class Sales
{
private $conn;
private $stockObj;
private $userObj;
private $cartObj;
private $randomObj;
function __construct(PDO $conn)
{
$this->conn = $conn;
$this->stockObj = new Stock($this->conn);
$this->userObj = new User($this->conn);
$this->cartObj = new Cart($this->conn);
$this->randomObj = new Random($this->conn);
}
//methods come here//
}
然后我使用spl_autoload_register
在我的代码中加载类,所以我不必在所有其他文件中包含所有类文件。使用这种方法,调用方法更容易,我不需要将PDO $conn
传递给每个方法调用,并且它已经与构造函数一起传递。
嗯,这些都很好,所有相关代码现在都在一个地方,可能更容易管理。但我有一种感觉,OOP应该提供更多。使用我使用的方法,我不觉得,现在我的代码更有效和可维护。我觉得我应该错过这里的一些概念。 感谢您的帮助。
答案 0 :(得分:1)
您开始将代码组织到对象中是件好事,这是更好地应用于更好的应用程序结构。 一旦你开始深入研究它,你就会找到将当前对象分成更小部分的方法,并以更好的方式组织它们,减少代码以更灵活的方式解决更多问题。
例如,在您的代码中,业务逻辑仍然与数据库紧密耦合。如果您决定使用mysqli
而不是PDO
,该怎么办?您必须触摸申请表中的每个班级。
但是,如果将数据库交互提取到业务逻辑使用的自有对象集中,则更换数据库访问层会更容易。实际上,在这种情况下,你可以很容易地用PostgreSQL替换MySQL,甚至用普通文件替换它。
我可以想出两种方法来了解有关OOP如何工作的更多信息:阅读book或从现有代码中学习。
我链接的这本书是我最喜欢的OOP书,它展示了一些很好的例子,说明如何通过将程序分解为合作对象来解决问题。
我还建议开始使用一些OOP框架,过去我对Yii有一些很好的经验,请查看guide以查看它的外观。您将看到大量有用的对象解决了在开发Web应用程序时必须始终解决的各种问题。 尝试用它构建一些简单的应用程序,然后尝试查看框架代码,看看它是如何工作的。
另一个建议是研究自动测试。这不仅可以使您的应用程序保持活力,还可以教您如何构建更好的对象。您必须在两种不同的情况下使用您的课程 - 您的实际代码和测试。在内部测试中,您需要将正在测试的对象与其余代码隔离开来,例如,在不触及数据库的情况下测试销售统计算法。而且你必须将代码分成更小,更灵活的结构才能做到这一点。
答案 1 :(得分:1)
你有一个良好的开端,需要时间来开始考虑对象的架构。 OOP的优势在于它可以模仿代码必须交互的内容。因此,请考虑需要处理的事情以及需要执行的操作。所以在你的例子中,你可以有一个新的类SpecialOffers,它将处理与你的specialoffers表相关的所有事情。
例如:
class SpecialOffers {
function __construct(PDO $conn)
{
// this is connected to the server table
$this->conn = $conn;
}
// get the details of a special offer
private function get($salesId) {
$sql="SELECT * FROM specialoffers WHERE id=:id LIMIT 1";
$st=$this->conn->prepare($sql);
$st->bindvalue(":id",$salesId,PDO::PARAM_STR);
$st->execute();
$rows = $st->fetchAll();
if (count($rows) > 0) {
return $rows[0];
} else {
return null;
}
}
// answers whether a particular sales is active
public function isActive($salesId) {
$answer = $this->get($salesId);
if (isset($answer['finishdate']) && isset($answer['startdate'])) {
$now=time();
return $now<$answer['finishdate'] && $now>$answer['startdate'];
} else {
return false;
}
}
}
还有很多事情要做,比如错误处理,但你可以看到它在事情发生时变得越来越明显,而你只想到特别优惠。他们是如何工作的?什么可能出错?
最后,在尝试考虑类的范围时,最好的建议是来自SOLID原则。第一个,S - 单一责任原则:
一个班级应该只有一个责任(即只有一个 软件规范的潜在变化应该能够 影响类的规范)
最好的课程可以用一句话来描述。方法也一样,用一句话来描述它的作用。