2017-02-17 102 views
1

这可能会讨论好几次,但我想知道OOP如何帮助我改进代码。我习惯以程序的方式进行编码。但是要有合理的逻辑。整个项目中使用的代码段都包含在函数中。然而,所有的功能都放在一个大的functions.php文件中(我发现效率不高)。 例如,这是检查的功能,如果一个销售过期或不:php - 如何用OOP改善代码

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传递给每个方法调用,并且它已经与构造函数一起传递。

好吧,这些都很好,所有相关的代码现在在一个地方,也许更容易管理。但我有一种感觉,即面向对象应该提供更多的东西。与我使用的方法,我不觉得,现在我的代码更高效和可维护。我觉得我应该在这里错过一些概念。 您的帮助表示赞赏。

+0

[OOP vs Functional Programming vs Procedural]的可能重复(http://stackoverflow.com/questions/552336/oop-vs-functional-programming-vs-procedural) –

回答

1

很好,你已经开始组织你的代码到对象中,这是一个很好的进入更好的应用程序结构。当你开始深入研究它时,你会发现将当前对象分割成更小的部分并以更好的方式组织它们的方法,减少代码以更灵活的方式解决更多问题。

例如,在您的代码中,业务逻辑仍与数据库紧密耦合。如果您决定使用mysqli而不是PDO,该怎么办?您必须触摸应用程序中的每个课程。

但是,如果数据库交互被提取到您的业务逻辑使用的自己的一组对象中,那么替换数据库访问层会容易得多。事实上,在这种情况下,你可以很容易地用PostgreSQL替换MySQL,甚至可以用普通文件替换。

我可以通过两种方法来了解更多关于OOP的工作方式:阅读book或从现有代码中学习。

我连接的这本书是我最喜欢的面向对象的书,并且展示了一些很好的例子,说明如何通过将程序分解成协作对象来解决OOP问题。

而且我也建议开始使用一些OOP框架,过去我和Yii有过一些很好的经验,请查看guide,看看它是怎么样的。您将看到大量有用的对象解决您在开发Web应用程序时必须解决的所有问题。 尝试使用它构建一些简单的应用程序,然后尝试查看框架代码内部,以查看其实际工作方式。

还有一个建议是研究自动测试。这不仅会让应用程序保持活跃状态​​,还会教你如何编写更好的对象。您必须在两种不同的情况下使用您的类 - 您的实际代码和测试。在内部测试中,您希望将您正在测试的对象与其余代码隔离开来,例如,在不触及数据库的情况下测试销售统计信息算法。而且你必须将代码分成更小更灵活的结构才能做到这一点。

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 - 单一职责原则:

类应该只有一个单一的责任(即只有一个 在软件的规格电位变化应该能够 影响类的规范)

最好的一类可以用一句话来描述。方法也一样,用一句话来描述它的功能。